PHP Code:
/*
* Known bug: Only 1 explosion sprite effect is performed when there should be 12 explosions
*/
//--------------------------------------------------------------------------------------------------
#define MAXBOMBS 12 // Number of bombs
#define BETWEENTIME 10 // Must be greater or equal to 1
#define RADIUS 350 // Radius of bomb drops
#include <amxmodx> // Amx mod include definitions
#include <fun> // Fun Module
#include <amxmisc> // Useful functions
#include <engine> // Engine Plugin
#include <cstrike>
//--------------------------------------------------------------------------------------------------
// Declaring info variables
new PLUGIN[]="Extra Air Raid Strike"
new AUTHOR[]="roadrage, Edit by Sky-High"
new VERSION[]="1.2"
new inuse = 0 // variable to tell whether used already or not
new donebombs = MAXBOMBS // tells the engine how many bombs are finished dropping
new bombs[MAXBOMBS] // bomb array
new bool:g_hasAirRaid[33]
new Float:timers[MAXBOMBS] // timers array
new SpriteExplosion
new location[3]
//Extra Item Values
//new g_itemid_airraid
//new const g_item_name[] = { "Air Strike" }
//const g_item_cost = 25
//--------------------------------------------------------------------------------------------------
// initalize function
public plugin_init()
{
register_plugin(PLUGIN,VERSION,AUTHOR) // Register Function
register_clcmd("airstrike", "CMD_airraid")
//g_itemid_airraid = zp_register_extra_item(g_item_name, g_item_cost, ZP_TEAM_HUMAN)
//register_event("HLTV", "event_round_start", "a", "1=0", "2=0")
}
public plugin_natives()
{
register_native("airstrike_give", "Native_OnPurchase", 1)
}
public Native_OnPurchase(id)
{
OnItemPurchase(id)
}
//--------------------------------------------------------------------------------------------------
// Precache
public plugin_precache()
{
//precache_sound("ambience/siren.wav") // Siren Sound
precache_sound("ambience/jetflyby1.wav") // Fly By Sound
precache_model("models/rpgrocket.mdl") // Bomb Model
SpriteExplosion = precache_model("sprites/bexplo.spr") // precache explosion sprite
}
//--------------------------------------------------------------------------------------------------
// Player buys our upgrade
public OnItemPurchase(id)
{
g_hasAirRaid[id] = true
client_cmd(id, "bind v airstrike")
client_print(id, print_center, "You just bought an Air Strike press 'V' to call in a BOOM")
}
public client_connect(id)
{
g_hasAirRaid[id] = true
}
public client_disconnect(id)
{
g_hasAirRaid[id] = false
}
/*public event_round_start()
{
for (new i = 1; i <= 32; i++)
g_hasAirRaid[i] = false
}*/
public CMD_airraid(id) // Credit to CubicVirtuoso
{
new k
if (!is_user_alive(id) || cs_get_user_team(id) == CS_TEAM_T || !g_hasAirRaid[id]) // Checks if the command user has access
return PLUGIN_HANDLED
if (inuse == 1 && donebombs != MAXBOMBS)
{
client_print(id, print_center, "You must wait longer before calling another air strike")
return PLUGIN_HANDLED
}
new name[32];
get_user_name(id,name,31)
client_print(0, print_center, "%s just called in an air strike!! Take cover!!", name);
inuse = 1
//emit_sound(id,CHAN_AUTO, "ambience/siren.wav", 1.0, ATTN_NORM, 0, PITCH_NORM)
new Float:ftime
ftime = float(BETWEENTIME)
get_user_origin(id, location, 3) // storing the position where the player was looking at when he requested an airstrike, this is the location the bombs will fall
set_task(ftime, "ACT_resetraid")
set_task(5.0, "ACT_stopsound")
set_task(6.0, "ACT_flybysound", id)
set_task(6.0, "CRT_bomb", id)
g_hasAirRaid[id] = false
for (k = 0; k<MAXBOMBS; k++)
{
timers[k] = random_float(1.0,2.0)
}
return PLUGIN_HANDLED
}
public ACT_explodebomb(id,posistion)
{
new location[3]
new Float:Vec[3]
IVecFVec(location, Vec)
entity_get_vector(bombs[posistion], EV_VEC_origin, Vec)
FVecIVec(Vec, location)
location[2] = location[2] + 20
CRT_explosion(location, SpriteExplosion, 80, 10, 0)
REM_bomb(posistion)
new powner = entity_get_edict(id, EV_ENT_owner)
static playercount, players[32], player, m
get_players(players,playercount,"ae", "TERRORIST")
for ( m=0; m<playercount; m++)
{
player = players[m]
new playerlocation[3]
new resultdistance
new Float:damage = random_float(750.0 , 1500.0)
get_user_origin(player, playerlocation)
resultdistance = get_distance(playerlocation,location)
//if(resultdistance > 400 /*||cs_get_user_team(id) != CS_TEAM_T*/)
//return PLUGIN_HANDLED/
if(resultdistance < 400 /*|| cs_get_user_team(id) == CS_TEAM_T*/)
{
if( !is_valid_ent(powner) )
{
new szName[35]
get_user_name(powner, szName, charsmax(szName))
server_print("<<<<<<<<<DEBUG Get owner of the bombs is invalid: %i %s", powner, szName )
return PLUGIN_HANDLED
}
if(( get_user_health(player) - damage ) <= 0)
{
fakedamage(player,"Air Raid",damage,DMG_BLAST)
make_deathmsg(powner, player, 0, "Air Raid")
/* Give Kill rewards to player called the airstrike (powner) here
Exmple:
RPGx_GiveCredits(powner,1)
RPGx_AddXP(powner, floatround(damage*0.1))
*/
}
else {
fakedamage(player,"Air Raid",damage,DMG_BLAST)
/* Give Damage rewards to player called the airstrike (powner) here
Exmple:
RPGx_AddXP(powner, floatround(damage*0.15))
*/
}
new szName[35]
get_user_name(powner, szName, charsmax(szName))
server_print("DEBUG Owner of bombs:: %i , %s , id: %i", powner, szName, id )
}
}
return PLUGIN_CONTINUE
}
public REM_bomb(posistion)
{
remove_entity(bombs[posistion])
bombs[posistion] = 0
}
public CRT_bomb(id)
{
new randomlocation[3]
new endrandomlocation[3]
new randomx
new randomy
location[2] = location[2] + 500
donebombs = 0
for (new i=0; i<MAXBOMBS; i++)
{
randomx = random_num(-RADIUS,RADIUS)
randomy = random_num(-RADIUS,RADIUS)
randomlocation[0] = location[0]+1*randomx
randomlocation[1] = location[1]+1*randomy
randomlocation[2] = location[2]
new Float:LocVec[3]
IVecFVec(/*random*/location, LocVec) //change the integer location vector into a float vec and store it in LocVec*/
endrandomlocation[0] = randomlocation[0]
endrandomlocation[1] = randomlocation[1]
endrandomlocation[2] = randomlocation[2] - 5
new Float:EndVec[3]
IVecFVec(endrandomlocation, EndVec) //make the origin a float and store it in endvec
// outside max end of the targetted radius
new Float:VeloVec[3]
VeloVec[0] = (EndVec[0] - LocVec[0])*1+1
VeloVec[1] = (EndVec[1] - LocVec[1])*1+1
VeloVec[2] = (EndVec[2] - LocVec[2])*1+1
bombs[i] = create_entity("info_target") // creates the bombs
if (!bombs[i]) // if not exist
return PLUGIN_HANDLED
entity_set_string(bombs[i], EV_SZ_classname, "Bomb") // set name
entity_set_edict(bombs[i], EV_ENT_owner, id) // set owner
entity_set_int(bombs[i], EV_INT_solid, 1) // not a solid but interactive
entity_set_int(bombs[i], EV_INT_movetype, 6) // set move type to toss
entity_set_model(bombs[i], "models/rpgrocket.mdl") // enterance sprite
entity_set_origin(bombs[i], LocVec) // start posistion
entity_set_vector(bombs[i], EV_VEC_velocity, VeloVec) // follow velocity
DispatchSpawn(bombs[i]) // Dispatches the Fire
set_task(timers[i], "ACT_explodebomb", bombs[i])
}
/*for (new k = 0; k<MAXBOMBS; k++)
{
set_task(timers[k], "ACT_explodebomb", k)
}*/
return PLUGIN_CONTINUE
}
public ACT_resetraid()
{
inuse = 0
return PLUGIN_CONTINUE
}
public ACT_stopsound()
{
client_cmd(0,"stopsound") // stops sound on all clients
return PLUGIN_CONTINUE
}
public ACT_flybysound(id)
{
emit_sound(id,CHAN_AUTO, "ambience/jetflyby1.wav", 1.0, ATTN_NORM, 0, PITCH_NORM)
return PLUGIN_CONTINUE
}
public CRT_explosion(location[3], spritename, scale, framerate, flags)
{
message_begin( MSG_BROADCAST, SVC_TEMPENTITY)
write_byte(3) // TE_EXPLOSION
write_coord(location[0])
write_coord(location[1])
write_coord(location[2])
write_short(spritename)
write_byte(scale)
write_byte(framerate)
write_byte(flags)
message_end()
}