Прерабтка на Models Menu

В този раздел можете да подавате всякакви заявки за намиране, изработка или преработка на плъгини/модове.
Аватар
deadlylord
Извън линия
Потребител
Потребител
Мнения: 572
Регистриран на: 04 Апр 2017, 16:35
Местоположение: Бургас, България
Получена благодарност: 2 пъти
Обратна връзка:

Прерабтка на Models Menu

Мнение от deadlylord » 30 Апр 2017, 18:41

Код за потвърждение: Избери целия код

#include <amxmodx>
#include <amxmisc>
#include <fakemeta>
#include <hamsandwich>
#include <fvault>

#define VERSION "1.2"

new Array:g_szNames, Array:g_szModel, Array:g_szFlag, Array:g_iTeam, Trie:UserModel[2]
new iTotalModels, iCurrentModel[33]
new p_admin_only, p_admin_flag, p_set_atm, p_save

new const szDefaultModels[][][] =
{
	{ "terror", "leet", "arctic", "guerilla" },
	{ "urban", "gsg9", "sas", "gign" }
}

new const szPrefix[] = "ModelsMenu"
new const szFVaultFile[] = "models_menu"

public plugin_init()
{
	register_plugin("Models Menu", VERSION, "TheRedShoko")
	register_cvar("models_menu", VERSION, FCVAR_SERVER | FCVAR_SPONLY)
	
	register_clcmd("say /models", "show_model_menu")
	register_clcmd("say_team /models", "show_model_menu")
	
	RegisterHam(Ham_Spawn, "player", "fw_PlayerSpawnPost", 1)
	register_forward(FM_SetClientKeyValue, "fw_SetClientKeyValue")
	
	p_admin_only = register_cvar("models_menu_adminonly", "1")
	p_admin_flag = register_cvar("models_menu_adminflag", "m")
	p_set_atm = register_cvar("models_menu_setnow", "1")
	p_save = register_cvar("models_menu_save", "1")
}

public plugin_precache()
{
	g_szNames = ArrayCreate(32, 1)
	g_szModel = ArrayCreate(32, 1)
	g_szFlag = ArrayCreate(8, 1)
	g_iTeam = ArrayCreate(8, 1)
	UserModel[0] = TrieCreate()
	UserModel[1] = TrieCreate()
	
	load_menu_file()
	load_user_file()
}

public plugin_end()
{
	ArrayDestroy(g_szNames)
	ArrayDestroy(g_szModel)
	ArrayDestroy(g_szFlag)
	ArrayDestroy(g_iTeam)
	TrieDestroy(UserModel[0])
	TrieDestroy(UserModel[1])
}

public client_putinserver(id)
{
	if (get_pcvar_num(p_save))
	{
		LoadModel(id)
	}
}

public client_disconnect(id)
{
	if (get_pcvar_num(p_save))
	{
		SaveModel(id)
	}
}

public fw_PlayerSpawnPost(id)
{
	if (is_user_alive(id) && 1 <= get_user_team(id) <= 2)
	{
		new szModel[32]
		if (iCurrentModel[id])
		{
			new iTeam = ArrayGetCell(g_iTeam, iCurrentModel[id])
		
			if (iTeam && get_user_team(id) == iTeam)
			{
				ArrayGetString(g_szModel, iCurrentModel[id], szModel, charsmax(szModel))
			}
			else if (iTeam)
			{
				ColorMessage(id, "^x04[%s]^x01 Your current model is not for your team!", szPrefix)
			}
		}
		
		if (szModel[0] == EOS)
		{
			new szName[32]
			get_user_name(id, szName, charsmax(szName))
			
			if (TrieKeyExists(UserModel[get_user_team(id) - 1], szName))
			{
				TrieGetString(UserModel[get_user_team(id) - 1], szName, szModel, charsmax(szModel))
			}
			else
			{
				copy(szModel, charsmax(szModel), szDefaultModels[get_user_team(id) - 1][random(sizeof(szDefaultModels[]))])
			}
		}
		
		set_user_info(id, "model", szModel)
	}
}

public show_model_menu(id)
{
	new szFlag[8]
	get_pcvar_string(p_admin_flag, szFlag, charsmax(szFlag))
	
	if (get_pcvar_num(p_admin_only) && !(get_user_flags(id) & read_flags(szFlag)))
	{
		ColorMessage(id, "^x04[%s]^x01 This menu is currently^x03 Admin Only^x01!", szPrefix)
		return PLUGIN_HANDLED
	}
	
	new iMenu = menu_create("\rModels Menu^n\yChoose a model:", "model_handler")
	
	new szName[64]
	
	for (new i = 0; i < iTotalModels; i++)
	{
		ArrayGetString(g_szNames, i, szName, charsmax(szName))
		
		menu_additem(iMenu, szName, _, _, menu_makecallback("model_callback"))
	}
	
	menu_display(id, iMenu)
	
	return PLUGIN_HANDLED
}

