Помощ с добавянето на Exit/Back в меню

Въпроси и проблеми свързани с AMXModX.
Аватар
YankoNL
Извън линия
Потребител
Потребител
Мнения: 163
Регистриран на: 06 Апр 2017, 09:07
Местоположение: Варна
Се отблагодари: 22 пъти
Получена благодарност: 9 пъти

Помощ с добавянето на Exit/Back в меню

Мнение от YankoNL » 16 Май 2021, 21:54

Здравейте, в следния плъгин има меню което работи до някъде. Когато човек иска да се върне назад или да излезе - нищо не се получава.
В самия код има добавени 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
}
Благодаря предварително! :beer:

  • Подобни теми
    Отговори
    Преглеждания
     Последно мнение

Обратно към “Поддръжка / Помощ”

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 7 госта