Code:
#include <amxmodx>
#include <amxmisc>
#include <engine>
#include <engine_stocks>
#include <string>
#include <fun>
#include <harbu>
#define Author "James J. Kelly Jr."
#define Version "FINAL"
#define Plugin "FireMod"
#define Sprite "sprites/afire.spr"
#define Sprite_Smoke "sprites/steam1.spr"
#define Sprite_Scale 0.80
#define Sprite_Offset (Sprite_Scale * (Sprite_Scale * 100))+12
#define Sprite_Framerate 10.0
#define Burning_Sound "ambience/fire.wav"
#define Extinguisher_Sound "fire_ext.wav"
#define Painful_Sound "player/pl_fallpain3.wav"
#define SOUND_STOP (1<<5)
#define DAMAGE_BURN 8
#define MAX_FLAMES 200
#define FLAME_INDEX_INDEX 0
#define FLAME_INDEX_HEALTH 1
#define FLAME_INDEX_SPREAD 2
#define FLAME_INDEX_LIFETIME 3
#define FLAME_INDEX_SMOKE 4
#define PI 3.14159265358979323846
new smoke = 0;
new gPlayerLastExtinguish[32];
new gFlames[MAX_FLAMES][5];
new mcfdjobs[2];
new Float:cosTable[361];
new Float:sinTable[361];
public plugin_init()
{
register_plugin(Plugin,Version,Author);
for( new i = 0; i < 361; i++ )
{
cosTable[i] = floatcos(float(i));
sinTable[i] = floatsin(float(i));
}
register_cvar("fire_max_flames","200");
register_cvar("rp_item_extinguisher","1");
register_cvar("rp_fire_jobid_mcfd","50 54");
register_event("DeathMsg","client_death","a");
register_srvcmd("server_spawnflame","server_spawnflame");
register_srvcmd("item_fire","item_fire");
register_srvcmd("item_extinguisher","item_extinguisher");
register_clcmd("say","sayHandle");
register_concmd("amx_createflame","admin_createflame",ADMIN_BAN,"Creates a flame at the specified position");
register_concmd("amx_extinguish","admin_extinguish",ADMIN_BAN,"Extinguishes all the fires in the map");
register_concmd("amx_entity","admin_entity",ADMIN_ALL,"Displays information on the given entity");
server_cmd("exec addons/amxmodx/configs/firemod.cfg");
server_cmd("exec addons/amxmodx/configs/HarbuRP/harbu_rp_config.cfg");
cvar_to_array("rp_fire_jobid_mcfd",31,mcfdjobs,2);
//set_task(1.0,"flameEffect",0,"",0,"b");
set_task(1.0,"timer",0,"",0,"b");
}
public plugin_precache()
{
precache_model(Sprite);
smoke = precache_model(Sprite_Smoke);
precache_sound(Burning_Sound);
precache_sound(Extinguisher_Sound);
precache_sound(Painful_Sound);
}
public plugin_credits(id)
{
client_print(id,engprint_console,"/*=======================================*\^n");
client_print(id,engprint_console,"|* FireMod *|^n");
client_print(id,engprint_console,"|*=======================================*|^n");
client_print(id,engprint_console,"|* ©Copyright 2006 by James J. Kelly Jr. *|^n");
client_print(id,engprint_console,"\*=======================================*/^n");
return PLUGIN_HANDLED;
}
public client_putinserver(id)
{
set_task(8.0,"plugin_credits",id);
}
public client_connect(id)
{
gPlayerLastExtinguish[id] = 0;
}
public client_disconnect(id)
{
gPlayerLastExtinguish[id] = 0;
}
public client_death()
{
new id = read_data(2);
gPlayerLastExtinguish[id] = 0;
}
public item_use(id,itemid)
{
callfunc_begin ("item_use","HarbuRPAlpha.amxx");
callfunc_push_int(id);
callfunc_push_int(itemid);
callfunc_end();
return PLUGIN_HANDLED;
}
public Float:degtorad(Float:angle)
{
return angle * PI / 180;
}
public Float:radtodeg(Float:angle)
{
return angle * 180 / PI;
}
public sayHandle(id)
{
new buffer[256], strArguments[3][32];
read_argv(1,buffer,255)
parse(buffer,strArguments[0],31,strArguments[1],31,strArguments[2],31);
if( equali(strArguments[0],"/extinguisher") )
{
item_use(id,get_cvar_num("rp_item_extinguisher"));
return PLUGIN_HANDLED;
}
return PLUGIN_CONTINUE;
}
public effectSmoke(spriteindex,origin[])
{
message_begin(MSG_BROADCAST,SVC_TEMPENTITY);
write_byte(5);
write_coord(origin[0]);
write_coord(origin[1]);
write_coord(origin[2]);
write_short(spriteindex);
write_byte(10);
write_byte(15);
message_end();
return PLUGIN_HANDLED;
}
public effectSmokeCloud(spriteindex,spritecount,origin[])
{
for( new i = 0; i < spritecount; i++ )
{
new Float:fsmokeOrigin[3];
fsmokeOrigin[0] = float(origin[0]);
fsmokeOrigin[1] = float(origin[1]);
fsmokeOrigin[2] = float(origin[2]+random_num(-90,50));
new smokeDistance = random_num(10,60);
new angle = random_num(0,360);
fsmokeOrigin[0] += cosTable[angle] * smokeDistance;
fsmokeOrigin[1] += sinTable[angle] * smokeDistance;
new smokeOrigin[3];
FVecIVec(fsmokeOrigin,smokeOrigin);
effectSmoke(spriteindex,smokeOrigin);
}
return PLUGIN_HANDLED;
}
public removeFlame(id)
{
emit_sound(gFlames[id][FLAME_INDEX_INDEX],CHAN_AUTO,Burning_Sound,1.0,ATTN_NORM,SOUND_STOP,PITCH_NORM);
if( is_valid_ent(gFlames[id][FLAME_INDEX_INDEX]) )
{
remove_entity(gFlames[id][FLAME_INDEX_INDEX]);
gFlames[id][FLAME_INDEX_INDEX] = 0;
}
return PLUGIN_HANDLED;
}
public getFlameCount()
{
new flameCount = 0;
for( new i = 0; i < MAX_FLAMES; i++ )
{
if( is_valid_ent(gFlames[i][FLAME_INDEX_INDEX]) ) flameCount += 1;
}
return flameCount;
}
public findFreeFlame()
{
for( new i = 0; i < MAX_FLAMES; i++ )
{
if( !is_valid_ent(gFlames[i][FLAME_INDEX_INDEX]) ) return i;
}
return -1;
}
public timer()
{
flameEffect();
flameDamage();
flameSpread();
new player[32], playerCount;
get_players(player,playerCount,"ac");
for( new i = 0; i < playerCount; i++ )
{
gPlayerLastExtinguish[player[i]] -= 1;
if( gPlayerLastExtinguish[player[i]] < 0 ) gPlayerLastExtinguish[player[i]] = 0;
}
return PLUGIN_HANDLED;
}
public flameEffect()
{
for( new i = 0; i < MAX_FLAMES; i++ )
{
if( is_valid_ent(gFlames[i][FLAME_INDEX_INDEX]) )
{
gFlames[i][FLAME_INDEX_SMOKE] -= 1;
if( gFlames[i][FLAME_INDEX_SMOKE] <= 0 )
{
gFlames[i][FLAME_INDEX_SMOKE] = random_num(5,10);
new entOrigin[3];
new Float:fentOrigin[3];
entity_get_vector(gFlames[i][FLAME_INDEX_INDEX],EV_VEC_origin,fentOrigin);
FVecIVec(fentOrigin,entOrigin);
effectSmokeCloud(smoke,random_num(1,5),entOrigin);
}
}
}
return PLUGIN_HANDLED;
}
public flameSpread()
{
for( new i = 0; i < MAX_FLAMES; i++ )
{
if( is_valid_ent(gFlames[i][FLAME_INDEX_INDEX]) )
{
gFlames[i][FLAME_INDEX_SPREAD] -= 1;
if( getFlameCount() >= get_cvar_num("fire_max_flames") || getFlameCount() >= MAX_FLAMES )
{
gFlames[i][FLAME_INDEX_SPREAD] = 1;
}
else if( gFlames[i][FLAME_INDEX_SPREAD] == 0 )
{
new Float:entPosition[3];
entity_get_vector(gFlames[i][FLAME_INDEX_INDEX],EV_VEC_origin,entPosition);
new entDistance = random_num(40,120);
new angle = random_num(0,360);
entPosition[0] += cosTable[angle] * entDistance;
entPosition[1] += sinTable[angle] * entDistance;
if( PointContents(entPosition) == CONTENTS_EMPTY )
{
new newPosition[3];
FVecIVec(entPosition,newPosition);
drop_fire(newPosition);
}
else
{
gFlames[i][FLAME_INDEX_SPREAD] = 1;
}
}
if ( gFlames[i][FLAME_INDEX_SPREAD] < -1 ) gFlames[i][FLAME_INDEX_SPREAD] = -1;
gFlames[i][FLAME_INDEX_LIFETIME] -= 1;
if( gFlames[i][FLAME_INDEX_LIFETIME] <= 0 || gFlames[i][FLAME_INDEX_HEALTH] <= 0 )
{
removeFlame(i);
}
}
}
return PLUGIN_HANDLED;
}
public flameDamage()
{
new player[32], playerCount;
get_players(player,playerCount,"ac");
new bool:playerInjured[32];
for( new i = 0; i < MAX_FLAMES; i++ )
{
for( new j = 0; j < playerCount; j++ )
{
new playerId = player[j];
new playerOrigin[3];
get_user_origin(playerId,playerOrigin);
if( is_valid_ent(gFlames[i][FLAME_INDEX_INDEX]) )
{
new entOrigin[3];
new Float:fentOrigin[3];
entity_get_vector(gFlames[i][FLAME_INDEX_INDEX],EV_VEC_origin,fentOrigin);
FVecIVec(fentOrigin,entOrigin);
if( !playerInjured[playerId] && get_distance(playerOrigin,entOrigin) <= 100 )
{
emit_sound(playerId, CHAN_ITEM, Painful_Sound, 1.0, ATTN_NORM, 0, PITCH_NORM);
new playerHealth = get_user_health(playerId);
new playerJob = get_user_job(playerId);
if( playerJob >= mcfdjobs[0] && playerJob <= mcfdjobs[1] )
{
playerHealth -= random_num(5,8);
}
else
{
playerHealth -= random_num(10,15);
}
playerInjured[playerId] = true;
fakedamage(playerId,"Fire",float(random_num(10,15)),DAMAGE_BURN);
if( playerHealth <= 0 )
{
user_silentkill(playerId);
client_print(playerId,print_chat,"[FireMod] You have burned to death!^n");
}
else
{
set_user_health(playerId,playerHealth);
}
}
}
}
}
return PLUGIN_HANDLED;
}
public drop_fire(entOrigin[3])
{
if( getFlameCount() >= get_cvar_num("fire_max_flames") || getFlameCount() >= MAX_FLAMES ) return -1;
new flameIndex = findFreeFlame();
if( flameIndex < 0 ) return -1;
new entId = create_entity("env_sprite");
if( !entId ) return PLUGIN_HANDLED;
entity_set_string(entId,EV_SZ_classname,"item_fire");
DispatchKeyValue(entId,"spawnflags","1");
entity_set_float(entId,EV_FL_framerate,Sprite_Framerate);
entity_set_float(entId,EV_FL_scale,Sprite_Scale);
entity_set_float(entId,EV_FL_renderamt,200.0);
entity_set_float(entId,EV_FL_max_health,99999.0);
entity_set_float(entId,EV_FL_health,99999.0);
entity_set_int(entId,EV_INT_rendermode,5);
entity_set_int(entId,EV_INT_solid,SOLID_TRIGGER);
entity_set_int(entId,EV_INT_movetype,MOVETYPE_NONE);
entity_set_string(entId,EV_SZ_model,Sprite);
new Float:minBox[3] = { -2.5, -2.5, -2.5 };
new Float:maxBox[3] = { 2.5, 2.5, -2.5 };
entity_set_size(entId,minBox,maxBox);
new Float:fentOrigin[3];
IVecFVec(entOrigin,fentOrigin);
entity_set_vector(entId,EV_VEC_origin,fentOrigin);
drop_to_floor(entId);
entity_get_vector(entId,EV_VEC_origin,fentOrigin);
fentOrigin[2] += Sprite_Offset;
entity_set_vector(entId,EV_VEC_origin,fentOrigin);
DispatchSpawn(entId);
gFlames[flameIndex][FLAME_INDEX_INDEX] = entId;
gFlames[flameIndex][FLAME_INDEX_HEALTH] = random_num(6,18);
gFlames[flameIndex][FLAME_INDEX_SPREAD] = random_num(10,20);
gFlames[flameIndex][FLAME_INDEX_LIFETIME] = random_num(300,600);
gFlames[flameIndex][FLAME_INDEX_SMOKE] = random_num(5,10);
emit_sound(entId,CHAN_AUTO,Burning_Sound,1.0,ATTN_NORM,0,PITCH_NORM);
return entId;
}
/*
public natv_firemod_drop_fire(origin[3])
{
param_convert(1);
return drop_fire(origin);
}
*/
public admin_entity(id)
{
new strArguments[1][32];
read_argv(1,strArguments[0],31);
new numArguments[1];
numArguments[0] = str_to_num(strArguments[0]);
if( !is_valid_ent(numArguments[0]) )
{
client_print(id,print_console,"Specified entity is invalid!");
return PLUGIN_HANDLED;
}
new className[32];
new target[32], targetName[32];
entity_get_string(numArguments[0],EV_SZ_classname,className,31);
entity_get_string(numArguments[0],EV_SZ_target,target,31);
entity_get_string(numArguments[0],EV_SZ_targetname,targetName,31);
client_print(id,print_console,"ID: %i^n",numArguments[0]);
client_print(id,print_console,"Class: %s^n",className);
client_print(id,print_console,"Name: %s^n",targetName);
client_print(id,print_console,"Target: %s^n",target);
return PLUGIN_HANDLED;
}
public server_spawnflame()
{
new strArguments[3][32];
read_argv(1,strArguments[0],31);
read_argv(2,strArguments[1],31);
read_argv(3,strArguments[2],31);
if( equali(strArguments[0],"") || equali(strArguments[1],"") || equali(strArguments[2],"") )
{
server_print("[FireMod] Usage: server_spawnflame <x> <y> <z>^n");
return PLUGIN_HANDLED;
}
new flameOrigin[3];
flameOrigin[0] = str_to_num(strArguments[0]);
flameOrigin[1] = str_to_num(strArguments[1]);
flameOrigin[2] = str_to_num(strArguments[2]);
drop_fire(flameOrigin);
return PLUGIN_HANDLED;
}
public admin_createflame(id)
{
if( !(get_user_flags(id) & ADMIN_BAN) )
{
client_print(id,print_console,"[FireMod] You do not have access to this command!^n");
return PLUGIN_HANDLED;
}
new strArguments[3][32];
read_argv(1,strArguments[0],31);
read_argv(2,strArguments[1],31);
read_argv(3,strArguments[2],31);
if( equali(strArguments[0],"") || equali(strArguments[1],"") || equali(strArguments[2],"") )
{
client_print(id,print_console,"[FireMod] Usage: amx_createflame <x> <y> <z>^n");
return PLUGIN_HANDLED;
}
new flameOrigin[3];
flameOrigin[0] = str_to_num(strArguments[0]);
flameOrigin[1] = str_to_num(strArguments[1]);
flameOrigin[2] = str_to_num(strArguments[2]);
new entId = drop_fire(flameOrigin);
if( entId > 0 )
{
client_print(id,print_console,"[FireMod] Created flame successfully!^n");
}
else
{
client_print(id,print_console,"[FireMod] Flame creation unsuccessful!^n");
}
return PLUGIN_HANDLED;
}
public admin_extinguish(id)
{
if( !(get_user_flags(id) & ADMIN_BAN) )
{
client_print(id,print_console,"[FireMod] You do not have access to this command!^n");
return PLUGIN_HANDLED;
}
new entityRemoved;
for( new i = 0; i < MAX_FLAMES; i++ )
{
if( is_valid_ent(gFlames[i][FLAME_INDEX_INDEX]) )
{
removeFlame(i);
entityRemoved += 1;
}
}
client_print(id,print_console,"[FireMod] %i flames extinguished!",entityRemoved);
return PLUGIN_HANDLED;
}
public item_fire()
{
new strArguments[1][64];
read_argv(1,strArguments[0],63);
if( equali(strArguments[0],"") ) return PLUGIN_HANDLED;
new numArguments[1];
numArguments[0] = str_to_num(strArguments[0]);
if( !(is_user_connected(numArguments[0]) && is_user_alive(numArguments[0])) ) return PLUGIN_HANDLED;
if( getFlameCount() >= get_cvar_num("fire_max_flames") || getFlameCount() >= MAX_FLAMES )
{
client_print(numArguments[0],print_chat,"[FireMod] Server has reached maximum allowed flame limit!");
return PLUGIN_HANDLED;
}
new entOrigin[3];
get_user_origin(numArguments[0],entOrigin);
new entCount = random_num(1,1);
for( new i = 0; i < entCount; i++ )
{
new Float:entPosition[3];
IVecFVec(entOrigin,entPosition);
new entDistance = random_num(40,50);
new angle = random_num(0,360);
entPosition[0] += cosTable[angle] * entDistance;
entPosition[1] += sinTable[angle] * entDistance;
if( PointContents(entPosition) == CONTENTS_EMPTY )
{
new newPosition[3];
FVecIVec(entPosition,newPosition);
drop_fire(newPosition);
}
}
return PLUGIN_HANDLED;
}
public item_extinguisher()
{
new strArguments[3][64];
read_argv(1,strArguments[0],63);
read_argv(2,strArguments[1],63);
read_argv(3,strArguments[2],63);
if( equali(strArguments[0],"") || equali(strArguments[1],"") || equali(strArguments[2],"") ) return PLUGIN_HANDLED;
new numArguments[3];
numArguments[0] = str_to_num(strArguments[0]);
numArguments[1] = str_to_num(strArguments[1]);
numArguments[2] = str_to_num(strArguments[2]);
if( !(is_user_connected(numArguments[0]) && is_user_alive(numArguments[0])) ) return PLUGIN_HANDLED;
if( gPlayerLastExtinguish[numArguments[0]] > 0 ) return PLUGIN_HANDLED;
new playerOrigin[3];
get_user_origin(numArguments[0],playerOrigin);
new entityFound = 0;
for( new i = 0; i < MAX_FLAMES; i++ )
{
if( is_valid_ent(gFlames[i][FLAME_INDEX_INDEX]) )
{
new Float:fentityOrigin[3];
entity_get_vector(gFlames[i][FLAME_INDEX_INDEX],EV_VEC_origin,fentityOrigin);
new entityOrigin[3];
FVecIVec(fentityOrigin,entityOrigin);
if( get_distance(playerOrigin,entityOrigin) <= 140 )
{
gFlames[i][FLAME_INDEX_HEALTH] -= numArguments[1];
entityFound += 1;
effectSmokeCloud(smoke,random_num(3,6),entityOrigin);
}
}
}
if( entityFound <= 0 )
{
client_print(numArguments[0],print_chat,"[FireMod] You must be near flames!^n");
}
else
{
emit_sound(numArguments[0],CHAN_ITEM,Extinguisher_Sound,1.0,ATTN_NORM,0,PITCH_NORM);
gPlayerLastExtinguish[numArguments[0]] = numArguments[2];
}
return PLUGIN_HANDLED;
}
Can anyone have enough courtesy and generosity to break this down so i can understand it ? The only reason i chose this is because all the future plugins i planned to make will be similar to this, i have tried searching parts up but no results...THANKS ALLLOT TO WHOEVER DOES IT FOR ME...Thank you