#include <amxmodx>
#include <amxmisc>
#include <cstrike>
#include <engine>
#include <fakemeta>
#include <fakemeta_util>
#include <hamsandwich>
#define PLUGIN "Weapons Menu"
#define VERSION "1.0"
#define AUTHOR "Aragon*"
#define VIP_LEVEL ADMIN_LEVEL_H
//------| Weapons Menu |------//
#define DMG_HEGRENADE (1<<24)
new Menu, Shell, BloodSpray, BloodDrop, bool:HaveWeapons[33], Float:cl_pushangle[33][3];
new PrimaryWeapons[][][] = {
{ "M4A1", "weapon_m4a1" },
{ "AK47", "weapon_ak47" },
{ "M3", "weapon_m3" },
{ "AUG", "weapon_aug" },
{ "Famas", "weapon_famas" },
{ "MP5 Navy", "weapon_mp5navy" },
{ "XM1014", "weapon_xm1014" }
}
new Grenades[][] = {
"weapon_hegrenade",
"weapon_flashbang"//,
//"weapon_smokegrenade"
}
#define AK47GOLD_WEAPONKEY 109
#define weapon_ak47gold "weapon_aug"
#define CSW_AK47GOLD CSW_AUG
new AK47GoldModel_V[] = "models/v_ak47gold.mdl";
new AK47GoldModel_P[] = "models/p_ak47gold.mdl";
new AK47GoldModel_W[] = "models/w_ak47gold.mdl";
new AK47Gold_Sound[][] = {
"weapons/ak47-1.wav",
"weapons/ak47-2.wav"
};
new bool:HaveAK47Gold[33], AK47CaseNum, Bullets[33], BulletSprite, ak47gold_clip[33], ak47gold_reload[33], ak47gold_event;
new ak47golddamage, ak47goldclip, ak47goldreloadtime, ak47goldrecoil;
public plugin_init() {
RegisterHam(Ham_Spawn, "player", "HAM_Spawn_Post", 1);
Shell = engfunc(EngFunc_PrecacheModel, "models/rshell.mdl");
// AK47 Gold
register_clcmd("weapon_ak47gold", "Hook_AK47Gold");
register_message(get_user_msgid("DeathMsg"), "AK47Gold_DeathMsg");
register_event("CurWeapon", "AK47Gold_ViewModel", "be", "1=1");
register_event("CurWeapon", "AK47Gold_MakeTracer", "be", "1=1", "3>0")
register_event("WeapPickup","AK47Gold_ViewModel","b","1=19");
register_forward(FM_SetModel, "AK47Gold_WorldModel");
register_forward(FM_UpdateClientData, "AK47Gold_UpdateClientData_Post", 1);
register_forward(FM_PlaybackEvent, "AK47Gold_PlaybackEvent");
RegisterHam(Ham_TakeDamage, "player", "AK47Gold_TakeDamage");
RegisterHam(Ham_TraceAttack, "worldspawn", "AK47Gold_TraceAttack_Post", 1);
RegisterHam(Ham_TraceAttack, "player", "AK47Gold_TraceAttack_Post", 1);
RegisterHam(Ham_TraceAttack, "func_breakable", "AK47Gold_TraceAttack_Post", 1);
RegisterHam(Ham_TraceAttack, "func_wall", "AK47Gold_TraceAttack_Post", 1);
RegisterHam(Ham_TraceAttack, "func_door", "AK47Gold_TraceAttack_Post", 1);
RegisterHam(Ham_TraceAttack, "func_door_rotating", "AK47Gold_TraceAttack_Post", 1);
RegisterHam(Ham_TraceAttack, "func_plat", "AK47Gold_TraceAttack_Post", 1);
RegisterHam(Ham_TraceAttack, "func_rotating", "AK47Gold_TraceAttack_Post", 1);
RegisterHam(Ham_Item_Deploy , weapon_ak47gold, "AK47Gold_Deploy_Post", 1);
RegisterHam(Ham_Weapon_PrimaryAttack, weapon_ak47gold, "AK47Gold_PrimaryAttack");
RegisterHam(Ham_Weapon_PrimaryAttack, weapon_ak47gold, "AK47Gold_PrimaryAttack_Post", 1);
RegisterHam(Ham_Item_AddToPlayer, weapon_ak47gold, "AK47Gold_AddToPlayer");
RegisterHam(Ham_Weapon_Reload, weapon_ak47gold, "AK47Gold_Reload");
RegisterHam(Ham_Weapon_Reload, weapon_ak47gold, "AK47Gold_Reload_Post", 1);
RegisterHam(Ham_Item_PostFrame, weapon_ak47gold, "AK47Gold_PostFrame");
ak47golddamage = register_cvar("amx_ak47gold_damage", "45"); //| AK47 Gold Damage |//
ak47goldclip = register_cvar("amx_ak47gold_clip", "30"); //| AK47 Gold Clip |//
ak47goldreloadtime = register_cvar("amx_ak47gold_reload_time", "2.45"); //| AK47 Gold Reload Time |//
ak47goldrecoil = register_cvar("amx_ak47gold_recoil", "0.8"); //| AK47 Gold Recoil |//
}
public plugin_precache() {
BloodSpray = precache_model("sprites/bloodspray.spr");
BloodDrop = precache_model("sprites/blood.spr");
// AK47 Gold
register_forward(FM_PrecacheEvent, "AK47Gold_PrecacheEvent_Post", 1);
BulletSprite = precache_model("sprites/dot.spr")
precache_model(AK47GoldModel_V);
precache_model(AK47GoldModel_P);
precache_model(AK47GoldModel_W);
for(new i = 0; i < sizeof(AK47Gold_Sound); i++)
engfunc(EngFunc_PrecacheSound, AK47Gold_Sound);
}
public plugin_natives() {
// AK47 Gold
register_native("get_user_ak47gold", "get_user_ak47gold", 1);
register_native("set_user_ak47gold", "set_user_ak47gold", 1);
}
public HAM_Spawn_Post(id) {
if(is_user_connected(id) && get_user_team(id) == 2) {
fm_strip_user_weapons(id);
HaveWeapons[id] = false
set_user_ak47gold(id, false);
Equipment(id)
}
}
public Equipment(id) {
if(is_user_alive(id) && get_user_team(id) == 2) {
Menu = menu_create("\rEquipment", "EquipmentCmd");
for(new i = 0; i < sizeof Grenades; ++i)
fm_give_item(id, Grenades);
new WeaponName[256], WeaponNum[256]
for(new i = 0; i < sizeof PrimaryWeapons; ++i) {
formatex(WeaponName,sizeof(WeaponName)-1,"\w%s", PrimaryWeapons[0]);
formatex(WeaponNum,sizeof(WeaponNum)-1,"%d", i);
menu_additem(Menu, WeaponName, WeaponNum, 0);
}
menu_addblank(Menu, 0);
if(get_user_flags(id) & VIP_LEVEL)
formatex(WeaponName,sizeof(WeaponName)-1,"\yAK47 Gold");
else
formatex(WeaponName,sizeof(WeaponName)-1,"\dAK47 Gold - \rOnly VIP");
formatex(WeaponNum,sizeof(WeaponNum)-1,"%d", sizeof PrimaryWeapons + 1);
AK47CaseNum = str_to_num(WeaponNum)
menu_additem(Menu, WeaponName, WeaponNum, 0);
menu_setprop(Menu, MPROP_PERPAGE, 0)
menu_setprop(Menu, MPROP_EXIT, MEXIT_NEVER)
menu_display(id, Menu, 0);
}
}
public EquipmentCmd(id, menu, item) {
if(item == MENU_EXIT) {
menu_destroy(menu);
Equipment(id)
return PLUGIN_HANDLED;
}
else if(!is_user_alive(id) || get_user_team(id) != 2) {
menu_destroy(menu);
return PLUGIN_HANDLED;
}
new Data[6], Name[64];
new Access, CallBack;
menu_item_getinfo(menu, item, Access, Data,5, Name, 63, CallBack);
new Key = str_to_num(Data);
if(Key == AK47CaseNum) {
if(get_user_flags(id) & VIP_LEVEL) {
set_user_ak47gold(id, true);
fm_give_item(id, "weapon_deagle");
cs_set_user_bpammo(id, CSW_DEAGLE, 100);
HaveWeapons[id] = true
}
else {
menu_destroy(menu);
Equipment(id)
return PLUGIN_HANDLED;
}
}
else {
fm_give_item(id, PrimaryWeapons[Key][1]);
cs_set_user_bpammo(id, get_weaponid(PrimaryWeapons[Key][1]), 200)
fm_give_item(id, "weapon_deagle");
cs_set_user_bpammo(id, CSW_DEAGLE, 100);
HaveWeapons[id] = true
}
menu_destroy(menu);
return PLUGIN_HANDLED;
}
public AK47Gold_DeathMsg(msg_id, msg_dest, id) {
static TruncatedWeapon[33], Attacker, Victim;
get_msg_arg_string(4, TruncatedWeapon, charsmax(TruncatedWeapon));
Attacker = get_msg_arg_int(1);
Victim = get_msg_arg_int(2);
if(!is_user_connected(Attacker) || Attacker == Victim)
return PLUGIN_CONTINUE;
if(equal(TruncatedWeapon, "ak47") && get_user_weapon(Attacker) == CSW_AK47GOLD) {
if(get_user_ak47gold(Attacker))
set_msg_arg_string(4, "AK47 Gold");
}
return PLUGIN_CONTINUE;
}
public AK47Gold_ViewModel(id) {
if(get_user_weapon(id) == CSW_AK47GOLD && get_user_ak47gold(id)) {
set_pev(id, pev_viewmodel2, AK47GoldModel_V);
set_pev(id, pev_weaponmodel2, AK47GoldModel_P);
}
}
public AK47Gold_MakeTracer(id) {
if(get_user_weapon(id) == CSW_AK47GOLD && get_user_ak47gold(id)) {
new Clip, AK47Gold
AK47Gold = find_ent_by_owner(-1, weapon_ak47gold, id);
Clip = cs_get_weapon_ammo(AK47Gold);
if(Bullets[id] > Clip) {
static EndOrigin[3];
get_user_origin(id, EndOrigin, 4);
message_begin(MSG_BROADCAST,SVC_TEMPENTITY);
write_byte(TE_BEAMENTPOINT);
write_short(id | 0x1000);
write_coord(EndOrigin[0]); // Start X
write_coord(EndOrigin[1]); // Start Y
write_coord(EndOrigin[2]); // Start Z
write_short(BulletSprite); // Sprite
write_byte(0); // Start frame
write_byte(1); // Frame rate
write_byte(1); // Life
write_byte(20); // Line width
write_byte(0); // Noise
write_byte(255); // Red
write_byte(215); // Green
write_byte(0); // Blue
write_byte(150); // Brightness
write_byte(0); // Scroll speed
message_end();
}
Bullets[id] = Clip
}
}
public AK47Gold_WorldModel(entity, model[]) {
if(!is_valid_ent(entity))
return FMRES_IGNORED;
static ClassName[33];
entity_get_string(entity, EV_SZ_classname, ClassName, charsmax(ClassName));
if(!equal(ClassName, "weaponbox"))
return FMRES_IGNORED;
new Owner = entity_get_edict(entity, EV_ENT_owner);
new AK47Gold = find_ent_by_owner(-1, weapon_ak47gold, entity);
if(get_user_ak47gold(Owner) && is_valid_ent(AK47Gold) && equal(model, "models/w_ak47.mdl")) {
entity_set_int(AK47Gold, EV_INT_impulse, AK47GOLD_WEAPONKEY);
HaveAK47Gold[Owner] = false;
entity_set_model(entity, AK47GoldModel_W);
return FMRES_SUPERCEDE;
}
return FMRES_IGNORED;
}
public AK47Gold_UpdateClientData_Post(id, sendweapons, cd_handle) {
if(is_user_alive(id) && is_user_connected(id)) {
if(get_user_weapon(id) == CSW_AK47GOLD && get_user_ak47gold(id))
set_cd(cd_handle, CD_flNextAttack, halflife_time() + 0.001);
}
}
public AK47Gold_PlaybackEvent(flags, invoker, eventid, Float:delay, Float:origin[3], Float:angles[3], Float:fparam1, Float:fparam2, iParam1, iParam2, bParam1, bParam2) {
if(!is_user_connected(invoker))
return FMRES_IGNORED;
if(eventid != ak47gold_event)
return FMRES_IGNORED;
playback_event(flags | FEV_HOSTONLY, invoker, eventid, delay, origin, angles, fparam1, fparam2, iParam1, iParam2, bParam1, bParam2);
return FMRES_SUPERCEDE;
}
public AK47Gold_PrecacheEvent_Post(type, const name[]) {
if (equal("events/mp5navy.sc", name)) {
ak47gold_event = get_orig_retval();
return FMRES_HANDLED;
}
return FMRES_IGNORED;
}
public AK47Gold_TakeDamage(victim, inflictor, attacker, Float:damage, damagetype) {
if(is_user_connected(attacker) && !(damagetype & DMG_HEGRENADE)) {
new Body, Target, Float:NewDamage;
if(get_user_weapon(attacker) == CSW_AK47GOLD && get_user_ak47gold(attacker)) {
if(is_user_connected(victim)) {
get_user_aiming(attacker, Target, Body, 999999);
NewDamage = float(get_damage_body(Body, get_pcvar_float(ak47golddamage)));
SetHamParamFloat(4, NewDamage);
}
else {
SetHamParamFloat(4, get_pcvar_float(ak47golddamage));
}
}
}
}
public AK47Gold_TraceAttack_Post(ent, attacker, Float:Damage, Float:Dir[3], pentru, DamageType) {
if(!is_user_alive(attacker) || !is_user_connected(attacker))
return HAM_IGNORED;
if(get_user_weapon(attacker) != CSW_AK47GOLD)
return HAM_IGNORED;
if(!get_user_ak47gold(attacker))
return HAM_IGNORED;
static Float:End[3];
get_tr2(pentru, TR_vecEndPos, End);
Make_Bullet(attacker, End);
return HAM_HANDLED;
}
public AK47Gold_AddToPlayer(Weapon, id) {
if(is_valid_ent(Weapon) && is_user_connected(id) && entity_get_int(Weapon, EV_INT_impulse) == AK47GOLD_WEAPONKEY) {
HaveAK47Gold[id] = true;
entity_set_int(Weapon, EV_INT_impulse, 0);
}
}
public AK47Gold_Deploy_Post(entity) {
static Owner;
Owner = get_pdata_cbase(entity, 41, 4);
if(get_user_ak47gold(Owner)) {
set_pev(Owner, pev_viewmodel2, AK47GoldModel_V);
set_pev(Owner, pev_weaponmodel2, AK47GoldModel_P);
set_pdata_float(Owner, 83, 1.03, 5);
set_weapon_anim(Owner, 2);
static clip;
clip = cs_get_weapon_ammo(entity);
if(clip > 0)
ak47gold_reload[Owner] = 0;
}
}
public AK47Gold_PrimaryAttack(Weapon) {
new id = get_pdata_cbase(Weapon, 41, 4);
if (get_user_ak47gold(id)) {
pev(id,pev_punchangle,cl_pushangle[id]);
ak47gold_clip[id] = cs_get_weapon_ammo(Weapon);
}
}
public AK47Gold_PrimaryAttack_Post(Weapon) {
new id = get_pdata_cbase(Weapon, 41, 4);
new ActiveItem = get_pdata_cbase(id, 373) ;
if(ak47gold_clip[id] > 0 && pev_valid(ActiveItem)) {
if(is_user_alive(id) && get_user_ak47gold(id)) {
set_pdata_int(ActiveItem, 57, Shell, 4) ;
set_pdata_float(id, 111, get_gametime());
new Float:Push[3];
pev(id,pev_punchangle,Push);
xs_vec_sub(Push,cl_pushangle[id],Push);
xs_vec_mul_scalar(Push,get_pcvar_float(ak47goldrecoil),Push);
xs_vec_add(Push,cl_pushangle[id],Push);
set_pev(id,pev_punchangle,Push);
emit_sound(id, CHAN_WEAPON, AK47Gold_Sound[random_num(0,1)], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
set_weapon_anim(id, random_num(3,5));
}
}
}
public AK47Gold_Reload(ent) {
if(!pev_valid(ent))
return HAM_IGNORED;
new id;
id = pev(ent, pev_owner);
if(!is_user_alive(id) || !get_user_ak47gold(id))
return HAM_IGNORED;
ak47gold_clip[id] = -1;
new Ammo = cs_get_user_bpammo(id, CSW_AK47GOLD);
if(Ammo <= 0)
return HAM_SUPERCEDE;
new Clip = get_pdata_int(ent, 51, 4);
if(Clip >= get_pcvar_num(ak47goldclip))
return HAM_SUPERCEDE;
ak47gold_clip[id] = Clip;
ak47gold_reload[id] = 1;
return HAM_IGNORED;
}
public AK47Gold_Reload_Post(ent) {
if(!pev_valid(ent))
return HAM_IGNORED;
new id;
id = pev(ent, pev_owner);
if(!is_user_alive(id) || !get_user_ak47gold(id))
return HAM_IGNORED;
if(ak47gold_clip[id] == -1)
return HAM_IGNORED;
new Float:reload_time = get_pcvar_float(ak47goldreloadtime);
set_pdata_int(ent, 51, ak47gold_clip[id], 4);
set_pdata_float(ent, 48, reload_time, 4);
set_pdata_float(id, 83, reload_time, 5);
set_pdata_int(ent, 54, 1, 4);
set_weapon_anim(id, 1);
return HAM_IGNORED;
}
public AK47Gold_PostFrame(ent) {
if(!pev_valid(ent))
return HAM_IGNORED;
new id;
id = pev(ent, pev_owner);
if(!is_user_alive(id) || !get_user_ak47gold(id))
return HAM_IGNORED;
new Float:NextAttack = get_pdata_float(id, 83, 5);
new Ammo = cs_get_user_bpammo(id, CSW_AK47GOLD);
new Clip = get_pdata_int(ent, 51, 4);
new InReload = get_pdata_int(ent, 54, 4);
if(InReload && NextAttack <= 0.0) {
new Temp = min(get_pcvar_num(ak47goldclip) - Clip, Ammo);
set_pdata_int(ent, 51, Clip + Temp, 4);
cs_set_user_bpammo(id, CSW_AK47GOLD, Ammo - Temp);
set_pdata_int(ent, 54, 0, 4);
InReload = 0;
ak47gold_reload[id] = 0;
}
return HAM_IGNORED;
}
public Hook_AK47Gold(id) {
engclient_cmd(id, weapon_ak47gold);
}
public get_user_ak47gold(id) {
return HaveAK47Gold[id];
}
public set_user_ak47gold(id, ak47gold) {
if(ak47gold) {
if(!HaveAK47Gold[id]) {
HaveAK47Gold[id] = true;
ak47gold_reload[id] = 0;
fm_give_item(id, weapon_ak47gold);
new Clip = fm_get_user_weapon_entity(id, CSW_AK47GOLD);
cs_set_weapon_ammo(Clip, get_pcvar_num(ak47goldclip));
cs_set_user_bpammo(id, CSW_AK47GOLD, 200);
}
}
else {
if(HaveAK47Gold[id]) {
HaveAK47Gold[id] = false;
}
}
}
stock Make_Bullet(id, Float:Origin[3]) {
// Find target
new target, body;
get_user_aiming(id, target, body, 999999);
if(target > 0 && target <= get_maxplayers()) {
new Float:fStart[3], Float:fEnd[3], Float:fRes[3], Float:fVel[3];
pev(id, pev_origin, fStart);
velocity_by_aim(id, 64, fVel);
fStart[0] = Origin[0];
fStart[1] = Origin[1];
fStart[2] = Origin[2];
fEnd[0] = fStart[0]+fVel[0];
fEnd[1] = fStart[1]+fVel[1];
fEnd[2] = fStart[2]+fVel[2];
new res;
engfunc(EngFunc_TraceLine, fStart, fEnd, 0, target, res);
get_tr2(res, TR_vecEndPos, fRes);
message_begin(MSG_BROADCAST, SVC_TEMPENTITY) ;
write_byte(TE_BLOODSPRITE);
write_coord(floatround(fStart[0]));
write_coord(floatround(fStart[1]));
write_coord(floatround(fStart[2]));
write_short(BloodSpray);
write_short(BloodDrop);
write_byte(70);
write_byte(random_num(1,2));
message_end();
}
else {
new decal = 41;
if(target) {
message_begin(MSG_BROADCAST, SVC_TEMPENTITY);
write_byte(TE_DECAL);
write_coord(floatround(Origin[0]));
write_coord(floatround(Origin[1]));
write_coord(floatround(Origin[2]));
write_byte(decal);
write_short(target);
message_end();
}
else {
message_begin(MSG_BROADCAST, SVC_TEMPENTITY);
write_byte(TE_WORLDDECAL);
write_coord(floatround(Origin[0]));
write_coord(floatround(Origin[1]));
write_coord(floatround(Origin[2]));
write_byte(decal);
message_end();
}
message_begin(MSG_BROADCAST, SVC_TEMPENTITY);
write_byte(TE_GUNSHOTDECAL);
write_coord(floatround(Origin[0]));
write_coord(floatround(Origin[1]));
write_coord(floatround(Origin[2]));
write_short(id);
write_byte(decal);
message_end();
}
}
stock set_weapon_anim(id, anim) {
set_pev(id, pev_weaponanim, anim);
if(is_user_connected(id)) {
message_begin(MSG_ONE, SVC_WEAPONANIM, _, id);
write_byte(anim);
write_byte(pev(id, pev_body));
message_end();
}
}
stock get_damage_body(body, Float:damage) {
switch(body) {
case HIT_HEAD:
damage *= 1.3;
case HIT_STOMACH:
damage *= 1.0;
case HIT_CHEST:
damage *= 1.1;
case HIT_LEFTARM:
damage *= 0.7;
case HIT_RIGHTARM:
damage *= 0.7;
case HIT_LEFTLEG:
damage *= 0.75;
case HIT_RIGHTLEG:
damage *= 0.75;
default:
damage *= 1.0;
}
return floatround(damage);
}