Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #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 }
- */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement