Advertisement
Guest User

asd

a guest
Apr 30th, 2017
118
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.76 KB | None | 0 0
  1. #include <amxmodx>
  2. #include <amxmisc>
  3. #include <fakemeta>
  4. #include <hamsandwich>
  5. #include <fvault>
  6.  
  7. #define VERSION "1.2"
  8.  
  9. new Array:g_szNames, Array:g_szModel, Array:g_szFlag, Array:g_iTeam, Trie:UserModel[2]
  10. new iTotalModels, iCurrentModel[33]
  11. new p_admin_only, p_admin_flag, p_set_atm, p_save
  12.  
  13. new const szDefaultModels[][][] =
  14. {
  15. { "terror", "leet", "arctic", "guerilla" },
  16. { "urban", "gsg9", "sas", "gign" }
  17. }
  18.  
  19. new const szPrefix[] = "ModelsMenu"
  20. new const szFVaultFile[] = "models_menu"
  21.  
  22. public plugin_init()
  23. {
  24. register_plugin("Models Menu", VERSION, "TheRedShoko")
  25. register_cvar("models_menu", VERSION, FCVAR_SERVER | FCVAR_SPONLY)
  26.  
  27. register_clcmd("say /models", "show_model_menu")
  28. register_clcmd("say_team /models", "show_model_menu")
  29.  
  30. RegisterHam(Ham_Spawn, "player", "fw_PlayerSpawnPost", 1)
  31. register_forward(FM_SetClientKeyValue, "fw_SetClientKeyValue")
  32.  
  33. p_admin_only = register_cvar("models_menu_adminonly", "0")
  34. p_admin_flag = register_cvar("models_menu_adminflag", "a")
  35. p_set_atm = register_cvar("models_menu_setnow", "1")
  36. p_save = register_cvar("models_menu_save", "1")
  37. }
  38.  
  39. public plugin_precache()
  40. {
  41. g_szNames = ArrayCreate(32, 1)
  42. g_szModel = ArrayCreate(32, 1)
  43. g_szFlag = ArrayCreate(8, 1)
  44. g_iTeam = ArrayCreate(8, 1)
  45. UserModel[0] = TrieCreate()
  46. UserModel[1] = TrieCreate()
  47.  
  48. load_menu_file()
  49. load_user_file()
  50. }
  51.  
  52. public plugin_end()
  53. {
  54. ArrayDestroy(g_szNames)
  55. ArrayDestroy(g_szModel)
  56. ArrayDestroy(g_szFlag)
  57. ArrayDestroy(g_iTeam)
  58. TrieDestroy(UserModel[0])
  59. TrieDestroy(UserModel[1])
  60. }
  61.  
  62. public client_putinserver(id)
  63. {
  64. if (get_pcvar_num(p_save))
  65. {
  66. LoadModel(id)
  67. }
  68. }
  69.  
  70. public client_disconnect(id)
  71. {
  72. if (get_pcvar_num(p_save))
  73. {
  74. SaveModel(id)
  75. }
  76. }
  77.  
  78. public fw_PlayerSpawnPost(id)
  79. {
  80. if (is_user_alive(id) && 1 <= get_user_team(id) <= 2)
  81. {
  82. new szModel[32]
  83. if (iCurrentModel[id])
  84. {
  85. new iTeam = ArrayGetCell(g_iTeam, iCurrentModel[id])
  86.  
  87. if (iTeam && get_user_team(id) == iTeam)
  88. {
  89. ArrayGetString(g_szModel, iCurrentModel[id], szModel, charsmax(szModel))
  90. }
  91. else if (iTeam)
  92. {
  93. ColorMessage(id, "^x04[%s]^x01 Your current model is not for your team!", szPrefix)
  94. }
  95. }
  96.  
  97. if (szModel[0] == EOS)
  98. {
  99. new szName[32]
  100. get_user_name(id, szName, charsmax(szName))
  101.  
  102. if (TrieKeyExists(UserModel[get_user_team(id) - 1], szName))
  103. {
  104. TrieGetString(UserModel[get_user_team(id) - 1], szName, szModel, charsmax(szModel))
  105. }
  106. else
  107. {
  108. copy(szModel, charsmax(szModel), szDefaultModels[get_user_team(id) - 1][random(sizeof(szDefaultModels[]))])
  109. }
  110. }
  111.  
  112. set_user_info(id, "model", szModel)
  113. }
  114. }
  115.  
  116. public show_model_menu(id)
  117. {
  118. new szFlag[8]
  119. get_pcvar_string(p_admin_flag, szFlag, charsmax(szFlag))
  120.  
  121. if (get_pcvar_num(p_admin_only) && !(get_user_flags(id) & read_flags(szFlag)))
  122. {
  123. ColorMessage(id, "^x04[%s]^x01 This menu is currently^x03 Admin Only^x01!", szPrefix)
  124. return PLUGIN_HANDLED
  125. }
  126.  
  127. new iMenu = menu_create("\rModels Menu^n\yChoose a model:", "model_handler")
  128.  
  129. new szName[64]
  130.  
  131. for (new i = 0; i < iTotalModels; i++)
  132. {
  133. ArrayGetString(g_szNames, i, szName, charsmax(szName))
  134.  
  135. menu_additem(iMenu, szName, _, _, menu_makecallback("model_callback"))
  136. }
  137.  
  138. menu_display(id, iMenu)
  139.  
  140. return PLUGIN_HANDLED
  141. }
  142.  
  143. public model_callback(id, iMenu, Item)
  144. {
  145. new szFlag[8]
  146. ArrayGetString(g_szFlag, Item, szFlag, charsmax(szFlag))
  147.  
  148. new iFlags = get_user_flags(id)
  149. new iTeam = ArrayGetCell(g_iTeam, Item)
  150.  
  151. new szName[64], szInfo[1], iCallback, iAccess
  152. menu_item_getinfo(iMenu, Item, iAccess, szInfo, charsmax(szInfo), szName, charsmax(szName), iCallback)
  153.  
  154. if (equal(szName, "ERROR"))
  155. {
  156. add(szName, charsmax(szName), " \r(Failed to load model)")
  157.  
  158. menu_item_setname(iMenu, Item, szName)
  159.  
  160. return ITEM_DISABLED
  161. }
  162.  
  163. new szToAdd[64]
  164.  
  165. if (szFlag[0] != EOS)
  166. {
  167. formatex(szToAdd, charsmax(szToAdd), " \%s(Admin Only)", (iFlags & read_flags(szFlag)) ? "y" : "r")
  168. add(szName, charsmax(szName), szToAdd)
  169. }
  170.  
  171. if (1 <= iTeam <= 2)
  172. {
  173. formatex(szToAdd, charsmax(szToAdd), " \%s(%s)", (get_user_team(id) == iTeam) ? "y" : "r", (iTeam == 1) ? "Terrorist Only" : "CT Only")
  174. add(szName, charsmax(szName), szToAdd)
  175. }
  176.  
  177. menu_item_setname(iMenu, Item, szName)
  178.  
  179. if (Item == iCurrentModel[id] || 1 <= iTeam <= 2 && get_user_team(id) != iTeam || !(iFlags & read_flags(szFlag)) && szFlag[0] != EOS)
  180. {
  181. return ITEM_DISABLED
  182. }
  183.  
  184. return ITEM_ENABLED
  185. }
  186.  
  187. public model_handler(id, iMenu, Item)
  188. {
  189. if (Item == MENU_EXIT)
  190. {
  191. menu_destroy(iMenu)
  192. return
  193. }
  194.  
  195. iCurrentModel[id] = Item
  196.  
  197. new szName[32]
  198. ArrayGetString(g_szNames, Item, szName, charsmax(szName))
  199.  
  200. if (is_user_alive(id) && get_pcvar_num(p_set_atm) && 1 <= get_user_team(id) <= 2)
  201. {
  202. new szModel[32]
  203.  
  204. if (Item)
  205. {
  206. ArrayGetString(g_szModel, Item, szModel, charsmax(szModel))
  207. }
  208. else
  209. {
  210. new szName[32]
  211. get_user_name(id, szName, charsmax(szName))
  212.  
  213. if (TrieKeyExists(UserModel[get_user_team(id) - 1], szName))
  214. {
  215. TrieGetString(UserModel[get_user_team(id) - 1], szName, szModel, charsmax(szModel))
  216. }
  217. else
  218. {
  219. copy(szModel, charsmax(szModel), szDefaultModels[get_user_team(id) - 1][random(sizeof(szDefaultModels[]))])
  220. }
  221. }
  222.  
  223. set_user_info(id, "model", szModel)
  224.  
  225. ColorMessage(id, "^x04[%s]^x01 Your model is now^x03 %s^x01!", szPrefix, szName)
  226. }
  227. else
  228. {
  229. ColorMessage(id, "^x04[%s]^x01 Your model will be changed to^x03 %s^x01 after your next spawn!", szPrefix, szName)
  230. }
  231.  
  232. menu_destroy(iMenu)
  233. }
  234.  
  235. load_menu_file()
  236. {
  237. new szFile[128]
  238. get_configsdir(szFile, charsmax(szFile))
  239.  
  240. add(szFile, charsmax(szFile), "/models.ini")
  241.  
  242. new iLine, szData[128], buffer
  243.  
  244. new szName[32], szModel[32], szFlag[8], szTeam[8], iTeam
  245.  
  246. if (file_exists(szFile))
  247. {
  248. iTotalModels = 1
  249.  
  250. ArrayPushString(g_szNames, "Default")
  251. ArrayPushString(g_szModel, "")
  252. ArrayPushString(g_szFlag, "")
  253. ArrayPushCell(g_iTeam, 0)
  254.  
  255. while ( (iLine = read_file(szFile, iLine, szData, charsmax(szData), buffer)) )
  256. {
  257. if (szData[0] == EOS || szData[0] == '/' && szData[1] == '/' || szData[0] == ';') continue
  258.  
  259. parse(szData, szName, charsmax(szName), szModel, charsmax(szModel), szFlag, charsmax(szFlag), szTeam, charsmax(szTeam))
  260.  
  261. switch (szTeam[0])
  262. {
  263. case 'T', 't':
  264. {
  265. iTeam = 1
  266. }
  267. case 'c', 'C':
  268. {
  269. iTeam = 2
  270. }
  271. default:
  272. {
  273. iTeam = 0
  274. }
  275. }
  276.  
  277. if (try_to_precache(szModel))
  278. {
  279. ArrayPushString(g_szNames, szName)
  280. ArrayPushString(g_szModel, szModel)
  281. ArrayPushString(g_szFlag, szFlag)
  282. ArrayPushCell(g_iTeam, iTeam)
  283. }
  284. else
  285. {
  286. ArrayPushString(g_szNames, "ERROR")
  287. ArrayPushString(g_szModel, "")
  288. ArrayPushString(g_szFlag, "")
  289. ArrayPushCell(g_iTeam, 0)
  290. }
  291.  
  292. iTotalModels++
  293. }
  294. }
  295. else
  296. {
  297. new iFile = fopen(szFile, "wt")
  298.  
  299. if (iFile)
  300. {
  301. new szLine[256]
  302.  
  303. 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^"")
  304.  
  305. fputs(iFile, szLine)
  306.  
  307. fclose(iFile)
  308. }
  309. }
  310. }
  311.  
  312. load_user_file()
  313. {
  314. new szFile[128]
  315. get_configsdir(szFile, charsmax(szFile))
  316.  
  317. add(szFile, charsmax(szFile), "/user_models.ini")
  318.  
  319. new iLine, szData[128], buffer
  320.  
  321. new szName[32], szModel[2][32]
  322.  
  323. if (file_exists(szFile))
  324. {
  325. while ( (iLine = read_file(szFile, iLine, szData, charsmax(szData), buffer)) )
  326. {
  327. if (szData[0] == EOS || szData[0] == '/' && szData[1] == '/' || szData[0] == ';') continue
  328.  
  329. parse(szData, szName, charsmax(szName), szModel[0], charsmax(szModel[]), szModel[1], charsmax(szModel[]))
  330.  
  331. for (new i = 0; i < sizeof(szModel); i++)
  332. {
  333. if (szModel[i][0] != EOS && try_to_precache(szModel[i]))
  334. {
  335. TrieSetString(UserModel[i], szName, szModel[i])
  336. }
  337. }
  338. }
  339. }
  340. else
  341. {
  342. new iFile = fopen(szFile, "wt")
  343.  
  344. if (iFile)
  345. {
  346. new szLine[256]
  347.  
  348. formatex(szLine, charsmax(szLine), "; Player models menu by TheRedShoko^n; Usage: ^"Player Name^" ^"Name of the model for terrorist^" ^"Name of model for CT^"")
  349.  
  350. fputs(iFile, szLine)
  351.  
  352. fclose(iFile)
  353. }
  354. }
  355. }
  356.  
  357. SaveModel(id)
  358. {
  359. new szData[8], szName[32]
  360. get_user_name(id, szName, charsmax(szName))
  361. num_to_str(iCurrentModel[id], szData, charsmax(szData))
  362.  
  363. fvault_set_data(szFVaultFile, szName, szData)
  364. }
  365.  
  366. LoadModel(id)
  367. {
  368. new szData[8], szName[32]
  369. get_user_name(id, szName, charsmax(szName))
  370.  
  371. if (fvault_get_data(szFVaultFile, szName, szData, charsmax(szData)))
  372. {
  373. iCurrentModel[id] = str_to_num(szData)
  374. }
  375. else
  376. {
  377. iCurrentModel[id] = 0
  378. }
  379. }
  380.  
  381. public fw_SetClientKeyValue(id, szInfoBuffer[], szKey[], szValue[])
  382. {
  383. if (equal(szKey, "model"))
  384. {
  385. return FMRES_SUPERCEDE
  386. }
  387.  
  388. return FMRES_IGNORED
  389. }
  390.  
  391. try_to_precache(model[])
  392. {
  393. new szModel[64]
  394. formatex(szModel, charsmax(szModel), "models/player/%s/%s.mdl", model, model)
  395.  
  396. if (!file_exists(szModel))
  397. {
  398. log_amx("Failed to precache ^"%s^"! File is missing or may have wrong name!", szModel)
  399. return 0;
  400. }
  401.  
  402. precache_generic(szModel)
  403.  
  404. return 1
  405. }
  406.  
  407. stock ColorMessage(const id, const input[], any:...)
  408. {
  409. new count = 1, players[32];
  410. static msg[191];
  411. vformat(msg, 190, input, 3);
  412. if (id) players[0] = id; else get_players(players , count , "ch");
  413. {
  414. for (new i = 0; i < count; i++)
  415. {
  416. if (is_user_connected(players[i]))
  417. {
  418. message_begin(MSG_ONE_UNRELIABLE , get_user_msgid("SayText"), _, players[i]);
  419. write_byte(players[i]);
  420. write_string(msg);
  421. message_end();
  422. }
  423. }
  424. }
  425. }
  426. /* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
  427. *{\\ rtf1\\ ansi\\ deff0{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ lang1026\\ f0\\ fs16 \n\\ par }
  428. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement