Hey im having an error when im trying to use the natives from this plugin;
PHP Code:
/*===============================================================================
**Zombie XP system By K1llerZM**
=* Info *=
*- Add xp system (getting xp when killing zombie - infecting human )
*- Add the Abilty to register Items That will be unlocked with level ( non registred yet )
*- By dafult there 75 LEVELS
*- ITEM TEAM SUPPORT (human and zombie only)
=* Natives *=
*- zx_get_user_xp(id)
*- zx_get_user_level(id)
*- zx_set_user_xp(id , amount)
*- zx_set_user_level(id , amount)
*- zx_get_next_class(id)
*- zx_get_current_class(id)
*- zx_get_registered_classes_count()
*- zx_set_next_class(id , const classid[])
*- zx_register_zombie_class(const name[] , const description[] , const model[] ,const claw_model[] , health , Float:speed , Float:gravity , level)
*- zx_register_extra_item(const name[] , item_level , team)
=* Forward *=
*- zx_extra_item_selected_post(id , itemid)
*- zx_zombie_class_selected_post(id , classid)
*- zx_extra_item_selected_pre(id , itemid)
=* Commands *=
*- say /xpmenu // show main menu
=* Updates *=
*- v1.0 - first release , test . . .
*- v1,0a - some bugs fixed
*- v1,1 - fixed Native errors
*- v1.2 - fixed Somethings Thanks Donii
- added cvar Creator
- added other cvars
*- v1.3 - Fixed Native Params
- Added support team chat
*- v1.4 - Add Zombie Classes System
*- v1.5 - Fixed Bugs According Zombie Classes System
*- v1.7 - Add Credtis
*- v1.8 -
=*= Creditis =*=
*- DoNii - Some Fixes
*- Dias 'Pednragon' Leon - Some help in models
*- ZinoZack - level up sound
*- Tenebere - Test and FeedBack
*- Arion - for say commands duplicates
*- Author Notes
*- You Aren't allowed to copy/paste any code without credits
================================================================================*/
/*===============================================================================
START OF PLUGIN
================================================================================*/
#include <amxmodx>
#include <amxmisc>
#include <fun>
#include <nvault>
#include <hamsandwich>
#include <fakemeta>
#include <cstrike>
#include <zombieplague>
#include <cs_maxspeed_api>
#include <cs_weap_restrict_api>
#include "zx_const.cfg"
#include "zx_zombie_vars.cfg"
#include "zx_allowed_weapon.cfg"
#define PLUGIN "Zombie XP system"
#define VERSION "1.8"
#define AUTHOR "K1llerZM"
#define TEAM_ZOM (1<<0)
#define TEAM_HUM (1<<1)
#define is_user_valid(%1) (1 <= %1 <= g_MaxPlayers)
#define TASK_HUD_REMOVE 100
native cs_set_player_view_model(id, weaponid, const view_model[])
native cs_reset_player_view_model(id, weaponid)
native cs_set_player_weap_model(id, weaponid, const weapon_model[])
native cs_reset_player_weap_model(id, weaponid)
native cs_set_player_model(id, const model[])
// cvar Vars
new cvar_kill_xp , cvar_hs_xp , cvar_infect_xp , cvar_save_type , cvar_max , cvar_allow_show , cvar_show_type , cvar_extra_item_enabled , cvar_hud_r , cvar_hud_b , cvar_hud_g , cvar_allow_classes
// XP Vars
new playerxp[33] , playerlvl[33] , lvl_vault , xp_vault
// Messages Vars
new g_saytxt
new fade
// Extra Item Varsx
new Array:i_name
new Array:i_lvl
new Array:i_team
new zx_items_count
new zx_item_selected_post , zx_fw_return
new zx_item_selected_pre , pre_select_return
// Other Stuff
new g_MaxPlayers
new zx_hud
new red , green , blue
new xp_change[3][33] , xp
new selected[33]
new sound[64] = "misc/zp_level_up.wav"
public plugin_init() {
register_plugin(PLUGIN, VERSION, AUTHOR)
// Events
register_event("DeathMsg","event_death","a")
// Cvars
register_cvar("zombie_xp_version" , VERSION , FCVAR_SERVER)
cvar_kill_xp = register_cvar("zx_kill_xp" , "25") // xp for every kill
cvar_hs_xp = register_cvar("zx_headshot_xp" , "50") // xp for every kill with headshot
cvar_infect_xp = register_cvar("zx_infect_xp" , "35") // xp for infect
cvar_max = register_cvar("zx_max_level" , "75") // max level whenever you increase here increase limit in zx_const.cfg
cvar_save_type = register_cvar("zx_save_in" , "1") // save type : 1 = name , 2 = ip , 3 = staemid
cvar_allow_show = register_cvar("zx_allow_show_xp" , "1") // allow show xp hud when killing (+ XP)
cvar_show_type = register_cvar("zx_show_type" , "1") // 1 = hud wtih colors - 0 = hud with normal color
cvar_extra_item_enabled = register_cvar("zx_allow_extra_items" , "1") // allow extra items
cvar_hud_b = register_cvar("zx_hud_blue" , "0") //
cvar_hud_g = register_cvar("zx_hud_green" , "255")
cvar_hud_r = register_cvar("zx_hud_red" , "0")
cvar_allow_classes = register_cvar("zx_allow_zombie_classes", "1")
// Ham
RegisterHam(Ham_TakeDamage , "player" , "func_damage") // when user take damage , used for damage bonus
RegisterHam(Ham_Spawn , "player" , "func_spawn") // when user spawn not round start
// Vaults
lvl_vault = nvault_open("lvl_bank")
xp_vault = nvault_open("xp_bank")
// Commands - last 2 not say commands used in console only
register_clcmd("say" , "func_say") // used for prefix
register_clcmd("say_team" , "func_say_team") // team perfix
register_clcmd("say /xpmenu" , "funcs") // show main menu
register_clcmd("say xpmenu" , "funcs") // showing main menu
register_clcmd("info" , "func_info") // option 2 in main menu
register_clcmd("xpitems" , "func_menu") // items menu - option 1
register_clcmd("zcnemu" , "zclasses_menu")
// Forwards
zx_item_selected_post = CreateMultiForward("zx_extra_item_selected_post" , ET_CONTINUE , FP_CELL , FP_CELL)
zx_item_selected_pre = CreateMultiForward("zx_extra_item_selected_pre" , ET_CONTINUE , FP_CELL , FP_CELL)
zx_class_fw = CreateMultiForward("zx_zombie_class_selected_post" , ET_CONTINUE , FP_CELL , FP_CELL)
// Messages
fade = get_user_msgid("ScreenFade")
g_saytxt = get_user_msgid ("SayText")
register_message (g_saytxt, "avoid_duplicated") // Thanks Arion LOL
// Other Stuff
g_MaxPlayers = get_maxplayers()
zx_hud = CreateHudSyncObj()
register_dictionary("zombie_xp.txt")
}
public plugin_precache()
{
// Arrays
i_lvl = ArrayCreate(1 ,1)
i_name = ArrayCreate(32 , 1)
i_team = ArrayCreate(1,1)
Zc_Name = ArrayCreate(64 ,1)
Zc_Desc = ArrayCreate(64 ,1)
Zc_Model = ArrayCreate(64 ,1)
Zc_Claw = ArrayCreate(64 ,1)
Zc_Gravity = ArrayCreate(1 ,1)
Zc_speed = ArrayCreate(1,1)
Zc_health = ArrayCreate(1,1)
Zc_level = ArrayCreate(1,1)
precache_sound(sound)
}
public plugin_cfg()
{
new file[64]
get_configsdir(file , 63)
format(file , 63 , "%s/zombie_xp.cfg" ,file)
if(!file_exists(file))
create_cvars_file()
}
public avoid_duplicated (msgId, msgDest, receiver)
{
return PLUGIN_HANDLED
}
// user spawn
public func_spawn(id)
{
if (playerlvl[id] == 0)
playerlvl[id] = 1
if(is_user_alive(id))
set_task(0.1 , "zx_hud_show" , id+TASK_HUD_REMOVE , _, _, "b") // show_hud
//give_spawn_bonus(id)
set_task(1.0 , "give_spawn_bonus", id)
}
// Show Hud
public zx_hud_show(id)
{
id -= TASK_HUD_REMOVE
if(is_user_valid(id))
{
red = get_pcvar_num(cvar_hud_r)
green = get_pcvar_num(cvar_hud_g)
blue = get_pcvar_num(cvar_hud_b)
set_hudmessage(red, green, blue, 0.0, 0.31, 0, 6.0, 1.1, 0.0, 0.0, -1)
if (playerlvl[id] >= get_pcvar_num(cvar_max))
ShowSyncHudMsg(id ,zx_hud , "[Zombie XP system]^n[XP : %i | MAXED]^n[LEVEL : %i]" , playerxp[id] , playerlvl[id])
else
ShowSyncHudMsg(id ,zx_hud , "[Zombie XP system]^n[XP : %i | %i]^n[LEVEL : %i]" , playerxp[id] , level[playerlvl[id]] , playerlvl[id])
}
}
// Give Damage Bonus
public func_damage(victim, idinflictor, attacker, Float:damage, damagebits)
{
if(is_user_valid(attacker))
{
if (playerlvl[attacker] >= 5 && zp_get_user_human(attacker))
SetHamParamFloat(4 ,damage * 1.0)
if (playerlvl[attacker] >= 15 && zp_get_user_human(attacker))
SetHamParamFloat(4 , damage * 1.1)
if (playerlvl[attacker] >= 20 && zp_get_user_human(attacker))
SetHamParamFloat(4 , damage * 1.3)
if (playerlvl[attacker] >= 30 && zp_get_user_human(attacker))
SetHamParamFloat(4 , damage * 1.5 )
if (playerlvl[attacker] >= 5 && zp_get_user_zombie(attacker))
SetHamParamFloat(4 , damage + 5.0)
if (playerlvl[attacker] >= 10 && zp_get_user_zombie(attacker))
SetHamParamFloat(4 , damage + 20.0)
if (playerlvl[attacker] >= 20 && zp_get_user_zombie(attacker))
SetHamParamFloat(4 , damage + 40.0)
if (playerlvl[attacker] >= 30 && zp_get_user_zombie(attacker))
SetHamParamFloat(4 , damage + 50.0)
}
}
// Give Some Bonus
public give_spawn_bonus(id)
{
if(is_user_alive(id) && is_user_valid(id))
{
if (playerlvl[id] >= 5)
{
set_bonus(id , 150 , 30)
}
if (playerlvl[id] >= 10)
{
set_bonus(id , 200 , 50)
}
if (playerlvl[id] >= 15)
{
set_bonus(id , 250 , 80)
}
if (playerlvl[id] >= 20)
{
set_bonus(id , 300 , 100)
}
}
}
// Natives
public plugin_natives()
{
register_native("zx_get_user_xp" , "native_zx_get_user_xp" , 1)
register_native("zx_get_user_level" , "native_zx_get_user_level" , 1)
register_native("zx_set_user_xp" , "native_zx_set_user_xp" , 1)
register_native("zx_set_user_level" , "native_zx_set_user_level" , 1)
register_native("zx_register_extra_item" , "zx_register_extra_item" , 1)
register_native("zx_register_zombie_class" , "native_register_class" ,1)
register_native("zx_get_next_class" , "native_get_next_class" ,1)
register_native("zx_get_current_class" , "native_get_current_class" ,1)
register_native("zx_get_registered_classes_count" , "native_registered_count" ,1)
register_native("zx_set_next_class" , "native_set_next" ,1)
}
// After Infected
public zp_user_infected_post(id , infector)
{
playerxp[infector] += get_pcvar_num(cvar_infect_xp)
if(selected[id])
set_task(1.0 , "attr_set" , id)
}
public attr_set(id)
{
if(zclasses_count == 0)
{
return PLUGIN_HANDLED
}
if(zp_is_nemesis_round())
return PLUGIN_HANDLED;
PlayerCurClass[id] = PlayerNextClass[id]
ExecuteForward(zx_class_fw , zx_class_fw_return , id , PlayerCurClass[id])
new modelx[64]
ArrayGetString(Zc_Model , PlayerCurClass[id] , modelx , 63)
cs_set_player_model(id ,modelx)
//cs_set_user_model(id ,modelx)
set_user_gravity(id ,Float:ArrayGetCell(Zc_Gravity ,PlayerCurClass[id]))
cs_set_player_maxspeed_auto(id ,Float:ArrayGetCell(Zc_speed , PlayerCurClass[id]))
set_user_health(id , ArrayGetCell(Zc_health , PlayerCurClass[id]))
new Clawx[64]
ArrayGetString(Zc_Claw ,PlayerCurClass[id] , Clawx ,63)
cs_set_player_view_model(id , CSW_KNIFE ,Clawx)
cs_set_player_weap_restrict(id ,true , ALLOWED_WEAPONS , CSW_KNIFE)
cs_set_player_weap_model(id, CSW_KNIFE, "")
return PLUGIN_HANDLED
}
public zp_user_humanized_post(id)
{
cs_reset_player_view_model(id, CSW_KNIFE)
cs_reset_player_weap_model(id, CSW_KNIFE)
cs_set_player_weap_restrict(id , false)
}
// Players connect
public client_putinserver(id)
{
load_xp(id) // load_xp
if(get_pcvar_num(cvar_allow_show))
set_task(3.0 , "func_xp" , id)
}
// Thanks to someone i don't remeber
public func_xp(id)
{
xp = playerxp[id]
xp_change[0][id] = xp
xp_change[1][id] = xp
xp_change[2][id] = xp
set_task(1.0,"xp_changed" , id , _,_,"b")
}
public xp_changed(id)
{
xp_change[1][id] = playerxp[id]
new hold[33]
if(xp_change[1][id] !=xp_change[2][id])
{
if(xp_change[1][id] > xp_change[2][id])
{
xp = xp_change[1][id] - xp_change[2][id]
format(hold , charsmax(hold) ,"+ %i XP", xp)
}
xp_change[2][id] = xp_change[1][id]
if(get_pcvar_num(cvar_show_type))
{
set_hudmessage(0, 255, 0, 0.29, 0.46, 0, 0.1, 3.0, 0.1, 0.1)
show_hudmessage(id, hold)
}
else
client_print(id ,print_center , hold)
}
}
// player disconnect
public client_disconnect(id)
{
save_xp(id) // save exp when disconnect not including crash
if (!is_user_alive(id))
remove_task(id+TASK_HUD_REMOVE)
}
/*=========================================================================
STORE - VAULTS SECTION START HERE !
=========================================================================*/
public save_xp(id)
{
// Nvault Vars
new Xkey[65] , Lkey[65] , Xdate[256] , Ldate[256]
// Save type
switch(get_pcvar_num(cvar_save_type))
{
case 0:
{
new name[33]
get_user_name(id , name , 32)
format(Xkey , 64 , "%s-" , name)
format(Lkey , 64 , "%s-" , name)
}
case 1:
{
new ip[36]
get_user_ip(id , ip , 35)
format(Xkey , 64 , "%s-" , ip)
format(Lkey , 64 , "%s-" , ip)
}
case 2:
{
new steamid[35]
get_user_authid(id , steamid , 34)
format(Xkey , 64 , "%s-" , steamid)
format(Lkey , 64 , "%s-" , steamid)
}
}
format(Xdate , charsmax(Xdate) , "%i#" , playerxp[id])
format(Ldate , charsmax(Ldate) , "%i#" , playerlvl[id])
nvault_set(lvl_vault , Lkey , Ldate)
nvault_set(xp_vault , Xkey , Xdate)
return PLUGIN_CONTINUE
}
public load_xp(id)
{
new Xkey[65] , Lkey[65] , Xdate[256] , Ldate[256]
switch(get_pcvar_num(cvar_save_type))
{
case 0:
{
new name[33]
get_user_name(id , name , 32)
format(Xkey , 64 , "%s-" , name)
format(Lkey , 64 , "%s-" , name)
}
case 1:
{
new ip[36]
get_user_ip(id , ip , 35)
format(Xkey , 64 , "%s-" , ip)
format(Lkey , 64 , "%s-" , ip)
}
case 2:
{
new steamid[35]
get_user_authid(id , steamid , 34)
format(Xkey , 64 , "%s-" , steamid)
format(Lkey , 64 , "%s-" , steamid)
}
}
format(Xdate , charsmax(Xdate) , "%i#" , playerxp[id])
format(Ldate , charsmax(Ldate) , "%i#" , playerlvl[id])
nvault_get(lvl_vault , Lkey , Ldate , 255)
nvault_get(xp_vault , Xkey , Xdate , 255)
replace_all(Ldate , 255 ,"#" ,"")
replace_all(Xdate , 255 ,"#" ,"")
new xp[32] , lvl[32]
parse(Ldate , lvl , 31)
parse(Xdate , xp , 31)
playerlvl[id] = str_to_num(lvl)
playerxp[id] = str_to_num(xp)
return PLUGIN_CONTINUE
}
/*=========================================================================
END OF STORE - VAULTS SECTION , START OF MENU
=========================================================================*/
// Main Menu
public funcs(id)
{
new menu_id2 , menu[250]
formatex(menu , charsmax(menu) , "\r%L" , id , "ZX_MAIN_TITLE")
menu_id2 = menu_create(menu , "main_handler")
if (get_pcvar_num(cvar_extra_item_enabled))
formatex(menu , charsmax(menu) , "\w%L" ,id , "ZX_EXTRA_NAME")
else
formatex(menu , charsmax(menu) , "\d%L" ,id , "ZX_EXTRA_NAME_DES")
menu_additem(menu_id2 , menu , "" , 0)
formatex(menu , charsmax(menu) , "%s%L" , !get_pcvar_num(cvar_allow_classes) ? "\d":"\w",id , "ZX_INFO_NAME")
menu_additem(menu_id2 , menu ,"",0)
formatex(menu , charsmax(menu) , "\w%L" , id , "ZX_ZOMBIE_MENU_NAME")
menu_additem(menu_id2 , menu , "" , 0)
formatex(menu, charsmax(menu), "%L", id, "ZX_MENU_BACK")
menu_setprop(menu_id2, MPROP_BACKNAME, menu)
formatex(menu, charsmax(menu), "%L", id, "ZX_MENU_NEXT")
menu_setprop(menu_id2, MPROP_NEXTNAME, menu)
formatex(menu, charsmax(menu), "%L", id, "ZX_MENU_EXIT")
menu_setprop(menu_id2, MPROP_EXITNAME, menu)
menu_display(id , menu_id2 , 0)
}
public main_handler(id , menu_id2 , item)
{
if (item == MENU_EXIT)
{
menu_destroy(menu_id2)
return PLUGIN_HANDLED
}
switch(item)
{
case 0:
{
if (get_pcvar_num(cvar_extra_item_enabled))
func_menu(id)
else
client_printcolor(id , "%L" , id , "ZX_ITEMS_DISABLED")
}
case 1:
{
func_info(id)
}
case 2:
{
if (get_pcvar_num(cvar_allow_classes))
zclasses_menu(id)
else
client_printcolor(id , "%L" , id , "ZX_CLASSES_DISABLED")
}
}
return PLUGIN_HANDLED
}
public zclasses_menu(id)
{
if(zclasses_count == 0)
{
client_printcolor(id ,"%L" , id ,"ZX_NO_CLASS")
return PLUGIN_HANDLED
}
static menu , menu_a[300]
new item
formatex(menu_a , charsmax(menu_a) , "\r%L" , id ,"ZX_CLASSES_TITLE")
menu = menu_create(menu_a , "class_op")
for(item=0; item < zclasses_count ; item++)
{
new name[50] , desc[50] , cost
ArrayGetString(Zc_Name , item , name , charsmax(name))
ArrayGetString(Zc_Desc , item , desc , charsmax(desc))
cost = ArrayGetCell(Zc_level , item)
if(playerlvl[id] < ArrayGetCell(Zc_level , item))
{
formatex(menu_a , 299 , "\d%s [%s][%d]" , name , desc , cost)
}
else if(item == PlayerNextClass[id])
{
formatex(menu_a , 299 , "\d%s [%s][%d][Selected]" , name , desc , cost)
}
else
formatex(menu_a , 299 , "%s [\r%s][%d]" , name , desc ,cost)
name[0] = item
name[1] = 0
menu_additem(menu , menu_a , name)
}
formatex(menu_a, charsmax(menu), "%L", id, "ZX_MENU_BACK")
menu_setprop(menu, MPROP_BACKNAME, menu_a)
formatex(menu_a, charsmax(menu), "%L", id, "ZX_MENU_NEXT")
menu_setprop(menu, MPROP_NEXTNAME, menu_a)
formatex(menu_a, charsmax(menu), "%L", id, "ZX_MENU_EXIT")
menu_setprop(menu, MPROP_EXITNAME, menu_a)
menu_display(id ,menu, 0)
return PLUGIN_HANDLED
}
public class_op(id , menu , item)
{
if(item == MENU_EXIT)
{
menu_destroy(menu)
return PLUGIN_HANDLED
}
if (!is_user_alive(id)) {
client_printcolor(id , "%L" , id , "ZX_DEAD_MSG")
menu_destroy(menu)
}
new itemdata[2], dummy, classid
menu_item_getinfo(menu, item, dummy, itemdata, charsmax(itemdata), _, _, dummy)
classid = itemdata[0]
if(playerlvl[id] < ArrayGetCell(Zc_level, classid)) {
zclasses_menu(id)
client_printcolor(id , "%L" , id , "ZX_NOT_AT_LVL")
return PLUGIN_HANDLED
}
PlayerNextClass[id] = classid
selected[id] = true
menu_destroy(menu)
return PLUGIN_HANDLED
}
// Player Info
public func_info(id)
{
new menu[250] ,menu_id_info
formatex(menu , charsmax(menu) , "\r%L" , id ,"ZX_INFO_TITLE")
menu_id_info = menu_create(menu ,"p_handler")
new players[32] , snum , pl_id , holder[500]
new name[32]//, ///user_id[32]
get_players(players ,snum , "")
for (new i ; i<snum;i++)
{
pl_id = players[i]
get_user_name(pl_id , name , charsmax(name))
//format(user_id ,charsmax(user_id) , "%d" ,get_user_userid(pl_id))
format(holder , charsmax(holder) , "%s \r[\yLVL : \r%i][\yXP : \r%d]" , name , playerlvl[pl_id] , playerxp[pl_id])
menu_additem(menu_id_info ,holder)
}
formatex(menu, charsmax(menu), "%L", id, "ZX_MENU_BACK")
menu_setprop(menu_id_info, MPROP_BACKNAME, menu)
formatex(menu, charsmax(menu), "%L", id, "ZX_MENU_NEXT")
menu_setprop(menu_id_info, MPROP_NEXTNAME, menu)
formatex(menu, charsmax(menu), "%L", id, "ZX_MENU_EXIT")
menu_setprop(menu_id_info, MPROP_EXITNAME, menu)
menu_display(id , menu_id_info , 0)
}
public p_handler(id ,menu_id_info , item)
{
if (item == MENU_EXIT)
{
menu_destroy(menu_id_info)
return PLUGIN_HANDLED
}
new szData[6], szName[64];
new _access, item_callback;
menu_item_getinfo(menu_id_info , item, _access, szData,charsmax( szData ), szName,charsmax( szName ), item_callback );
new userid = str_to_num( szData );
new player = find_player( "k", userid )
if (player )
{
func_info(id)
}
menu_destroy(menu_id_info );
return PLUGIN_HANDLED;
}
// Extra Items menu
public func_menu(id)
{
// Don't Open The menu If there no items
if (zx_items_count == 0) {
client_printcolor(id ,"%L" , id , "NO_ITEMS")
return PLUGIN_HANDLED
}
static menu[250] , menu_id , item
new holder[32] , check_team
formatex(menu , charsmax(menu) , "\r%L" , id , "ZX_EXTRA_TITLE" , playerlvl[id])
menu_id = menu_create(menu , "zx_hanlder")
for(item =0 ; item < zx_items_count ; item++)
{
check_team = ArrayGetCell( i_team , item)
if(zp_get_user_zombie(id) && !(check_team & TEAM_ZOM) || (zp_get_user_human(id) && !(check_team & TEAM_HUM))) // check user team
continue
ArrayGetString(i_name, item , holder , charsmax(holder)) // Get item name
if (playerlvl[id] < ArrayGetCell(i_lvl , item))
format(menu , charsmax(menu) , "\d%s \r[\yLVL:\r%d]" , holder , ArrayGetCell(i_lvl , item)) // if user not at resusted level show grey color (disabled)
else
format(menu , charsmax(menu) , "%s \r[\yLVL:\r%d]" , holder , ArrayGetCell(i_lvl , item))
holder[0] = item
holder[1] = 0
// Add hte item
menu_additem(menu_id , menu , holder)
}
formatex(menu, charsmax(menu), "%L", id, "ZX_MENU_BACK")
menu_setprop(menu_id, MPROP_BACKNAME, menu)
formatex(menu, charsmax(menu), "%L", id, "ZX_MENU_NEXT")
menu_setprop(menu_id, MPROP_NEXTNAME, menu)
formatex(menu, charsmax(menu), "%L", id, "ZX_MENU_EXIT")
menu_setprop(menu_id, MPROP_EXITNAME, menu)
menu_display(id , menu_id , 0)
return PLUGIN_HANDLED
}
public zx_hanlder(id , menu_id , item)
{
if (item == MENU_EXIT)
{
menu_destroy(menu_id)
return PLUGIN_HANDLED
}
if (!is_user_alive(id)) {
client_printcolor(id , "%L" , id , "ZX_DEAD_MSG")
menu_destroy(menu_id)
}
if (zp_get_user_survivor(id))
menu_destroy(menu_id)
if (zp_get_user_nemesis(id))
menu_destroy(menu_id)
new itemdata[2], dummy, itemid
menu_item_getinfo(menu_id, item, dummy, itemdata, charsmax(itemdata), _, _, dummy)
itemid = itemdata[0]
// Check user level if not as we want disable the item send message say Not at wanted level
if (playerlvl[id] < ArrayGetCell(i_lvl , itemid))
{
func_menu(id)
client_printcolor(id , "%L" , id , "ZX_NOT_AT_LVL")
return ITEM_DISABLED
}
ExecuteForward(zx_item_selected_pre , pre_select_return , id , itemid)
// Item has Been bought
zx_item_bought(id , itemid)
menu_destroy(menu_id)
return PLUGIN_HANDLED
}
public zx_item_bought(id, itemid)
{
static check_team
check_team = ArrayGetCell(i_team , itemid)
if(zp_get_user_zombie(id) && !(check_team & TEAM_ZOM) || (zp_get_user_human(id) && !(check_team & TEAM_HUM)))
{
client_printcolor(id , "%L" , id , "ZX_NO_ITEMS_FOR_YOUR_TEAM")
}
new name[32]
ArrayGetString(i_name , itemid , name , charsmax(name))
client_printcolor(id , "%L" , id , "ZX_ITEM_PURCHASED" ,name )
// Forward (zx_extra_item_selected
ExecuteForward(zx_item_selected_post , zx_fw_return , id , itemid)
}
/*=============================================================================
END OF MENU SECTION - KILLS GIVING XP - LEVELS START HERE
=============================================================================*/
// When user is killed
public event_death()
{
new attacker = read_data(1)
//new victim = read_data(2)
new headshot = read_data(3)
if (is_user_valid(attacker))
{
if (headshot)
{
playerxp[attacker] += get_pcvar_num(cvar_hs_xp)
}
else
playerxp[attacker] += get_pcvar_num(cvar_kill_xp)
do_check(attacker)
}
}
public do_check(id)
{
if(playerlvl[id] < get_pcvar_num(cvar_max))
{
while(playerxp[id] >= level[playerlvl[id]])
{
playerlvl[id] += 1
message_begin(MSG_ONE_UNRELIABLE, fade, _, id)
write_short(1<<12) // duration
write_short(1) // hold time
write_short(0x0000) // fade type
write_byte(1) // red
write_byte(195) // green
write_byte(4) // blue
write_byte(205) // alpha
message_end()
client_printcolor(id , "%L" ,id,"ZX_LEVEL_UP" ,playerlvl[id])
set_user_health(id, get_user_health(id) + 50)
set_user_armor(id , get_user_armor(id) +50)
emit_sound(id,CHAN_VOICE , sound, VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
}
}
}
public func_say(id)
{
new msg[191] , name[32]
read_args(msg , 191)
remove_quotes(msg)
get_user_name(id , name , 31)
if (equali(msg , "") || equali(msg , "") || !is_valid_mesg(msg))
return PLUGIN_HANDLED_MAIN
if(is_user_alive(id))
format(msg , 191 , "^4[LVL : ^3%d] ^3%s : ^1%s" , playerlvl[id] ,name , msg)
else
format(msg , 191 , "^1*DEAD*^4[LVL : ^3%d] ^3%s : ^1%s" , playerlvl[id] ,name , msg)
for (new i = 1 ; i < g_MaxPlayers;i++)
{
send_message_lol(i , msg)
}
return PLUGIN_CONTINUE
}
public func_say_team(id)
{
new msg[191] , name[32]
read_args(msg , 191)
remove_quotes(msg)
get_user_name(id , name , 31)
if (equali(msg , "") || equali(msg , "") || !is_valid_mesg(msg))
return PLUGIN_HANDLED_MAIN
new CsTeams:team[33]
team[id] = cs_get_user_team(id)
if(is_user_alive(id))
format(msg , 191 , "^1(%s)^4[LVL : ^3%d] ^3%s : ^1%s" ,team[id], playerlvl[id] ,name , msg)
else
format(msg , 191 , "^1(%s)^1*DEAD*^4[LVL : ^3%d] ^3%s : ^1%s" ,team[id], playerlvl[id] ,name , msg)
for (new i = 1 ; i < g_MaxPlayers;i++)
{
send_message_lol(i , msg)
}
return PLUGIN_CONTINUE
}
/*========================================================================
END OF KILLS - LEVEL SECTION , START OF NATIVES
=========================================================================*/
// zx_get_user_xp get_user_xp when used in other plugins
public native_zx_get_user_xp(plugin_id, num_params)
{
new id = get_param(1)
if(!is_user_valid(id))
{
log_error(AMX_ERR_NATIVE , "[ZX] Invaild Player (%d)" , id)
return -1
}
return playerxp[id]
}
// zx_get_user_levle get_user_level when used in other plugins
public native_zx_get_user_level(plugin_id, num_params)
{
new id = get_param(1)
if(!is_user_valid(id))
{
log_error(AMX_ERR_NATIVE , "[ZX] Invaild Player (%d)" , id)
return -1
}
return playerlvl[id]
}
// zx_set_user_xp set user xp when used in other plugins
public native_zx_set_user_xp(plugin_id, num_params)
{
new id = get_param(1)
new amount = get_param(2)
if(!is_user_valid(id))
{
log_error(AMX_ERR_NATIVE , "[ZX] Invaild Player (%d)" , id)
return false
}
playerxp[id] = amount
return true
}
// zx_set_user_level set_user_level when used in other plugins
public native_zx_set_user_level(plugin_id, num_params)
{
new id = get_param(1)
new amount = get_param(2)
if(!is_user_valid(id))
{
log_error(AMX_ERR_NATIVE , "[ZX] Invaild Player (%d)" , id) // number of id
return false
}
playerlvl[id] = amount
return true
}
// The native That register the item
public zx_register_extra_item(const name[] , item_level , team)
{
param_convert(1)
ArrayPushString(i_name , name)
ArrayPushCell(i_lvl , item_level)
ArrayPushCell(i_team , team)
zx_items_count++ // increase the item count
return zx_items_count-1 // to work proberly
}
public native_register_class(const name[] , const description[] , const player_model[] ,const claw_model[] , health , Float:speed , Float:gravity , level)
{
param_convert(1)
param_convert(2)
param_convert(3)
param_convert(4)
ArrayPushString(Zc_Name , name)
ArrayPushString(Zc_Desc , description)
ArrayPushString(Zc_Model , player_model)
ArrayPushString(Zc_Claw , claw_model)
ArrayPushCell(Zc_health , health)
ArrayPushCell(Zc_speed , speed)
ArrayPushCell(Zc_Gravity , gravity)
ArrayPushCell(Zc_level , level)
new model_path[128]
formatex(model_path, charsmax(model_path), "models/player/%s/%s.mdl", player_model, player_model)
if(file_exists(model_path)) //precache_model(model_path)
engfunc(EngFunc_PrecacheModel ,model_path)
engfunc(EngFunc_PrecacheModel ,claw_model)
zclasses_count++
return zclasses_count-1
}
public native_get_next_class(plugin_id, num_params)
{
new id = get_param(1)
if(!is_user_valid(id))
{
log_error(AMX_ERR_NATIVE , "[ZX] Invaild Player (%d)" , id) // number of id
return false
}
return PlayerNextClass[id]
}
public native_registered_count(plugin_id, num_params)
{
return zclasses_count
}
public native_set_next(plugin_id, num_params)
{
new id = get_param(1)
new classid = get_param(2)
if(!is_user_valid(id))
{
log_error(AMX_ERR_NATIVE , "[ZX] Invaild Player (%d)" , id) // number of id
return false
}
PlayerNextClass[id] = classid
return true
}
public native_get_current_class(plugin_id, num_params)
{
new id = get_param(1)
if(!is_user_valid(id))
{
log_error(AMX_ERR_NATIVE , "[ZX] Invaild Player (%d)" , id) // number of id
return false
}
return PlayerCurClass[id]
}
/*==============================================================================
END OF NATIVES - START OF STOCKES
==============================================================================*/
// Some Stocks
stock set_bonus(id , health , armor)
{
if(is_user_valid(id))
{
set_user_health(id , health)
set_user_armor(id , armor)
}
}
stock bool:zp_get_user_human(id)
{
if(!zp_get_user_nemesis(id) && !zp_get_user_zombie(id) && !zp_get_user_survivor(id) && is_user_valid(id))
return true
else
return false
return true
}
public send_message_lol(id , msg[])
{
message_begin (MSG_ONE, g_saytxt, {0, 0, 0}, id)
write_byte(id)
write_string(msg)
message_end()
}
bool:is_valid_mesg(const message[])
{
if(message[0] == '@' || message[0] == '/' || message[0] == '!' || !strlen(message))
return false
else
return true
return true
}
stock client_printcolor(const id, const input[], any:...)
{
new count = 1, players[32];
static msg[191];
vformat(msg, 190, input, 3);
replace_all(msg, 190, "!g", "^4"); // Green Color
replace_all(msg, 190, "!y", "^1"); // Default Color
replace_all(msg, 190, "!t", "^3"); // Team Color
if (id) players[0] = id; else get_players(players, count, "ch");
for ( new i = 0; i < count; i++ )
{
if ( is_user_connected(players[i]) )
{
message_begin(MSG_ONE_UNRELIABLE, g_saytxt , _, players[i]);
write_byte(players[i]);
write_string(msg);
message_end();
}
}
}
create_cvars_file()
{
new file[64] , f , fmt[1000]
get_configsdir(file, charsmax(file))
format(file , charsmax(file) , "%s/zombie_xp",file)
add(file , charsmax(file) ,".cfg")
f = fopen(file , "wt")
if (file_exists(file)) {
server_cmd("exec %s" ,file)
}
new pug , file_n[300] , plug_name[200] , plug_ver[300] , plug_auther[300]
pug = get_plugin(-1 ,file_n, charsmax(file_n) , plug_name , charsmax(plug_name) , plug_ver , charsmax(plug_ver) , plug_auther , charsmax(plug_auther))
format(fmt , charsmax(fmt) ,"; %s configuration file By %s ^n" , plug_name , plug_auther)
fprintf(f , fmt)
new cvars = get_plugins_cvarsnum()
new cvarsd , cvar_name[300] , cvar_value[30] ,id_pl
fprintf(f , "^nCvars :^n")
for(new i ; i < cvars ;i++)
{
get_plugins_cvar(i ,cvar_name , charsmax(cvar_name) ,_, id_pl , cvarsd)
if (id_pl == pug)
{
get_pcvar_string(cvarsd , cvar_value ,charsmax(cvar_value))
fprintf(f , "^n%s %s^n" , cvar_name , cvar_value)
}
}
fclose(f)
}
/*=====================================================================
END OF PLUGIN - HAVE FUN
=====================================================================*/
/* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
*{\\ rtf1\\ fbidis\\ ansi\\ ansicpg1252\\ deff0{\\ fonttbl{\\ f0\\ fnil\\ fcharset0 Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ ltrpar\\ lang1025\\ f0\\ fs16 \n\\ par }
*/