here is jetpack.sma
Code: Select all
#include <zombie_escape>
#include <engine>
#define JETPACK_COST 1000
new const ClassInfoTarget[] = "info_target"
new const ClassBreakAble[] = "func_breakable"
new const ClassnameJetPack[] = "n4d_jetpack"
new const ClassnameRocket[] = "n4d_bazooka"
new const ModelVJetPack[] = "models/mu/v_jp_mu.mdl"
new const ModelPJetPack[] = "models/mu/p_jp_mu.mdl"
new const ModelWJetPack[] = "models/mu/w_jp_mu.mdl"
new const ModelRocket[] = "models/rpgrocket.mdl"
new const SoundPickup[] = "items/gunpickup2.wav"
new const SoundShoot[] = "mu/at4-1.wav"
new const SoundTravel[] = "mu/bfuu.wav"
new const SoundFly[] = "mu/fly.wav"
new const SoundBlow[] = "mu/blow.wav"
new bool:bHasJetPack[33]
new Float:fJetpackFuel[33]
new Float:fLastShoot[33]
new SprExp, SprTrail, ItemJetPack
new CvarMaxFuel, CvarRadius, CvarDamage, CvarSpeed, CvarCooldown, CvarRegen, CvarRocketSpeed, CvarRemove
new Float:CMaxFuel, Float:CRadius, Float:CDamage, CSpeed, Float:CCooldown, Float:CRegen, CRocketSpeed, Float:CRemove
new bool:g_bBlockBuy
//Uncomment this to draw ring effect
//#define DrawRing
//Uncomment this to draw flame effect
//#define DrawFlame
#if defined DrawRing
new SprRing
#endif
#if defined DrawFlame
new SprFlame
#endif
public plugin_precache()
{
precache_sound(SoundPickup)
precache_sound(SoundShoot)
precache_sound(SoundTravel)
precache_sound(SoundFly)
precache_sound(SoundBlow)
SprExp = precache_model("sprites/zerogxplode.spr")
SprTrail = precache_model("sprites/smoke.spr")
#if defined DrawFlame
SprFlame = precache_model("sprites/xfireball3.spr")
#endif
#if defined DrawRing
SprRing = precache_model("sprites/shockwave.spr")
#endif
precache_model(ModelVJetPack)
precache_model(ModelPJetPack)
precache_model(ModelWJetPack)
precache_model(ModelRocket)
}
public plugin_init()
{
register_plugin("New Jetpack", "0.0.3", "Bad_Bud,ZmOutStanding,Connor,wbyokomo")
register_event("HLTV", "OnNewRound", "a", "1=0", "2=0")
register_logevent("OnRoundEnd", 2, "1=Round_End")
RegisterHam(Ham_Killed, "player", "OnPlayerKilled")
RegisterHam(Ham_Player_Jump, "player", "OnPlayerJump")
RegisterHam(Ham_Weapon_SecondaryAttack, "weapon_knife", "OnKnifeSecAtkPost", 1)
RegisterHam(Ham_Item_Deploy, "weapon_knife", "OnKnifeDeployPost", 1)
register_forward(FM_PlayerPreThink, "OnPlayerPreThink")
register_touch(ClassnameRocket, "*", "OnTouchRocket")
register_touch(ClassnameJetPack, "player", "OnTouchJetPack")
register_think(ClassnameJetPack, "OnThinkJetPack")
CvarMaxFuel = register_cvar("jp_maxfuel", "250.0")
CvarRadius = register_cvar("jp_radius", "250.0")
CvarDamage = register_cvar("jp_damage", "600.0")
CvarSpeed = register_cvar("jp_speed", "300")
CvarCooldown = register_cvar("jp_cooldown", "10.0")
CvarRegen = register_cvar("jp_regen", "0.5")
CvarRocketSpeed = register_cvar("jp_rocket_speed", "1500")
CvarRemove = register_cvar("jp_remove_time", "420.0")
ItemJetPack = ze_register_item("Jetpack", JETPACK_COST, 0)
register_clcmd("drop", "CmdDropJP")
}
public client_putinserver(id)
{
ResetValues(id)
}
public ze_user_infected(iVictim)
{
ResetValues(iVictim)
}
public client_disconnected(id)
{
ResetValues(id)
}
public ze_game_started()
{
g_bBlockBuy = true
set_task(20.0, "EnableBuy")
}
public EnableBuy()
{
g_bBlockBuy = false
}
public OnNewRound()
{
RemoveAllJetPack()
CMaxFuel = get_pcvar_float(CvarMaxFuel)
CRadius = get_pcvar_float(CvarRadius)
CDamage = get_pcvar_float(CvarDamage)
CSpeed = get_pcvar_num(CvarSpeed)
CCooldown = get_pcvar_float(CvarCooldown)
CRegen = get_pcvar_float(CvarRegen)
CRocketSpeed = get_pcvar_num(CvarRocketSpeed)
CRemove = get_pcvar_float(CvarRemove)
}
public ze_user_humanized(id)
{
ResetValues(id) // Item lasts only one round
}
public OnRoundEnd()
{
RemoveAllJetPack()
}
public OnPlayerKilled(id)
{
if(bHasJetPack[id]) DropJetPack(id);
ResetValues(id)
}
public OnPlayerJump(id)
{
if(bHasJetPack[id] && fJetpackFuel[id] > 0.0 && get_user_weapon(id) == CSW_KNIFE && pev(id, pev_button) & IN_DUCK && ~pev(id, pev_flags) & FL_ONGROUND)
{
static Float:vVelocity[3], Float:upSpeed
pev(id, pev_velocity, vVelocity)
upSpeed = vVelocity[2] + 35.0
velocity_by_aim(id, CSpeed, vVelocity)
vVelocity[2] = upSpeed > 300.0 ? 300.0 : upSpeed
set_pev(id, pev_velocity, vVelocity)
#if defined DrawFlame
pev(id, pev_origin, vVelocity)
engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, vVelocity, 0)
write_byte(TE_SPRITE)
engfunc(EngFunc_WriteCoord, vVelocity[0])
engfunc(EngFunc_WriteCoord, vVelocity[1])
engfunc(EngFunc_WriteCoord, vVelocity[2])
write_short(SprFlame)
write_byte(8)
write_byte(128)
message_end()
#endif
fJetpackFuel[id] > 80.0 ? emit_sound(id, CHAN_STREAM, SoundFly, VOL_NORM, ATTN_NORM, 0, PITCH_NORM) : emit_sound(id, CHAN_STREAM, SoundBlow, VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
fJetpackFuel[id] -= 1.0
}
}
public ze_select_item_pre(id, itemid)
{
// Return Available and we will block it in Post, So it dosen't affect other plugins
if (itemid != ItemJetPack)
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
if (bHasJetPack[id])
return ZE_ITEM_UNAVAILABLE
if (g_bBlockBuy && itemid == ItemJetPack)
return ZE_ITEM_UNAVAILABLE
return ZE_ITEM_AVAILABLE
}
public ze_select_item_post(id, item)
{
if (item == ItemJetPack)
{
bHasJetPack[id] = true
ze_colored_print(id, "JetPack usage: JUMP+DUCK")
engclient_cmd(id, "weapon_knife")
ReplaceModel(id)
}
}
public OnKnifeSecAtkPost(ent2)
{
if(pev_valid(ent2) == 2)
{
static id, Float:ctime
id = get_pdata_cbase(ent2, 41, 4)
ctime = get_gametime()
if(is_user_alive(id) && bHasJetPack[id] && fLastShoot[id] < ctime)
{
new ent = create_entity(ClassInfoTarget)
if(ent)
{
engfunc(EngFunc_SetModel, ent, ModelRocket)
engfunc(EngFunc_SetSize, ent, Float:{0.0, 0.0, 0.0}, Float:{0.0, 0.0, 0.0})
new Float:fOrigin[3]
pev(id, pev_origin, fOrigin)
fOrigin[2] += 16.0
engfunc(EngFunc_SetOrigin, ent, fOrigin)
set_pev(ent, pev_classname, ClassnameRocket)
set_pev(ent, pev_dmg, 100.0)
set_pev(ent, pev_owner, id)
velocity_by_aim(id, CRocketSpeed, fOrigin)
set_pev(ent, pev_velocity, fOrigin)
new Float:vecAngles[3]
engfunc(EngFunc_VecToAngles, fOrigin, vecAngles)
set_pev(ent, pev_angles, vecAngles)
set_pev(ent, pev_movetype, MOVETYPE_FLY)
set_pev(ent, pev_effects, EF_LIGHT)
set_pev(ent, pev_solid, SOLID_BBOX)
emit_sound(id, CHAN_STATIC, SoundShoot, VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
emit_sound(ent, CHAN_WEAPON, SoundTravel, VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
write_byte(TE_BEAMFOLLOW)
write_short(ent)
write_short(SprTrail)
write_byte(40)
write_byte(5)
write_byte(224)
write_byte(224)
write_byte(255)
write_byte(192)
message_end()
fLastShoot[id] = ctime+CCooldown
}
else
{
client_print(id, print_chat, "[JpDebug] Failed to create rocket.")
fLastShoot[id] = ctime+1.5
}
}
}
}
public OnKnifeDeployPost(ent)
{
if(pev_valid(ent) == 2)
{
static id; id = get_pdata_cbase(ent, 41, 4)
if(is_user_alive(id) && bHasJetPack[id]) ReplaceModel(id);
}
}
public OnPlayerPreThink(id)
{
if(bHasJetPack[id] && fJetpackFuel[id] < CMaxFuel)
{
static button; button = pev(id, pev_button)
if(!(button & IN_DUCK) && !(button & IN_JUMP)) fJetpackFuel[id] += CRegen;
}
}
public OnTouchRocket(ent, id)
{
static Float:fOrigin[3]
pev(ent, pev_origin, fOrigin)
engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, fOrigin, 0)
write_byte(TE_EXPLOSION)
engfunc(EngFunc_WriteCoord, fOrigin[0])
engfunc(EngFunc_WriteCoord, fOrigin[1])
engfunc(EngFunc_WriteCoord, fOrigin[2])
write_short(SprExp)
write_byte(40)
write_byte(30)
write_byte(10)
message_end()
#if defined DrawRing
engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, fOrigin, 0)
write_byte(TE_BEAMCYLINDER)
engfunc(EngFunc_WriteCoord, fOrigin[0])
engfunc(EngFunc_WriteCoord, fOrigin[1])
engfunc(EngFunc_WriteCoord, fOrigin[2])
engfunc(EngFunc_WriteCoord, fOrigin[0])
engfunc(EngFunc_WriteCoord, fOrigin[1])
engfunc(EngFunc_WriteCoord, fOrigin[2]+555.0)
write_short(SprRing)
write_byte(0)
write_byte(1)
write_byte(6)
write_byte(8)
write_byte(10)
write_byte(224)
write_byte(224)
write_byte(255)
write_byte(192)
write_byte(5)
message_end()
#endif
static attacker; attacker = pev(ent, pev_owner)
if(!is_user_connected(attacker))
{
engfunc(EngFunc_RemoveEntity, ent)
return PLUGIN_CONTINUE;
}
if(pev_valid(id) && !is_user_connected(id))
{
static szClassname[32]
pev(id, pev_classname, szClassname, 31)
if(equal(szClassname, ClassBreakAble) && (pev(id, pev_solid) != SOLID_NOT))
{
dllfunc(DLLFunc_Use, id, ent)
}
}
static victim; victim = -1
while((victim = engfunc(EngFunc_FindEntityInSphere, victim, fOrigin, CRadius)) != 0)
{
if(is_user_alive(victim) && ze_is_user_zombie(victim))
{
static Float:originV[3], Float:dist, Float:damage
pev(victim, pev_origin, originV)
dist = get_distance_f(fOrigin, originV)
damage = CDamage-(CDamage/CRadius)*dist
if(damage > 0.0)
{
ExecuteHamB(Ham_TakeDamage, victim, ent, attacker, damage, DMG_BULLET)
//client_print(attacker, print_chat, "[Jp] Rocket damage: %.1f", damage)
}
}
}
engfunc(EngFunc_RemoveEntity, ent)
return PLUGIN_CONTINUE;
}
public OnTouchJetPack(ent, id)
{
if((pev(ent, pev_iuser4) != 11111) && is_user_alive(id) && !ze_is_user_zombie(id) && !bHasJetPack[id])
{
engfunc(EngFunc_RemoveEntity, ent)
bHasJetPack[id] = true
emit_sound(id, CHAN_STATIC, SoundPickup, VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
engclient_cmd(id,"weapon_knife")
ReplaceModel(id)
}
}
public OnThinkJetPack(ent)
{
if(pev_valid(ent) == 2)
{
switch(pev(ent, pev_flTimeStepSound))
{
case 200:
{
set_pev(ent, pev_iuser4, 22222)
set_pev(ent, pev_flTimeStepSound, 201)
set_pev(ent, pev_nextthink, get_gametime()+CRemove)
}
case 201:
{
engfunc(EngFunc_RemoveEntity, ent)
}
}
}
}
public CmdDropJP(id)
{
if(is_user_alive(id) && bHasJetPack[id] && get_user_weapon(id) == CSW_KNIFE)
{
DropJetPack(id)
bHasJetPack[id] = false
set_pev(id, pev_viewmodel2, "models/v_knife.mdl")
set_pev(id, pev_weaponmodel2, "models/p_knife.mdl")
return PLUGIN_HANDLED;
}
return PLUGIN_CONTINUE;
}
ReplaceModel(id)
{
set_pev(id, pev_viewmodel2, ModelVJetPack)
set_pev(id, pev_weaponmodel2, ModelPJetPack)
}
DropJetPack(id)
{
new ent = create_entity(ClassInfoTarget)
if(!ent) return;
engfunc(EngFunc_SetModel, ent, ModelWJetPack)
engfunc(EngFunc_SetSize, ent, Float:{-8.0, -8.0, -8.0}, Float:{8.0, 8.0, 8.0})
new Float:fOrigin[3]
pev(id, pev_origin, fOrigin)
fOrigin[2] += 16.0
engfunc(EngFunc_SetOrigin, ent, fOrigin)
set_pev(ent, pev_classname, ClassnameJetPack)
velocity_by_aim(id, 800, fOrigin) //if it too far then reduce it
set_pev(ent, pev_velocity, fOrigin)
set_pev(ent, pev_movetype, MOVETYPE_TOSS)
set_pev(ent, pev_effects, EF_LIGHT)
set_pev(ent, pev_iuser4, 11111)
set_pev(ent, pev_solid, SOLID_TRIGGER)
set_pev(ent, pev_flTimeStepSound, 200)
set_pev(ent, pev_nextthink, get_gametime()+2.0) // prevent drop/pickup exploit
}
RemoveAllJetPack()
{
new ent = engfunc(EngFunc_FindEntityByString, -1, "classname", ClassnameJetPack)
while(ent > 0)
{
engfunc(EngFunc_RemoveEntity, ent)
ent = engfunc(EngFunc_FindEntityByString, -1, "classname", ClassnameJetPack)
}
}
ResetValues(id)
{
bHasJetPack[id] = false
fJetpackFuel[id] = CMaxFuel
}
Code: Select all
#include <zombie_escape>
#include <ze_levels>
native give_golden_m3(id);
native give_golden_mp5(id);
native give_golden_m4a1(id);
native give_golden_ak47(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_xm1014", // Level 0
"weapon_ump45", // Level 0
"weapon_m3", // Level 1
"weapon_mp5navy", // Level 2
"weapon_p90", // Level 3
"weapon_galil", // Level 4
"weapon_famas", // Level 5
"weapon_sg550", // Level 6
"weapon_g3sg1", // Level 7
"weapon_m249", // Level 8
"weapon_sg552", // Level 9
"weapon_aug", // Level 10
"weapon_m4a1", // Level 11
"weapon_ak47" // Level 12
}
// Secondary Weapons Entities [Default Values]
new const szSecondaryWeaponEnt[][]=
{
"weapon_usp", // Level 0
"weapon_p228", // Level 0
"weapon_glock18", // Level 1
"weapon_fiveseven", // Level 2
"weapon_deagle", // Level 3
"weapon_elite" // Level 4
}
// Primary and Secondary Weapons Names [Default Values]
new const szWeaponNames[][] =
{
"",
"P228",
"",
"Scout",
"HE Grenade",
"XM1014",
"",
"MAC-10",
"AUG",
"Smoke Grenade",
"Dual Elite",
"Five Seven",
"UMP 45",
"SG-550",
"Galil",
"Famas",
"USP",
"Glock",
"AWP",
"MP5",
"M249",
"M3",
"M4A1",
"TMP",
"G3SG1",
"Flashbang",
"Desert Eagle",
"SG-552",
"AK-47",
"",
"P90"
}
// Max Back Clip Ammo (Change it From here if you need)
new const szMaxBPAmmo[] =
{
-1,
52,
-1,
90,
1,
32,
1,
100,
90,
1,
120,
100,
100,
90,
90,
90,
100,
120,
30,
120,
200,
32,
90,
120,
90,
2,
35,
90,
90,
-1,
100
}
// 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],
WPN_MAXIDS[33]
// Define
#define WPN_STARTID g_iMenuData[id][0]
#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,
g_pCvarBlockWeapLowLevel
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] Levels Weapons Menu", "1.1", "Raheem")
// 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", "60")
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")
g_pCvarBlockWeapLowLevel = register_cvar("ze_block_weapons_lowlvl", "1")
// Menus
register_menu("Primary Weapons", KEYSMENU, "Menu_Buy_Primary")
register_menu("Secondary Weapons", KEYSMENU, "Menu_Buy_Secondary")
// Hams
RegisterHam(Ham_Touch, "weaponbox", "Fw_TouchWeapon_Pre", 0)
RegisterHam(Ham_Touch, "armoury_entity", "Fw_TouchWeapon_Pre", 0)
}
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)
{
// Static Values
switch (ze_get_user_level(id))
{
case 0: WPN_MAXIDS[id] = 2
case 1: WPN_MAXIDS[id] = 3
case 2: WPN_MAXIDS[id] = 4
case 3: WPN_MAXIDS[id] = 5
case 4: WPN_MAXIDS[id] = 6
case 5: WPN_MAXIDS[id] = 7
case 6: WPN_MAXIDS[id] = 8
case 7: WPN_MAXIDS[id] = 9
case 8: WPN_MAXIDS[id] = 10
case 9: WPN_MAXIDS[id] = 11
case 10: WPN_MAXIDS[id] = 12
case 11: WPN_MAXIDS[id] = 13
case 12..14: WPN_MAXIDS[id] = 14
case 15..19: WPN_MAXIDS[id] = 15 // Golden m3
case 20..24: WPN_MAXIDS[id] = 16 // Golden MP5
case 25..29: WPN_MAXIDS[id] = 17 // Golden M4A1
case 30: WPN_MAXIDS[id] = 18 // Golden AK47
}
if (ze_get_user_level(id) > 30)
{
WPN_MAXIDS[id] = 18
}
// 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")
Buy_Primary_Weapon(id, WPN_AUTO_PRI)
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[id])
// Title
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\y%L \w[\r%d\w-\r%d\w]^n^n", id, "MENU_PRIMARY_TITLE", WPN_STARTID+1, min(WPN_STARTID+7, WPN_MAXIDS[id]))
// 1-7. Weapon List
for (iIndex = WPN_STARTID; iIndex < iMaxLoops; iIndex++)
{
if (ze_get_user_level(id) == 0 && iIndex >= 2||
ze_get_user_level(id) == 1 && iIndex >= 3 ||
ze_get_user_level(id) == 2 && iIndex >= 4 ||
ze_get_user_level(id) == 3 && iIndex >= 5 ||
ze_get_user_level(id) == 4 && iIndex >= 6 ||
ze_get_user_level(id) == 5 && iIndex >= 7 ||
ze_get_user_level(id) == 6 && iIndex >= 8 ||
ze_get_user_level(id) == 7 && iIndex >= 9 ||
ze_get_user_level(id) == 8 && iIndex >= 10 ||
ze_get_user_level(id) == 9 && iIndex >= 11 ||
ze_get_user_level(id) == 10 && iIndex >= 12 ||
ze_get_user_level(id) == 11 && iIndex >= 13 ||
ze_get_user_level(id) == 12 && iIndex >= 14)
{
break
}
/*
* Note that WPN_MAXIDS start from 1 but iIndex start from 0.
*/
// Golden M3
if (ze_get_user_level(id) >= 15 && ze_get_user_level(id) < 20)
{
if (iIndex == 14)
{
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\w%d.\y %s^n", iIndex-WPN_STARTID+1, "Golden M3")
break;
}
}
// Golden MP5
if (ze_get_user_level(id) >= 20 && ze_get_user_level(id) < 25)
{
if (iIndex == 14)
{
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\w%d.\y %s^n", iIndex-WPN_STARTID+1, "Golden M3")
}
if (iIndex == 15)
{
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\w%d.\y %s^n", iIndex-WPN_STARTID+1, "Golden MP5")
break;
}
}
// Golden M4A1
if (ze_get_user_level(id) >= 25 && ze_get_user_level(id) < 30)
{
if (iIndex == 14)
{
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\w%d.\y %s^n", iIndex-WPN_STARTID+1, "Golden M3")
}
if (iIndex == 15)
{
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\w%d.\y %s^n", iIndex-WPN_STARTID+1, "Golden MP5")
}
if (iIndex == 16)
{
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\w%d.\y %s^n", iIndex-WPN_STARTID+1, "Golden M4A1")
break;
}
}
// Golden AK47
if (ze_get_user_level(id) >= 30)
{
if (iIndex == 14)
{
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\w%d.\y %s^n", iIndex-WPN_STARTID+1, "Golden M3")
}
if (iIndex == 15)
{
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\w%d.\y %s^n", iIndex-WPN_STARTID+1, "Golden MP5")
}
if (iIndex == 16)
{
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\w%d.\y %s^n", iIndex-WPN_STARTID+1, "Golden M4A1")
}
if (iIndex == 17)
{
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\w%d.\y %s^n", iIndex-WPN_STARTID+1, "Golden AK-47")
break;
}
}
// Must check if iIndex < 14 means max is AK47
if (iIndex < 14)
{
ArrayGetString(g_szPrimaryWeapons, iIndex, szWeaponName, charsmax(szWeaponName))
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\w%d.\y %s^n", iIndex-WPN_STARTID+1, szWeaponNames[get_weaponid(szWeaponName)])
}
}
if (iIndex < 7)
{
ArrayGetString(g_szPrimaryWeapons, iIndex, szWeaponName, charsmax(szWeaponName))
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n\r Next Level Unlock\w: \y%s^n", szWeaponNames[get_weaponid(szWeaponName)])
}
if (ze_get_user_level(id) == 5)
{
ArrayGetString(g_szPrimaryWeapons, 7, szWeaponName, charsmax(szWeaponName))
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n\r Next Level Unlock\w: \y%s^n", szWeaponNames[get_weaponid(szWeaponName)])
}
else if (ze_get_user_level(id) == 6)
{
ArrayGetString(g_szPrimaryWeapons, 8, szWeaponName, charsmax(szWeaponName))
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n\r Next Level Unlock\w: \y%s^n", szWeaponNames[get_weaponid(szWeaponName)])
}
else if (ze_get_user_level(id) == 7)
{
ArrayGetString(g_szPrimaryWeapons, 9, szWeaponName, charsmax(szWeaponName))
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n\r Next Level Unlock\w: \y%s^n", szWeaponNames[get_weaponid(szWeaponName)])
}
else if (ze_get_user_level(id) == 8)
{
ArrayGetString(g_szPrimaryWeapons, 10, szWeaponName, charsmax(szWeaponName))
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n\r Next Level Unlock\w: \y%s^n", szWeaponNames[get_weaponid(szWeaponName)])
}
else if (ze_get_user_level(id) == 9)
{
ArrayGetString(g_szPrimaryWeapons, 11, szWeaponName, charsmax(szWeaponName))
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n\r Next Level Unlock\w: \y%s^n", szWeaponNames[get_weaponid(szWeaponName)])
}
else if (ze_get_user_level(id) == 10)
{
ArrayGetString(g_szPrimaryWeapons, 12, szWeaponName, charsmax(szWeaponName))
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n\r Next Level Unlock\w: \y%s^n", szWeaponNames[get_weaponid(szWeaponName)])
}
else if (ze_get_user_level(id) == 11)
{
ArrayGetString(g_szPrimaryWeapons, 13, szWeaponName, charsmax(szWeaponName))
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n\r Next Level Unlock\w: \y%s^n", szWeaponNames[get_weaponid(szWeaponName)])
}
else if (ze_get_user_level(id) >= 12 && ze_get_user_level(id) < 15) // Golden M3
{
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n\r Level 15 Unlock\w: \yGolden M3^n")
}
else if (ze_get_user_level(id) >= 15 && ze_get_user_level(id) < 20) // Golden MP5
{
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n\r Level 20 Unlock\w: \yGolden MP5^n")
}
else if (ze_get_user_level(id) >= 20 && ze_get_user_level(id) < 25) // Golden M4A1
{
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n\r Level 25 Unlock\w: \yGolden M4A1^n")
}
else if (ze_get_user_level(id) >= 25 && ze_get_user_level(id) < 30) // Golden Ak-47
{
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n\r Level 30 Unlock\w: \yGolden AK-47^n")
}
// 8. Auto Select
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n\w8.\y %L \w[\r%L\w]", id, "MENU_AUTOSELECT", id, (WPN_AUTO_ON) ? "SAVE_YES" : "SAVE_NO")
// 9. Next/Back - 0. Exit
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n^n\y9.\r %L \w/ \r%L^n^n\w0.\y %L", id, "NEXT", id, "BACK", 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++)
{
if (ze_get_user_level(id) == 0 && iIndex >= 2 ||
ze_get_user_level(id) == 1 && iIndex >= 3 ||
ze_get_user_level(id) == 2 && iIndex >= 4 ||
ze_get_user_level(id) == 3 && iIndex >= 5 ||
ze_get_user_level(id) == 4 && iIndex >= 6)
{
break
}
ArrayGetString(g_szSecondaryWeapons, iIndex, szWeaponName, charsmax(szWeaponName))
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n\w%d.\y %s", iIndex+1, szWeaponNames[get_weaponid(szWeaponName)])
}
if (iIndex < ArraySize(g_szSecondaryWeapons))
{
ArrayGetString(g_szSecondaryWeapons, iIndex, szWeaponName, charsmax(szWeaponName))
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n^n\r Next Level Unlock\w: \y%s", szWeaponNames[get_weaponid(szWeaponName)])
}
// 8. Auto Select
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n^n\w8.\y %L \w[\r%L\w]", id, "MENU_AUTOSELECT", id, (WPN_AUTO_ON) ? "SAVE_YES" : "SAVE_NO")
// 0. Exit
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n^n\w0.\y %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[id])
{
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[id])
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)
{
if (selection == 14) // Golden M3
{
give_golden_m3(id)
g_bBoughtPrimary[id] = true
return true;
}
else if (selection == 15) // Golden MP5
{
give_golden_mp5(id)
g_bBoughtPrimary[id] = true
return true;
}
else if (selection == 16) // Golden M4A1
{
give_golden_m4a1(id)
g_bBoughtPrimary[id] = true
return true;
}
else if (selection == 17) // Golden AK47
{
give_golden_ak47(id)
g_bBoughtPrimary[id] = true
return true;
}
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])
// Primary bought
g_bBoughtPrimary[id] = true
return 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)
{
if ( ((selection == 2) && (ze_get_user_level(id) < 1)) ||
((selection == 3) && (ze_get_user_level(id) < 2)) ||
((selection == 4) && (ze_get_user_level(id) < 3)) ||
((selection == 5) && (ze_get_user_level(id) < 4)) )
{
Show_Menu_Buy_Secondary(id)
return;
}
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
}
public Fw_TouchWeapon_Pre(iEnt, id)
{
if (get_pcvar_num(g_pCvarBlockWeapLowLevel) == 0)
return HAM_IGNORED;
// Not alive or Not Valid Weapon?
if(!is_user_alive(id) || !pev_valid(iEnt))
return HAM_IGNORED;
// Get Weapon Model
new szWeapModel[32]
pev(iEnt, pev_model, szWeapModel, charsmax(szWeapModel))
// Remove "models/w_" and ".mdl"
copyc(szWeapModel, charsmax(szWeapModel), szWeapModel[contain(szWeapModel, "_" ) + 1], '.')
// Set for mp5 to be same as "weapon_mp5navy"
if(szWeapModel[1] == 'p' && szWeapModel[2] == '5')
szWeapModel = "mp5navy"
// Add "weapon_" to all model names
static szWeaponEnt[32]
formatex(szWeaponEnt, charsmax(szWeaponEnt), "weapon_%s", szWeapModel)
// Get it's index in Weapon Array
new iIndex, i
// I won't explain the blew code if you need to understand ask me in Escapers-Zone.XYZ
for (i = 0; i < ArraySize(g_szPrimaryWeapons); i++)
{
new szPrimaryWeapon[32]
ArrayGetString(g_szPrimaryWeapons, i, szPrimaryWeapon, charsmax(szPrimaryWeapon))
if (equali(szWeaponEnt, szPrimaryWeapon))
iIndex = i
}
if (ze_get_user_level(id) == 0 && iIndex > 1)
{
return HAM_SUPERCEDE;
}
for (i = 1; i <= 11; i++)
{
if ((ze_get_user_level(id) == i) && iIndex > i+1)
{
return HAM_SUPERCEDE;
}
}
return HAM_IGNORED;
}
// 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
}