balrog >
Code: Select all
/*================================================================================
--------------------------------
[ZE] Extra Item: Balrog Ethereal
--------------------------------
Balrog Ethereal
Copyright (C) 2017 by Crazy + ZE DEV TEAM
-------------------
-*- Description -*-
-------------------
This plugin add a new weapon into your zombie plague mod with
the name of Balrog Ethereal. That weapon launch a powerfull beams!
When the laser hit any object, a explosion effect with red color appers.
----------------
-*- Commands -*-
----------------
* zp_give_balrog_ethereal <target> - Give the item to target.
-------------
-*- Cvars -*-
-------------
* ze_balrog_ethereal_ammo <number> - Ammo amout.
* ze_balrog_ethereal_clip <number> - Clip amout. (Max: 100)
* ze_balrog_ethereal_one_round <0/1> - Only one round.
* ze_balrog_ethereal_damage <number> - Damage multiplier.
* ze_balrog_ethereal_unlimited <0/1> - Unlimited ammunition.
------------------
-*- Change Log -*-
------------------
* v1.5: (Mar 2017)
- Updated all the code, added explosion effect, added new cvars;
* v1.6: (Mar 2017)
- Added custom weapon hud;
---------------
-*- Credits -*-
---------------
* MeRcyLeZZ: for the nice zombie plague mod.
* Crazy: created the extra item code.
* deanamx: for the nice weapon model.
* And all zombie-mod players that use this weapon.
* ZE DEV TEAM : For converting this Item
=================================================================================*/
#include <zombie_escape>
#include <cstrike>
#include <engine>
/*================================================================================
[Plugin Customization]
=================================================================================*/
// Item Name
#define ITEM_NAME "Balrog Ethereal"
/*================================================================================
Customization ends here! Yes, that's it. Editing anything beyond
here is not officially supported. Proceed at your own risk...
=================================================================================*/
new const PLUGIN_VERSION[] = "v1.6";
new const V_BALROG_MDL[64] = "models/zombie_escape/v_balrog_ethereal.mdl";
new const P_BALROG_MDL[64] = "models/zombie_escape/p_balrog_ethereal.mdl";
new const W_BALROG_MDL[64] = "models/zombie_escape/w_balrog_ethereal.mdl";
new const BALROG_SOUNDS[][] = { "weapons/ethereal_shoot.wav", "weapons/ethereal_reload.wav", "weapons/ethereal_idle1.wav", "weapons/ethereal_draw.wav" };
new g_has_balrog[33], g_laser_sprite, g_balrog_exp, g_balrog, g_event_balrog, g_playername[33][32], g_maxplayers, g_primary_attack, g_balrog_reload_clip[33], cvar_balrog_clip, cvar_balrog_ammo, cvar_balrog_damage, cvar_balrog_oneround, cvar_balrog_unlimited;
const BALROG_KEY = 0982478;
const m_iClip = 51;
const m_flNextAttack = 83;
const m_fInReload = 54;
const OFFSET_WEAPON_OWNER = 41;
const OFFSET_LINUX_WEAPONS = 4;
const OFFSET_LINUX = 5;
const OFFSET_ACTIVE_ITEM = 373;
const WEAPON_BITSUM = ((1<<CSW_SCOUT) | (1<<CSW_XM1014) | (1<<CSW_MAC10) | (1<<CSW_AUG) | (1<<CSW_UMP45) | (1<<CSW_SG550) | (1<<CSW_P90) | (1<<CSW_FAMAS) | (1<<CSW_AWP) | (1<<CSW_MP5NAVY) | (1<<CSW_M249) | (1<<CSW_M3) | (1<<CSW_M4A1) | (1<<CSW_TMP) | (1<<CSW_G3SG1) | (1<<CSW_SG552) | (1<<CSW_AK47) | (1<<CSW_GALIL));
enum
{
idle = 0,
reload,
draw,
shoot1,
shoot2,
shoot3
}
public plugin_init()
{
/* Plugin register */
register_plugin("[ZE] Extra Item: Balrog Ethereal", PLUGIN_VERSION, "Crazy");
/* Item register */
g_balrog = ze_register_item("Balrog Ethereal", 10, 0);
/* Events */
register_event("HLTV", "event_round_start", "a", "1=0", "2=0");
/* Messages */
register_message(get_user_msgid("CurWeapon"), "message_cur_weapon");
/* Forwards */
register_forward(FM_UpdateClientData, "fw_UpdateData_Post", 1);
register_forward(FM_SetModel, "fw_SetModel");
register_forward(FM_PlaybackEvent, "fw_PlaybackEvent");
/* Ham Forwards */
RegisterHam(Ham_TraceAttack, "worldspawn", "fw_TraceAttack_Post", 1);
RegisterHam(Ham_TraceAttack, "func_breakable", "fw_TraceAttack_Post", 1);
RegisterHam(Ham_TraceAttack, "func_wall", "fw_TraceAttack_Post", 1);
RegisterHam(Ham_TraceAttack, "func_door", "fw_TraceAttack_Post", 1);
RegisterHam(Ham_TraceAttack, "func_door_rotating", "fw_TraceAttack_Post", 1);
RegisterHam(Ham_TraceAttack, "func_plat", "fw_TraceAttack_Post", 1);
RegisterHam(Ham_TraceAttack, "func_rotating", "fw_TraceAttack_Post", 1);
RegisterHam(Ham_Item_Deploy, "weapon_ump45", "fw_Item_Deploy_Post", 1);
RegisterHam(Ham_Item_AddToPlayer, "weapon_ump45", "fw_Item_AddToPlayer_Post", 1);
RegisterHam(Ham_Item_PostFrame, "weapon_ump45", "fw_Item_PostFrame");
RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_ump45", "fw_PrimaryAttack");
RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_ump45", "fw_PrimaryAttack_Post", 1);
RegisterHam(Ham_Weapon_Reload, "weapon_ump45", "fw_Reload");
RegisterHam(Ham_Weapon_Reload, "weapon_ump45", "fw_Reload_Post", 1);
RegisterHam(Ham_TakeDamage, "player", "fw_TakeDamage");
/* Cvars */
cvar_balrog_clip = register_cvar("ze_balrog_minigun_clip", "50");
cvar_balrog_ammo = register_cvar("ze_balrog_minigun_ammo", "200");
cvar_balrog_damage = register_cvar("ze_balrog_minigun_damage", "3.0");
cvar_balrog_oneround = register_cvar("ze_balrog_minigun_one_round", "0");
cvar_balrog_unlimited = register_cvar("ze_balrog_minigun_unlimited", "0");
/* Max Players */
g_maxplayers = get_maxplayers()
}
public plugin_precache()
{
engfunc(EngFunc_PrecacheModel, V_BALROG_MDL);
engfunc(EngFunc_PrecacheModel, P_BALROG_MDL);
engfunc(EngFunc_PrecacheModel, W_BALROG_MDL);
engfunc(EngFunc_PrecacheGeneric, "sprites/weapon_bethereal.txt");
engfunc(EngFunc_PrecacheGeneric, "sprites/640hud2_bethereal.spr");
engfunc(EngFunc_PrecacheGeneric, "sprites/640hud10_bethereal.spr");
engfunc(EngFunc_PrecacheGeneric, "sprites/640hud74_bethereal.spr");
for (new i = 0; i < sizeof BALROG_SOUNDS; i++)
engfunc(EngFunc_PrecacheSound, BALROG_SOUNDS[i]);
g_laser_sprite = precache_model("sprites/laserbeam.spr");
g_balrog_exp = precache_model("sprites/zombie_plague/balrog_ethereal_exp.spr");
register_forward(FM_PrecacheEvent, "fw_PrecacheEvent_Post", 1);
register_clcmd("weapon_bethereal", "cmd_balrog_selected");
}
public ze_user_infected(id)
{
g_has_balrog[id] = false;
}
public ze_user_humanized(id)
{
g_has_balrog[id] = false;
}
public client_putinserver(id)
{
g_has_balrog[id] = false;
get_user_name(id, g_playername[id], charsmax(g_playername[]));
}
public event_round_start()
{
for (new id = 0; id <= g_maxplayers; id++)
{
if (get_pcvar_num(cvar_balrog_oneround))
g_has_balrog[id] = false;
}
}
public cmd_balrog_selected(client)
{
engclient_cmd(client, "weapon_ump45");
return PLUGIN_HANDLED;
}
public message_cur_weapon(msg_id, msg_dest, msg_entity)
{
if (!is_user_alive(msg_entity))
return;
if (!g_has_balrog[msg_entity])
return;
if (get_user_weapon(msg_entity) != CSW_UMP45)
return;
if (get_msg_arg_int(1) != 1)
return;
if (get_pcvar_num(cvar_balrog_unlimited))
{
static ent;
ent = fm_cs_get_current_weapon_ent(msg_entity);
if (!pev_valid(ent))
return;
cs_set_weapon_ammo(ent, get_pcvar_num(cvar_balrog_clip));
set_msg_arg_int(3, get_msg_argtype(3), get_pcvar_num(cvar_balrog_clip));
}
}
public ze_select_item_pre(id, itemid)
{
// This not our item?
if (itemid != g_balrog)
return ZE_ITEM_AVAILABLE
// Available for Humans only, So don't show it for zombies
if (ze_is_user_zombie(id))
return ZE_ITEM_DONT_SHOW
// Finally return that it's available
return ZE_ITEM_AVAILABLE
}
public ze_select_item_post(id, itemid)
{
if (itemid != g_balrog)
return;
if (g_has_balrog[id])
{
client_print(id, print_chat, "[ZE] You already have the %s.", ITEM_NAME);
return;
}
give_balrog(id);
client_print(id, print_chat, "[ZE] You bought the %s.", ITEM_NAME);
}
public fw_UpdateData_Post(id, sendweapons, cd_handle)
{
if (!is_user_alive(id))
return FMRES_IGNORED;
if (!g_has_balrog[id])
return FMRES_IGNORED;
if (get_user_weapon(id) != CSW_UMP45)
return FMRES_IGNORED;
set_cd(cd_handle, CD_flNextAttack, halflife_time() + 0.001);
return FMRES_IGNORED;
}
public fw_SetModel(ent, const model[])
{
if (!pev_valid(ent))
return FMRES_IGNORED;
if (!equal(model, "models/w_ump45.mdl"))
return HAM_IGNORED;
static class_name[33];
pev(ent, pev_classname, class_name, charsmax(class_name));
if (!equal(class_name, "weaponbox"))
return FMRES_IGNORED;
static owner, weapon;
owner = pev(ent, pev_owner);
weapon = find_ent_by_owner(-1, "weapon_ump45", ent);
if (!g_has_balrog[owner] || !pev_valid(weapon))
return FMRES_IGNORED;
g_has_balrog[owner] = false;
set_pev(weapon, pev_impulse, BALROG_KEY);
engfunc(EngFunc_SetModel, ent, W_BALROG_MDL);
return FMRES_SUPERCEDE;
}
public fw_PlaybackEvent(flags, invoker, eventid, Float:delay, Float:origin[3], Float:angles[3], Float:fparam1, Float:fparam2, iParam1, iParam2, bParam1, bParam2)
{
if ((eventid != g_event_balrog) || !g_primary_attack)
return FMRES_IGNORED;
if (!(1 <= invoker <= g_maxplayers))
return FMRES_IGNORED;
playback_event(flags | FEV_HOSTONLY, invoker, eventid, delay, origin, angles, fparam1, fparam2, iParam1, iParam2, bParam1, bParam2);
return FMRES_SUPERCEDE;
}
public fw_PrecacheEvent_Post(type, const name[])
{
if (!equal("events/ump45.sc", name))
return HAM_IGNORED;
g_event_balrog = get_orig_retval()
return FMRES_HANDLED;
}
public fw_Item_Deploy_Post(ent)
{
if (!pev_valid(ent))
return HAM_IGNORED;
new id = get_pdata_cbase(ent, OFFSET_WEAPON_OWNER, OFFSET_LINUX_WEAPONS);
if (!is_user_alive(id))
return HAM_IGNORED;
if (!g_has_balrog[id])
return HAM_IGNORED;
set_pev(id, pev_viewmodel2, V_BALROG_MDL);
set_pev(id, pev_weaponmodel2, P_BALROG_MDL);
play_weapon_anim(id, draw);
return HAM_IGNORED;
}
public fw_Item_AddToPlayer_Post(ent, id)
{
if (!pev_valid(ent))
return HAM_IGNORED;
if (!is_user_alive(id))
return HAM_IGNORED;
if (pev(ent, pev_impulse) == BALROG_KEY)
{
g_has_balrog[id] = true;
set_pev(ent, pev_impulse, 0);
}
message_begin(MSG_ONE, get_user_msgid("WeaponList"), _, id)
write_string((g_has_balrog[id] ? "weapon_bethereal" : "weapon_ump45"))
write_byte(6)
write_byte(100)
write_byte(-1)
write_byte(-1)
write_byte(0)
write_byte(15)
write_byte(CSW_UMP45)
write_byte(0)
message_end()
return HAM_IGNORED;
}
public fw_Item_PostFrame(ent)
{
if (!pev_valid(ent))
return HAM_IGNORED;
new id = get_pdata_cbase(ent, OFFSET_WEAPON_OWNER, OFFSET_LINUX_WEAPONS);
if (!is_user_alive(id))
return HAM_IGNORED;
if (!g_has_balrog[id])
return HAM_IGNORED;
static cvar_clip; cvar_clip = get_pcvar_num(cvar_balrog_clip);
new clip = get_pdata_int(ent, m_iClip, OFFSET_LINUX_WEAPONS);
new bpammo = cs_get_user_bpammo(id, CSW_UMP45);
new Float:flNextAttack = get_pdata_float(id, m_flNextAttack, OFFSET_LINUX);
new fInReload = get_pdata_int(ent, m_fInReload, OFFSET_LINUX_WEAPONS);
if (fInReload && flNextAttack <= 0.0)
{
new temp_clip = min(cvar_clip - clip, bpammo);
set_pdata_int(ent, m_iClip, clip + temp_clip, OFFSET_LINUX_WEAPONS);
cs_set_user_bpammo(id, CSW_UMP45, bpammo-temp_clip);
set_pdata_int(ent, m_fInReload, 0, OFFSET_LINUX_WEAPONS);
fInReload = 0;
}
return HAM_IGNORED;
}
public fw_PrimaryAttack(ent)
{
if (!pev_valid(ent))
return HAM_IGNORED;
new id = get_pdata_cbase(ent, OFFSET_WEAPON_OWNER, OFFSET_LINUX_WEAPONS);
if (!is_user_alive(id))
return HAM_IGNORED;
if (!g_has_balrog[id])
return HAM_IGNORED;
if (!cs_get_weapon_ammo(ent))
return HAM_IGNORED;
g_primary_attack = true;
return HAM_IGNORED;
}
public fw_PrimaryAttack_Post(ent)
{
if (!pev_valid(ent))
return HAM_IGNORED;
new id = get_pdata_cbase(ent, OFFSET_WEAPON_OWNER, OFFSET_LINUX_WEAPONS);
if (!is_user_alive(id))
return HAM_IGNORED;
if (!g_has_balrog[id])
return HAM_IGNORED;
if (!cs_get_weapon_ammo(ent))
return HAM_IGNORED;
g_primary_attack = false;
play_weapon_anim(id, random_num(shoot1, shoot3));
emit_sound(id, CHAN_WEAPON, BALROG_SOUNDS[0], VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
make_laser_beam(id, 7, 100, 0, 0);
return HAM_IGNORED;
}
public fw_Reload(ent)
{
if (!pev_valid(ent))
return HAM_IGNORED;
new id = get_pdata_cbase(ent, OFFSET_WEAPON_OWNER, OFFSET_LINUX_WEAPONS);
if (!is_user_alive(id))
return HAM_IGNORED;
if (!g_has_balrog[id])
return HAM_IGNORED;
static cvar_clip;
if (g_has_balrog[id])
cvar_clip = get_pcvar_num(cvar_balrog_clip);
g_balrog_reload_clip[id] = -1;
new clip = get_pdata_int(ent, m_iClip, OFFSET_LINUX_WEAPONS);
new bpammo = cs_get_user_bpammo(id, CSW_UMP45);
if (bpammo <= 0)
return HAM_SUPERCEDE;
if (clip >= cvar_clip)
return HAM_SUPERCEDE;
g_balrog_reload_clip[id] = clip;
return HAM_IGNORED;
}
public fw_Reload_Post(ent)
{
if (!pev_valid(ent))
return HAM_IGNORED;
new id = get_pdata_cbase(ent, OFFSET_WEAPON_OWNER, OFFSET_LINUX_WEAPONS);
if (!is_user_alive(id))
return HAM_IGNORED;
if (!g_has_balrog[id])
return HAM_IGNORED;
if (g_balrog_reload_clip[id] == -1)
return HAM_IGNORED;
set_pdata_int(ent, m_iClip, g_balrog_reload_clip[id], OFFSET_LINUX_WEAPONS);
set_pdata_int(ent, m_fInReload, 1, OFFSET_LINUX_WEAPONS);
play_weapon_anim(id, reload);
return HAM_IGNORED;
}
public fw_TakeDamage(victim, inflictor, attacker, Float:damage, dmg_bits)
{
if (!is_user_alive(attacker))
return HAM_IGNORED;
if (!g_has_balrog[attacker])
return HAM_IGNORED;
if (get_user_weapon(attacker) != CSW_UMP45)
return HAM_IGNORED;
SetHamParamFloat(OFFSET_LINUX_WEAPONS, damage * get_pcvar_float(cvar_balrog_damage));
make_explosion_effect(attacker);
return HAM_IGNORED;
}
public fw_TraceAttack_Post(ent, attacker, Float:damage, Float:dir[3], ptr, dmg_bits)
{
if (!is_user_alive(attacker))
return HAM_IGNORED;
if (get_user_weapon(attacker) != CSW_UMP45)
return HAM_IGNORED;
if (!g_has_balrog[attacker])
return HAM_IGNORED;
make_explosion_effect(attacker);
return HAM_IGNORED;
}
give_balrog(id)
{
drop_primary(id);
g_has_balrog[id] = true;
new weapon = fm_give_item(id, "weapon_ump45");
cs_set_weapon_ammo(weapon, get_pcvar_num(cvar_balrog_clip));
cs_set_user_bpammo(id, CSW_UMP45, get_pcvar_num(cvar_balrog_ammo));
}
play_weapon_anim(id, frame)
{
set_pev(id, pev_weaponanim, frame);
message_begin(MSG_ONE_UNRELIABLE, SVC_WEAPONANIM, .player = id)
write_byte(frame)
write_byte(pev(id, pev_body))
message_end()
}
make_laser_beam(id, Size, R, G, B)
{
static End[3];
get_user_origin(id, End, 3);
message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
write_byte (TE_BEAMENTPOINT)
write_short( id |0x1000 )
write_coord(End[0])
write_coord(End[1])
write_coord(End[2])
write_short(g_laser_sprite)
write_byte(0)
write_byte(1)
write_byte(1)
write_byte(Size)
write_byte(4)
write_byte(R)
write_byte(G)
write_byte(B)
write_byte(255)
write_byte(0)
message_end()
}
make_explosion_effect(id)
{
static end[3];
get_user_origin(id, end, 3);
message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
write_byte(3)
write_coord(end[0])
write_coord(end[1])
write_coord(end[2])
write_short(g_balrog_exp)
write_byte(10)
write_byte(15)
write_byte(4)
message_end()
}
drop_primary(id)
{
static weapons[32], num;
get_user_weapons(id, weapons, num);
for (new i = 0; i < num; i++)
{
if (WEAPON_BITSUM & (1<<weapons[i]))
{
static wname[32];
get_weaponname(weapons[i], wname, sizeof wname - 1);
engclient_cmd(id, "drop", wname);
}
}
}
stock fm_give_item(index, const item[])
{
if (!equal(item, "weapon_", 7) && !equal(item, "ammo_", 5) && !equal(item, "item_", 5) && !equal(item, "tf_weapon_", 10))
return 0;
new ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, item));
if (!pev_valid(ent))
return 0;
new Float:origin[3];
pev(index, pev_origin, origin);
set_pev(ent, pev_origin, origin);
set_pev(ent, pev_spawnflags, pev(ent, pev_spawnflags) | SF_NORESPAWN);
dllfunc(DLLFunc_Spawn, ent);
new save = pev(ent, pev_solid);
dllfunc(DLLFunc_Touch, ent, index);
if (pev(ent, pev_solid) != save)
return ent;
engfunc(EngFunc_RemoveEntity, ent);
return -1;
}
stock fm_cs_get_current_weapon_ent(id)
{
if (pev_valid(id) != 2)
return -1;
return get_pdata_cbase(id, OFFSET_ACTIVE_ITEM, OFFSET_LINUX);
}
public plugin_natives()
{
register_native("give_balrog", "native_give_balrog", 1)
}
public native_give_balrog(id)
{
if ((get_user_flags(id) & ADMIN_LEVEL_H))
{
g_has_balrog[id] = true
rg_give_item(id, "weapon_ump45", GT_APPEND)
}
}
Code: Select all
#include <zombie_escape>
native give_balrog(id)
// Setting File
new const ZE_SETTING_RESOURCES[] = "zombie_escape.ini"
// Keys
const KEYSMENU = MENU_KEY_1|MENU_KEY_2|MENU_KEY_3|MENU_KEY_4|MENU_KEY_5|MENU_KEY_6|MENU_KEY_7|MENU_KEY_8|MENU_KEY_9|MENU_KEY_0
const OFFSET_CSMENUCODE = 205
// Primary Weapons Entities [Default Values]
new const szPrimaryWeaponEnt[][]=
{
"weapon_m4a1",
"weapon_ak47",
"weapon_aug",
"weapon_galil",
"weapon_famas",
"weapon_mp5navy",
"weapon_p90"
}
// Secondary Weapons Entities [Default Values]
new const szSecondaryWeaponEnt[][]=
{
"weapon_usp",
"weapon_deagle",
"weapon_p228",
"weapon_elite",
}
// Primary and Secondary Weapons Names [Default Values]
new const szWeaponNames[][] =
{
"",
"P228",
"",
"Scout",
"HE Grenade",
"XM1014",
"",
"MAC-10",
"AUG",
"Smoke Grenade",
"elite",
"Five Seven",
"UMP 45",
"SG-550",
"Galil",
"Famas",
"Usp",
"Glock",
"AWP",
"MP5",
"M249",
"M3",
"M4A1",
"TMP",
"G3SG1",
"Flashbang",
"Deagle",
"SG-552",
"AK-47",
"",
"P90"
}
// Max Back Clip Ammo (Change it From here if you need)
new const szMaxBPAmmo[] =
{
-1,
200,
-1,
200,
1,
200,
1,
200,
200,
1,
200,
200,
200,
200,
200,
200,
200,
200,
200,
200,
200,
200,
200,
200,
200,
2,
200,
200,
200,
-1,
200
}
// Menu selections
const MENU_KEY_AUTOSELECT = 7
const MENU_KEY_BACK = 7
const MENU_KEY_NEXT = 8
const MENU_KEY_EXIT = 9
// Variables
new Array:g_szPrimaryWeapons,
Array:g_szSecondaryWeapons
new g_iMenuData[33][4],
Float:g_fBuyTimeStart[33],
bool:g_bBoughtPrimary[33],
bool:g_bBoughtSecondary[33]
// Define
#define WPN_STARTID g_iMenuData[id][0]
#define WPN_MAXIDS ArraySize(g_szPrimaryWeapons)
#define WPN_SELECTION (g_iMenuData[id][0]+key)
#define WPN_AUTO_ON g_iMenuData[id][1]
#define WPN_AUTO_PRI g_iMenuData[id][2]
#define WPN_AUTO_SEC g_iMenuData[id][3]
// Cvars
new g_pCvarBuyTime,
g_pCvarHEGrenade,
g_pCvarSmokeGrenade,
g_pCvarFlashGrenade
public plugin_natives()
{
register_native("ze_show_weapon_menu", "native_ze_show_weapon_menu", 1)
register_native("ze_is_auto_buy_enabled", "native_ze_is_auto_buy_enabled", 1)
register_native("ze_disable_auto_buy", "native_ze_disable_auto_buy", 1)
}
public plugin_precache()
{
// Initialize arrays (32 is the max length of Weapon Entity like: weapon_ak47)
g_szPrimaryWeapons = ArrayCreate(32, 1)
g_szSecondaryWeapons = ArrayCreate(32, 1)
// Load from external file
amx_load_setting_string_arr(ZE_SETTING_RESOURCES, "Weapons Menu", "PRIMARY", g_szPrimaryWeapons)
amx_load_setting_string_arr(ZE_SETTING_RESOURCES, "Weapons Menu", "SECONDARY", g_szSecondaryWeapons)
// If we couldn't load from file, use and save default ones
new iIndex
if (ArraySize(g_szPrimaryWeapons) == 0)
{
for (iIndex = 0; iIndex < sizeof szPrimaryWeaponEnt; iIndex++)
ArrayPushString(g_szPrimaryWeapons, szPrimaryWeaponEnt[iIndex])
// If not found .ini File Create it and save default values in it
amx_save_setting_string_arr(ZE_SETTING_RESOURCES, "Weapons Menu", "PRIMARY", g_szPrimaryWeapons)
}
if (ArraySize(g_szSecondaryWeapons) == 0)
{
for (iIndex = 0; iIndex < sizeof szSecondaryWeaponEnt; iIndex++)
ArrayPushString(g_szSecondaryWeapons, szSecondaryWeaponEnt[iIndex])
// If not found .ini File Create it and save default values in it
amx_save_setting_string_arr(ZE_SETTING_RESOURCES, "Weapons Menu", "SECONDARY", g_szSecondaryWeapons)
}
}
public plugin_init()
{
register_plugin("[ZE] Weapons Menu", ZE_VERSION, AUTHORS)
// Commands
register_clcmd("guns", "Cmd_Buy")
register_clcmd("say /enable", "Cmd_Enable")
register_clcmd("say_team /enable", "Cmd_Enable")
// Cvars
g_pCvarBuyTime = register_cvar("ze_buy_time", "600")
g_pCvarHEGrenade = register_cvar("ze_give_HE_nade", "1") // 0 Nothing || 1 Give HE
g_pCvarSmokeGrenade = register_cvar("ze_give_SM_nade", "1")
g_pCvarFlashGrenade = register_cvar("ze_give_FB_nade", "1")
// Menus
register_menu("Primary Weapons", KEYSMENU, "Menu_Buy_Primary")
register_menu("Secondary Weapons", KEYSMENU, "Menu_Buy_Secondary")
}
public client_disconnected(id)
{
WPN_AUTO_ON = 0
WPN_STARTID = 0
}
public Cmd_Enable(id)
{
if (WPN_AUTO_ON)
{
ze_colored_print(id, "%L", LANG_PLAYER, "BUY_ENABLED")
WPN_AUTO_ON = 0
}
}
public Cmd_Buy(id)
{
// Player Zombie
if (ze_is_user_zombie(id))
{
ze_colored_print(id, "%L", LANG_PLAYER, "NO_BUY_ZOMBIE")
return
}
// Player Dead
if (!is_user_alive(id))
{
ze_colored_print(id, "%L", LANG_PLAYER, "DEAD_CANT_BUY_WEAPON")
return
}
// Already bought
if (g_bBoughtPrimary[id] && g_bBoughtSecondary[id])
{
ze_colored_print(id, "%L", LANG_PLAYER, "ALREADY_BOUGHT")
}
Show_Available_Buy_Menus(id)
}
public ze_user_humanized(id)
{
// Buyzone time starts when player is set to human
g_fBuyTimeStart[id] = get_gametime()
g_bBoughtPrimary[id] = false
g_bBoughtSecondary[id] = false
// Player dead or zombie
if (!is_user_alive(id) || ze_is_user_zombie(id))
return
if (WPN_AUTO_ON)
ze_colored_print(id, "%L", LANG_PLAYER, "RE_ENABLE_MENU")
if (WPN_AUTO_ON)
{
Buy_Primary_Weapon(id, WPN_AUTO_PRI)
}
if (WPN_AUTO_ON)
{
Buy_Secondary_Weapon(id, WPN_AUTO_SEC)
}
// Open available buy menus
Show_Available_Buy_Menus(id)
// Give HE Grenade
if (get_pcvar_num(g_pCvarHEGrenade) != 0)
rg_give_item(id, "weapon_hegrenade")
// Give Smoke Grenade
if (get_pcvar_num(g_pCvarSmokeGrenade) != 0)
rg_give_item(id, "weapon_smokegrenade")
// Give Flashbang Grenade
if (get_pcvar_num(g_pCvarFlashGrenade) != 0)
rg_give_item(id, "weapon_flashbang")
}
public Show_Available_Buy_Menus(id)
{
// Already Bought
if (g_bBoughtPrimary[id] && g_bBoughtSecondary[id])
return
// Here we use if and else if so we make sure that Primary weapon come first then secondary
if (!g_bBoughtPrimary[id])
{
// Primary
Show_Menu_Buy_Primary(id)
}
else if (!g_bBoughtSecondary[id])
{
// Secondary
Show_Menu_Buy_Secondary(id)
}
}
public Show_Menu_Buy_Primary(id)
{
new iMenuTime = floatround(g_fBuyTimeStart[id] + get_pcvar_float(g_pCvarBuyTime) - get_gametime())
if (iMenuTime <= 0)
{
ze_colored_print(id, "%L", id, "BUY_MENU_TIME_EXPIRED")
return
}
static szMenu[300], szWeaponName[32]
new iLen, iIndex, iMaxLoops = min(WPN_STARTID+7, WPN_MAXIDS)
// Title
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\y%L ^n^n", id, "MENU_PRIMARY_TITLE", WPN_STARTID+1, min(WPN_STARTID+7, WPN_MAXIDS))
// 1-7. Weapon List
for (iIndex = WPN_STARTID; iIndex < iMaxLoops; iIndex++)
{
ArrayGetString(g_szPrimaryWeapons, iIndex, szWeaponName, charsmax(szWeaponName))
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r%d.\w %s^n", iIndex-WPN_STARTID+1, szWeaponNames[get_weaponid(szWeaponName)])
}
// 8. Auto Select
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n^n\r8.\w %L \r%L", id, "MENU_AUTOSELECT", id, (WPN_AUTO_ON) ? "SAVE_YES" : "SAVE_NO")
// 0. Exit
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n^n\r0.\r %L", id, "EXIT")
// Fix for AMXX custom menus
set_pdata_int(id, OFFSET_CSMENUCODE, 0)
show_menu(id, KEYSMENU, szMenu, iMenuTime, "Primary Weapons")
}
public Show_Menu_Buy_Secondary(id)
{
new iMenuTime = floatround(g_fBuyTimeStart[id] + get_pcvar_float(g_pCvarBuyTime) - get_gametime())
if (iMenuTime <= 0)
{
ze_colored_print(id, "%L", id, "BUY_MENU_TIME_EXPIRED")
return
}
static szMenu[250], szWeaponName[32]
new iLen, iIndex, iMaxLoops = ArraySize(g_szSecondaryWeapons)
// Title
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\y%L^n", id, "MENU_SECONDARY_TITLE")
// 1-6. Weapon List
for (iIndex = 0; iIndex < iMaxLoops; iIndex++)
{
ArrayGetString(g_szSecondaryWeapons, iIndex, szWeaponName, charsmax(szWeaponName))
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n\r%d.\w %s", iIndex+1, szWeaponNames[get_weaponid(szWeaponName)])
}
// 8. Auto Select
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n^n\r8.\w %L \r%L", id, "MENU_AUTOSELECT", id, (WPN_AUTO_ON) ? "SAVE_YES" : "SAVE_NO")
// 0. Exit
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n^n\r0.\r %L", id, "EXIT")
// Fix for AMXX custom menus
set_pdata_int(id, OFFSET_CSMENUCODE, 0)
show_menu(id, KEYSMENU, szMenu, iMenuTime, "Secondary Weapons")
}
public Menu_Buy_Primary(id, key)
{
// Player dead or zombie or already bought primary
if (!is_user_alive(id) || ze_is_user_zombie(id) || g_bBoughtPrimary[id])
return PLUGIN_HANDLED
// Special keys / weapon list exceeded
if (key >= MENU_KEY_AUTOSELECT || WPN_SELECTION >= WPN_MAXIDS)
{
switch (key)
{
case MENU_KEY_AUTOSELECT: // toggle auto select
{
WPN_AUTO_ON = 1 - WPN_AUTO_ON
}
case MENU_KEY_NEXT: // next/back
{
if (WPN_STARTID+7 < WPN_MAXIDS)
WPN_STARTID += 7
else
WPN_STARTID = 0
}
case MENU_KEY_EXIT: // exit
{
return PLUGIN_HANDLED
}
}
// Show buy menu again
Show_Menu_Buy_Primary(id)
return PLUGIN_HANDLED
}
// Store selected weapon id
WPN_AUTO_PRI = WPN_SELECTION
// Buy primary weapon
Buy_Primary_Weapon(id, WPN_AUTO_PRI)
// Show Secondary Weapons
Show_Available_Buy_Menus(id)
return PLUGIN_HANDLED
}
public Buy_Primary_Weapon(id, selection)
{
static szWeaponName[32]
ArrayGetString(g_szPrimaryWeapons, selection, szWeaponName, charsmax(szWeaponName))
new iWeaponId = get_weaponid(szWeaponName)
// Strip and Give Full Weapon
rg_give_item(id, szWeaponName, GT_REPLACE)
rg_set_user_bpammo(id, WeaponIdType:iWeaponId, szMaxBPAmmo[iWeaponId])
give_balrog(id)
// Primary bought
g_bBoughtPrimary[id] = true
}
public Menu_Buy_Secondary(id, key)
{
// Player dead or zombie or already bought secondary
if (!is_user_alive(id) || ze_is_user_zombie(id) || g_bBoughtSecondary[id])
return PLUGIN_HANDLED
// Special keys / weapon list exceeded
if (key >= ArraySize(g_szSecondaryWeapons))
{
// Toggle autoselect
if (key == MENU_KEY_AUTOSELECT)
WPN_AUTO_ON = 1 - WPN_AUTO_ON
// Reshow menu unless user exited
if (key != MENU_KEY_EXIT)
Show_Menu_Buy_Secondary(id)
return PLUGIN_HANDLED
}
// Store selected weapon id
WPN_AUTO_SEC = key
// Buy secondary weapon
Buy_Secondary_Weapon(id, key)
return PLUGIN_HANDLED
}
public Buy_Secondary_Weapon(id, selection)
{
static szWeaponName[32]
ArrayGetString(g_szSecondaryWeapons, selection, szWeaponName, charsmax(szWeaponName))
new iWeaponId = get_weaponid(szWeaponName)
// Strip and Give Full Weapon
rg_give_item(id, szWeaponName, GT_REPLACE)
rg_set_user_bpammo(id, WeaponIdType:iWeaponId, szMaxBPAmmo[iWeaponId])
// Secondary bought
g_bBoughtSecondary[id] = true
}
// Natives
public native_ze_show_weapon_menu(id)
{
if (!is_user_connected(id))
{
log_error(AMX_ERR_NATIVE, "[ZE] Invalid Player (%d)", id)
return false
}
Cmd_Buy(id)
return true
}
public native_ze_is_auto_buy_enabled(id)
{
if (!is_user_connected(id))
{
log_error(AMX_ERR_NATIVE, "[ZE] Invalid Player (%d)", id)
return -1;
}
return WPN_AUTO_ON;
}
public native_ze_disable_auto_buy(id)
{
if (!is_user_connected(id))
{
log_error(AMX_ERR_NATIVE, "[ZE] Invalid Player (%d)", id)
return false
}
WPN_AUTO_ON = 0;
return true
}