Код за потвърждение: Избери целия код
#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", "0")
p_admin_flag = register_cvar("models_menu_adminflag", "a")
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 }
*/