#include <amxmodx>
#include <amxmisc>
#include <fakemeta>
#include <cstrike>
#include <fakemeta_util>
#include <fun>
#define OFFSET_MONEY 115
#define ADMIN_CMD ADMIN_BAN
#define fm_find_ent_by_class(%1,%2) engfunc(EngFunc_FindEntityByString, %1, "classname", %2)
new const PLUGIN[] = "Deagle Nail Launcher";
new const VERSION[] = "2.7+";
new const AUTH[] = "GameMoon&CeDee";
new nail_MODEL[] = "models/nail.mdl";
new nail_SOUND[] = "misc/spike1.wav";
new trail[] = "sprites/smoke.spr";
new explode[] = "sprites/zerogxplode.spr";
new smokesZ[] = "sprites/steam1.spr";
new nail_classname[] = "deagle_nail";
new Float:was_nail[33];
new trail2, explode2, smokesZ2;
new g_toggle_enable, g_toggle_speed, g_toggle_delay, g_toggle_trail_width;
new g_toggle_admin_only, g_toggle_damageradius, g_toggle_nail_damage, g_maxplayers;
new gMsgID, gDmsgID, g_toggle_colormode, gMsgIDMoney, g_toggle_moneybonus, g_toggle_loosemoney;
new g_fragbonus, g_loosefrags;
new penz,ar,id2;
public plugin_init() {
register_plugin(PLUGIN, VERSION, AUTH);
register_forward(FM_Touch, "pfn_touch" );
register_forward(FM_StartFrame, "server_frame");
register_logevent("logevent_round_end", 2, "1=Round_End");
g_toggle_enable = register_cvar("nail_enable", "1");// 1-enabled/2-disabled
g_toggle_admin_only= register_cvar("nail_admin_only", "0");// set this to 1 from ADMINONLY
g_toggle_speed = register_cvar("nail_speed","600");// nail speed
g_toggle_delay = register_cvar("nail_delay","3.0"); // nail delay
g_toggle_damageradius = register_cvar("nail_damage_radius", "500");// nail explode radius damage
g_toggle_nail_damage = register_cvar("nail_damage", "200");// nail damage when hit someone
g_toggle_trail_width = register_cvar("nail_trail_width", "5");// trail width
g_toggle_colormode = register_cvar("nail_trail_colormode", "1");// 0-grey and 1- team color (default: 1 - team color)
g_toggle_moneybonus = register_cvar("nail_kill_money_bonus", "1000"); // the kill money bonus xD
g_toggle_loosemoney = register_cvar("nail_tk_loose_money", "5000");// -money if you kill a teammate :|
g_fragbonus = register_cvar("nail_fragbonus", "3"); // frag bonus when you kill some1 with nail
g_loosefrags = register_cvar("nail_loosefrags", "5"); // loose frags when you kill a teammmate :
ar = register_cvar("Ar","10000");
gMsgID = get_user_msgid("Damage");
gDmsgID = get_user_msgid("DeathMsg");
gMsgIDMoney = get_user_msgid("Money");
g_maxplayers = get_maxplayers();
register_clcmd("say /deagle","vasarlas");
register_clcmd("say_team /deagle","vasarlas");
}
public server_frame()
{
if(get_pcvar_num(g_toggle_enable) == 0)
return FMRES_IGNORED;
new id;
for(id = 1; id <= g_maxplayers; id++)
{
if(is_user_alive(id))
{
check_nails(id);
}
}
return FMRES_IGNORED;
}
public plugin_precache()
{
engfunc(EngFunc_PrecacheModel, nail_MODEL);
engfunc(EngFunc_PrecacheSound, nail_SOUND);
trail2 = engfunc(EngFunc_PrecacheModel, trail);
explode2 = engfunc(EngFunc_PrecacheModel, explode);
smokesZ2 = engfunc(EngFunc_PrecacheModel, smokesZ);
}
public check_nails(id)
{
if(get_pcvar_num(g_toggle_enable) == 0)
return PLUGIN_HANDLED;
new wpnid = get_user_weapon(id);
new button = pev(id, pev_button);
if(wpnid == CSW_DEAGLE && id==id2)
{
if(button & IN_ATTACK2)
{
launch_nail(id);
}
}
return PLUGIN_CONTINUE;
}
public launch_nail(id)
{
if(get_pcvar_num(g_toggle_admin_only) == 1)
{
if(!(get_user_flags(id) & ADMIN_CMD))
{
log_amx("[DNL] The plugin has been set just 4 admins!");
return PLUGIN_HANDLED;
}
}
new Float:nexTime = get_gametime();
if(was_nail[id] > nexTime)
{
return PLUGIN_CONTINUE;
}
else
{
new nail = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target"));
if(nail == 0)
return PLUGIN_CONTINUE;
set_pev(nail, pev_classname, nail_classname);
engfunc(EngFunc_SetModel, nail, nail_MODEL);
set_pev(nail, pev_size, Float:{0.0, 0.0, 0.0}, Float:{0.0, 0.0, 0.0});
set_pev(nail, pev_movetype, MOVETYPE_FLY);
set_pev(nail, pev_solid, SOLID_BBOX);
new Float:vSrc[3];
pev(id, pev_origin, vSrc);
new Float:Aim[3], Float:origin[3];
velocity_by_aim(id, 64, Aim);
pev(id,pev_origin,origin);
vSrc[0] += Aim[0];
vSrc[1] += Aim[1];
engfunc(EngFunc_SetOrigin, nail, vSrc);
new Float:velocity[3], Float:angles[3];
velocity_by_aim(id, get_pcvar_num(g_toggle_speed), velocity);
set_pev(nail, pev_velocity, velocity);
vector_to_angle(velocity, angles);
set_pev(nail, pev_angles, angles);
set_pev(nail, pev_owner,id);
set_pev(nail, pev_takedamage, 1.0);
message_begin(MSG_BROADCAST, SVC_TEMPENTITY);
write_byte(TE_BEAMFOLLOW);
write_short(nail);
write_short(trail2);
write_byte(25);
write_byte(get_pcvar_num(g_toggle_trail_width));
if(get_pcvar_num(g_toggle_colormode))
{
new r, g, b;
switch(get_user_team(id))
{
case 1:
{
r = 255;
g = 0;
b = 0;
}
case 2:
{
r = 0;
g = 0;
b = 255;
}
default:
{
r = 211;
g = 211;
b = 211;
}
}
write_byte(r);
write_byte(g);
write_byte(b);
}
else
{
write_byte(211);
write_byte(211);
write_byte(211);
}
write_byte(255);
message_end();
emit_sound(nail, CHAN_WEAPON, nail_SOUND, 1.0, ATTN_NORM, 0, PITCH_NORM);
was_nail[id] = nexTime + get_pcvar_float(g_toggle_delay);
}
return PLUGIN_CONTINUE;
}
public pfn_touch(ptr, ptd)
{
if(get_pcvar_num(g_toggle_enable) == 1)
{
if(pev_valid(ptr))
{
new classname[32];
pev(ptr, pev_classname, classname, 31);
if(equal(classname, nail_classname))
{
new Float:fOrigin[3];
new iOrigin[3];
pev(ptr, pev_origin, fOrigin);
FVecIVec(fOrigin,iOrigin);
nail_radius_damage(ptr);
message_begin(MSG_BROADCAST,SVC_TEMPENTITY,iOrigin);
write_byte(TE_EXPLOSION);
write_coord(iOrigin[0]);
write_coord(iOrigin[1]);
write_coord(iOrigin[2]);
write_short(explode2);
write_byte(30);
write_byte(15);
write_byte(0);
message_end();
message_begin(MSG_BROADCAST, SVC_TEMPENTITY);
write_byte(TE_SMOKE);
write_coord(iOrigin[0]);
write_coord(iOrigin[1]);
write_coord(iOrigin[2]);
write_short(smokesZ2);
write_byte(40);
write_byte(5);
message_end();
engfunc(EngFunc_RemoveEntity, ptr);
}
}
}
}
public logevent_round_end()
{
if(get_pcvar_num(g_toggle_enable) == 1)
{
new ent = -1;
while((ent = fm_find_ent_by_class(ent, nail_classname)))
engfunc(EngFunc_RemoveEntity, ent);
}
}
stock nail_radius_damage(entity)
{
new id = pev(entity, pev_owner);
new i;
for(i = 1; i <= g_maxplayers; i++)
{
if(is_user_alive(i))
{
new dist = floatround(fm_entity_range(entity,i));
if(dist <= get_pcvar_num(g_toggle_damageradius))
{
new hp = get_user_health(i);
new Float:damage = get_pcvar_float(g_toggle_nail_damage)-(get_pcvar_float(g_toggle_nail_damage) / get_pcvar_float(g_toggle_damageradius))*float(dist);
new Origin[3];
get_user_origin(i,Origin);
if(!get_cvar_num("mp_friendlyfire"))
{
if(get_user_team(id) != get_user_team(i))
{
if(hp > damage)
{
nail_take_damage(i, floatround(damage), Origin, DMG_BLAST);
}
else
{
nail_kill(id, i, "** Deagle-Nail **", 0);
}
}
}
}
}
}
}
stock nail_take_damage(victim,damage,origin[3],bit)
{
message_begin(MSG_ONE_UNRELIABLE, gMsgID,{0,0,0}, victim);
write_byte(21);
write_byte(20);
write_long(bit);
write_coord(origin[0]);
write_coord(origin[1]);
write_coord(origin[2]);
message_end();
message_begin(MSG_BROADCAST, SVC_TEMPENTITY);
write_byte(TE_LAVASPLASH);
write_coord(origin[0]);
write_coord(origin[1]);
write_coord(origin[2]);
message_end();
fm_set_user_health(victim, get_user_health(victim) - damage);
}
stock nail_kill(killer, victim, weapon[],headshot)
{
set_msg_block(gDmsgID , BLOCK_ONCE);
user_kill(victim, 1);
set_msg_block(gDmsgID, BLOCK_NOT);
message_begin(MSG_ALL, gDmsgID, {0,0,0}, 0);
write_byte(killer);
write_byte(victim);
write_byte(headshot);
write_string(weapon);
message_end();
new money = fm_get_user_money(killer);
if(get_user_team(killer)!= get_user_team(victim))
{
fm_set_user_frags(killer,get_user_frags(killer) + get_pcvar_num(g_fragbonus));
fm_set_user_money(killer, money + get_pcvar_num(g_toggle_moneybonus));
}
else
{
fm_set_user_frags(killer,get_user_frags(killer) - get_pcvar_num(g_loosefrags));
fm_set_user_money(killer, money - get_pcvar_num(g_toggle_loosemoney));
}
return 1;
}
stock fm_get_user_money( index )
{
new money = get_pdata_int(index, OFFSET_MONEY);
return money;
}
stock fm_set_user_money(index, money, flash = 1)
{
set_pdata_int(index, OFFSET_MONEY, money);
fm_set_money(index, money, flash);
return 1;
}
stock fm_set_money(index, money, flash)
{
message_begin( MSG_ONE_UNRELIABLE, gMsgIDMoney, {0, 0, 0}, index);
write_long(money);
write_byte(flash ? 1 : 0);
message_end();
}
public vasarlas(id)
{
penz = cs_get_user_money(id);
if(penz>=get_pcvar_num(ar))
{
cs_set_user_money(id,penz - get_pcvar_num(ar));
if(is_user_alive(id))
{
give_item(id, "weapon_deagle")
}
id2 = id;
} else {
client_print(id,print_chat,"Nincs eleg penzed");
}
}
/* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
*{\\ rtf1\\ ansi\\ deff0{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ lang1038\\ f0\\ fs16 \n\\ par }