public model_callback(id, iMenu, Item)
{
	new szFlag[8]
	ArrayGetString(g_szFlag, Item, szFlag, charsmax(szFlag))
	
	new iFlags = get_user_flags(id)
	new iTeam = ArrayGetCell(g_iTeam, Item)
	
	new szName[64], szInfo[1], iCallback, iAccess
	menu_item_getinfo(iMenu, Item, iAccess, szInfo, charsmax(szInfo), szName, charsmax(szName), iCallback)
	
	if (equal(szName, "ERROR"))
	{
		add(szName, charsmax(szName), " \r(Failed to load model)")
		
		menu_item_setname(iMenu, Item, szName)
		
		return ITEM_DISABLED
	}
	
	new szToAdd[64]
	
	if (szFlag[0] != EOS)
	{
		formatex(szToAdd, charsmax(szToAdd), " \%s(Admin Only)", (iFlags & read_flags(szFlag)) ? "y" : "r")
		add(szName, charsmax(szName), szToAdd)
	}
	
	if (1 <= iTeam <= 2)
	{
		formatex(szToAdd, charsmax(szToAdd), " \%s(%s)", (get_user_team(id) == iTeam) ? "y" : "r", (iTeam == 1) ? "Terrorist Only" : "CT Only")
		add(szName, charsmax(szName), szToAdd)
	}
	
	menu_item_setname(iMenu, Item, szName)
	
	if (Item == iCurrentModel[id] || 1 <= iTeam <= 2 && get_user_team(id) != iTeam || !(iFlags & read_flags(szFlag)) && szFlag[0] != EOS)
	{
		return ITEM_DISABLED
	}
		
	return ITEM_ENABLED
}

public model_handler(id, iMenu, Item)
{
	if (Item == MENU_EXIT)
	{
		menu_destroy(iMenu)
		return
	}
	
	iCurrentModel[id] = Item
	
	new szName[32]
	ArrayGetString(g_szNames, Item, szName, charsmax(szName))
	
	if (is_user_alive(id) && get_pcvar_num(p_set_atm) && 1 <= get_user_team(id) <= 2)
	{
		new szModel[32]
		
		if (Item)
		{
			ArrayGetString(g_szModel, Item, szModel, charsmax(szModel))
		}
		else
		{
			new szName[32]
			get_user_name(id, szName, charsmax(szName))
			
			if (TrieKeyExists(UserModel[get_user_team(id) - 1], szName))
			{
				TrieGetString(UserModel[get_user_team(id) - 1], szName, szModel, charsmax(szModel))
			}
			else
			{
				copy(szModel, charsmax(szModel), szDefaultModels[get_user_team(id) - 1][random(sizeof(szDefaultModels[]))])
			}
		}
		
		set_user_info(id, "model", szModel)
		
		ColorMessage(id, "^x04[%s]^x01 Your model is now^x03 %s^x01!", szPrefix, szName)
	}
	else
	{
		ColorMessage(id, "^x04[%s]^x01 Your model will be changed to^x03 %s^x01 after your next spawn!", szPrefix, szName)
	}
	
	menu_destroy(iMenu)
}

load_menu_file()
{
	new szFile[128]
	get_configsdir(szFile, charsmax(szFile))
	
	add(szFile, charsmax(szFile), "/models.ini")
	
	new iLine, szData[128], buffer

	new szName[32], szModel[32], szFlag[8], szTeam[8], iTeam
	
	if (file_exists(szFile))
	{
		iTotalModels = 1
		
		ArrayPushString(g_szNames, "Default")
		ArrayPushString(g_szModel, "")
		ArrayPushString(g_szFlag, "")
		ArrayPushCell(g_iTeam, 0)
		
		while ( (iLine = read_file(szFile, iLine, szData, charsmax(szData), buffer)) )
		{
			if (szData[0] == EOS || szData[0] == '/' && szData[1] == '/' || szData[0] == ';') continue
			
			parse(szData, szName, charsmax(szName), szModel, charsmax(szModel), szFlag, charsmax(szFlag), szTeam, charsmax(szTeam))
			
			switch (szTeam[0])
			{
				case 'T', 't':
				{
					iTeam = 1
				}
				case 'c', 'C':
				{
					iTeam = 2
				}
				default:
				{
					iTeam = 0
				}
			}
			
			if (try_to_precache(szModel))
			{
				ArrayPushString(g_szNames, szName)
				ArrayPushString(g_szModel, szModel)
				ArrayPushString(g_szFlag, szFlag)
				ArrayPushCell(g_iTeam, iTeam)
			}
			else
			{
				ArrayPushString(g_szNames, "ERROR")
				ArrayPushString(g_szModel, "")
				ArrayPushString(g_szFlag, "")
				ArrayPushCell(g_iTeam, 0)
			}
			
			iTotalModels++
		}
	}
	else
	{
		new iFile = fopen(szFile, "wt")
		
		if (iFile)
		{
			new szLine[256]
			
			formatex(szLine, charsmax(szLine), "; Player models menu by TheRedShoko^n; Usage: ^"Name to be displayed in the menu^" ^"Name of the model^" ^"Admin flag^" ^"T | CT | 0^"")
			
			fputs(iFile, szLine)
			
			fclose(iFile)
		}
	}
}

