Code:
//Hi.
#include <amxmodx>
#include <amxmisc>
#include <fakemeta>
#include <hamsandwich>
//General
new bool:Disabled=true//For checking to keep players from flying during the buy period.
new bool:JetpackBools[33][3]//Jetpack On/Jetpack in use? [2 is for +jetpack now]
new Float:JetpackSound[33][2]//When was the last sound played?
new JetpackFuel[33]//How much fuel a player has.
//Sprites
new explosion
new smoke
//Death
new MSG_DEATH
//pcvars
new CS_Jetpack
new CS_Jetpack_ExplodeDamage
new CS_Jetpack_ExplodeRadius
new CS_Jetpack_ExplodeFrequency
new CS_Jetpack_FuelMode
new CS_Jetpack_FuelMatch
new CS_Jetpack_Death
new CS_Jetpack_UpSpeed
new CS_Jetpack_ForwardSpeed
new CS_Jetpack_Accelerate
new CS_Jetpack_UAccelerate
new CS_Jetpack_MaxFuel
new CS_Jetpack_StartingFuel
new CS_Jetpack_DepletionRate
new CS_Jetpack_RegenRate
new CS_Jetpack_IdleDeplete
new CS_Jetpack_RoundReset
new CS_Jetpack_JumpToFly
new CS_Jetpack_HudChannel
new MP_FriendlyFire
public plugin_init()
{
register_plugin("CS_Jetpack","1.6983421","Bad_Bud")
register_clcmd("say /jetpack","Jetpack")
register_clcmd("+jetpack","plusjetpack")
register_clcmd("-jetpack","minusjetpack")
register_concmd("cs_jetpack_setfuel","SetFuel",ADMIN_RCON)
register_concmd("cs_jetpack_givefuel","GiveFuel",ADMIN_RCON)
register_concmd("cs_jetpack_save","SaveConfig",ADMIN_RCON)
register_concmd("cs_jetpack_reset","JetpackReset",ADMIN_RCON)//Resets jetpack fuels.
RegisterHam(Ham_TakeDamage,"player","ClientDamage")
register_logevent("Round_Start",2,"1=Round_Start")
register_logevent("Round_End",2,"1=Round_End")
MSG_DEATH=get_user_msgid("DeathMsg")
CS_Jetpack=register_cvar("cs_jetpack","1")//1 = On
CS_Jetpack_ExplodeDamage=register_cvar("cs_jetpack_explodedamage","1.0")//Set to the ratio of damage dealt by exploding jetpacks.
CS_Jetpack_ExplodeRadius=register_cvar("cs_jetpack_exploderadius","650.0")//Set to the radius of jetpack explosion.
CS_Jetpack_ExplodeFrequency=register_cvar("cs_jetpack_explodefrequency","1.0")//Set the frequency of jetpack explosions.
CS_Jetpack_FuelMode=register_cvar("cs_jetpack_fuelmode","0")//1 = On, 2 = Burst regeneration jetpacks.
CS_Jetpack_FuelMatch=register_cvar("cs_jetpack_fuelmatch","10")//If greater than 0, you gain said fuel amount for each kill you get.
CS_Jetpack_Death=register_cvar("cs_jetpack_death","0")//If 1, jetpacks in use turn off when their owner dies.
CS_Jetpack_UpSpeed=register_cvar("cs_jetpack_upspeed","200.0")//Upward thrust the jetpack gives.
CS_Jetpack_ForwardSpeed=register_cvar("cs_jetpack_forwardspeed","575.0")//Max forward speed.
CS_Jetpack_Accelerate=register_cvar("cs_jetpack_accelerate","50.0")//Rate of acceleration (forward, back, left, right).
CS_Jetpack_UAccelerate=register_cvar("cs_jetpack_uaccelerate","100.0")//Rate of upward acceleration.
CS_Jetpack_MaxFuel=register_cvar("cs_jetpack_maxfuel","1000")//Max fuel.
CS_Jetpack_StartingFuel=register_cvar("cs_jetpack_startingfuel","50")//Starting fuel.
CS_Jetpack_DepletionRate=register_cvar("cs_jetpack_depletionrate","1.0")//Rate at which fuel depletes. 1.0 is the standard rate.
CS_Jetpack_RegenRate=register_cvar("cs_jetpack_regenrate","1.0")//Rate at which fuel regenerates. 1.0 is the standard rate. This is only used if cs_jetpack_fuel is set to 2.
CS_Jetpack_IdleDeplete=register_cvar("cs_jetpack_idledeplete","1")//If 0, idle jetpacks don't slowly lose fuel.
CS_Jetpack_RoundReset=register_cvar("cs_jetpack_roundreset","1")//Modifies whether jetpacks are on or off and whether fuel is reset at the beginning of every round.
CS_Jetpack_JumpToFly=register_cvar("cs_jetpack_jumptofly","0")//If 1, IN_JUMP will be used to cause flight, instead of +jetpack.
CS_Jetpack_HudChannel=register_cvar("cs_jetpack_hudchannel","4")//The fuel HUD channel. Change this to remove HUD conflicts.
MP_FriendlyFire=get_cvar_pointer("mp_friendlyfire")
register_event("DeathMsg","Death","a")
register_forward(FM_PlayerPreThink,"PreThink")
set_task(0.1,"JetpackFly",0,"",0,"b")
}
public plugin_precache()
{
precache_sound("Jetpack/Jetpack.wav")
precache_sound("Jetpack/JetpackIdle.wav")
explosion=precache_model("sprites/explode1.spr")
smoke=precache_model("sprites/lightsmoke.spr")
}
public client_putinserver(id)
{
switch(get_pcvar_num(CS_Jetpack_FuelMode))
{
case 1:
{
JetpackFuel[id]=((get_pcvar_num(CS_Jetpack_StartingFuel)*1000)-1)
}
case 2:
{
JetpackFuel[id]=99999
}
}
}
public client_disconnect(id)
{
JetpackBools[id][0]=false
JetpackBools[id][1]=false
JetpackSound[id][0]=0.0
JetpackSound[id][1]=0.0
}
public Round_Start()
{
Disabled=false
}
public Round_End()
{
Disabled=true
switch(get_pcvar_num(CS_Jetpack_FuelMode))
{
case 0:
{
switch(get_pcvar_num(CS_Jetpack_RoundReset))
{
case 2,3:
{
Mode2Reset(true)//Not really Mode2, so sue me.
}
}
}
case 1:
{
switch(get_pcvar_num(CS_Jetpack_RoundReset))
{
case 1:
{
Mode1Reset(true,false)
}
case 2:
{
Mode1Reset(true,true)
}
case 3:
{
Mode1Reset(false,true)
}
}
}
case 2:
{
switch(get_pcvar_num(CS_Jetpack_RoundReset))
{
case 2,3:
{
Mode2Reset(true)
}
default:
{
Mode2Reset(false)
}
}
}
}
}
public JetpackReset()//This is for the console command. It looks redundant, but that's just the way it is. :P
{
switch(get_pcvar_num(CS_Jetpack_FuelMode))
{
case 1:
{
arrayset(JetpackFuel,(get_pcvar_num(CS_Jetpack_StartingFuel)*1000)-1,33)
}
case 2:
{
arrayset(JetpackFuel,99999,33)
}
}
return PLUGIN_HANDLED
}
Mode1Reset(bool:fuelreset,bool:turnoff)
{
static i,TotalPlayers,id
static Players[32]
get_players(Players,TotalPlayers)
for (i=0;i<TotalPlayers;i++)
{
id=Players[i]
if(fuelreset)
JetpackFuel[id]=((get_pcvar_num(CS_Jetpack_StartingFuel)*1000)-1)
if(turnoff)
JetpackBools[id][0]=false
}
}
Mode2Reset(bool:turnoff)
{
static i,TotalPlayers,id
static Players[32]
get_players(Players,TotalPlayers)
for (i=0;i<TotalPlayers;i++)
{
id=Players[i]
JetpackFuel[id]=99999
if(turnoff)
JetpackBools[id][0]=false
}
}
public plusjetpack(id)
{
if(JetpackBools[id][0]&&!Disabled)
JetpackBools[id][2]=true
else
JetpackBools[id][2]=false
return PLUGIN_HANDLED
}
public minusjetpack(id)
{
JetpackBools[id][2]=false
return PLUGIN_HANDLED
}
public PreThink(id)
{
if(get_pcvar_num(CS_Jetpack)==1)
{
if(JetpackBools[id][0])
{
if(!(pev(id,pev_flags)&FL_ONGROUND))
{
if(!get_pcvar_num(CS_Jetpack_JumpToFly))
{
if(JetpackBools[id][2])
{
if(get_pcvar_num(CS_Jetpack_FuelMode)==2&&JetpackFuel[id]<5000)
JetpackBools[id][1]=false
else
JetpackBools[id][1]=true
}
}
else
{
static Button
Button=pev(id,pev_button)
if(Button&IN_JUMP)
{
if(get_pcvar_num(CS_Jetpack_FuelMode)==2&&JetpackFuel[id]<5000)
JetpackBools[id][1]=false
else
JetpackBools[id][1]=true
}
}
}
if(JetpackBools[id][1])
{
if(get_gametime()-JetpackSound[id][0]>1.0&&is_user_alive(id))
{
//emit_sound(id,CHAN_ITEM,"Jetpack/jetpack.wav",1.0,ATTN_NORM,0,PITCH_NORM)
JetpackSound[id][0]=get_gametime()
}
JetpackSound[id][1]=0.0
}
else
{
if(get_gametime()-JetpackSound[id][1]>1.0&&is_user_alive(id))
{
//emit_sound(id,CHAN_ITEM,"Jetpack/jetpackidle.wav",1.0,ATTN_NORM,0,PITCH_NORM)
JetpackSound[id][1]=get_gametime()
}
JetpackSound[id][0]=0.0
}
}
}
return FMRES_IGNORED
}
public ClientDamage(this,inflictor,attacker,Float:damage,dmgbits)//this = victim
{
if(get_pcvar_float(CS_Jetpack_ExplodeFrequency)>0.0)//If jetpack explosions are enabled.
{
if(JetpackBools[this][1]&&attacker!=0&&attacker<get_maxplayers())//Fall damage is server inflicted. Server does not have weapons.
{
if(get_pcvar_num(MP_FriendlyFire))//If friendly fire is on...
{
CheckDamage(this,inflictor,attacker,damage)
}
else if(!SameTeam(this,attacker))//if it's off, check their teams.
{
CheckDamage(this,inflictor,attacker,damage)
}
}
}
return HAM_HANDLED
}
CheckDamage(this,inflictor,attacker,Float:damage)
{
damage*=get_pcvar_float(CS_Jetpack_ExplodeFrequency)//Multiply the damage by whatever.
if(IsGrenade(inflictor)&&damage>15.0)//Grenade
{
JetpackExplode(this,attacker)
}
else
{
if(get_user_weapon(attacker)!=CSW_KNIFE)//If not: Knife
{
damage*=damage//Exponentiate so higher damage weapons have a much higher chance of causing explosions.
damage/=110.0//Turns damage into a percentage. It's divided by 110 so that 100 damage isn't a 100% chance, but instead a 91% chance.
//NEW: CS_Jetpack 1.3: Explodefrequency may make anything a 100% chance. But as a default, this will stay so 1.0 will give a 91% chance.
if(random_num(0,99)<damage)//Chance!
JetpackExplode(this,attacker)
}
}
}
JetpackExplode(victim,attacker)
{
static Float:TempOrigin[3]
pev(victim,pev_origin,TempOrigin)
if(get_pcvar_num(CS_Jetpack_FuelMode)==1)
{
if(JetpackFuel[victim]>25000)
JetpackFuel[victim]=floatround(JetpackFuel[victim]*0.8)
else
JetpackFuel[victim]=0
}
effect_explosion(victim)
AddDeaths(victim,1)
CreateDeathMessage(victim,attacker)
if(!SameTeam(victim,attacker))
AddPoints(attacker,1)//Give your killer one point, unless he was on your team, that asshole.
else
AddPoints(attacker,-1)//Teamkill.
DealJetpackDamage(victim,attacker,1000.0)//1000 is overkill. They best be dead and stay that way.
if(victim!=attacker)
RadiusDamage(attacker,TempOrigin,(170.0*get_pcvar_float(CS_Jetpack_ExplodeDamage)),get_pcvar_float(CS_Jetpack_ExplodeRadius))
}
RadiusDamage(attacker,Float:Origin[3],Float:MaxDamage,Float:Radius)
{
static victim,AlivePlayers,Float:Damage//,Float:Health
static Players[32],Float:VictimOrigin[3]
get_players(Players,AlivePlayers,"a")
for (new i=0;i<AlivePlayers;i++)
{
victim=Players[i]
static Health
if(get_pcvar_num(MP_FriendlyFire))
{
pev(victim,pev_origin,VictimOrigin)
if(get_distance_f(Origin,VictimOrigin)<=Radius)
{
Damage=(MaxDamage*(1-(get_distance_f(Origin,VictimOrigin)/Radius)))
Health=pev(victim,pev_health)
if(Damage>=Health)
{
if(!SameTeam(victim,attacker))
AddPoints(attacker,1)//If the explosion kills any enemies, add one point.
else
AddPoints(attacker,-1)//If the explosion kills anyone on the attacker's team (including the attacker himself), subract one point.
CreateDeathMessage(victim,attacker)
AddDeaths(victim,1)
}
DealJetpackDamage(victim,attacker,Damage)
}
}
else if(!SameTeam(victim,attacker)||victim==attacker)
{
pev(victim,pev_origin,VictimOrigin)
if(get_distance_f(Origin,VictimOrigin)<=Radius)
{
Damage=(MaxDamage*(1-(get_distance_f(Origin,VictimOrigin)/Radius)))
Health=pev(victim,pev_health)
if(Damage>=Health)
{
if(victim!=attacker)
AddPoints(attacker,1)//If the explosion kills any enemies, add one point.
else
AddPoints(attacker,-1)//If the explosion kills the attacker, subtract one point.
CreateDeathMessage(victim,attacker)
AddDeaths(victim,1)
}
DealJetpackDamage(victim,attacker,Damage)
}
}
}
}
public Death()
{
static id,killerid
killerid=read_data(1)
id=read_data(2)
if(get_pcvar_num(CS_Jetpack_FuelMatch)>0&&get_pcvar_num(CS_Jetpack_FuelMode)==1&&killerid!=id&&killerid!=0)//Fuelmatch is on, fuelmode is 1, killer is not self, and killer is not server (falldamage?).
{
if(!SameTeam(id,killerid))
{
client_print(killerid,print_chat,"[Jetpack] You have gained %d fuel.",get_pcvar_num(CS_Jetpack_FuelMatch))
JetpackFuel[killerid]+=((get_pcvar_num(CS_Jetpack_FuelMatch)*1000)-1)
if(JetpackFuel[killerid]>(get_pcvar_num(CS_Jetpack_MaxFuel)*1000))
JetpackFuel[killerid]=((get_pcvar_num(CS_Jetpack_MaxFuel)*1000)-1)
}
else
{
client_print(killerid,print_chat,"[Jetpack] You have lost %d fuel.",get_pcvar_num(CS_Jetpack_FuelMatch))
JetpackFuel[killerid]-=((get_pcvar_num(CS_Jetpack_FuelMatch)*1000)-1)
if(JetpackFuel[killerid]<0)
JetpackFuel[killerid]=0
}
}
else if(get_pcvar_num(CS_Jetpack_FuelMode)==2)
{
JetpackFuel[id]=99999
}
if(get_pcvar_num(CS_Jetpack_Death)==1)
JetpackBools[id][0]=false
JetpackBools[id][1]=false
}
public Jetpack(id)
{
if(get_pcvar_num(CS_Jetpack)==1)
{
if(!JetpackBools[id][0])
{
if(get_pcvar_num(CS_Jetpack_FuelMode)==1)
{
if(JetpackFuel[id]>0)
{
JetpackBools[id][0]=true
client_print(id,print_chat,"[Jetpack] You have turned your jetpack on.")
}
else
client_print(id,print_chat,"[Jetpack] Your jetpack has no fuel!")
}
else
{
JetpackBools[id][0]=true
client_print(id,print_chat,"[Jetpack] You have turned your jetpack on.")
}
}
else
{
JetpackBools[id][0]=false
client_print(id,print_chat,"[Jetpack] You have turned your jetpack off.")
}
}
return PLUGIN_HANDLED
}
public SetFuel(ID)
{
if(get_pcvar_num(CS_Jetpack_FuelMode)==1)
{
if(read_argc()==3)
{
static Fuel
static arg2[33]
read_argv(2,arg2,32)
Fuel=str_to_num(arg2)
if(Fuel<0)
{
client_print(ID,print_console,"ERROR: <You may only set fuel in non-negative amounts>")
}
else
{
static arg[33]
read_argv(1,arg,32)
ChangeFuel(ID,arg,Fuel,true)
}
}
else
{
client_print(ID,print_console,"USAGE: <Part of Playername or ^"ALL^"> <Amount of fuel to set (0 to %d)>",get_pcvar_num(CS_Jetpack_MaxFuel))
}
}
else
{
client_print(ID,print_console,"USAGE: cs_jetpack_fuel must be set to 1 in order to give or set fuel.")
}
return PLUGIN_HANDLED
}
public GiveFuel(ID)
{
if(get_pcvar_num(CS_Jetpack_FuelMode)==1)
{
if(read_argc()==3)
{
static Fuel
static arg2[33]
read_argv(2,arg2,32)
Fuel=str_to_num(arg2)
if(Fuel<1)
{
client_print(ID,print_console,"ERROR: <You may only give positive amounts of fuel>")
}
else
{
static arg[33]
read_argv(1,arg,32)
ChangeFuel(ID,arg,Fuel,false)
}
}
else
{
client_print(ID,print_console,"USAGE: <Part of Playername or ^"ALL^"> <Amount of fuel to give (Fuel will cap at %d)>",get_pcvar_num(CS_Jetpack_MaxFuel))
}
}
else
{
client_print(ID,print_console,"USAGE: cs_jetpack_fuel must be set to 1 in order to give or set fuel.")
}
return PLUGIN_HANDLED
}
ChangeFuel(ID,arg[33],Fuel,Set)
{
static id,MaxFuel
MaxFuel=get_pcvar_num(CS_Jetpack_MaxFuel)
if(!equali(arg,"ALL"))
{
id=cmd_target(id,arg)
if(Set)
{
if(Fuel>MaxFuel)
Fuel=MaxFuel
JetpackFuel[id]=((Fuel*1000)-1)
client_print(id,print_chat,"[Jetpack] Your fuel has been set to %d.",Fuel)
static Name[44]
get_user_name(id,Name,43)
client_print(ID,print_console,"You have set %s's fuel to %d.",Name,Fuel)
}
else//Give
{
JetpackFuel[id]+=((Fuel*1000)-1)
if(JetpackFuel[id]>(MaxFuel*1000))
{
JetpackFuel[id]=((MaxFuel*1000)-1)
}
client_print(id,print_chat,"[Jetpack] You have been given %d fuel.",Fuel)
static Name[44]
get_user_name(id,Name,43)
client_print(ID,print_console,"You have given %d fuel to %s.",Fuel,Name)
}
}
else
{
static i,TotalPlayers
static Players[32]
get_players(Players,TotalPlayers)
for (i=0;i<TotalPlayers;i++)
{
id=Players[i]
if(Set)
{
if(Fuel>MaxFuel)
Fuel=MaxFuel
JetpackFuel[id]=((Fuel*1000)-1)
client_print(id,print_chat,"[Jetpack] Your fuel has been set to %d.",Fuel)
}
else//Give
{
JetpackFuel[id]+=((Fuel*1000)-1)
if(JetpackFuel[id]>(MaxFuel*1000))
{
JetpackFuel[id]=((MaxFuel*1000)-1)
}
client_print(id,print_chat,"[Jetpack] You have been given %d fuel.",Fuel)
}
}
if(Set)
client_print(ID,print_console,"You have set everyone's fuel to %d",Fuel)
else
client_print(ID,print_console,"You have given %d fuel to everyone.",Fuel)
}
}
public SaveConfig(ID)
{
if(read_argc()==2)
{
static arg[65]
read_argv(1,arg,64)
if(containi(arg,".cfg")==-1)
format(arg,64,"%s.cfg",arg)
client_print(ID,print_console,"Attempting save: %s...",arg)
if(!equali(arg,"config.cfg")&&!equali(arg,"game.cfg")&&!equali(arg,"listenserver.cfg")&&!equali(arg,"autoexec.cfg")&&!equali(arg,"server.cfg"))
{
static Write[65]
format(Write,64,"cs_jetpack %d",get_pcvar_num(CS_Jetpack))
write_file(arg,Write,0)
format(Write,64,"cs_jetpack_explodedamage %f",get_pcvar_float(CS_Jetpack_ExplodeDamage))
write_file(arg,Write,1)
format(Write,64,"cs_jetpack_exploderadius %f",get_pcvar_float(CS_Jetpack_ExplodeRadius))
write_file(arg,Write,2)
format(Write,64,"cs_jetpack_explodefrequency %f",get_pcvar_float(CS_Jetpack_ExplodeFrequency))
write_file(arg,Write,3)
format(Write,64,"cs_jetpack_fuelmode %d",get_pcvar_num(CS_Jetpack_FuelMode))
write_file(arg,Write,4)
format(Write,64,"cs_jetpack_fuelmatch %d",get_pcvar_num(CS_Jetpack_FuelMatch))
write_file(arg,Write,5)
format(Write,64,"cs_jetpack_death %d",get_pcvar_num(CS_Jetpack_Death))
write_file(arg,Write,6)
format(Write,64,"cs_jetpack_upspeed %f",get_pcvar_float(CS_Jetpack_UpSpeed))
write_file(arg,Write,7)
format(Write,64,"cs_jetpack_forwardspeed %f",get_pcvar_float(CS_Jetpack_ForwardSpeed))
write_file(arg,Write,8)
format(Write,64,"cs_jetpack_accelerate %f",get_pcvar_float(CS_Jetpack_Accelerate))
write_file(arg,Write,9)
format(Write,64,"cs_jetpack_uaccelerate %f",get_pcvar_float(CS_Jetpack_UAccelerate))
write_file(arg,Write,10)
format(Write,64,"cs_jetpack_maxfuel %d",get_pcvar_num(CS_Jetpack_MaxFuel))
write_file(arg,Write,11)
format(Write,64,"cs_jetpack_startingfuel %d",get_pcvar_num(CS_Jetpack_StartingFuel))
write_file(arg,Write,12)
format(Write,64,"cs_jetpack_depletionrate %f",get_pcvar_float(CS_Jetpack_DepletionRate))
write_file(arg,Write,13)
format(Write,64,"cs_jetpack_regenrate %f",get_pcvar_float(CS_Jetpack_RegenRate))
write_file(arg,Write,14)
format(Write,64,"cs_jetpack_idledeplete %d",get_pcvar_num(CS_Jetpack_IdleDeplete))
write_file(arg,Write,15)
format(Write,64,"cs_jetpack_roundreset %d",get_pcvar_num(CS_Jetpack_RoundReset))
write_file(arg,Write,16)
format(Write,64,"cs_jetpack_jumptofly %d",get_pcvar_num(CS_Jetpack_JumpToFly))
write_file(arg,Write,17)
format(Write,64,"cs_jetpack_hudchannel %d",get_pcvar_num(CS_Jetpack_HudChannel))
write_file(arg,Write,18)
format(Write,64,"cs_jetpack_reset")
write_file(arg,Write,19)
client_print(ID,print_console,"Save complete.",arg)
}
else
{
client_print(ID,print_console,"Error: That filename is unavailable, please choose another.")
}
}
else
{
client_print(ID,print_console,"USAGE: <Name of file>")
}
return PLUGIN_HANDLED
}
public JetpackFly()
{
static Float:Velocity[3]
new Float:NewVelocity[3]
static Float:Angle[3]
static Float:AngleVector[3]
static Button
static id,AlivePlayers
static Players[32]
get_players(Players,AlivePlayers,"a")
for (new i=0;i<AlivePlayers;i++)
{
id=Players[i]
if(get_pcvar_num(CS_Jetpack)==0)
{
if(JetpackBools[id][0])
{
JetpackBools[id][0]=false
client_print(id,print_chat,"[Jetpack] Jetpacks have been disabled.")
}
}
if(JetpackBools[id][1])//If jetpack is on and jetpack key is being pressed.
{
effect_fly(id)
if(!(pev(id,pev_flags)&FL_ONGROUND))//If the jetpacker is off the ground already
{
pev(id,pev_velocity,Velocity)
pev(id,pev_angles,Angle)
Angle[2]=0.0//Remove the Z value.
Button=pev(id,pev_button)
if(Button&IN_FORWARD)
{
angle_vector(Angle,ANGLEVECTOR_FORWARD,AngleVector)
NewVelocity[0]+=(AngleVector[0]*get_pcvar_float(CS_Jetpack_Accelerate))
NewVelocity[1]+=(AngleVector[1]*get_pcvar_float(CS_Jetpack_Accelerate))
}
if(Button&IN_MOVERIGHT)
{
angle_vector(Angle,ANGLEVECTOR_RIGHT,AngleVector)
NewVelocity[0]+=(AngleVector[0]*get_pcvar_float(CS_Jetpack_Accelerate))
NewVelocity[1]+=(AngleVector[1]*get_pcvar_float(CS_Jetpack_Accelerate))
}
if(Button&IN_MOVELEFT)
{
angle_vector(Angle,ANGLEVECTOR_RIGHT,AngleVector)
NewVelocity[0]-=(AngleVector[0]*get_pcvar_float(CS_Jetpack_Accelerate))
NewVelocity[1]-=(AngleVector[1]*get_pcvar_float(CS_Jetpack_Accelerate))
}
if(Button&IN_BACK)
{
angle_vector(Angle,ANGLEVECTOR_FORWARD,AngleVector)
NewVelocity[0]-=(AngleVector[0]*get_pcvar_float(CS_Jetpack_Accelerate))
NewVelocity[1]-=(AngleVector[1]*get_pcvar_float(CS_Jetpack_Accelerate))
}
CheckAndScale(Velocity,NewVelocity)
if(Velocity[2]<0.0)//Jetpacks get more power on the way down -- it helps landing.
{
Velocity[2]+=(get_pcvar_float(CS_Jetpack_UAccelerate)*1.15)
}
else if(Velocity[2]<get_pcvar_float(CS_Jetpack_UpSpeed))
{
Velocity[2]+=get_pcvar_float(CS_Jetpack_UAccelerate)
}
set_pev(id,pev_velocity,Velocity)
}
switch(get_pcvar_num(CS_Jetpack_FuelMode))
{
case 1:
{
CheckFuel(id)
JetpackHUD(id)
JetpackFuel[id]-=floatround(150*get_pcvar_float(CS_Jetpack_DepletionRate))
}
case 2:
{
JetpackFuel[id]-=floatround(5000*get_pcvar_float(CS_Jetpack_DepletionRate))
CheckFuelP(id)
JetpackHUDP(id)
}
default:
{
set_hudmessage(0,175,0,-1.5,0.95,2,0.0,0.1,0.0,0.0,get_pcvar_num(CS_Jetpack_HudChannel))
show_hudmessage(id,"")
}
}
JetpackBools[id][1]=false
}
else if(JetpackBools[id][0])//Idle jetpack.
{
switch(get_pcvar_num(CS_Jetpack_FuelMode))
{
case 1:
{
CheckFuel(id)
JetpackHUD(id)
if(get_pcvar_num(CS_Jetpack_IdleDeplete)&&!Disabled)
JetpackFuel[id]-=floatround(20*get_pcvar_float(CS_Jetpack_DepletionRate))
}
case 2:
{
CheckFuelP(id)
JetpackHUDP(id)
JetpackFuel[id]+=floatround(1000*get_pcvar_float(CS_Jetpack_RegenRate))
if(JetpackFuel[id]>99999)
JetpackFuel[id]=99999
}
default:
{
set_hudmessage(0,175,0,-1.5,0.95,2,0.0,0.1,0.0,0.0,get_pcvar_num(CS_Jetpack_HudChannel))
show_hudmessage(id,"")
}
}
effect_idle(id)//Idle Jetpack Effect
}
else
{
set_hudmessage(0,175,0,-1.5,0.95,2,0.0,0.1,0.0,0.0,get_pcvar_num(CS_Jetpack_HudChannel))
show_hudmessage(id,"")
}
}
return PLUGIN_HANDLED
}
CheckAndScale(Float:Velocity[3],Float:NewVelocity[3])
{
new Float:Ratio
new Float:TempVelocity[3]
TempVelocity[0]=Velocity[0]+NewVelocity[0]
TempVelocity[1]=Velocity[1]+NewVelocity[1]
if(vector_length(TempVelocity)<get_pcvar_float(CS_Jetpack_ForwardSpeed))
{
Velocity[0]=TempVelocity[0]
Velocity[1]=TempVelocity[1]
}
else
{
Ratio=(get_pcvar_float(CS_Jetpack_ForwardSpeed)/vector_length(TempVelocity))
Velocity[0]*=Ratio
Velocity[1]*=Ratio
}
}
JetpackHUD(id)
{
if(JetpackFuel[id]>10000)
set_hudmessage(255,255,255,-1.0,0.92,0,0.0,10.0,0.0,0.0,get_pcvar_num(CS_Jetpack_HudChannel))
else
set_hudmessage(255,0,0,-1.0,0.92,0,0.0,10.0,0.0,0.0,get_pcvar_num(CS_Jetpack_HudChannel))
show_hudmessage(id,"Fuel: %d",(JetpackFuel[id]/1000)+1)
}
JetpackHUDP(id)
{
if(JetpackFuel[id]>10000)
set_hudmessage(255,255,255,-1.0,0.92,0,0.0,10.0,0.0,0.0,get_pcvar_num(CS_Jetpack_HudChannel))
else
set_hudmessage(255,0,0,-1.0,0.92,0,0.0,10.0,0.0,0.0,get_pcvar_num(CS_Jetpack_HudChannel))
if(JetpackFuel[id]>0)
show_hudmessage(id,"Fuel: %d%",(JetpackFuel[id]/1000)+1)
else
show_hudmessage(id,"Fuel: 0%")
}
CheckFuel(id)
{
if(JetpackFuel[id]<1)
{
JetpackBools[id][0]=false
JetpackBools[id][1]=false
JetpackFuel[id]=0//Set to 0 in case it was slightly negative due to a high depletion rate.
client_print(id,print_chat,"[Jetpack] Your jetpack is out of fuel!")
}
}
CheckFuelP(id)
{
if(JetpackFuel[id]<5000)
{
JetpackBools[id][1]=false
if(JetpackFuel[id]<1)
JetpackFuel[id]=0//Set to 0 in case it was slightly negative due to a high depletion rate.
}
}
effect_fly(id)
{
new Origin[3]
get_user_origin(id,Origin)
//effect_smoke(Origin)
//effect_smoke(Origin)
//effect_smoke(Origin)
effect_spark(Origin)
}
effect_smoke(Origin[3])
{
message_begin(MSG_BROADCAST,SVC_TEMPENTITY)
write_byte(TE_SPRITE)
write_coord(Origin[0]+random_num(-15,15))
write_coord(Origin[1]+random_num(-15,15))
write_coord(Origin[2]-60+random_num(-10,10))
write_short(smoke)
write_byte(10)
write_byte(115)
message_end()
}
effect_spark(Origin[3])
{
message_begin(MSG_BROADCAST,SVC_TEMPENTITY)
write_byte(TE_SPARKS)
write_coord(Origin[0])
write_coord(Origin[1])
write_coord(Origin[2]-50)
message_end()
}
effect_idle(id)
{
static Origin[3]
get_user_origin(id,Origin)
message_begin(MSG_BROADCAST,SVC_TEMPENTITY)
write_byte(TE_SPRITE)
write_coord(Origin[0]+random_num(-25,25))
write_coord(Origin[1]+random_num(-25,25))
write_coord(Origin[2]-35+random_num(0,15))
write_short(smoke)
write_byte(10)
write_byte(115)
message_end()
}
effect_explosion(id)
{
static Origin[3]
get_user_origin(id,Origin,0)
message_begin(MSG_BROADCAST,SVC_TEMPENTITY)
write_byte(TE_EXPLOSION2)
write_coord(Origin[0]) //coord, coord, coord (start)
write_coord(Origin[1])
write_coord(Origin[2])
write_byte(200) // byte (scale in 0.1's) 188
write_byte(10) // byte (framerate)
message_end()
message_begin(MSG_BROADCAST,SVC_TEMPENTITY)
write_byte(3)
write_coord(Origin[0]) //coord, coord, coord (start)
write_coord(Origin[1])
write_coord(Origin[2])
write_short(explosion)
write_byte(60)
write_byte(10)
write_byte(0)
message_end()
}
CreateDeathMessage(victim,attacker)
{
message_begin(MSG_ALL,MSG_DEATH)
write_byte(attacker)
write_byte(victim)
write_byte(0)
write_string("Jetpack Explosion")
message_end()
}
bool:IsGrenade(inflictor)
{
new bool:Grenade
static class[8]
pev(inflictor,pev_classname,class,7)
if(equal(class,"grenade"))
Grenade=true
return Grenade
}
bool:SameTeam(id,otherid)
{
if(get_pdata_int(id,114)==get_pdata_int(otherid,114))
return true
return false
}
AddPoints(id,Amount)
{
ExecuteHam(Ham_AddPoints,id,Amount,true)
}
AddDeaths(id,Amount)
{
set_pdata_int(id,444,get_pdata_int(id,444)+Amount)
}
DealJetpackDamage(victim,attacker,Float:damage)
{
ExecuteHam(Ham_TakeDamage,victim,attacker,attacker,damage,(1<<6)+(1<<13))
}