В самия код има добавени Exit и Back обаче не функционират. Ако може някой да ми помогне да го оправим и даже ако може да бъдат 7 неща на страница 8 да е Back, 9 да е Next и 0 да е Exit.
Ето го и въпросния код:
Код за потвърждение: Избери целия код
#include <amxmodx>
#include <engine>
#include <nvault>
#include <fakemeta>
#include <hamsandwich>
#include <zombieplague>
#define CC_COLORS_TYPE CC_COLORS_SHORT
#include <cromchat>
native zp_override_user_model(id, const model[], modelindex=0)
native zp_get_user_level(id)
#define GetLevel(%0) zp_get_user_level(%0)
new g_iUserClass[33], g_iUserNextClass[33], g_iMenuPosition[33]
new Array:aClassName,
Array:aClassLevel,
Array:aClassFlags,
Array:aClassPrivilege,
Array:aClassModel,
Array:aClassSubModel,
Array:aClassModelIndex
new g_iNvault
public plugin_init()
{
register_plugin("[ZP] Addon: Human Classes", "0.2", "ONYX")
//register_forward(FM_SetClientKeyValue, "FakeMeta_SetClientKeyValue")
RegisterHam(Ham_Spawn, "player", "Ham_PlayerSpawnPost", true)
//register_event("HLTV", "event_NewRound", "a", "1=0", "2=0")
register_menucmd(register_menuid("Show_ClassesMenu"), (1<<0|1<<1|1<<2|1<<3|1<<4|1<<5|1<<6|1<<7|1<<8|1<<9|1<<10), "Handler_ClassesMenu")
register_clcmd("hmenu", "Open_ClassesMenu")
g_iNvault = nvault_open("xman2030_class")
CC_SetPrefix("!g[!tHuman Classes!g]")
}
public plugin_precache()
{
aClassName = ArrayCreate(32)
aClassLevel = ArrayCreate()
aClassFlags = ArrayCreate(10)
aClassPrivilege = ArrayCreate(32)
aClassModel = ArrayCreate(64)
aClassSubModel = ArrayCreate()
aClassModelIndex = ArrayCreate()
new pFile = fopen("addons/amxmodx/configs/xman2030_human_classes.ini", "rt")
if(!pFile)
{
set_fail_state("[Human classes] No classes loaded. Check you human_classes.ini file!")
}
while(!feof(pFile))
{
new szLine[512], szKey[64], szValue[440]; fgets(pFile, szLine, charsmax(szLine))
replace(szLine, charsmax(szLine), "^n", "")
if(!equal(szLine, "") && szLine[0] != ';' && szLine[0] != '[')
{
strtok(szLine, szKey, charsmax(szKey), szValue, charsmax(szValue), '=')
trim(szKey); trim(szValue)
if(equal(szKey, "NAME"))
ArrayPushString(aClassName, szValue)
else if
(equal(szKey, "LEVEL")) ArrayPushCell(aClassLevel, str_to_num(szValue))
else if
(equal(szKey, "FLAGS")) ArrayPushString(aClassFlags, szValue)
else if
(equal(szKey, "PRIVILEGE")) ArrayPushString(aClassPrivilege, szValue)
else if
(equal(szKey, "SUB MODEL")) ArrayPushCell(aClassSubModel, str_to_num(szValue))
else if
(equal(szKey, "MODEL"))
{
new szModel[64]
formatex(szModel, charsmax(szModel), "models/player/%s/%s.mdl", szValue, szValue)
ArrayPushString(aClassModel, szValue)
ArrayPushCell(aClassModelIndex, engfunc(EngFunc_PrecacheModel, szModel))
}
}
}
if(!ArraySize(aClassName))
{
set_fail_state("[Human classes] No classes loaded. Check your human_classes.ini")
}
fclose(pFile)
}
public Open_ClassesMenu(id) return Show_ClassesMenu(id, g_iMenuPosition[id] = 0)
Show_ClassesMenu(id, iPosition)
{
if(iPosition < 0) return PLUGIN_HANDLED
new iStart = iPosition * 8, iClassesCount = ArraySize(aClassName)
if(iStart > iClassesCount)
{
iStart = iClassesCount
}
iStart = iStart - (iStart % 8)
g_iMenuPosition[id] = iStart / 8
new iEnd = iStart + 8
if(iEnd > iClassesCount)
{
iEnd = iClassesCount
}
new szMenu[1024], iLen
iLen = formatex(szMenu, charsmax(szMenu), "\yChoose class^n^n")
new iKeys = (1<<10), b
new szName[128], iLevel, szFlags[10], bool:bLevelAccess, bool:bFlagsAccess, szPrivilege[32]
for(new a = iStart; a < iEnd; a++)
{
ArrayGetString(aClassName, a, szName, charsmax(szName))
iLevel = ArrayGetCell(aClassLevel, a)
ArrayGetString(aClassFlags, a, szFlags, charsmax(szFlags))
bLevelAccess = ((GetLevel(id) >= iLevel) || !iLevel)
bFlagsAccess = ((get_user_flags(id) & read_flags(szFlags)) || equal(szFlags, "z")) ? true : false
if(!bLevelAccess)
{
format(szName, charsmax(szName), "%s \y[\rLevel:%d\y]", szName, iLevel)
}
if(!bFlagsAccess)
{
ArrayGetString(aClassPrivilege, a, szPrivilege, charsmax(szPrivilege))
format(szName, charsmax(szName), "%s \r[%s]", szName, szPrivilege)
}
if(bFlagsAccess && bLevelAccess)
{
iKeys |= (1<<b)
if(a != g_iUserClass[id])
{
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "%s \w%s^n", UTIL_MenuButton(++b), szName)
}
else
{
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "%s \d%s \y[Selected]^n", UTIL_MenuButton(++b), szName)
}
}
else
{
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "%s \d%s^n", UTIL_MenuButton(++b), szName)
}
}
for(new i = b; i < 8; i++) iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n")
if(iEnd < iClassesCount)
{
iKeys |= (1<<8)
formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n%s \wNext^n%s \w%s", UTIL_MenuButton(9), UTIL_MenuButton(0), iPosition ? "Back" : "Exit")
}
else
{
formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n^n%s \w%s", UTIL_MenuButton(0), iPosition ? "Back" : "Exit")
}
return show_menu(id, iKeys, szMenu, -1, "Show_ClassesMenu")
}
public Handler_ClassesMenu(id, iKey)
{
switch(iKey)
{
case 8: return Show_ClassesMenu(id, ++g_iMenuPosition[id])
case 9: return Show_ClassesMenu(id, --g_iMenuPosition[id])
default: SwitchModel(id, g_iMenuPosition[id] * 8 + iKey)
}
return PLUGIN_HANDLED
}
//public event_NewRound()
//{
// for(new i = 1, j = get_maxplayers(); i < j; i++)
// {
// if(g_iUserClass[i] != g_iUserNextClass[i])
// {
// ChangeModel(i, g_iUserClass[i] = g_iUserNextClass[i])
// CC_SendMessage(i, "Class changed!")
// }
// }
//}
public Ham_PlayerSpawnPost(id)
{
if(!zp_get_user_zombie(id) && !zp_get_user_survivor(id))
{
if(g_iUserClass[id] != g_iUserNextClass[id])
{
CC_SendMessage (id, "Class changed!")
ChangeModel(id, g_iUserClass[id] = g_iUserNextClass[id])
}
}
}
public zp_user_humanized_post(id, iSurvivor)
{
if(!iSurvivor) ChangeModel(id, g_iUserClass[id])
}
public plugin_end()
{
nvault_close(g_iNvault)
}
public client_putinserver(id)
{
LoadClass(id)
}
#if AMXX_VERSION_NUM < 183
public client_disconnect(id) SaveClass(id)
#else
public client_disconnected(id) SaveClass(id)
#endif
//public task_SetModel(id)
//{
// id -= 1876464854
// engfunc(EngFunc_SetClientKeyValue, id, engfunc(EngFunc_GetInfoKeyBuffer, id), "model", g_szUserModel[id])
// new szBuffer[64]; formatex(szBuffer, charsmax(szBuffer), "models/player/%s/%s.mdl", g_szUserModel[id], g_szUserModel[id])
// set_pdata_int(id, 491, engfunc(EngFunc_ModelIndex, szBuffer), 5)
//}
SwitchModel(id, iModel)
{
if(g_iUserClass[id] != iModel)
{
new szName[32]
ArrayGetString(aClassName, iModel, szName, charsmax(szName))
g_iUserNextClass[id] = iModel
CC_SendMessage(id, "You have selected class: !t%s!n. Model will be changed next round.", szName)
}
}
ChangeModel(id, iModel)
{
new szModel[64]
ArrayGetString(aClassModel, iModel, szModel, charsmax(szModel))
zp_override_user_model(id, szModel, ArrayGetCell(aClassModelIndex, iModel))
set_pev(id, pev_body, ArrayGetCell(aClassSubModel, iModel))
}
//SetModel(id, const szModel[])
//{
// if(zp_get_user_zombie(id) || zp_get_user_survivor(id)) return
//
// copy(g_szUserModel[id], charsmax(g_szUserModel[]), szModel)
// static Float:flGameTime, Float:flChangeTime; flGameTime = get_gametime()
// if(flGameTime - flChangeTime > 0.1)
// {
// task_SetModel(id + 1876464854)
// flChangeTime = flGameTime
// }
// else
// {
// set_task((flChangeTime + 0.1) - flGameTime, "task_SetModel", id + 1876464854)
// flChangeTime = flChangeTime + 0.1
// }
//}
LoadClass(id)
{
new szAuthID[32]; get_user_authid(id, szAuthID, charsmax(szAuthID))
new iClass = nvault_get(g_iNvault, szAuthID)
new iLevel
new szFlags[10]
iLevel = ArrayGetCell(aClassLevel, iClass)
ArrayGetString(aClassFlags, iClass, szFlags, charsmax(szFlags))
new bool:bLevelAccess = ((GetLevel(id) >= iLevel) || !iLevel)
new bool:bFlagsAccess = ((get_user_flags(id) & read_flags(szFlags)) || equal(szFlags, "z")) ? true : false
if(bFlagsAccess && bLevelAccess)
{
iClass = iClass
}
else
{
iClass = 0
}
g_iUserClass[id] = g_iUserNextClass[id] = iClass
ChangeModel(id, iClass)
}
SaveClass(id)
{
new szAuthID[32]
get_user_authid(id, szAuthID, charsmax(szAuthID))
new szData[3]; num_to_str(g_iUserClass[id], szData, charsmax(szData))
nvault_set(g_iNvault, szAuthID, szData)
}
stock UTIL_MenuButton(iNumber = -1)
{
new szButton[16]
if(iNumber == -1)
{
formatex(szButton, charsmax(szButton), "\y#")
}
else
{
formatex(szButton, charsmax(szButton), "\r%d.", iNumber)
}
return szButton
}