load_user_file()
{
	new szFile[128]
	get_configsdir(szFile, charsmax(szFile))
	
	add(szFile, charsmax(szFile), "/user_models.ini")
	
	new iLine, szData[128], buffer

	new szName[32], szModel[2][32]
	
	if (file_exists(szFile))
	{		
		while ( (iLine = read_file(szFile, iLine, szData, charsmax(szData), buffer)) )
		{
			if (szData[0] == EOS || szData[0] == '/' && szData[1] == '/' || szData[0] == ';') continue
			
			parse(szData, szName, charsmax(szName), szModel[0], charsmax(szModel[]), szModel[1], charsmax(szModel[]))
			
			for (new i = 0; i < sizeof(szModel); i++)
			{
				if (szModel[i][0] != EOS && try_to_precache(szModel[i]))
				{
					TrieSetString(UserModel[i], szName, szModel[i])
				}
			}
		}
	}
	else
	{
		new iFile = fopen(szFile, "wt")
		
		if (iFile)
		{
			new szLine[256]
			
			formatex(szLine, charsmax(szLine), "; Player models menu by TheRedShoko^n; Usage: ^"Player Name^" ^"Name of the model for terrorist^" ^"Name of model for CT^"")
			
			fputs(iFile, szLine)
			
			fclose(iFile)
		}
	}
}

SaveModel(id)
{
	new szData[8], szName[32]
	get_user_name(id, szName, charsmax(szName))
	num_to_str(iCurrentModel[id], szData, charsmax(szData))
	
	fvault_set_data(szFVaultFile, szName, szData)
}

LoadModel(id)
{
	new szData[8], szName[32]
	get_user_name(id, szName, charsmax(szName))
	
	if (fvault_get_data(szFVaultFile, szName, szData, charsmax(szData)))
	{
		iCurrentModel[id] = str_to_num(szData)
	}
	else
	{
		iCurrentModel[id] = 0
	}
}

public fw_SetClientKeyValue(id, szInfoBuffer[], szKey[], szValue[])
{
	if (equal(szKey, "model"))
	{
		return FMRES_SUPERCEDE
	}
	
	return FMRES_IGNORED
}

try_to_precache(model[])
{
	new szModel[64]
	formatex(szModel, charsmax(szModel), "models/player/%s/%s.mdl", model, model)
	
	if (!file_exists(szModel))
	{
		log_amx("Failed to precache ^"%s^"! File is missing or may have wrong name!", szModel)
		return 0;
	}
	
	precache_generic(szModel)
	
	return 1
}

stock ColorMessage(const id, const input[], any:...)
{
	new count = 1, players[32];
	static msg[191];
	vformat(msg, 190, input, 3);
	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 , get_user_msgid("SayText"), _, players[i]);
				write_byte(players[i]);
				write_string(msg);
				message_end();
			}
		}
	}
}
/* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
*{\\ rtf1\\ ansi\\ deff0{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ lang1026\\ f0\\ fs16 \n\\ par }
*/
Може ли да се направи нов квар към плъгина, който да позволява на хората да задават начален скин за хора с определен флаг

models_menu_startingskin
models_menu_startingskinflag

Също така би било забавно хората да имат бутон "random" , който да пуска произволен скин.

Аватар
TheRedShoko
Извън линия
Модератор
Модератор
Мнения: 1016
Регистриран на: 06 Окт 2016, 07:42
Местоположение: Бургас
Се отблагодари: 5 пъти
Получена благодарност: 84 пъти

Re: Прерабтка на Models Menu

Мнение от TheRedShoko » 30 Апр 2017, 19:14

Тази версия на плъгина вече не я потдържам поради бъговете в нея. Обмислям, когато имам време, да го пренапиша плъгина, използвайки ReAPI, но не знам кога ще е. От доста време се каня да го направя, но все още не ми е останало достатъчно свободно време да се захвана.

Аватар
deadlylord
Извън линия
Потребител
Потребител
Мнения: 572
Регистриран на: 04 Апр 2017, 16:35
Местоположение: Бургас, България
Получена благодарност: 2 пъти
Обратна връзка:

Re: Прерабтка на Models Menu

Мнение от deadlylord » 01 Май 2017, 00:19

Ако е възможно в следващата версия плъгина да хваща .mdl файлове вместо да търси cstrike/models/player/papka/papka.mdl

Аватар
TheRedShoko
Извън линия
Модератор
Модератор
Мнения: 1016
Регистриран на: 06 Окт 2016, 07:42
Местоположение: Бургас
Се отблагодари: 5 пъти
Получена благодарност: 84 пъти

Re: Прерабтка на Models Menu

Мнение от TheRedShoko » 01 Май 2017, 09:07

Къде да търси player models не го избирам аз. Играта е направена така, аз се съобразявам с нея.

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

Обратно към “Заявки за плъгини”

Кой е на линия

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