HLMOD.HU Forrás Megtekintés - www.hlmod.hu
  1. #include <amxmodx>
  2. #include <amxmisc>
  3. #include <cromchat>
  4. #include <formatin>
  5.  
  6. new const PLUGIN_VERSION[] = "1.2"
  7. const NO_GROUP = -1
  8. const NOT_CONNECTED = -2
  9.  
  10. enum
  11. {
  12. SECTION_NONE,
  13. SECTION_SETTINGS,
  14. SECTION_GROUPS
  15. }
  16.  
  17. enum _:Settings
  18. {
  19. MENU_ACCESS,
  20. MENU_PERPAGE,
  21. MENU_SOUND[64],
  22. FLAGS_METHOD,
  23. bool:EXIT_TO_MAIN
  24. }
  25.  
  26. enum _:Groups
  27. {
  28. Name[32],
  29. Flags[32],
  30. ViewFlags[32]
  31. }
  32.  
  33. new g_eSettings[Settings],
  34. Array:g_aGroups,
  35. g_iUserGroup[33],
  36. g_iCallback,
  37. g_iTotalGroups
  38.  
  39. public plugin_init()
  40. {
  41. register_plugin("Admin Groups", PLUGIN_VERSION, "OciXCrom")
  42. register_cvar("CRXAdminGroups", PLUGIN_VERSION, FCVAR_SERVER|FCVAR_SPONLY|FCVAR_UNLOGGED)
  43. register_dictionary("AdminGroups.txt")
  44. g_iCallback = menu_makecallback("Menu_CheckViewFlag")
  45. }
  46.  
  47. public plugin_precache()
  48. {
  49. g_aGroups = ArrayCreate(Groups)
  50. ReadFile()
  51. }
  52.  
  53. public plugin_end()
  54. {
  55. ArrayDestroy(g_aGroups)
  56. }
  57.  
  58. ReadFile()
  59. {
  60. new szConfigsName[256], szFilename[256]
  61. get_configsdir(szConfigsName, charsmax(szConfigsName))
  62. formatex(szFilename, charsmax(szFilename), "%s/AdminGroups.ini", szConfigsName)
  63.  
  64. new iFilePointer = fopen(szFilename, "rt")
  65.  
  66. if(iFilePointer)
  67. {
  68. new szData[96], szValue[64], szKey[32], iSection = SECTION_NONE, iSize
  69. new eGroup[Groups]
  70.  
  71. while(!feof(iFilePointer))
  72. {
  73. fgets(iFilePointer, szData, charsmax(szData))
  74. trim(szData)
  75.  
  76. switch(szData[0])
  77. {
  78. case EOS, ';', '#': continue
  79. case '[':
  80. {
  81. iSize = strlen(szData)
  82.  
  83. if(szData[iSize - 1] == ']')
  84. {
  85. switch(szData[1])
  86. {
  87. case 'N', 'n': iSection = SECTION_NONE
  88. case 'S', 's': iSection = SECTION_SETTINGS
  89. case 'G', 'g': iSection = SECTION_GROUPS
  90. default: continue
  91. }
  92. }
  93. else continue
  94. }
  95. default:
  96. {
  97. if(iSection == SECTION_NONE)
  98. {
  99. continue
  100. }
  101.  
  102. strtok(szData, szKey, charsmax(szKey), szValue, charsmax(szValue), '=')
  103. trim(szKey); trim(szValue)
  104.  
  105. if(!szValue[0])
  106. {
  107. continue
  108. }
  109.  
  110. switch(iSection)
  111. {
  112. case SECTION_SETTINGS:
  113. {
  114. if(equal(szKey, "MENU_COMMANDS"))
  115. {
  116. while(szValue[0] != 0 && strtok(szValue, szKey, charsmax(szKey), szValue, charsmax(szValue), ','))
  117. {
  118. trim(szKey); trim(szValue)
  119.  
  120. switch(szKey[0])
  121. {
  122. case '/', '!':
  123. {
  124. register_clcmd(formatin("say %s", szKey), "Menu_Groups")
  125. register_clcmd(formatin("say_team %s", szKey), "Menu_Groups")
  126. }
  127. default:
  128. {
  129. register_clcmd(szKey, "Menu_Groups")
  130. }
  131. }
  132. }
  133. }
  134. else if(equal(szKey, "MENU_ACCESS"))
  135. {
  136. g_eSettings[MENU_ACCESS] = szValue[0] == '0' ? ADMIN_ALL : read_flags(szValue)
  137. }
  138. else if(equal(szKey, "CHAT_PREFIX"))
  139. {
  140. CC_SetPrefix(szValue)
  141. }
  142. else if(equal(szKey, "MENU_PERPAGE"))
  143. {
  144. g_eSettings[MENU_PERPAGE] = clamp(str_to_num(szValue), 0, 7)
  145. }
  146. else if(equal(szKey, "MENU_SOUND"))
  147. {
  148. copy(g_eSettings[MENU_SOUND], charsmax(g_eSettings[MENU_SOUND]), szValue)
  149.  
  150. if(szValue[0])
  151. {
  152. precache_sound(szValue)
  153. }
  154. }
  155. else if(equal(szKey, "FLAGS_METHOD"))
  156. {
  157. g_eSettings[FLAGS_METHOD] = clamp(str_to_num(szValue), 0, 1)
  158. }
  159. else if(equal(szKey, "EXIT_TO_MAIN"))
  160. {
  161. g_eSettings[EXIT_TO_MAIN] = _:clamp(str_to_num(szValue), false, true)
  162. }
  163. }
  164. case SECTION_GROUPS:
  165. {
  166. eGroup[ViewFlags][0] = EOS
  167. copy(eGroup[Name], charsmax(eGroup[Name]), szKey)
  168. parse(szValue, eGroup[Flags], charsmax(eGroup[Flags]), eGroup[ViewFlags], charsmax(eGroup[ViewFlags]))
  169. ArrayPushArray(g_aGroups, eGroup)
  170. g_iTotalGroups++
  171. }
  172. }
  173. }
  174. }
  175. }
  176.  
  177. fclose(iFilePointer)
  178. }
  179. }
  180.  
  181. public client_putinserver(id)
  182. {
  183. update_user_group(id)
  184. }
  185.  
  186. public client_infochanged(id)
  187. {
  188. static szNewName[32], szOldName[32]
  189. get_user_info(id, "name", szNewName, charsmax(szNewName))
  190. get_user_name(id, szOldName, charsmax(szOldName))
  191.  
  192. if(!equal(szNewName, szOldName))
  193. {
  194. set_task(0.1, "update_user_group", id)
  195. }
  196. }
  197.  
  198. public Menu_Groups(id, bool:bWentBack)
  199. {
  200. if(!bWentBack)
  201. {
  202. if(g_eSettings[MENU_ACCESS] != ADMIN_ALL && ~get_user_flags(id) & g_eSettings[MENU_ACCESS])
  203. {
  204. CC_SendMessage(id, "%L", id, "AGROUPS_NO_ACCESS")
  205. return PLUGIN_HANDLED
  206. }
  207. }
  208.  
  209. new szTitle[128], szName[32], szGroup[32]
  210. get_user_name(id, szName, charsmax(szName))
  211.  
  212. if(g_iUserGroup[id] == NO_GROUP)
  213. {
  214. formatex(szGroup, charsmax(szGroup), "%L", id, "AGROUPS_NO_GROUP")
  215. }
  216. else
  217. {
  218. get_user_group(id, szGroup, charsmax(szGroup))
  219. }
  220.  
  221. formatex(szTitle, charsmax(szTitle), "%L", id, "AGROUPS_MENU_TITLE", szName, szGroup)
  222. replace_newline_characters(szTitle, charsmax(szTitle))
  223.  
  224. static eGroup[Groups]
  225. new iMenu = menu_create(szTitle, "Groups_Handler")
  226.  
  227. for(new i, iOnline; i < g_iTotalGroups; i++)
  228. {
  229. iOnline = get_players_in_group(i)
  230. ArrayGetArray(g_aGroups, i, eGroup)
  231. menu_additem(iMenu, formatin("%L", id, iOnline ? "AGROUPS_DISPLAY_ONLINE" : "AGROUPS_DISPLAY_OFFLINE", eGroup[Name], iOnline), .callback = g_iCallback)
  232. }
  233.  
  234. if(!bWentBack)
  235. {
  236. play_menu_sound(id)
  237. }
  238.  
  239. menu_setprop(iMenu, MPROP_PERPAGE, g_eSettings[MENU_PERPAGE])
  240. menu_display(id, iMenu)
  241. return PLUGIN_HANDLED
  242. }
  243.  
  244. public Menu_CheckViewFlag(id, iMenu, iItem)
  245. {
  246. static eGroup[Groups]
  247. ArrayGetArray(g_aGroups, iItem, eGroup)
  248. return (!eGroup[ViewFlags][0] || has_required_flags(id, eGroup[ViewFlags])) ? ITEM_ENABLED : ITEM_DISABLED
  249. }
  250.  
  251. public Groups_Handler(id, iMenu, iItem)
  252. {
  253. if(iItem == MENU_EXIT)
  254. {
  255. menu_destroy(iMenu)
  256. return PLUGIN_HANDLED
  257. }
  258.  
  259. menu_destroy(iMenu)
  260. Menu_SubGroup(id, iItem)
  261. return PLUGIN_HANDLED
  262. }
  263.  
  264. Menu_SubGroup(id, iGroup)
  265. {
  266. new szTitle[128]
  267. static eGroup[Groups]
  268. ArrayGetArray(g_aGroups, iGroup, eGroup)
  269. formatex(szTitle, charsmax(szTitle), "%L", id, "AGROUPS_MENU2_TITLE", eGroup[Name], get_players_in_group(iGroup))
  270. replace_newline_characters(szTitle, charsmax(szTitle))
  271.  
  272. new iPlayers[32], iPnum
  273. get_players(iPlayers, iPnum)
  274.  
  275. new iMenu = menu_create(szTitle, "SubGroup_Handler")
  276.  
  277. for(new i, iPlayer, szName[32]; i < iPnum; i++)
  278. {
  279. iPlayer = iPlayers[i]
  280.  
  281. if(g_iUserGroup[iPlayer] == iGroup)
  282. {
  283. get_user_name(iPlayer, szName, charsmax(szName))
  284. menu_additem(iMenu, szName)
  285. }
  286. }
  287.  
  288. if(!menu_items(iMenu))
  289. {
  290. menu_additem(iMenu, formatin("%L", id, "AGROUPS_NO_USERS"))
  291. }
  292.  
  293. menu_display(id, iMenu)
  294. return PLUGIN_HANDLED
  295. }
  296.  
  297. public SubGroup_Handler(id, iMenu, iItem)
  298. {
  299. menu_destroy(iMenu)
  300.  
  301. if(g_eSettings[EXIT_TO_MAIN])
  302. {
  303. Menu_Groups(id, true)
  304. }
  305.  
  306. return PLUGIN_HANDLED
  307. }
  308.  
  309. public update_user_group(id)
  310. {
  311. static eGroup[Groups]
  312. g_iUserGroup[id] = NO_GROUP
  313.  
  314. for(new i; i < g_iTotalGroups; i++)
  315. {
  316. ArrayGetArray(g_aGroups, i, eGroup)
  317.  
  318. if(has_required_flags(id, eGroup[Flags]))
  319. {
  320. g_iUserGroup[id] = i
  321. break
  322. }
  323. }
  324.  
  325. return g_iUserGroup[id]
  326. }
  327.  
  328. has_required_flags(const id, const szFlags[])
  329. {
  330. return (g_eSettings[FLAGS_METHOD] == 1) ? has_all_flags(id, szFlags) : has_flag(id, szFlags)
  331. }
  332.  
  333. get_user_group(const id, szGroup[], const iLen)
  334. {
  335. if(g_iUserGroup[id] == NO_GROUP)
  336. {
  337. formatex(szGroup, iLen, "%L", id, "AGROUPS_NO_GROUP")
  338. return
  339. }
  340.  
  341. static eGroup[Groups]
  342. ArrayGetArray(g_aGroups, g_iUserGroup[id], eGroup)
  343. copy(szGroup, iLen, eGroup[Name])
  344. }
  345.  
  346. get_players_in_group(const iGroup)
  347. {
  348. new iPlayers[32], iPnum, iCount
  349. get_players(iPlayers, iPnum)
  350.  
  351. for(new i; i < iPnum; i++)
  352. {
  353. if(g_iUserGroup[iPlayers[i]] == iGroup)
  354. {
  355. iCount++
  356. }
  357. }
  358.  
  359. return iCount
  360. }
  361.  
  362. play_menu_sound(id)
  363. {
  364. if(g_eSettings[MENU_SOUND][0])
  365. {
  366. client_cmd(id, "spk %s", g_eSettings[MENU_SOUND])
  367. return 1
  368. }
  369.  
  370. return 0
  371. }
  372.  
  373. replace_newline_characters(szString[], const iLen)
  374. {
  375. replace_all(szString, iLen, "\n", "^n")
  376. }
  377.  
  378. public plugin_natives()
  379. {
  380. register_library("agroups.inc")
  381. register_native("agroups_get_groups_num", "_agroups_get_groups_num")
  382. register_native("agroups_get_players_in_group", "_agroups_get_players_in_group")
  383. register_native("agroups_get_user_group", "_agroups_get_user_group")
  384. register_native("agroups_open_groups_menu", "_agroups_open_groups_menu")
  385. register_native("agroups_play_menu_sound", "_agroups_play_menu_sound")
  386. register_native("agroups_update_user_group", "_agroups_update_user_group")
  387. }
  388.  
  389. public _agroups_get_groups_num(iPlugin, iParams)
  390. {
  391. return g_iTotalGroups
  392. }
  393.  
  394. public _agroups_get_players_in_group(iPlugin, iParams)
  395. {
  396. new iGroup = get_param(1)
  397.  
  398. if(iGroup < 0 || iGroup > g_iTotalGroups)
  399. {
  400. return -1
  401. }
  402.  
  403. return get_players_in_group(iGroup)
  404. }
  405.  
  406. public _agroups_get_user_group(iPlugin, iParams)
  407. {
  408. new id = get_param(1)
  409.  
  410. if(!is_user_connected(id))
  411. {
  412. return NOT_CONNECTED
  413. }
  414.  
  415. if(g_iUserGroup[id] == NO_GROUP)
  416. {
  417. set_string(2, formatin("%L", id, "AGROUPS_NO_GROUP"), get_param(3))
  418. return NO_GROUP
  419. }
  420.  
  421. static eGroup[Groups]
  422. ArrayGetArray(g_aGroups, g_iUserGroup[id], eGroup)
  423. set_string(2, eGroup[Name], get_param(3))
  424. return g_iUserGroup[id]
  425. }
  426.  
  427. public _agroups_open_groups_menu(iPlugin, iParams)
  428. {
  429. new id = get_param(1)
  430.  
  431. if(!is_user_connected(id))
  432. {
  433. return NOT_CONNECTED
  434. }
  435.  
  436. Menu_Groups(id, false)
  437. return 1
  438. }
  439.  
  440. public _agroups_play_menu_sound(iPlugin, iParams)
  441. {
  442. new id = get_param(1)
  443.  
  444. if(!is_user_connected(id))
  445. {
  446. return NOT_CONNECTED
  447. }
  448.  
  449. return play_menu_sound(id)
  450. }
  451.  
  452. public _agroups_update_user_group(iPlugin, iParams)
  453. {
  454. new id = get_param(1)
  455.  
  456. if(!is_user_connected(id))
  457. {
  458. return NOT_CONNECTED
  459. }
  460.  
  461. return update_user_group(id)
  462. }