Guest User

Untitled

a guest
Jan 6th, 2019
148
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #pragma tabsize 0
  2. #include <amxmodx>
  3. #include <amxmisc>
  4. #include <engine>
  5. #include <fakemeta>
  6.  
  7. #define PLUGIN "[Ar4 Mode] HookManager"
  8. #define VERSION "3.0"
  9. #define AUTHOR "LeGioN & arttty7"
  10.  
  11. #define PLAYERS_PER_PAGE 8
  12. #define JBE_CORE //Закомментируйте, если вам не нужна привязка к [JB] Engine.
  13.  
  14. #if defined JBE_CORE
  15. native jbe_get_day_mode();
  16. native jbe_is_user_wanted(pPlayer);
  17. #endif
  18.  
  19. new g_iMenuPlayers[33][32], g_iMenuPosition[33], szPlayerHook[33], szBreakEnd[33];
  20. new g_pEndSpriteBreak[4], g_LoadColor[81], g_LoadSprite[81], g_LoadSound[81], bool:g_iHookEnable = true;
  21. new szPlayerColor[33], szPlayerSprite[33], szPlayerSize[33], szPlayerSound[33], szPlayerSpeed[33], szPlayerView[33], szPlayerEndSprite[33], szPlayerHookOrigin[33][3];
  22. new g_HookColorNum, g_HookColorDefault, g_HookColorName[999][64], g_HookColorRGB[999][4];
  23. new g_HookSpriteNum, g_HookSpriteDefault, g_HookSpriteName[999][64], g_HookSpriteFile[999][64], g_HookSpriteMsg[999];
  24. new g_HookSoundNum, g_HookSoundDefault, g_HookSoundName[999][64], g_HookSoundFile[999][64]
  25.  
  26. public plugin_init()
  27. {
  28. register_plugin(PLUGIN, VERSION, AUTHOR)
  29.  
  30. register_clcmd("+hook", "HookOn")
  31. register_clcmd("-hook", "HookOff")
  32. register_clcmd("say /hook", "Ar4_HookMenu")
  33.  
  34. register_dictionary("jbe_ar4mode_hook.txt")
  35.  
  36. register_menucmd(register_menuid("Show_HookMenu"), 1023, "Handle_HookMenu");
  37. register_menucmd(register_menuid("Show_HookTargetMenu"), 1023, "Handle_HookTargetMenu");
  38. }
  39.  
  40. public plugin_precache()
  41. {
  42. new g_LoadDir[81]
  43. get_configsdir(g_LoadDir, charsmax( g_LoadDir ))
  44. formatex(g_LoadDir, charsmax( g_LoadDir ), "%s/ar4mode_hook", g_LoadDir)
  45. if(!dir_exists( g_LoadDir ))
  46. {
  47. new szError[512]
  48. formatex(szError, charsmax( szError ), "%L", 0, "JBE_HOOK_AR4_MODE_PRECACHE")
  49. set_fail_state( szError )
  50. }
  51. formatex(g_LoadColor, charsmax( g_LoadColor ), "%s/hook_color.ini", g_LoadDir)
  52. formatex(g_LoadSprite, charsmax( g_LoadSprite ), "%s/hook_sprite.ini", g_LoadDir)
  53. formatex(g_LoadSound, charsmax( g_LoadSound ), "%s/hook_sound.ini", g_LoadDir)
  54. if(!file_exists( g_LoadColor ))
  55. {
  56. new szError[512]
  57. formatex(szError, charsmax( szError ), "%L", 0, "JBE_HOOK_AR4_MODE_NOFILE_COLOR")
  58. set_fail_state( szError )
  59. }
  60. if(!file_exists( g_LoadSprite ))
  61. {
  62. new szError[512]
  63. formatex(szError, charsmax( szError ), "%L", 0, "JBE_HOOK_AR4_MODE_NOFILE_SPRITE")
  64. set_fail_state( szError )
  65. }
  66. if(!file_exists( g_LoadSound ))
  67. {
  68. new szError[512]
  69. formatex(szError, charsmax( szError ), "%L", 0, "JBE_HOOK_AR4_MODE_NOFILE_SOUND")
  70. set_fail_state( szError )
  71. }
  72. set_task(0.5, "LoadColor")
  73. set_task(0.5, "LoadSprite")
  74. set_task(0.5, "LoadSound")
  75. new szParse[320], szParseName[64], szParseFile[256], szLine, szNum, szNums
  76. for(szLine=0;read_file(g_LoadSprite, szLine, szParse, charsmax( szParse ), szNum);szLine++)
  77. {
  78. if(szNum > 0 && szParse[0] != ';')
  79. {
  80. ++szNums
  81. parse(szParse, szParseFile, charsmax( szParseFile ), szParseFile, charsmax( szParseFile ))
  82. g_HookSpriteMsg[szNums] = precache_model( szParseFile )
  83. }
  84. }
  85. for(szLine=0;read_file(g_LoadSound, szLine, szParse, charsmax( szParse ), szNum);szLine++)
  86. {
  87. if(szNum > 0 && szParse[0] != ';')
  88. {
  89. parse(szParse, szParseFile, charsmax( szParseFile ), szParseFile, charsmax( szParseFile ))
  90. precache_sound( szParseFile )
  91. }
  92. }
  93. szParseName = szParseName
  94. g_pEndSpriteBreak[0] = engfunc(EngFunc_PrecacheModel, "sprites/jbe_ar4mode/end_7.spr");
  95. g_pEndSpriteBreak[1] = engfunc(EngFunc_PrecacheModel, "sprites/jbe_ar4mode/end_6.spr");
  96. g_pEndSpriteBreak[2] = engfunc(EngFunc_PrecacheModel, "sprites/jbe_ar4mode/end_3.spr");
  97. g_pEndSpriteBreak[3] = engfunc(EngFunc_PrecacheModel, "sprites/jbe_ar4mode/end_4.spr");
  98. }
  99.  
  100. public LoadColor()
  101. {
  102. new szParse[256], szParseName[64], szParseColor[32], szParseDefault[32], szParseR[32], szParseG[32], szParseB[32], szParseDefaultNum, szLine, szNum
  103. for(szLine=0;read_file(g_LoadColor, szLine, szParse, charsmax( szParse ), szNum);szLine++)
  104. {
  105. if(szNum > 0 && szParse[0] != ';' && szParse[0] != '?')
  106. {
  107. ++g_HookColorNum
  108. parse(szParse, szParseName, charsmax( szParseName ), szParseColor, charsmax( szParseColor ), szParseDefault, charsmax( szParseDefault ))
  109. parse(szParseColor, szParseR, charsmax( szParseR ), szParseG, charsmax( szParseG ), szParseB, charsmax( szParseB ))
  110. g_HookColorName[g_HookColorNum] = szParseName
  111. g_HookColorRGB[g_HookColorNum][0] = str_to_num( szParseR )
  112. g_HookColorRGB[g_HookColorNum][1] = str_to_num( szParseG )
  113. g_HookColorRGB[g_HookColorNum][2] = str_to_num( szParseB )
  114. szParseDefaultNum = str_to_num( szParseDefault )
  115. if(szParseDefaultNum && !g_HookColorDefault) g_HookColorDefault = g_HookColorNum
  116. }
  117. }
  118. if(!g_HookColorNum)
  119. {
  120. new szError[512]
  121. formatex(szError, charsmax( szError ), "%L", 0, "JBE_HOOK_AR4_MODE_BUILDING_NOCOLOR")
  122. set_fail_state( szError )
  123. }
  124. if(!g_HookColorDefault)
  125. {
  126. new szError[512]
  127. formatex(szError, charsmax( szError ), "%L", 0, "JBE_HOOK_AR4_MODE_BUILDING_NOCOLORDEF")
  128. set_fail_state( szError )
  129. }
  130. }
  131.  
  132. public LoadSprite()
  133. {
  134. new szParse[256], szParseName[64], szParseFile[32], szParseDefault[32], szParseDefaultNum, szLine, szNum
  135. for(szLine=0;read_file(g_LoadSprite, szLine, szParse, charsmax( szParse ), szNum);szLine++)
  136. {
  137. if(szNum > 0 && szParse[0] != ';' && szParse[0] != '?')
  138. {
  139. ++g_HookSpriteNum
  140. parse(szParse, szParseName, charsmax( szParseName ), szParseFile, charsmax( szParseFile ), szParseDefault, charsmax( szParseDefault ))
  141. g_HookSpriteName[g_HookSpriteNum] = szParseName
  142. g_HookSpriteFile[g_HookSpriteNum] = szParseFile
  143. szParseDefaultNum = str_to_num( szParseDefault )
  144. if(szParseDefaultNum)
  145. {
  146. if(!g_HookSpriteDefault)
  147. {
  148. g_HookSpriteDefault = g_HookSpriteNum
  149. server_print("fsdfsd - %d - %d", g_HookSpriteDefault, g_HookSpriteNum)
  150. }
  151. }
  152. }
  153. }
  154. if(!g_HookSpriteNum)
  155. {
  156. new szError[512]
  157. formatex(szError, charsmax( szError ), "%L", 0, "JBE_HOOK_AR4_MODE_BUILDING_NOSPRITE")
  158. set_fail_state( szError )
  159. }
  160. if(!g_HookSpriteDefault)
  161. {
  162. new szError[512]
  163. formatex(szError, charsmax( szError ), "%L", 0, "JBE_HOOK_AR4_MODE_BUILDING_NOSPRITEDEF")
  164. set_fail_state( szError )
  165. }
  166. }
  167.  
  168. public LoadSound()
  169. {
  170. new szParse[256], szParseName[64], szParseFile[32], szParseDefault[32], szParseDefaultNum, szLine, szNum
  171. for(szLine=0;read_file(g_LoadSound, szLine, szParse, charsmax( szParse ), szNum);szLine++)
  172. {
  173. if(szNum > 0 && szParse[0] != ';' && szParse[0] != '?')
  174. {
  175. ++g_HookSoundNum
  176. parse(szParse, szParseName, charsmax( szParseName ), szParseFile, charsmax( szParseFile ), szParseDefault, charsmax( szParseDefault ))
  177. g_HookSoundName[g_HookSoundNum] = szParseName
  178. g_HookSoundFile[g_HookSoundNum] = szParseFile
  179. szParseDefaultNum = str_to_num( szParseDefault )
  180. if(szParseDefaultNum && !g_HookSoundDefault) g_HookSoundDefault = g_HookSoundNum
  181. }
  182. }
  183. if(!g_HookSoundNum)
  184. {
  185. new szError[512]
  186. formatex(szError, charsmax( szError ), "%L", 0, "JBE_HOOK_AR4_MODE_BUILDING_NOSOUND")
  187. set_fail_state( szError )
  188. }
  189. if(!g_HookSoundDefault)
  190. {
  191. new szError[512]
  192. formatex(szError, charsmax( szError ), "%L", 0, "JBE_HOOK_AR4_MODE_BUILDING_NOSOUNDDEF")
  193. set_fail_state( szError )
  194. }
  195. }
  196. public client_putinserver(id)
  197. {
  198. if(get_user_flags(id) & ADMIN_LEVEL_G)
  199. {
  200. szPlayerHook[id] = true;
  201. szPlayerColor[id] = g_HookColorDefault
  202. szPlayerSprite[id] = g_HookSpriteDefault
  203. szPlayerSize[id] = 0
  204. szPlayerSound[id] = g_HookSoundDefault
  205. szPlayerSpeed[id] = 0
  206. szPlayerView[id] = 0
  207. szPlayerEndSprite[id] = 0
  208. }
  209. }
  210.  
  211. public client_disconnect(id)
  212. {
  213. RemoveHook(id)
  214. szPlayerHook[id] = false;
  215. }
  216. public Ar4_HookMenu(id)
  217. {
  218. if(get_user_flags(id) & ADMIN_LEVEL_G) return Show_HookMenu(id);
  219. else ChatColor(id, "%L", id, "JBE_MENU_AR4_MODE_NOACCESS"); return PLUGIN_HANDLED;
  220. }
  221.  
  222. Show_HookMenu(id)
  223. {
  224. new szMenu[512], iKeys = (1<<9), iLen = formatex(szMenu, charsmax(szMenu), "\y%L^n^n", id, "JBE_MENU_AR4_MODE_MAIN_TITLE")
  225. if(g_iHookEnable)
  226. {
  227. iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r[\w1\r] \w%L^n", id, "JBE_MENU_AR4_MODE_COLOR", g_HookColorName[szPlayerColor[id]]);
  228. iKeys |= (1<<0);
  229. }
  230. else iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\d[#] \d%L^n", id, "JBE_MENU_AR4_MODE_COLOR_FALLS", g_HookColorName[szPlayerColor[id]]);
  231. if(g_iHookEnable)
  232. {
  233. iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r[\w2\r] \w%L^n", id, "JBE_MENU_AR4_MODE_HOOK", g_HookSpriteName[szPlayerSprite[id]]);
  234. iKeys |= (1<<1);
  235. }
  236. else iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\d[#] \d%L^n", id, "JBE_MENU_AR4_MODE_HOOK_FALLS", g_HookSpriteName[szPlayerSprite[id]]);
  237. if(g_iHookEnable)
  238. {
  239. switch(szPlayerSize[id])
  240. {
  241. case 0: iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r[\w3\r] \w%L^n", id, "JBE_MENU_AR4_MODE_0_SIZE");
  242. case 1: iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r[\w3\r] \w%L^n", id, "JBE_MENU_AR4_MODE_1_SIZE");
  243. case 2: iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r[\w3\r] \w%L^n", id, "JBE_MENU_AR4_MODE_2_SIZE");
  244. case 3: iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r[\w3\r] \w%L^n", id, "JBE_MENU_AR4_MODE_3_SIZE");
  245. }
  246. iKeys |= (1<<2);
  247. }
  248. else iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\d[#] \d%L^n", id, "JBE_MENU_AR4_MODE_0_SIZE_FALLS");
  249. if(g_iHookEnable)
  250. {
  251. iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r[\w4\r] \w%L^n", id, "JBE_MENU_AR4_MODE_SOUND", g_HookSoundName[szPlayerSound[id]]);
  252. iKeys |= (1<<3);
  253. }
  254. else iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\d[#] \d%L^n", id, "JBE_MENU_AR4_MODE_SOUND_FALLS", g_HookSoundName[szPlayerSound[id]]);
  255. if(g_iHookEnable)
  256. {
  257. switch(szPlayerSpeed[id])
  258. {
  259. case 0: iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r[\w5\r] \w%L^n", id, "JBE_MENU_AR4_MODE_1_SPEED");
  260. case 1: iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r[\w5\r] \w%L^n", id, "JBE_MENU_AR4_MODE_0_SPEED");
  261. case 2: iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r[\w5\r] \w%L^n", id, "JBE_MENU_AR4_MODE_2_SPEED");
  262. }
  263. iKeys |= (1<<4);
  264. }
  265. else iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\d[#] \d%L^n", id, "JBE_MENU_AR4_MODE_1_SPEED_FALLS");
  266. if(g_iHookEnable)
  267. {
  268. switch(szPlayerView[id])
  269. {
  270. case 0: iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r[\w6\r] \w%L^n", id, "JBE_MENU_AR4_MODE_0_VIEW");
  271. case 1: iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r[\w6\r] \w%L^n", id, "JBE_MENU_AR4_MODE_1_VIEW");
  272. case 2: iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r[\w6\r] \w%L^n", id, "JBE_MENU_AR4_MODE_2_VIEW");
  273. }
  274. iKeys |= (1<<5);
  275. }
  276. else iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\d[#] \d%L^n", id, "JBE_MENU_AR4_MODE_0_VIEW_FALLS");
  277. if(g_iHookEnable)
  278. {
  279. switch(szPlayerEndSprite[id])
  280. {
  281. case 0: iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r[\w7\r] \w%L^n", id, "JBE_MENU_AR4_MODE_0_END");
  282. case 1: iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r[\w7\r] \w%L^n", id, "JBE_MENU_AR4_MODE_1_END");
  283. case 2: iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r[\w7\r] \w%L^n", id, "JBE_MENU_AR4_MODE_2_END");
  284. case 3: iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r[\w7\r] \w%L^n", id, "JBE_MENU_AR4_MODE_3_END");
  285. case 4: iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r[\w7\r] \w%L^n", id, "JBE_MENU_AR4_MODE_4_END");
  286. }
  287. iKeys |= (1<<6);
  288. }
  289. else iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\d[#] \d%L^n", id, "JBE_MENU_AR4_MODE_0_END_FALLS");
  290. if(get_user_flags(id) & ADMIN_RESERVATION && g_iHookEnable)
  291. {
  292. if(g_iHookEnable) iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n\r[\w8\r] \w%L^n", id, "JBE_MENU_AR4_MODE_HOOK_TARGET_MENU");
  293. iKeys |= (1<<7);
  294. }
  295. else iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n\d[#] \d%L^n", id, "JBE_MENU_AR4_MODE_HOOK_TARGET_MENU_FALLS");
  296. if(get_user_flags(id) & ADMIN_RESERVATION)
  297. {
  298. iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r[\w9\r] \w%L^n", id, g_iHookEnable ? "JBE_AR4_MODE_HOOK_ENABLE" : "JBE_AR4_MODE_HOOK_DISABLE");
  299. iKeys |= (1<<8);
  300. }
  301. else iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\d[#] %L^n", id, g_iHookEnable ? "JBE_AR4_MODE_HOOK_ENABLE" : "JBE_AR4_MODE_HOOK_DISABLE");
  302. formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n\r[\w0\r] \w%L", id, "JBE_MENU_AR4_MODE_EXIT");
  303. return show_menu(id, iKeys, szMenu, -1, "Show_HookMenu");
  304. }
  305.  
  306. public Handle_HookMenu(id, iKey)
  307. {
  308. switch(iKey)
  309. {
  310. case 0:
  311. {
  312. if(g_iHookEnable)
  313. {
  314. ++szPlayerColor[id];
  315. if(szPlayerColor[id] == g_HookColorNum + 1) szPlayerColor[id] = 1;
  316. }
  317. }
  318. case 1:
  319. {
  320. if(g_iHookEnable)
  321. {
  322. ++szPlayerSprite[id]
  323. if(szPlayerSprite[id] == g_HookSpriteNum + 1) szPlayerSprite[id] = 1
  324. }
  325. }
  326. case 2:
  327. {
  328. if(g_iHookEnable)
  329. {
  330. ++szPlayerSize[id]
  331. if(szPlayerSize[id] == 4) szPlayerSize[id] = 0
  332. }
  333. }
  334. case 3:
  335. {
  336. if(g_iHookEnable)
  337. {
  338. ++szPlayerSound[id]
  339. if(szPlayerSound[id] == g_HookSoundNum + 1) szPlayerSound[id] = 1
  340. }
  341. }
  342. case 4:
  343. {
  344. if(g_iHookEnable)
  345. {
  346. ++szPlayerSpeed[id]
  347. if(szPlayerSpeed[id] == 3) szPlayerSpeed[id] = 0
  348. }
  349. }
  350. case 5:
  351. {
  352. if(g_iHookEnable)
  353. {
  354. ++szPlayerView[id]
  355. if(szPlayerView[id] == 3) szPlayerView[id] = 0
  356. }
  357. }
  358. case 6:
  359. {
  360. if(g_iHookEnable)
  361. {
  362. ++szPlayerEndSprite[id]
  363. if(szPlayerEndSprite[id] == 5) szPlayerEndSprite[id] = 0
  364. }
  365. }
  366. case 7: if(g_iHookEnable) return Cmd_HookTargetMenu(id);
  367. case 8:
  368. {
  369. new szName[32]; get_user_name(id, szName, charsmax(szName))
  370. if(g_iHookEnable)
  371. {
  372. g_iHookEnable = false
  373. ChatColor(0, "%L", id, "JBE_MENU_AR4_MODE_HOOK_OFF_CHAT", szName)
  374. }
  375. else
  376. {
  377. g_iHookEnable = true
  378. ChatColor(0, "%L", id, "JBE_MENU_AR4_MODE_HOOK_ON_CHAT", szName)
  379. }
  380. }
  381. case 9: return PLUGIN_HANDLED;
  382. }
  383. return Show_HookMenu(id);
  384. }
  385.  
  386. public Cmd_HookTargetMenu(id) return Show_HookTargetMenu(id, g_iMenuPosition[id] = 0);
  387. Show_HookTargetMenu(id, iPos)
  388. {
  389. new iPlayersNum;
  390. for(new i = 1; i <= 32; i++)
  391. {
  392. if(!is_user_connected(i)) continue;
  393. g_iMenuPlayers[id][iPlayersNum++] = i;
  394. }
  395. new iStart = iPos * PLAYERS_PER_PAGE;
  396. if(iStart > iPlayersNum) iStart = iPlayersNum;
  397. iStart = iStart - (iStart % 8);
  398. g_iMenuPosition[id] = iStart / PLAYERS_PER_PAGE;
  399. new iEnd = iStart + PLAYERS_PER_PAGE;
  400. if(iEnd > iPlayersNum) iEnd = iPlayersNum;
  401. new szMenu[512], iLen, iPagesNum = (iPlayersNum / PLAYERS_PER_PAGE + ((iPlayersNum % PLAYERS_PER_PAGE) ? 1 : 0));
  402. switch(iPagesNum)
  403. {
  404. case 0:
  405. {
  406. ChatColor(id, "%L", id, "JBE_HOOK_AR4_MODE_PLAYER");
  407. return PLUGIN_HANDLED;
  408. }
  409. default: iLen = formatex(szMenu, charsmax(szMenu), "\y%L^n^n", id, "JBE_HOOK_AR4_MODE_TARGET_HOOK", iPos + 1, iPagesNum);
  410. }
  411. new szName[32], i, iKeys = (1<<9), b;
  412. for(new a = iStart; a < iEnd; a++)
  413. {
  414. i = g_iMenuPlayers[id][a];
  415. get_user_name(i, szName, charsmax(szName));
  416. iKeys |= (1<<b);
  417. iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r[\w%d\r] \w%s %L^n", ++b, szName, i, szPlayerHook[i] ? "JBE_HOOK_AR4_MODE_HOOK_TAKE" : "JBE_HOOK_AR4_MODE_HOOK_GIVE");
  418. }
  419. for(new i = b; i < PLAYERS_PER_PAGE; i++) iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n");
  420. if(iEnd < iPlayersNum)
  421. {
  422. iKeys |= (1<<8);
  423. formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n\r[\w9\r] \w%L^n\r[\w0\r] \w%L", id, "JBE_MENU_AR4_MODE_NEXT", id, iPos ? "JBE_MENU_AR4_MODE_BACK" : "JBE_MENU_AR4_MODE_EXIT");
  424. }
  425. else formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n^n\r[\w0\r] \w%L", id, iPos ? "JBE_MENU_AR4_MODE_BACK" : "JBE_MENU_AR4_MODE_EXIT");
  426. return show_menu(id, iKeys, szMenu, -1, "Show_HookTargetMenu");
  427. }
  428.  
  429. public Handle_HookTargetMenu(id, iKey)
  430. {
  431. switch(iKey)
  432. {
  433. case 8: return Show_HookTargetMenu(id, ++g_iMenuPosition[id]);
  434. case 9: return Show_HookTargetMenu(id, --g_iMenuPosition[id]);
  435. default:
  436. {
  437. new iTarget = g_iMenuPlayers[id][g_iMenuPosition[id] * PLAYERS_PER_PAGE + iKey];
  438. new szName[32], szTargetName[32];
  439. get_user_name(id, szName, charsmax(szName))
  440. get_user_name(iTarget, szTargetName, charsmax(szTargetName))
  441. if(!szPlayerHook[iTarget])
  442. {
  443. szPlayerSpeed[iTarget] = szPlayerSpeed[id]
  444. szPlayerSize[iTarget] = szPlayerSize[id]
  445. szPlayerColor[iTarget] = szPlayerColor[id]
  446. szPlayerSound[iTarget] = szPlayerSound[id]
  447. szPlayerSprite[iTarget] = szPlayerSprite[id]
  448. szPlayerEndSprite[iTarget] = szPlayerEndSprite[id]
  449. szPlayerView[iTarget] = szPlayerView[id]
  450. szPlayerHook[iTarget] = true
  451. ChatColor(0, "%L", LANG_PLAYER, "JBE_HOOK_AR4_MODE_HOOK_GIVE_CHAT", szName, szTargetName)
  452. }
  453. else
  454. {
  455. szPlayerHook[iTarget] = false
  456. ChatColor(0, "%L", LANG_PLAYER, "JBE_HOOK_AR4_MODE_HOOK_TAKE_CHAT", szName, szTargetName)
  457. }
  458. }
  459. }
  460. return Show_HookTargetMenu(id, g_iMenuPosition[id]);
  461. }
  462.  
  463. public HookOn(id)
  464. {
  465. #if defined JBE_CORE
  466. if(jbe_get_day_mode() > 2 || jbe_is_user_wanted(id)) return PLUGIN_HANDLED;
  467. #endif
  468. if(is_user_alive(id) && szPlayerHook[id] && g_iHookEnable)
  469. {
  470. get_user_origin(id, szPlayerHookOrigin[id], 3)
  471. if(callfunc_begin("detect_cheat", "prokreedz.amxx") == 1)
  472. {
  473. callfunc_push_int(id)
  474. callfunc_push_str("Hook")
  475. callfunc_end()
  476. }
  477. emit_sound(id, CHAN_STATIC, g_HookSoundFile[szPlayerSound[id]], 1.0, ATTN_NORM, 0, PITCH_NORM)
  478. set_task(0.1, "HookTask", id, "", 0, "ab")
  479. HookTask(id)
  480. szBreakEnd[id] = szPlayerEndSprite[id] + 1;
  481. break_end(id);
  482. }
  483. return PLUGIN_HANDLED;
  484. }
  485.  
  486. public HookOff(id)
  487. {
  488. RemoveHook(id)
  489. return PLUGIN_HANDLED
  490. }
  491.  
  492. public HookTask(id)
  493. {
  494. #if defined JBE_CORE
  495. if(jbe_is_user_wanted(id)) RemoveHook(id)
  496. #endif
  497. if(!is_user_connected(id) || !is_user_alive(id)) RemoveHook(id)
  498. RemoveBeam(id)
  499. DrawHook(id)
  500. new szOrigin[3], Float:szVelocity[3]
  501. get_user_origin(id, szOrigin)
  502. new szDistance = get_distance(szPlayerHookOrigin[id], szOrigin)
  503. if(szDistance > 25)
  504. {
  505. if(szPlayerSpeed[id] == 0)
  506. {
  507. szVelocity[0] = (szPlayerHookOrigin[id][0] - szOrigin[0]) * (3.0 * 280 / szDistance)
  508. szVelocity[1] = (szPlayerHookOrigin[id][1] - szOrigin[1]) * (3.0 * 280 / szDistance)
  509. szVelocity[2] = (szPlayerHookOrigin[id][2] - szOrigin[2]) * (3.0 * 280 / szDistance)
  510. }
  511. else if(szPlayerSpeed[id] == 1)
  512. {
  513. szVelocity[0] = (szPlayerHookOrigin[id][0] - szOrigin[0]) * (3.0 * 150 / szDistance)
  514. szVelocity[1] = (szPlayerHookOrigin[id][1] - szOrigin[1]) * (3.0 * 150 / szDistance)
  515. szVelocity[2] = (szPlayerHookOrigin[id][2] - szOrigin[2]) * (3.0 * 150 / szDistance)
  516. }
  517. else if(szPlayerSpeed[id] == 2)
  518. {
  519. szVelocity[0] = (szPlayerHookOrigin[id][0] - szOrigin[0]) * (3.0 * 400 / szDistance)
  520. szVelocity[1] = (szPlayerHookOrigin[id][1] - szOrigin[1]) * (3.0 * 400 / szDistance)
  521. szVelocity[2] = (szPlayerHookOrigin[id][2] - szOrigin[2]) * (3.0 * 400 / szDistance)
  522. }
  523. entity_set_vector(id, EV_VEC_velocity, szVelocity)
  524. }
  525. }
  526.  
  527. public DrawHook(id)
  528. {
  529. new szSize, szView
  530. message_begin(MSG_BROADCAST,SVC_TEMPENTITY)
  531. write_byte(1)
  532. write_short(id)
  533. write_coord(szPlayerHookOrigin[id][0])
  534. write_coord(szPlayerHookOrigin[id][1])
  535. write_coord(szPlayerHookOrigin[id][2])
  536. write_short(g_HookSpriteMsg[szPlayerSprite[id]])
  537. write_byte(7)
  538. write_byte(7)
  539. write_byte(100)
  540. switch(szPlayerSize[id])
  541. {
  542. case 0: szSize = 34
  543. case 1: szSize = 18
  544. case 2: szSize = 48
  545. case 3: szSize = 80
  546. }
  547. write_byte(szSize)
  548. switch(szPlayerView[id])
  549. {
  550. case 0: szView = 0
  551. case 1: szView = 7
  552. case 2: szView = 35
  553. }
  554. write_byte(szView)
  555. write_byte(g_HookColorRGB[szPlayerColor[id]][0])
  556. write_byte(g_HookColorRGB[szPlayerColor[id]][1])
  557. write_byte(g_HookColorRGB[szPlayerColor[id]][2])
  558. write_byte(250)
  559. write_byte(7)
  560. message_end()
  561. }
  562.  
  563. public RemoveHook(id)
  564. {
  565. if(task_exists(id))
  566. remove_task(id)
  567. RemoveBeam(id)
  568. }
  569.  
  570. public RemoveBeam(id)
  571. {
  572. message_begin(MSG_BROADCAST,SVC_TEMPENTITY)
  573. write_byte(99)
  574. write_short(id)
  575. message_end()
  576. }
  577.  
  578. public break_end(id)
  579. {
  580. new origin[3], szSprite;
  581. switch(szBreakEnd[id])
  582. {
  583. case 1: szSprite = g_pEndSpriteBreak[0];
  584. case 2: szSprite = g_pEndSpriteBreak[1];
  585. case 3: szSprite = g_pEndSpriteBreak[2];
  586. case 4: szSprite = g_pEndSpriteBreak[3];
  587. }
  588. get_user_origin(id,origin,3)
  589. message_begin(MSG_ALL,SVC_TEMPENTITY,{0,0,0},id)
  590. write_byte(TE_SPRITETRAIL)
  591. write_coord(origin[0])
  592. write_coord(origin[1])
  593. write_coord(origin[2]+20)
  594. write_coord(origin[0])
  595. write_coord(origin[1])
  596. write_coord(origin[2]+80)
  597. write_short(szSprite);
  598. write_byte(30);
  599. write_byte(20);
  600. write_byte(2);
  601. write_byte(20);
  602. write_byte(10);
  603. message_end()
  604. }
  605.  
  606. stock ChatColor(const id, const input[], any:...)
  607. {
  608. new count = 1, players[32]
  609. static msg[191]
  610. vformat(msg, 190, input, 3)
  611. replace_all(msg, 190, "!g", "^4")
  612. replace_all(msg, 190, "!y", "^1")
  613. replace_all(msg, 190, "!t", "^3")
  614. if (id) players[0] = id; else get_players(players, count, "ch")
  615. {
  616. for (new i = 0; i < count; i++)
  617. {
  618. if (is_user_connected(players[i]))
  619. {
  620. message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("SayText"), _, players[i]);
  621. write_byte(players[i]);
  622. write_string(msg);
  623. message_end();
  624. }
  625. }
  626. }
  627. }
RAW Paste Data