HLMOD.HU Forrás Megtekintés - www.hlmod.hu
  1. #include < amxmodx >
  2. #include < amxmisc >
  3. #include < hamsandwich >
  4. #include < fakemeta >
  5.  
  6. #pragma semicolon 1
  7.  
  8. #define ICHAT_VERSION "2.3.0"
  9. #define ICHAT_HOST "forums.alliedmods.net"
  10. #define ICHAT_THREAD "showthread.php?t=173113"
  11.  
  12. #define USE_TEAM_FIX
  13.  
  14. #define MAX_PLAYERS 32
  15. #define TASK_NOTIFY 5987
  16. #define NOTIFY_TASK_TIME 15.0
  17. #define FORMAT_MAX_SIZE 264
  18. #define FORMAT_SMALL_MAX_SIZE 36
  19. #define MAX_CUSTOM_TAGS 2
  20. #define MAX_CUSTOM_TAGS_SIZE 24
  21. #define TEAM_AA_1 0
  22. #define TEAM_AA_2 3
  23.  
  24. #define ICHAT_RETURN PLUGIN_HANDLED
  25.  
  26. #if defined USE_TEAM_FIX
  27. #define TeamInfo_PlayerID 1
  28. #define XO_PLAYER 5
  29. #define m_iTeam 114
  30. #define m_iDeaths 444
  31. new gMsgScoreInfo;
  32. #endif
  33.  
  34. enum _:formats
  35. {
  36. formatAllDefAlive = 0,
  37. formatAllAdminAlive,
  38. formatAllVIPAlive,
  39. formatTeamDefAlive,
  40. formatTeamAdminAlive,
  41. formatTeamVIPAlive,
  42. formatAllDefDead,
  43. formatAllAdminDead,
  44. formatAllVIPDead,
  45. formatTeamDefDead,
  46. formatTeamAdminDead,
  47. formatTeamVIPDead,
  48. formatMeMessage,
  49. formatMeCommand,
  50. formatClearCommand,
  51. formatMax
  52. };
  53.  
  54. enum _:formatTypes { formatDefAlive = 0, formatDefDead, formatTeamAlive, formatTeamDead, formatTypesMax };
  55. enum _:messageType { messageToAll = 0, messageToTeam };
  56. enum _:formatMode { USER = 0, ADMIN, VIP, CUSTOM };
  57. enum _:teamTags { NONE = 0, T, CT, SPEC };
  58. enum _:deadOrAlive { DEAD = 0, ALIVE };
  59. enum _:usersFlags { FLAG_RELOAD = 0, FLAG_SPY, FLAG_ADMIN, FLAG_VIP, FLAG_CHAT, FLAG_SEE_CHAT };
  60.  
  61. new gszChatFormats[ formatMax ][ FORMAT_MAX_SIZE ];
  62. new gszFormatTeamTags[ SPEC + 1 ][ ALIVE + 1 ][ FORMAT_SMALL_MAX_SIZE ];
  63. new gszAccesFlags[ FLAG_SEE_CHAT + 1 ][ 26 ];
  64. new gszCustomTags[ MAX_PLAYERS + 1 ][ MAX_CUSTOM_TAGS ][ MAX_CUSTOM_TAGS_SIZE ];
  65. new gszAuthid[ MAX_PLAYERS + 1 ][ 35 ];
  66.  
  67. new Trie:gtCustomFormats[ formatTypesMax ];
  68. new Trie:gtCustomFormatEnabled[ formatTypesMax ];
  69.  
  70. new giRemoveOnSlash;
  71. new giUserNotify;
  72. new giAdminsSpy;
  73. new giUseCustomColor;
  74. new giRemoveNameChanged;
  75. new giRed;
  76. new giGreen;
  77. new giBlue;
  78. new giPunishment;
  79. new giAllTalk;
  80. new giUseCustomTags;
  81. new giUseCustomFormats;
  82. new giForceSimplePrint;
  83. new giMustBeUpdated;
  84. new giAllowStop;
  85. new giAdminOverrides;
  86. new Float:gFlPrintRadiusAll;
  87. new Float:gFlPrintRadiusTeam;
  88.  
  89. new giCheckArray[ 3 ][ MAX_PLAYERS + 1 ];
  90.  
  91. #define SetUserFirstSpawn(%1) giCheckArray[0][%1]=1
  92. #define ClearUserFirstSpawn(%1) giCheckArray[0][%1]=0
  93. #define IsFirstSpawn(%1) giCheckArray[0][%1]
  94.  
  95. #define EnableUserChat(%1) giCheckArray[1][%1]=1
  96. #define DisableUserChat(%1) giCheckArray[1][%1]=0
  97. #define IsUserChatEnabled(%1) giCheckArray[1][%1]
  98.  
  99. #define SetUserVip(%1) giCheckArray[2][%1]=1
  100. #define ClearUserVip(%1) giCheckArray[2][%1]=0
  101. #define IsUserVip(%1) giCheckArray[2][%1]
  102.  
  103. new giLocation;
  104. new gszLocation[ MAX_PLAYERS + 1 ][ FORMAT_SMALL_MAX_SIZE ];
  105.  
  106. new gMsgSayText;
  107. new gMsgTeamInfo;
  108.  
  109. new giPluginIndex;
  110.  
  111. public plugin_init( )
  112. {
  113. giPluginIndex = register_plugin( "iChat", ICHAT_VERSION, "Kid" );
  114.  
  115. iChatCheckErrors( );
  116.  
  117. register_dictionary( "iChat.txt" );
  118. register_dictionary( "common.txt" );
  119.  
  120. gMsgSayText = get_user_msgid( "SayText" );
  121. gMsgTeamInfo = get_user_msgid( "TeamInfo" );
  122.  
  123. #if defined USE_TEAM_FIX
  124. gMsgScoreInfo = get_user_msgid( "ScoreInfo" );
  125. #endif
  126.  
  127. register_message( gMsgSayText, "messageSayText" );
  128.  
  129. RegisterHam( Ham_Spawn, "player", "hamPlayerSpawnPost", 1 );
  130.  
  131. register_concmd( "amx_reload_ichat", "iChatReloadConfig" );
  132.  
  133. register_clcmd( "say", "iChatHookSay", 0 );
  134. register_clcmd( "say_team", "iChatHookSay", 1 );
  135.  
  136. new szModShortName[ 7 ];
  137. if ( get_modname( szModShortName, charsmax( szModShortName ) ) == 5
  138. && equal( szModShortName, "czero" ) )
  139. {
  140. register_event( "Location", "eventLocation", "be" );
  141. }
  142.  
  143. register_event( "TeamInfo", "eventTeamInfoAll", "a" );
  144.  
  145. new iSutppCvar = register_cvar( "ichat_version", ICHAT_VERSION, FCVAR_SERVER | FCVAR_EXTDLL | FCVAR_SPONLY );
  146. set_pcvar_string( iSutppCvar, ICHAT_VERSION );
  147.  
  148. new iFormatType;
  149. for ( iFormatType = 0; iFormatType < formatTypesMax; iFormatType++ )
  150. {
  151. gtCustomFormats[ iFormatType ] = TrieCreate( );
  152. gtCustomFormatEnabled[ iFormatType ] = TrieCreate( );
  153. }
  154. iChatConfig( );
  155. }
  156.  
  157. public plugin_unpause( )
  158. {
  159. iChatPause( 1, "ad", "HIBA: Valaki megprobalta leallitani az iChatet, ezert leallt.", "" );
  160. }
  161.  
  162. public iChatPause( iForcePause, const szFlags[ ], const szError[ ], const szWarning[ ] )
  163. {
  164. if ( giAllowStop || iForcePause )
  165. {
  166. log_amx( szError );
  167. pause( szFlags );
  168. }
  169. else
  170. {
  171. log_amx( szWarning );
  172. }
  173. }
  174.  
  175. public iChatCheckErrors( )
  176. {
  177. new iPluginsNum;
  178. if ( ( giPluginIndex + 1 ) < ( iPluginsNum = get_pluginsnum( ) ) )
  179. {
  180. log_amx( "Nehany plugin az iChat utan van irva a plugins.ini-ben, javitsd." );
  181. new i, szFileName[ 15 ], szStatus[ 15 ];
  182. for ( i = ( giPluginIndex + 1 ); i < iPluginsNum; i++ )
  183. {
  184. if ( get_plugin( i, szFileName, charsmax( szFileName ), _, _, _, _, _, _, szStatus, charsmax( szStatus ) ) >= 0 )
  185. {
  186. log_amx( "[%d] %s is %s", ( i + 1 ), szFileName, szStatus );
  187. }
  188. else break;
  189. }
  190. iChatPause( 0, "ad", "HIBA: iChat nem az utolso a plugins.ini-ben, ezert leallt.", "FIGYELEM: iChat nem az utolso a plugins.ini-ben." );
  191. }
  192. if ( is_plugin_loaded( "Admin Chat Colors" ) != -1 )
  193. {
  194. log_amx( "FIGYELEM: iChat ezt a futo plugint talalta 'Admin Chat Colors'. Plugin leallitva." );
  195. pause( "acd", "Admin Chat Colors" );
  196. }
  197. }
  198.  
  199. public iChatCheckUpdates( )
  200. {
  201. new iOutdated = 0;
  202. if ( iOutdated )
  203. {
  204. log_amx( "FIGYELEM: iChat elavult. Toltsd le az uj frissitest: http://%s/%s", ICHAT_HOST, ICHAT_THREAD );
  205. giMustBeUpdated = 1;
  206. }
  207. }
  208.  
  209. public plugin_natives( )
  210. {
  211. register_library( "iChat" );
  212. register_native( "iChatSendCustomData", "iChatSendCustomData" );
  213. register_native( "iChatVipAction", "iChatVipAction" );
  214. }
  215.  
  216. public iChatReloadConfig( id )
  217. {
  218. if ( !has_flag( id, gszAccesFlags[ FLAG_RELOAD ] ) && gszAccesFlags[ FLAG_RELOAD ][ 0 ] )
  219. {
  220. client_print( id, print_console, "%L", id, "NO_ACC_COM" );
  221. return PLUGIN_HANDLED;
  222. }
  223. iChatConfig( );
  224. client_print( id, print_console, "[iChat] %L", id, "RELOADED" );
  225. return PLUGIN_CONTINUE;
  226. }
  227.  
  228. public iChatConfig( )
  229. {
  230. new szCfgFile[ 128 ];
  231. get_configsdir( szCfgFile, charsmax( szCfgFile ) );
  232. formatex( szCfgFile, charsmax( szCfgFile ), "%s/ichat.cfg", szCfgFile );
  233.  
  234. new iCfgFileHandle = fopen( szCfgFile, "rt" );
  235. if ( !iCfgFileHandle )
  236. {
  237. set_fail_state( "No configuration file" );
  238. return;
  239. }
  240.  
  241. new szLineData[ 364 ], szLineKey[ 96 ], szLineValue[ 264 ];
  242. while ( !feof( iCfgFileHandle ) )
  243. {
  244. fgets( iCfgFileHandle, szLineData, charsmax( szLineData ) );
  245. trim( szLineData );
  246.  
  247. if ( szLineData[ 0 ] == ';' || szLineData[ 0 ] == '#' || ( szLineData[ 0 ] == '/' && szLineData[ 1 ] == '/' ) || !szLineData[ 0 ] )
  248. {
  249. continue;
  250. }
  251.  
  252. parse( szLineData, szLineKey, charsmax( szLineKey ), szLineValue, charsmax( szLineValue ) );
  253.  
  254. switch ( szLineKey[ 0 ] )
  255. {
  256. case 'F':
  257. {
  258. switch ( szLineKey[ 7 ] )
  259. {
  260. case 'D':
  261. {
  262. switch ( szLineKey[ 11 ] )
  263. {
  264. case 'A':
  265. {
  266. if ( equal( szLineKey, "FORMAT_DEF_ALIVE" ) )
  267. {
  268. copy( gszChatFormats[ formatAllDefAlive ], charsmax( gszChatFormats[ ] ), szLineValue );
  269. }
  270. }
  271. case 'D':
  272. {
  273. if ( equal( szLineKey, "FORMAT_DEF_DEAD" ) )
  274. {
  275. copy( gszChatFormats[ formatAllDefDead ], charsmax( gszChatFormats[ ] ), szLineValue );
  276. }
  277. }
  278. }
  279. }
  280. case 'A':
  281. {
  282. switch ( szLineKey[ 13 ] )
  283. {
  284. case 'A':
  285. {
  286. if ( equal( szLineKey, "FORMAT_ADMIN_ALIVE" ) )
  287. {
  288. copy( gszChatFormats[ formatAllAdminAlive ], charsmax( gszChatFormats[ ] ), szLineValue );
  289. }
  290. }
  291. case 'D':
  292. {
  293. if ( equal( szLineKey, "FORMAT_ADMIN_DEAD" ) )
  294. {
  295. copy( gszChatFormats[ formatAllAdminDead ], charsmax( gszChatFormats[ ] ), szLineValue );
  296. }
  297. }
  298. }
  299. }
  300. case 'V':
  301. {
  302. switch ( szLineKey[ 11 ] )
  303. {
  304. case 'A':
  305. {
  306. if ( equal( szLineKey, "FORMAT_VIP_ALIVE" ) )
  307. {
  308. copy( gszChatFormats[ formatAllVIPAlive ], charsmax( gszChatFormats[ ] ), szLineValue );
  309. }
  310. }
  311. case 'D':
  312. {
  313. if ( equal( szLineKey, "FORMAT_VIP_DEAD" ) )
  314. {
  315. copy( gszChatFormats[ formatAllVIPDead ], charsmax( gszChatFormats[ ] ), szLineValue );
  316. }
  317. }
  318. }
  319. }
  320. case 'T':
  321. {
  322. switch ( szLineKey[ 12 ] )
  323. {
  324. case 'D':
  325. {
  326. switch ( szLineKey[ 16 ] )
  327. {
  328. case 'A':
  329. {
  330. if ( equal( szLineKey, "FORMAT_TEAM_DEF_ALIVE" ) )
  331. {
  332. copy( gszChatFormats[ formatTeamDefAlive ], charsmax( gszChatFormats[ ] ), szLineValue );
  333. }
  334. }
  335. case 'D':
  336. {
  337. if ( equal( szLineKey, "FORMAT_TEAM_DEF_DEAD" ) )
  338. {
  339. copy( gszChatFormats[ formatTeamDefDead ], charsmax( gszChatFormats[ ] ), szLineValue );
  340. }
  341. }
  342. }
  343. }
  344. case 'A':
  345. {
  346. switch ( szLineKey[ 18 ] )
  347. {
  348. case 'A':
  349. {
  350. if ( equal( szLineKey, "FORMAT_TEAM_ADMIN_ALIVE" ) )
  351. {
  352. copy( gszChatFormats[ formatTeamAdminAlive ], charsmax( gszChatFormats[ ] ), szLineValue );
  353. }
  354. }
  355. case 'D':
  356. {
  357. if ( equal( szLineKey, "FORMAT_TEAM_ADMIN_DEAD" ) )
  358. {
  359. copy( gszChatFormats[ formatTeamAdminDead ], charsmax( gszChatFormats[ ] ), szLineValue );
  360. }
  361. }
  362. }
  363. }
  364. case 'V':
  365. {
  366. switch ( szLineKey[ 16 ] )
  367. {
  368. case 'A':
  369. {
  370. if ( equal( szLineKey, "FORMAT_TEAM_VIP_ALIVE" ) )
  371. {
  372. copy( gszChatFormats[ formatTeamVIPAlive ], charsmax( gszChatFormats[ ] ), szLineValue );
  373. }
  374. }
  375. case 'D':
  376. {
  377. if ( equal( szLineKey, "FORMAT_TEAM_VIP_DEAD" ) )
  378. {
  379. copy( gszChatFormats[ formatTeamVIPDead ], charsmax( gszChatFormats[ ] ), szLineValue );
  380. }
  381. }
  382. }
  383. }
  384. }
  385. }
  386. case 'M':
  387. {
  388. switch ( szLineKey[ 10 ] )
  389. {
  390. case 'M':
  391. {
  392. if ( equal( szLineKey, "FORMAT_ME_MESSAGE" ) )
  393. {
  394. copy( gszChatFormats[ formatMeMessage ], charsmax( gszChatFormats[ ] ), szLineValue );
  395. }
  396. }
  397. case 'C':
  398. {
  399. if ( equal( szLineKey, "FORMAT_ME_COMMAND" ) )
  400. {
  401. copy( gszChatFormats[ formatMeCommand ], charsmax( gszChatFormats[ ] ), szLineValue );
  402. add( gszChatFormats[ formatMeCommand ], charsmax( gszChatFormats[ ] ), " " );
  403. }
  404. }
  405. }
  406. }
  407. }
  408. }
  409. case 'C':
  410. {
  411. switch ( szLineKey[ 5 ] )
  412. {
  413. case 'C':
  414. {
  415. switch ( szLineKey[ 11 ] )
  416. {
  417. case 'R':
  418. {
  419. if ( equal( szLineKey, "CHAT_CLCMD_REMOVE" ) )
  420. {
  421. giRemoveOnSlash = str_to_num( szLineValue );
  422. }
  423. }
  424. case 'C':
  425. {
  426. if ( equal( szLineKey, "CHAT_CLCMD_CLEAR" ) )
  427. {
  428. copy( gszChatFormats[ formatClearCommand ], charsmax( gszChatFormats[ ] ), szLineValue );
  429. }
  430. }
  431. case 'U':
  432. {
  433. if ( equal( szLineKey, "CHAT_CHECK_UPDATES" ) )
  434. {
  435. if ( str_to_num( szLineValue ) == 1 )
  436. {
  437. giMustBeUpdated = 0;
  438. iChatCheckUpdates( );
  439. }
  440. }
  441. }
  442. case 'O':
  443. {
  444. if ( equal( szLineKey, "CHAT_CAN_STOP_ITSELF" ) )
  445. {
  446. giAllowStop = str_to_num( szLineValue );
  447. }
  448. }
  449. }
  450. }
  451. case 'F':
  452. {
  453. switch ( szLineKey[ 10 ] )
  454. {
  455. case 'R':
  456. {
  457. if ( equal( szLineKey, "CHAT_FLAG_RELOAD" ) )
  458. {
  459. if ( equal( szLineValue, "ALL" ) )
  460. {
  461. gszAccesFlags[ FLAG_RELOAD ][ 0 ] = 0;
  462. }
  463. else
  464. {
  465. copy( gszAccesFlags[ FLAG_RELOAD ], charsmax( gszAccesFlags[ ] ), szLineValue );
  466. }
  467. }
  468. }
  469. case 'S':
  470. {
  471. switch ( szLineKey[ 11 ] )
  472. {
  473. case 'P':
  474. {
  475. if ( equal( szLineKey, "CHAT_FLAG_SPY" ) )
  476. {
  477. if ( equal( szLineValue, "ALL" ) )
  478. {
  479. gszAccesFlags[ FLAG_SPY ][ 0 ] = 0;
  480. }
  481. else
  482. {
  483. copy( gszAccesFlags[ FLAG_SPY ], charsmax( gszAccesFlags[ ] ), szLineValue );
  484. }
  485. }
  486. }
  487. case 'E':
  488. {
  489. if ( equal( szLineKey, "CHAT_FLAG_SEE_CHAT" ) )
  490. {
  491. if ( equal( szLineValue, "ALL" ) )
  492. {
  493. gszAccesFlags[ FLAG_SEE_CHAT ][ 0 ] = 0;
  494. }
  495. else
  496. {
  497. copy( gszAccesFlags[ FLAG_SEE_CHAT ], charsmax( gszAccesFlags[ ] ), szLineValue );
  498. }
  499. }
  500. }
  501. }
  502. }
  503. case 'A':
  504. {
  505. if ( equal( szLineKey, "CHAT_FLAG_ADMIN" ) )
  506. {
  507. if ( equal( szLineValue, "ALL" ) )
  508. {
  509. gszAccesFlags[ FLAG_ADMIN ][ 0 ] = 0;
  510. }
  511. else
  512. {
  513. copy( gszAccesFlags[ FLAG_ADMIN ], charsmax( gszAccesFlags[ ] ), szLineValue );
  514. }
  515. }
  516. }
  517. case 'V':
  518. {
  519. if ( equal( szLineKey, "CHAT_FLAG_VIP" ) )
  520. {
  521. if ( equal( szLineValue, "ALL" ) )
  522. {
  523. gszAccesFlags[ FLAG_VIP ][ 0 ] = 0;
  524. }
  525. else
  526. {
  527. copy( gszAccesFlags[ FLAG_VIP ], charsmax( gszAccesFlags[ ] ), szLineValue );
  528. }
  529. }
  530. }
  531. case 'C':
  532. {
  533. if ( equal( szLineKey, "CHAT_FLAG_CHAT" ) )
  534. {
  535. if ( equal( szLineValue, "ALL" ) )
  536. {
  537. gszAccesFlags[ FLAG_CHAT ][ 0 ] = 0;
  538. }
  539. else
  540. {
  541. copy( gszAccesFlags[ FLAG_CHAT ], charsmax( gszAccesFlags[ ] ), szLineValue );
  542. }
  543. }
  544. }
  545. case 'L':
  546. {
  547. if ( equal( szLineKey, "CHAT_NO_COLORS" ) )
  548. {
  549. giForceSimplePrint = str_to_num( szLineValue );
  550. }
  551. }
  552. }
  553. }
  554. case 'A':
  555. {
  556. switch ( szLineKey[ 11 ] )
  557. {
  558. case 'S':
  559. {
  560. if ( equal( szLineKey, "CHAT_ADMIN_SPY" ) )
  561. {
  562. giAdminsSpy = str_to_num( szLineValue );
  563. }
  564. }
  565. case 'L':
  566. {
  567. if ( equal( szLineKey, "CHAT_ALL_TALK" ) )
  568. {
  569. giAllTalk = str_to_num( szLineValue );
  570. }
  571. }
  572. case 'O':
  573. {
  574. if ( equal( szLineKey, "CHAT_ADMIN_OVERRIDES" ) )
  575. {
  576. giAdminOverrides = str_to_num( szLineValue );
  577. }
  578. }
  579. }
  580. }
  581. case 'D':
  582. {
  583. if ( equal( szLineKey, "CHAT_DEFAULT_COLOR" ) )
  584. {
  585. new iColor = str_to_num( szLineValue );
  586. if ( iColor < 0 || iColor > 255255255 )
  587. {
  588. giUseCustomColor = 0;
  589. }
  590. else
  591. {
  592. giUseCustomColor = 1;
  593. giRed = iColor / 1000000;
  594. iColor %= 1000000;
  595. giGreen = iColor / 1000;
  596. giBlue = iColor % 1000;
  597. }
  598. }
  599. }
  600. case 'P':
  601. {
  602. if ( equal( szLineKey, "CHAT_PUNISHMENT" ) )
  603. {
  604. giPunishment = str_to_num( szLineValue );
  605. if ( giPunishment > 1 || giPunishment < 0 )
  606. {
  607. giPunishment = 1;
  608. }
  609. }
  610. }
  611. case 'N':
  612. {
  613. if ( equal( szLineKey, "CHAT_NOTIFY" ) )
  614. {
  615. giUserNotify = str_to_num( szLineValue );
  616. }
  617. }
  618. case 'R':
  619. {
  620. switch ( szLineKey[ 12 ] )
  621. {
  622. case 'A':
  623. {
  624. if ( equal( szLineKey, "CHAT_RADIUS_ALL" ) )
  625. {
  626. gFlPrintRadiusAll = str_to_float( szLineValue );
  627. }
  628. }
  629. case 'T':
  630. {
  631. if ( equal( szLineKey, "CHAT_RADIUS_TEAM" ) )
  632. {
  633. gFlPrintRadiusTeam = str_to_float( szLineValue );
  634. }
  635. }
  636. case 'C':
  637. {
  638. if ( equal( szLineKey, "CHAT_REMOVE_CHANGE_NAME" ) )
  639. {
  640. giRemoveNameChanged = str_to_num( szLineValue );
  641. }
  642. }
  643. }
  644. }
  645. case 'T':
  646. {
  647. switch ( szLineKey[ 14 ] )
  648. {
  649. case '1':
  650. {
  651. switch ( szLineKey[ 16 ] )
  652. {
  653. case 'A':
  654. {
  655. if ( equal( szLineKey, "CHAT_TEAM_TAG_1_A" ) )
  656. {
  657. copy( gszFormatTeamTags[ T ][ ALIVE ], charsmax( gszFormatTeamTags[ ][ ] ), szLineValue );
  658. }
  659. }
  660. case 'D':
  661. {
  662. if ( equal( szLineKey, "CHAT_TEAM_TAG_1_D" ) )
  663. {
  664. copy( gszFormatTeamTags[ T ][ DEAD ], charsmax( gszFormatTeamTags[ ][ ] ), szLineValue );
  665. }
  666. }
  667. }
  668. }
  669. case '2':
  670. {
  671. switch ( szLineKey[ 16 ] )
  672. {
  673. case 'A':
  674. {
  675. if ( equal( szLineKey, "CHAT_TEAM_TAG_2_A" ) )
  676. {
  677. copy( gszFormatTeamTags[ CT ][ ALIVE ], charsmax( gszFormatTeamTags[ ][ ] ), szLineValue );
  678. }
  679. }
  680. case 'D':
  681. {
  682. if ( equal( szLineKey, "CHAT_TEAM_TAG_2_D" ) )
  683. {
  684. copy( gszFormatTeamTags[ CT ][ DEAD ], charsmax( gszFormatTeamTags[ ][ ] ), szLineValue );
  685. }
  686. }
  687. }
  688. }
  689. case '3':
  690. {
  691. if ( equal( szLineKey, "CHAT_TEAM_TAG_3" ) )
  692. {
  693. copy( gszFormatTeamTags[ SPEC ][ DEAD ], charsmax( gszFormatTeamTags[ ][ ] ), szLineValue );
  694. }
  695. }
  696. }
  697. }
  698. case 'U':
  699. {
  700. switch ( szLineKey[ 16 ] )
  701. {
  702. case 'T':
  703. {
  704. if ( equal( szLineKey, "CHAT_USE_CUSTOM_TAGS" ) )
  705. {
  706. giUseCustomTags = str_to_num( szLineValue );
  707. }
  708. }
  709. case 'F':
  710. {
  711. if ( equal( szLineKey, "CHAT_USE_CUSTOM_FORMATS" ) )
  712. {
  713. giUseCustomFormats = str_to_num( szLineValue );
  714. }
  715. }
  716. }
  717. }
  718. }
  719. }
  720. }
  721. }
  722. fclose( iCfgFileHandle );
  723. if ( giUseCustomFormats )
  724. {
  725. iChatCustomFormats( );
  726. }
  727. }
  728.  
  729. public iChatCustomFormats( )
  730. {
  731. new szIniFile[ 128 ];
  732. get_configsdir( szIniFile, charsmax( szIniFile ) );
  733. formatex( szIniFile, charsmax( szIniFile ), "%s/ichat_custom_formats.ini", szIniFile );
  734.  
  735. new iIniFileHandle = fopen( szIniFile, "rt" );
  736. if ( !iIniFileHandle )
  737. {
  738. set_fail_state( "No custom formats file" );
  739. return;
  740. }
  741.  
  742. new szLineData[ 456 ], szLineKey[ 96 ], szLineKeyValue[ 96 ], szLineValue[ 264 ], iFormatType;
  743. for ( iFormatType = 0; iFormatType < formatTypesMax; iFormatType++ )
  744. {
  745. TrieClear( gtCustomFormats[ iFormatType ] );
  746. TrieClear( gtCustomFormatEnabled[ iFormatType ] );
  747. }
  748. while ( !feof( iIniFileHandle ) )
  749. {
  750. fgets( iIniFileHandle, szLineData, charsmax( szLineData ) );
  751. trim( szLineData );
  752.  
  753. if ( szLineData[ 0 ] == ';' || szLineData[ 0 ] == '#' || ( szLineData[ 0 ] == '/' && szLineData[ 1 ] == '/' ) || !szLineData[ 0 ] )
  754. {
  755. continue;
  756. }
  757.  
  758. parse( szLineData, szLineKey, charsmax( szLineKey ), szLineKeyValue, charsmax( szLineKeyValue ), szLineValue, charsmax( szLineValue ) );
  759.  
  760. if ( ( iFormatType = iChatGetFormatFromString( szLineKeyValue ) ) < 0 )
  761. {
  762. continue;
  763. }
  764.  
  765. if ( ( equal( szLineKey, "STEAM_", 6 ) || equal( szLineKey, "BOT" ) ) && szLineValue[ 0 ] )
  766. {
  767. TrieSetString( gtCustomFormats[ iFormatType ], szLineKey, szLineValue );
  768. TrieSetCell( gtCustomFormatEnabled[ iFormatType ], szLineKey, 1 );
  769. }
  770. }
  771. fclose( iIniFileHandle );
  772. }
  773.  
  774. public iChatGetFormatFromString( const szKey[ ] )
  775. {
  776. switch ( szKey[ 5 ] )
  777. {
  778. case 'L': return formatDefAlive;
  779. case 'E': return formatDefDead;
  780. case 'A': return formatTeamAlive;
  781. case 'D': return formatTeamDead;
  782. }
  783. return -1;
  784. }
  785.  
  786. public iChatHookSay( id, iTeamMessage )
  787. {
  788. return iChatGenerateMessage( id, iTeamMessage );
  789. }
  790.  
  791. public iChatGenerateMessage( id, iTeamMessage )
  792. {
  793. if ( !is_user_connected( id ) || ( !has_flag( id, gszAccesFlags[ FLAG_CHAT ] ) && gszAccesFlags[ FLAG_CHAT ][ 0 ] ) )
  794. {
  795. return ICHAT_RETURN;
  796. }
  797.  
  798. new szSaid[ 128 ], iSaidLen;
  799. iSaidLen = charsmax( szSaid );
  800. read_args( szSaid, charsmax( szSaid ) );
  801. remove_quotes( szSaid );
  802. replace_all( szSaid, charsmax( szSaid ), "%s", " s" );
  803. replace_all( szSaid, charsmax( szSaid ), "#", " * " );
  804. replace_all( szSaid, charsmax( szSaid ), "_", " - " );
  805. replace_all( szSaid, charsmax( szSaid ), "", " * " );
  806. replace_all( szSaid, charsmax( szSaid ), "", " * " );
  807. trim( szSaid );
  808.  
  809. if ( iChatIsChatValid( szSaid ) )
  810. {
  811. iChatSendToHLSW( id, szSaid, iTeamMessage );
  812. }
  813.  
  814. if ( !contain( szSaid, gszChatFormats[ formatMeCommand ] ) )
  815. {
  816. iChatMeCommand( id, szSaid, iSaidLen );
  817. return ICHAT_RETURN;
  818. }
  819. if ( !contain( szSaid, gszChatFormats[ formatClearCommand ] ) )
  820. {
  821. iChatChangeChatStatus( id, IsUserChatEnabled( id ) );
  822. return ICHAT_RETURN;
  823. }
  824.  
  825. if ( ( !szSaid[ 0 ] )
  826. || ( ( giRemoveOnSlash && ( szSaid[ 0 ] == '/' || szSaid[ 0 ] == '@' || szSaid[ 0 ] == '!' ) ) || ( szSaid[ 0 ] == ' ' ) )
  827. || ( !IsUserChatEnabled( id ) ) )
  828. {
  829. return ICHAT_RETURN;
  830. }
  831.  
  832. new iAlive = is_user_alive( id );
  833.  
  834. new szMessage[ 496 ], szColor[ 16 ], szTeam[ 16 ];
  835. get_user_team( id, szTeam, charsmax( szTeam ) );
  836.  
  837. iChatFormatMessage( id, iAlive, iTeamMessage, 0, szSaid, szMessage, charsmax( szMessage ), szColor, charsmax( szColor ) );
  838.  
  839. if ( giForceSimplePrint > 0 )
  840. {
  841. client_print( 0, print_chat, szMessage );
  842. return ICHAT_RETURN;
  843. }
  844.  
  845. new iGenCheck = ( giAllTalk && !iTeamMessage );
  846.  
  847. iChatChangeTeamInfo( id, szColor, iGenCheck );
  848.  
  849. if ( iGenCheck )
  850. {
  851. iChatMessageAll( id, szMessage );
  852. }
  853. else
  854. {
  855. iChatMessageRest( id, iAlive, iTeamMessage, szMessage );
  856. }
  857. iChatChangeTeamInfo( id, szTeam, iGenCheck );
  858. return ICHAT_RETURN;
  859. }
  860.  
  861. public iChatMeCommand( id, szSaid[ ], iSaidLen )
  862. {
  863. new szMessage[ 496 ], szColor[ 16 ], szTeam[ 16 ];
  864. get_user_team( id, szTeam, charsmax( szTeam ) );
  865. replace_all( szSaid, iSaidLen, gszChatFormats[ formatMeCommand ], " " );
  866. trim( szSaid );
  867.  
  868. iChatFormatMessage( id, ALIVE, 0, 1, szSaid, szMessage, charsmax( szMessage ), szColor, charsmax( szColor ) );
  869. if ( giForceSimplePrint > 0 )
  870. {
  871. client_print( 0, print_chat, szMessage );
  872. }
  873. else
  874. {
  875. iChatChangeTeamInfo( id, szColor, 1 );
  876. iChatMessageAll( id, szMessage );
  877. iChatChangeTeamInfo( id, szTeam, 1 );
  878. }
  879. }
  880.  
  881. public iChatChangeChatStatus( id, iEnabled )
  882. {
  883. if ( iEnabled )
  884. {
  885. if ( giForceSimplePrint > 0 )
  886. {
  887. client_print( id, print_chat, "[iChat] %L", id, "CHAT_DISABLED_NOC" );
  888. }
  889. else
  890. {
  891. iChatSimplePrint( id, "!g[iChat]!d %L", id, "CHAT_DISABLED" );
  892. }
  893. DisableUserChat( id );
  894. }
  895. else
  896. {
  897. EnableUserChat( id );
  898. if ( giForceSimplePrint > 0 )
  899. {
  900. client_print( id, print_chat, "[iChat] %L", id, "CHAT_ENABLED_NOC" );
  901. }
  902. else
  903. {
  904. iChatSimplePrint( id, "!g[iChat]!d %L", id, "CHAT_ENABLED" );
  905. }
  906. }
  907. }
  908.  
  909. public iChatFormatMessage( id, iAlive, iSayTeam, iMeCmd, const szSaid[ ], szMessage[ ], iMessageLen, szColor[ ], iColorLen )
  910. {
  911. new szName[ 32 ], szLife[ 16 ], iLife, iTeam;
  912. get_user_name( id, szName, charsmax( szName ) );
  913. iLife = get_user_health( id );
  914. num_to_str( iLife, szLife, charsmax( szLife ) );
  915. iTeam = get_user_team( id );
  916. if ( iTeam < NONE || iTeam > SPEC )
  917. {
  918. iTeam = 0;
  919. }
  920.  
  921. if ( iMeCmd )
  922. {
  923. copy( szMessage, iMessageLen, gszChatFormats[ formatMeMessage ] );
  924. }
  925. else
  926. {
  927. new iFormatType = ( iSayTeam ? ( ( iAlive || iTeam == TEAM_AA_1 || iTeam == TEAM_AA_2 ) ? formatTeamAlive : formatTeamDead ) : ( ( iAlive || iTeam == TEAM_AA_1 || iTeam == TEAM_AA_2 ) ? formatDefAlive : formatDefDead ) );
  928.  
  929. new iHasCustom = 0;
  930. if ( giUseCustomFormats )
  931. {
  932. if ( TrieKeyExists( gtCustomFormatEnabled[ iFormatType ], gszAuthid[ id ] ) )
  933. {
  934. TrieGetCell( gtCustomFormatEnabled[ iFormatType ], gszAuthid[ id ], iHasCustom );
  935. }
  936. }
  937. new iModeFormat = USER;
  938. new iCrusher = ( giAdminOverrides ? ADMIN : VIP );
  939. new iCrushed = ( giAdminOverrides ? VIP : ADMIN );
  940. if ( iHasCustom )
  941. {
  942. iModeFormat = CUSTOM;
  943. }
  944. else if ( has_flag( id, gszAccesFlags[ ( iCrusher + 1 ) ] ) || !gszAccesFlags[ ( iCrusher + 1 ) ][ 0 ] )
  945. {
  946. iModeFormat = iCrusher;
  947. }
  948. else if ( has_flag( id, gszAccesFlags[ ( iCrushed + 1 ) ] ) || IsUserVip( id ) || !gszAccesFlags[ ( iCrushed + 1 ) ][ 0 ] )
  949. {
  950. iModeFormat = iCrushed;
  951. }
  952.  
  953. switch ( iModeFormat )
  954. {
  955. case USER:
  956. {
  957. switch ( iFormatType )
  958. {
  959. case formatTeamAlive: copy( szMessage, iMessageLen, gszChatFormats[ formatTeamDefAlive ] );
  960. case formatTeamDead: copy( szMessage, iMessageLen, gszChatFormats[ formatTeamDefDead ] );
  961. case formatDefAlive: copy( szMessage, iMessageLen, gszChatFormats[ formatAllDefAlive ] );
  962. case formatDefDead: copy( szMessage, iMessageLen, gszChatFormats[ formatAllDefDead ] );
  963. }
  964. }
  965. case ADMIN:
  966. {
  967. switch ( iFormatType )
  968. {
  969. case formatTeamAlive: copy( szMessage, iMessageLen, gszChatFormats[ formatTeamAdminAlive ] );
  970. case formatTeamDead: copy( szMessage, iMessageLen, gszChatFormats[ formatTeamAdminDead ] );
  971. case formatDefAlive: copy( szMessage, iMessageLen, gszChatFormats[ formatAllAdminAlive ] );
  972. case formatDefDead: copy( szMessage, iMessageLen, gszChatFormats[ formatAllAdminDead ] );
  973. }
  974. }
  975. case VIP:
  976. {
  977. switch ( iFormatType )
  978. {
  979. case formatTeamAlive: copy( szMessage, iMessageLen, gszChatFormats[ formatTeamVIPAlive ] );
  980. case formatTeamDead: copy( szMessage, iMessageLen, gszChatFormats[ formatTeamVIPDead ] );
  981. case formatDefAlive: copy( szMessage, iMessageLen, gszChatFormats[ formatAllVIPAlive ] );
  982. case formatDefDead: copy( szMessage, iMessageLen, gszChatFormats[ formatAllVIPDead ] );
  983. }
  984. }
  985. case CUSTOM:
  986. {
  987. TrieGetString( gtCustomFormats[ iFormatType ], gszAuthid[ id ], szMessage, iMessageLen );
  988. }
  989. }
  990. }
  991.  
  992. new szFormatTemp[ 64 ], iCustomTagsCount;
  993.  
  994. replace_all( szMessage, iMessageLen, "%TEAMTAG%", gszFormatTeamTags[ iTeam ][ iAlive ] );
  995.  
  996. if ( giUseCustomTags )
  997. {
  998. for ( iCustomTagsCount = 0; iCustomTagsCount < MAX_CUSTOM_TAGS; iCustomTagsCount++ )
  999. {
  1000. formatex( szFormatTemp, charsmax( szFormatTemp ), "#CUSTOM%i#", iCustomTagsCount );
  1001. replace_all( szMessage, iMessageLen, szFormatTemp, gszCustomTags[ id ][ iCustomTagsCount ] );
  1002. }
  1003. }
  1004.  
  1005. if ( giForceSimplePrint <= 0 )
  1006. {
  1007. replace_all( szMessage, iMessageLen, "<default>", "^x01" );
  1008. replace_all( szMessage, iMessageLen, "<green>", "^x04" );
  1009.  
  1010. if ( contain( szMessage, "<red>" ) != -1 )
  1011. {
  1012. copy( szColor, iColorLen, "TERRORIST" );
  1013. }
  1014. else if ( contain( szMessage, "<blue>" ) != -1 )
  1015. {
  1016. copy( szColor, iColorLen, "CT" );
  1017. }
  1018. else if ( contain( szMessage, "<grey>" ) != -1 )
  1019. {
  1020. copy( szColor, iColorLen, "SPECTATOR" );
  1021. }
  1022. else
  1023. {
  1024. get_user_team( id, szFormatTemp, iColorLen );
  1025. copy( szColor, iColorLen, szFormatTemp );
  1026. }
  1027.  
  1028. replace_all( szMessage, iMessageLen, "<team>", "^x03" );
  1029. replace_all( szMessage, iMessageLen, "<red>", "^x03" );
  1030. replace_all( szMessage, iMessageLen, "<blue>", "^x03" );
  1031. replace_all( szMessage, iMessageLen, "<grey>", "^x03" );
  1032. }
  1033.  
  1034. replace_all( szMessage, iMessageLen, "%STEAMID%", gszAuthid[ id ] );
  1035. replace_all( szMessage, iMessageLen, "%LIFE%", szLife );
  1036. replace_all( szMessage, iMessageLen, "%POS%", giLocation ? gszLocation[ id ] : "" );
  1037.  
  1038. new szLangOpt[ 16 ];
  1039. formatex( szLangOpt, charsmax( szLangOpt ), "TEAM%i", iTeam );
  1040. formatex( szFormatTemp, charsmax( szFormatTemp ), "%L", LANG_SERVER, szLangOpt );
  1041. replace_all( szMessage, iMessageLen, "%TEAM%", szFormatTemp );
  1042.  
  1043. replace_all( szMessage, iMessageLen, "%NAME%", szName );
  1044. replace_all( szMessage, iMessageLen, "%MESSAGE%", szSaid );
  1045. }
  1046.  
  1047. public iChatMessageAll( id, const szMessage[ ] )
  1048. {
  1049. message_begin( MSG_BROADCAST, gMsgSayText );
  1050. write_byte( id );
  1051. write_string( szMessage );
  1052. message_end( );
  1053. }
  1054.  
  1055. public iChatMessageRest( id, iAlive, iTeamMessage, const szMessage[ ] )
  1056. {
  1057. new iTeam = get_user_team( id );
  1058. new iPlayers[ MAX_PLAYERS ], iNum, tid, iPlayerCounter, iTempAlive, iTempTeam, iTeamCheck, iRadiusCheck, iCanSeeCheck, iSupercedeCheck;
  1059. get_players( iPlayers, iNum );
  1060. for ( iPlayerCounter = 0; iPlayerCounter < iNum; iPlayerCounter++ )
  1061. {
  1062. tid = iPlayers[ iPlayerCounter ];
  1063. if ( !( iSupercedeCheck = ( id == tid ) ) )
  1064. {
  1065. iTempAlive = is_user_alive( tid );
  1066. if ( iTeamMessage )
  1067. {
  1068. iTempTeam = get_user_team( tid );
  1069. }
  1070.  
  1071. iTeamCheck = ( !iTeamMessage || ( iTeam == iTempTeam ) );
  1072. iRadiusCheck = iChatIsInRadius( id, tid, iTeamMessage, iAlive, iTempAlive );
  1073. iCanSeeCheck = ( ( has_flag( tid, gszAccesFlags[ FLAG_SEE_CHAT ] ) || !gszAccesFlags[ FLAG_SEE_CHAT ][ 0 ] ) && IsUserChatEnabled( tid ) );
  1074. }
  1075.  
  1076. if ( ( iSupercedeCheck )
  1077. || ( ( ( ( giAllTalk || ( iAlive && iTempAlive ) ) || ( !iAlive && !iTempAlive ) ) && iTeamCheck && iRadiusCheck && iCanSeeCheck )
  1078. || ( giAdminsSpy && ( has_flag( tid, gszAccesFlags[ FLAG_SPY ] ) || !gszAccesFlags[ FLAG_SPY ][ 0 ] ) )
  1079. || ( is_user_hltv( tid ) ) ) )
  1080. {
  1081. message_begin( MSG_ONE_UNRELIABLE, gMsgSayText, .player = tid );
  1082. write_byte( id );
  1083. write_string( szMessage );
  1084. message_end( );
  1085. }
  1086. }
  1087. }
  1088.  
  1089. public iChatIsInRadius( iSender, iReceiver, iTeamMessage, iSenderAlive, iReceiverAlive )
  1090. {
  1091. new Float:flSenderOrigin[ 3 ], Float:flRecieverOrigin[ 3 ], Float:flDistance, Float:flMaxRadius;
  1092. pev( iSender, pev_origin, flSenderOrigin );
  1093. pev( iReceiver, pev_origin, flRecieverOrigin );
  1094. flDistance = get_distance_f( flSenderOrigin, flRecieverOrigin );
  1095.  
  1096. if ( iTeamMessage )
  1097. {
  1098. flMaxRadius = gFlPrintRadiusTeam;
  1099. }
  1100. else
  1101. {
  1102. flMaxRadius = gFlPrintRadiusAll;
  1103. }
  1104.  
  1105. if ( flDistance <= flMaxRadius || flMaxRadius <= 0 || !iSenderAlive || !iReceiverAlive )
  1106. {
  1107. return 1;
  1108. }
  1109. return 0;
  1110. }
  1111.  
  1112. public eventLocation( id )
  1113. {
  1114. giLocation = 1;
  1115. if ( read_data( 1 ) == id )
  1116. {
  1117. read_data( 2, gszLocation[ id ], charsmax( gszLocation[ ] ) );
  1118. }
  1119. }
  1120.  
  1121. public client_putinserver( id )
  1122. {
  1123. if ( giUserNotify )
  1124. {
  1125. set_task( NOTIFY_TASK_TIME, "iChatNotify", id + TASK_NOTIFY );
  1126. }
  1127. get_user_authid( id, gszAuthid[ id ], charsmax( gszAuthid[ ] ) );
  1128. SetUserFirstSpawn( id );
  1129. EnableUserChat( id );
  1130. }
  1131.  
  1132. public plugin_end( )
  1133. {
  1134. new iFormatType;
  1135. for ( iFormatType = 0; iFormatType < formatTypesMax; iFormatType++ )
  1136. {
  1137. TrieDestroy( gtCustomFormats[ iFormatType ] );
  1138. TrieDestroy( gtCustomFormatEnabled[ iFormatType ] );
  1139. }
  1140. }
  1141.  
  1142. public hamPlayerSpawnPost( id )
  1143. {
  1144. if ( giUseCustomColor && is_user_connected( id ) && !is_user_bot( id ) && IsFirstSpawn( id ) )
  1145. {
  1146. iChatAskChangeCvar( id );
  1147. }
  1148. ClearUserFirstSpawn( id );
  1149. }
  1150.  
  1151. public iChatAskChangeCvar( id )
  1152. {
  1153. new szMenuFormat[ 164 ], iLen = charsmax( szMenuFormat );
  1154. formatex( szMenuFormat, iLen, "%L", id, "MENU_TITLE", giRed, giGreen, giBlue );
  1155. new iAskMenu = menu_create( szMenuFormat, "iChatAskMenuHandler" );
  1156. new szMenuAction[ 16 ];
  1157. formatex( szMenuAction, charsmax( szMenuAction ), "MENU_ACTION%i", giPunishment );
  1158. formatex( szMenuFormat, iLen, "%L %L", id, "MENU_NO", id, szMenuAction );
  1159. menu_additem( iAskMenu, szMenuFormat );
  1160. formatex( szMenuFormat, iLen, "%L", id, "MENU_YES" );
  1161. menu_additem( iAskMenu, szMenuFormat );
  1162.  
  1163. menu_setprop( iAskMenu, MPROP_EXIT, MEXIT_NEVER );
  1164. menu_display( id, iAskMenu );
  1165. }
  1166.  
  1167. public iChatAskMenuHandler( id, iMenu, iItem )
  1168. {
  1169. if ( iItem == 1 )
  1170. {
  1171. client_cmd( id, "con_color ^"%i %i %i^"", giRed, giGreen, giBlue );
  1172. }
  1173. else if ( giPunishment )
  1174. {
  1175. server_cmd( "kick #%d ^"%L^"", get_user_userid( id ), id, "KICK_REASON" );
  1176. }
  1177. menu_destroy( iMenu );
  1178. }
  1179.  
  1180. public iChatIsChatValid( const szChat[ ] )
  1181. {
  1182. new cChar, iCharCounter;
  1183. while ( ( cChar = szChat[ iCharCounter++ ] ) != EOS )
  1184. {
  1185. if ( cChar != ' ' )
  1186. {
  1187. return 1;
  1188. }
  1189. }
  1190. return 0;
  1191. }
  1192.  
  1193. public iChatSendToHLSW( id, const szSaid[ ], iTeamMessage )
  1194. {
  1195. new szName[ 32 ], szTeam[ 10 ];
  1196. get_user_name( id, szName, charsmax( szName ) );
  1197. get_user_team( id, szTeam, charsmax( szTeam ) );
  1198. if( szTeam[ 0 ] == 'U' )
  1199. {
  1200. szTeam[ 0 ] = EOS;
  1201. }
  1202. log_message( "^"%s<%d><%s><%s>^" %s ^"%s^"%s", szName, get_user_userid( id ), gszAuthid[ id ], szTeam, ( iTeamMessage ? "say_team" : "say" ), szSaid, is_user_alive( id ) ? "" : " (dead)" );
  1203. }
  1204.  
  1205. public iChatChangeTeamInfo( id, const szColor[ ], iToAll )
  1206. {
  1207. message_begin( ( iToAll ? MSG_BROADCAST : MSG_ONE_UNRELIABLE ), gMsgTeamInfo, .player = id );
  1208. write_byte( id );
  1209. write_string( szColor );
  1210. message_end( );
  1211. }
  1212.  
  1213. public messageSayText( iMsgId, iMsgDest, iMsgEntity )
  1214. {
  1215. if ( giRemoveNameChanged )
  1216. {
  1217. new szMessage[ 196 ];
  1218. get_msg_arg_string( 2, szMessage, charsmax( szMessage ) );
  1219. if ( equal( szMessage, "#Cstrike_Name_Change" ) )
  1220. {
  1221. return PLUGIN_HANDLED;
  1222. }
  1223. }
  1224. return PLUGIN_CONTINUE;
  1225. }
  1226.  
  1227. public iChatNotify( id )
  1228. {
  1229. id -= TASK_NOTIFY;
  1230. if ( giForceSimplePrint > 0 )
  1231. {
  1232. client_print( id, print_chat, "[iChat] Ez a szerver az iChat plugint hasznalja. Letoltesi link a konzolban." );
  1233. }
  1234. else
  1235. {
  1236. iChatSimplePrint( id, "!g[iChat]!d Ez a szerver az !tiChat!d by !tKid!d plugint hasznalja. Letoltesi link a konzolban." );
  1237. }
  1238. if ( giMustBeUpdated && ( has_flag( id, gszAccesFlags[ FLAG_RELOAD ] ) || !gszAccesFlags[ FLAG_RELOAD ][ 0 ] ) )
  1239. {
  1240. client_print( id, print_chat, "[iChat] FIGYELEM! iChat elavult. Ajanlott frissiteni!" );
  1241. }
  1242. client_print( id, print_console, "[iChat] 'iChat' by Kid letoltes itt: 'https://forums.alliedmods.net/showthread.php?t=173113'." );
  1243. client_print( id, print_console, "[iChat] vagy a githubon: 'https://github.com/Kid-/iChat'" );
  1244. }
  1245.  
  1246. public iChatSimplePrint( id, const szMessage[ ], any:... )
  1247. {
  1248. new szBuffer[ 512 ];
  1249. vformat( szBuffer, charsmax( szBuffer ), szMessage, 3 );
  1250. replace_all( szBuffer, charsmax( szBuffer ), "!d", "^x01" );
  1251. replace_all( szBuffer, charsmax( szBuffer ), "!t", "^x03" );
  1252. replace_all( szBuffer, charsmax( szBuffer ), "!g", "^x04" );
  1253. message_begin( MSG_ONE_UNRELIABLE, gMsgSayText, .player = id );
  1254. write_byte( id );
  1255. write_string( szBuffer );
  1256. message_end( );
  1257. }
  1258.  
  1259. #if defined USE_TEAM_FIX
  1260. public eventTeamInfoAll( )
  1261. {
  1262. new id = read_data( TeamInfo_PlayerID );
  1263. if ( !is_user_alive( id ) && is_user_connected( id ) )
  1264. {
  1265. new iTeam = get_pdata_int( id, m_iTeam, XO_PLAYER );
  1266. if ( iTeam != get_user_team( id ) )
  1267. {
  1268. emessage_begin( MSG_BROADCAST, gMsgScoreInfo );
  1269. ewrite_byte( id );
  1270. ewrite_short( get_user_frags( id ) );
  1271. ewrite_short( get_pdata_int( id, m_iDeaths, XO_PLAYER ) );
  1272. ewrite_short( 0 );
  1273. ewrite_short( iTeam );
  1274. emessage_end( );
  1275. }
  1276. }
  1277. }
  1278. #endif
  1279.  
  1280. public iChatSendCustomData( iPlugin, iParams )
  1281. {
  1282. new iTagIndex = get_param( 2 );
  1283. new szData[ MAX_CUSTOM_TAGS_SIZE ];
  1284. get_string( 3, szData, charsmax( szData ) );
  1285. copy( gszCustomTags[ get_param( 1 ) ][ ( ( iTagIndex < 0 || iTagIndex >= MAX_CUSTOM_TAGS ) ? 0 : iTagIndex ) ], charsmax( gszCustomTags[ ][ ] ), szData );
  1286. }
  1287.  
  1288. public iChatVipAction( iPlugin, iParams )
  1289. {
  1290. new id = get_param( 1 );
  1291. switch ( get_param( 2 ) )
  1292. {
  1293. case 0: return IsUserVip( id );
  1294. case 1: return SetUserVip( id );
  1295. case 2: return ClearUserVip( id );
  1296. }
  1297. return -1;
  1298. }
  1299.