HLMOD.HU Forrás Megtekintés - www.hlmod.hu
  1. #include <amxmodx>
  2. #include <hamsandwich>
  3. #include <engine>
  4. #include <cstrike>
  5. #include <fun>
  6. #include <reapi>
  7.  
  8. #pragma semicolon 1
  9.  
  10. new const PLUGIN[] = "Re GunGame";
  11. new const VERSION[] = "1.5.2";
  12. new const AUTHOR[] = "gyxoBka";
  13.  
  14. /*---------------EDIT ME------------------*/
  15.  
  16. #define RED_TEAM_COLOUR 255, 0, 0 // Цвет RGB во время защиты для ТТ ( рендеринг )
  17. #define BLUE_TEAM_COLOUR 0, 0, 255 // Цвет RGB во время защиты для CT ( рендеринг )
  18. #define GLOW_THICK 10 // "Плотность" цвета защиты. Закомментируйте, чтобы отключить свечение
  19.  
  20. #define MAXPLAYERS 32 // Максимальное количество игроков на сервере
  21. #define REFRESH_INTERVAL 5.0 // С какой периодичностью обновляется HUD лидера
  22.  
  23. #define MAX_SAVES 32 // Максимальное количество сохраненных игроков
  24.  
  25. /*----------------------------------------*/
  26.  
  27. #define CheckFlag(%1,%2) (%1 & (1 << (%2 & 31)))
  28. #define SetFlag(%1,%2) (%1 |= (1 << (%2 & 31)))
  29. #define ClearFlag(%1,%2) (%1 &= ~(1 << (%2 & 31)))
  30.  
  31. #define FIRST_PLAYER_ID 1
  32. #define MAX_LEVELS 26
  33. #define START_LEVEL 1
  34. #define MAX_SPAWNS 60
  35. #define WEAPON_LEN 16
  36. #define SOUND_SIZE 100
  37.  
  38. #define TASK_RESPAWN_ID 32
  39. #define TASK_NEWSPAWN_ID 64
  40. #define TASK_PROTECTION_ID 96
  41. #define TASK_GIVEGRENADE_ID 128
  42. #define TASK_LEADER_DISPLAY 500
  43.  
  44. #define IsPlayer(%1) ( FIRST_PLAYER_ID <= %1 <= MAXPLAYERS )
  45. #define IsMp3Format(%1) equali( %1[strlen( %1 ) - 4 ], ".mp3" )
  46.  
  47. enum Team
  48. {
  49. TT = 1,
  50. CT
  51. }
  52.  
  53. enum
  54. {
  55. WORLD = 0,
  56. BULLET,
  57. KNIFE,
  58. GRENADE
  59. }
  60.  
  61. enum
  62. {
  63. SECTION_NONE = 0,
  64. BASIC,
  65. DEATHMATCH,
  66. WARMUP,
  67. SOUND,
  68. WEAPON
  69. }
  70.  
  71. enum
  72. {
  73. LEVELUP = 0,
  74. LEVELDOWN,
  75. LEVELSTEAL,
  76. LEVELNADE,
  77. LEVELKNIFE,
  78. LEVELWELCOME,
  79. LEVELWINNER,
  80. LEVELLEAD,
  81. LEVELTIEDLEAD,
  82. LEVELLOSTLEAD
  83. }
  84.  
  85. enum SaveData
  86. {
  87. szAuth[35],
  88. iSavedLevel,
  89. iSavedKills,
  90. iTimeStamp
  91. }
  92.  
  93. //new const g_szScenarioIcons[][] ={ "", "number_1", "number_2", "number_3", "number_4", "number_5", "number_6", "number_7", "number_8", "number_9" };
  94.  
  95. new g_eSavedData[MAX_SAVES + 1][SaveData];
  96.  
  97. new Array:g_aLevelUp, Array:g_aLevelDown, Array:g_aLevelSteal, Array:g_aLevelNade, Array:g_aLevelKnife,
  98. Array:g_aLevelWelcome, Array:g_aLevelWinner, Array:g_aLevelLead, Array:g_aLevelTiedLead, Array:g_aLevelLostLead;
  99. new g_aLevelUp_size, g_aLevelDown_size, g_aLevelSteal_size, g_aLevelNade_size, g_aLevelKnife_size,
  100. g_aLevelWelcome_size, g_aLevelWinner_size, g_aLevelLead_size, g_aLevelTiedLead_size, g_aLevelLostLead_size;
  101.  
  102. new g_szWeaponLevelName[MAX_LEVELS + 1][WEAPON_LEN + 1], g_szShortWeaponName[MAX_LEVELS + 1][WEAPON_LEN + 1], g_iNeedFrags[MAX_LEVELS + 1],
  103. g_iMaxBpAmmoLevel[MAX_LEVELS + 1], g_iCswLevel[MAX_LEVELS + 1], g_iWeaponLevelSlot[MAX_LEVELS + 1], g_szWeaponIcon[MAX_LEVELS + 2][12];
  104.  
  105. new g_iPlayerLevel[MAXPLAYERS + 1] = {1, 1, ...}, g_iPlayerFrags[MAXPLAYERS + 1], g_iTiedLeaderId[MAXPLAYERS + 1];
  106.  
  107. new g_iSpawnVecs[MAX_SPAWNS][3], g_iSpawnAngles[MAX_SPAWNS][3], g_iSpawnVAngles[MAX_SPAWNS][3], g_iSpawnTeam[MAX_SPAWNS];
  108.  
  109. new g_szGameName[32], g_szVoteFunction[50], g_szCallPluginName[24], g_szLeaderName[32], g_szTiedLeaderName[32], g_szWarmUpWeapon[WEAPON_LEN + 1];
  110.  
  111. new g_iMaxLevels = START_LEVEL, g_iLevelVote, g_iLevelBeforeVote, g_iWinnerMotd, g_iAfkProtection, g_iArmorValue, g_iRandomSpawn, g_iWarmUpTime,
  112. g_iHeLevel, g_iKnifeLevel, g_iNewPlayerLevel, g_iAwpAmmo, g_iColorRed, g_iColorGreen, g_iColorBlue, g_iLevelSaveType, g_iDisplayLeader,
  113. g_iLeaderLevel = START_LEVEL, g_iLeaderId, g_iTiedLeaderNum, g_iWinnerId, g_iLastKilled, g_iWarmUpLevel, g_iProtectionBar, g_iGlowEffect, g_iNoShotProtection;
  114.  
  115. new Float:g_fDisplayPosX, Float:g_fDisplayPosY, Float:g_fSpawnDelay, Float:g_fProtectionTime, Float:g_fNadeRefreshTime;
  116.  
  117. new bool:g_bGameCommencing, bool:g_bIsWarpUp, bool:g_bVoteStarted;
  118.  
  119. new g_MsgCrosshair, g_MsgHideWeapon, g_MsgCurWeapon, g_MsgRoundTime, g_MsgBarTime, g_hookMsgRoundTime, g_MsgStatusIcon /**,g_MsgScenarioIcon**/;
  120.  
  121. new g_iHudLeaderSync, g_iHudFragSync, g_iMaxPlayers, g_iTotalSpawns;
  122.  
  123. new IsPlayerAlive, IsPlayerConnected, IsPlayerBot;
  124.  
  125. public plugin_init()
  126. {
  127. register_plugin(PLUGIN, VERSION, AUTHOR);
  128.  
  129. register_cvar( "regungame", VERSION, FCVAR_SERVER|FCVAR_SPONLY|FCVAR_UNLOGGED );
  130.  
  131. register_logevent("EventGameCommencing", 2, "0=World triggered", "1=Game_Commencing") ;
  132. register_event("CurWeapon","EventCurWeapon","be","1=1");
  133. register_event("AmmoX","EventAmmoX","be");
  134.  
  135. RegisterHookChain(RG_CBasePlayer_Spawn, "CBasePlayer_Spawn", true);
  136. RegisterHookChain(RG_CBasePlayer_Killed, "CBasePlayer_Killed", true);
  137. RegisterHookChain(RG_CBasePlayer_DropPlayerItem, "CBasePlayer_DropPlayerItem", false);
  138. RegisterHookChain(RG_HandleMenu_ChooseAppearance, "HandleMenu_ChooseAppearance", true);
  139. RegisterHookChain(RG_CSGameRules_DeadPlayerWeapons, "CSGameRules_DeadPlayerWeapons", false);
  140. RegisterHookChain(RG_CSGameRules_GiveC4, "CSGameRules_GiveC4", false);
  141. RegisterHookChain(RH_SV_DropClient, "SV_DropClient", true); /** !!!!!!!!!! **/
  142.  
  143. //register_clcmd("drop", "ClientDrop");
  144.  
  145. g_iHudLeaderSync = CreateHudSyncObj();
  146. g_iHudFragSync = CreateHudSyncObj();
  147. g_iMaxPlayers = get_maxplayers();
  148. g_MsgCurWeapon = get_user_msgid("CurWeapon");
  149. g_MsgRoundTime = get_user_msgid("RoundTime");
  150. //g_MsgScenarioIcon = get_user_msgid( "Scenario" );
  151. g_MsgStatusIcon = get_user_msgid("StatusIcon");
  152. g_MsgHideWeapon = get_user_msgid("HideWeapon");
  153. g_MsgCrosshair = get_user_msgid("Crosshair");
  154. g_MsgBarTime = get_user_msgid("BarTime");
  155.  
  156. remove_entity_name("armoury_entity");
  157. remove_entity_name("info_bomb_target");
  158. remove_entity_name("func_bomb_target");
  159. }
  160.  
  161. public SV_DropClient(id, bCrash, szFmt[])
  162. //public client_disconnect(id)
  163. {
  164. ClearFlag(IsPlayerAlive, id);
  165. remove_task(id + TASK_RESPAWN_ID);
  166. ClearFlag(IsPlayerConnected, id);
  167. remove_task(id + TASK_PROTECTION_ID);
  168. ClearFlag(IsPlayerBot, id);
  169. remove_task(id + TASK_GIVEGRENADE_ID);
  170.  
  171. if(g_iLevelSaveType >= 0)
  172. {
  173. SaveDisconnectPlayer(id);
  174. }
  175.  
  176. g_iPlayerLevel[id] = START_LEVEL;
  177. g_iPlayerFrags[id] = 0;
  178.  
  179. CalculateNewLeader();
  180. }
  181.  
  182. public CBasePlayer_DropPlayerItem() return HC_SUPERCEDE;
  183.  
  184. //public ClientDrop(id) return PLUGIN_HANDLED;
  185. public client_kill(id) return PLUGIN_HANDLED;
  186.  
  187. public plugin_precache()
  188. {
  189. ReadCfg();
  190. if(g_iRandomSpawn)
  191. {
  192. readSpawns();
  193. }
  194.  
  195. if(g_aLevelUp_size)
  196. {
  197. PrecacheSounds(g_aLevelUp, g_aLevelUp_size);
  198. }
  199.  
  200. if(g_aLevelDown_size)
  201. {
  202. PrecacheSounds(g_aLevelDown, g_aLevelDown_size);
  203. }
  204.  
  205. if(g_aLevelSteal_size)
  206. {
  207. PrecacheSounds(g_aLevelSteal, g_aLevelSteal_size);
  208. }
  209.  
  210. if(g_aLevelNade_size)
  211. {
  212. PrecacheSounds(g_aLevelNade, g_aLevelNade_size);
  213. }
  214.  
  215. if(g_aLevelWelcome_size)
  216. {
  217. PrecacheSounds(g_aLevelWelcome, g_aLevelWelcome_size);
  218. }
  219.  
  220. if(g_aLevelWinner_size)
  221. {
  222. PrecacheSounds(g_aLevelWinner, g_aLevelWinner_size);
  223. }
  224.  
  225. if(g_aLevelLead_size)
  226. {
  227. PrecacheSounds(g_aLevelLead, g_aLevelLead_size);
  228. }
  229.  
  230. if(g_aLevelTiedLead_size)
  231. {
  232. PrecacheSounds(g_aLevelTiedLead, g_aLevelTiedLead_size);
  233. }
  234.  
  235. if(g_aLevelLostLead_size)
  236. {
  237. PrecacheSounds(g_aLevelLostLead, g_aLevelLostLead_size);
  238. }
  239.  
  240. if(g_aLevelKnife_size)
  241. {
  242. PrecacheSounds(g_aLevelKnife, g_aLevelKnife_size);
  243. }
  244. }
  245.  
  246. public plugin_cfg()
  247. {
  248. set_cvar_num("mp_freezetime", 0);
  249. set_cvar_num("mp_timelimit", 0);
  250. set_cvar_num("mp_round_infinite", 0);
  251. set_cvar_num("mp_refill_bpammo_weapons", 2);
  252.  
  253. set_member_game(m_bCTCantBuy, true);
  254. set_member_game(m_bTCantBuy, true);
  255. set_member_game(m_GameDesc, g_szGameName);
  256.  
  257. g_iLevelVote = g_iMaxLevels - g_iLevelBeforeVote;
  258.  
  259. if(g_iDisplayLeader) set_task(REFRESH_INTERVAL, "ShowLeader", TASK_LEADER_DISPLAY, .flags = "b");
  260. }
  261.  
  262. NewPlayerMiddleLevel()
  263. {
  264. new iLevel, iMaxLevel = START_LEVEL, iMinLevel = 100; /** Level 100 just big value to get min ; ) **/
  265.  
  266. for(new id = 1; id <= g_iMaxPlayers; id++)
  267. {
  268. if(!CheckFlag(IsPlayerConnected, id)) continue;
  269.  
  270. iLevel = g_iPlayerLevel[id];
  271. if(iMinLevel > iLevel)
  272. {
  273. iMinLevel = iLevel;
  274. continue;
  275. }
  276.  
  277. if(iMaxLevel < iLevel) iMaxLevel = iLevel;
  278. }
  279.  
  280. if(iMinLevel > MAX_LEVELS) return START_LEVEL;
  281.  
  282. return (iMaxLevel + iMinLevel) / 2;
  283. }
  284.  
  285. public client_connect(id)
  286. {
  287. ClearFlag(IsPlayerConnected, id);
  288. ClearFlag(IsPlayerAlive, id);
  289. }
  290.  
  291. public client_putinserver(id)
  292. {
  293. if(GetPlayerData(id))
  294. {
  295. CalculateNewLeader();
  296. }
  297. else
  298. {
  299. switch(g_iNewPlayerLevel)
  300. {
  301. case 0:
  302. {
  303. g_iPlayerLevel[id] = NewPlayerMiddleLevel();
  304. }
  305. default:
  306. {
  307. new iLevel; iLevel = g_iPlayerLevel[g_iLeaderId] - g_iNewPlayerLevel;
  308. g_iPlayerLevel[id] = iLevel > START_LEVEL ? iLevel : START_LEVEL;
  309. }
  310. }
  311. }
  312.  
  313. if(is_user_connected(id))
  314. {
  315. SetFlag(IsPlayerConnected, id);
  316. }
  317.  
  318. if(is_user_bot(id) || is_user_hltv(id))
  319. {
  320. SetFlag(IsPlayerBot, id);
  321. return;
  322. }
  323.  
  324. set_task(0.5, "PlayWelcomeSound", id);
  325. }
  326.  
  327. public CSGameRules_DeadPlayerWeapons(const wEnt)
  328. {
  329. SetHookChainReturn(ATYPE_INTEGER, GR_PLR_DROP_GUN_NO);
  330. return HC_SUPERCEDE;
  331. }
  332.  
  333. public HandleMenu_ChooseAppearance(id, iSlot)
  334. {
  335. remove_task(TASK_NEWSPAWN_ID + id);
  336. set_task( g_fSpawnDelay, "SpawnNewPlayer", TASK_NEWSPAWN_ID + id);
  337.  
  338. return HC_CONTINUE;
  339. }
  340.  
  341. public CSGameRules_GiveC4() return HC_SUPERCEDE;
  342.  
  343. public SpawnNewPlayer(id)
  344. {
  345. id -= TASK_NEWSPAWN_ID;
  346.  
  347. if(CheckFlag(IsPlayerAlive, id) || !CheckFlag(IsPlayerConnected, id))
  348. return;
  349.  
  350. switch(get_member(id, m_iTeam))
  351. {
  352. case TT, CT: ExecuteHamB(Ham_CS_RoundRespawn, id);
  353. }
  354. }
  355.  
  356. public CBasePlayer_Killed(id, pevAttacker, iGib)
  357. {
  358. static TaskID, bool:bGrenadeSound, bool:bKnifeSound;
  359. static bool:bGiveNewWeapon; bGiveNewWeapon = false;
  360. static bool:bWinner;
  361.  
  362. if(bWinner) return HC_CONTINUE;
  363.  
  364. ClearFlag(IsPlayerAlive, id);
  365.  
  366. TaskID = TASK_RESPAWN_ID + id;
  367. remove_task(TaskID);
  368. set_task( g_fSpawnDelay, "Respawn", TaskID );
  369.  
  370. if(!IsPlayer(pevAttacker) || id == pevAttacker || !CheckFlag(IsPlayerConnected, pevAttacker) || get_member(id, m_iTeam) == get_member(pevAttacker, m_iTeam))
  371. return HC_CONTINUE;
  372.  
  373. if(g_bIsWarpUp)
  374. {
  375. if(g_iWarmUpLevel == g_iHeLevel || g_iWarmUpLevel == g_iKnifeLevel)
  376. return HC_CONTINUE;
  377.  
  378. rg_instant_reload_weapons(pevAttacker);
  379. //cs_set_weapon_ammo(get_member(pevAttacker, m_pActiveItem), g_iMaxClipLevel[g_iWarmUpLevel]);
  380. return HC_CONTINUE;
  381. }
  382.  
  383. if(g_iAfkProtection)
  384. {
  385. if(get_gametime() - cs_get_user_lastactivity(id) > g_iAfkProtection)
  386. return HC_CONTINUE;
  387. }
  388.  
  389. static iAttackerLevel, iAttackerFrags, iNeedFrags, iInflictor;
  390. iAttackerLevel = g_iPlayerLevel[pevAttacker];
  391. iAttackerFrags = g_iPlayerFrags[pevAttacker];
  392. iNeedFrags = g_iNeedFrags[iAttackerLevel];
  393.  
  394. get_death_reason(id, pevAttacker, iInflictor);
  395.  
  396. // We have to know weapon ;)
  397. switch(iInflictor)
  398. {
  399. case BULLET:
  400. {
  401. iAttackerFrags++;
  402. if(iNeedFrags <= iAttackerFrags)
  403. {
  404. iAttackerFrags = 0;
  405. iAttackerLevel++;
  406.  
  407. bGiveNewWeapon = true;
  408. // GIVE NEW WEAPON
  409. //GiveBetterWeapon(pevAttacker, iAttackerLevel);
  410.  
  411. // PLAY SOUND LEVEL UP
  412. if(g_aLevelUp_size)
  413. {
  414. PlaySound(pevAttacker, g_aLevelUp, g_aLevelUp_size);
  415. }
  416. }
  417. else rg_instant_reload_weapons(pevAttacker);
  418. //cs_set_weapon_ammo(get_member(pevAttacker, m_pActiveItem), g_iMaxClipLevel[iAttackerLevel]);
  419. }
  420. case KNIFE:
  421. {
  422. if(g_iPlayerLevel[id] > START_LEVEL)
  423. {
  424. g_iPlayerLevel[id]--;
  425.  
  426. if(g_iLeaderId == id)
  427. {
  428. switch(g_iTiedLeaderNum)
  429. {
  430. case 0:
  431. {
  432. CalculateNewLeader();
  433. }
  434. case 1:
  435. {
  436. g_iLeaderId = g_iTiedLeaderId[g_iTiedLeaderNum];
  437. g_iTiedLeaderId[g_iTiedLeaderNum] = 0;
  438. g_iTiedLeaderNum--;
  439.  
  440. get_user_name(g_iLeaderId, g_szLeaderName, charsmax(g_szLeaderName));
  441. }
  442. default:
  443. {
  444. g_iLeaderId = g_iTiedLeaderId[g_iTiedLeaderNum];
  445. g_iTiedLeaderId[g_iTiedLeaderNum] = 0;
  446. g_iTiedLeaderNum--;
  447.  
  448. get_user_name(g_iLeaderId, g_szLeaderName, charsmax(g_szLeaderName));
  449. get_user_name(g_iTiedLeaderId[g_iTiedLeaderNum], g_szTiedLeaderName, charsmax(g_szTiedLeaderName));
  450. }
  451. }
  452. }
  453.  
  454. // PLAY SOUND LEVEL DOWN
  455. if(g_aLevelDown_size)
  456. {
  457. PlaySound(id, g_aLevelDown, g_aLevelDown_size);
  458. }
  459. }
  460.  
  461. if(iAttackerLevel != g_iHeLevel)
  462. {
  463. iAttackerLevel++;
  464.  
  465. // PLAY SOUND LEVEL STEAL
  466. if(g_aLevelSteal_size)
  467. {
  468. PlaySound(pevAttacker, g_aLevelSteal, g_aLevelSteal_size);
  469. }
  470.  
  471. // GIVE NEW WEAPON
  472. //GiveBetterWeapon(pevAttacker, iAttackerLevel);
  473. bGiveNewWeapon = true;
  474. }
  475. else rg_give_item(id, "weapon_hegrenade", GT_APPEND);
  476. }
  477. case GRENADE:
  478. {
  479. remove_task(pevAttacker + TASK_GIVEGRENADE_ID);
  480. iAttackerLevel++;
  481.  
  482. // GIVE NEW WEAPON
  483. //GiveBetterWeapon(pevAttacker, iAttackerLevel);
  484. bGiveNewWeapon = true;
  485. }
  486. }
  487.  
  488. // PLAY GRENADE SOUND
  489. if(iAttackerLevel == g_iHeLevel && !bGrenadeSound && g_aLevelNade_size)
  490. {
  491. PlaySound(pevAttacker, g_aLevelNade, g_aLevelNade_size);
  492. bGrenadeSound = true;
  493. }
  494.  
  495. if(iAttackerLevel == g_iKnifeLevel && !bKnifeSound && g_aLevelKnife_size)
  496. {
  497. PlaySound(pevAttacker, g_aLevelKnife, g_aLevelKnife_size);
  498. bKnifeSound = true;
  499. }
  500.  
  501. if(g_iLeaderLevel == iAttackerLevel && g_iLeaderId != pevAttacker)
  502. {
  503. new bool:bIsPlayerTied = false;
  504. for(new i = 1; i <= g_iTiedLeaderNum; i++)
  505. {
  506. if(g_iTiedLeaderId[i] == pevAttacker)
  507. {
  508. bIsPlayerTied = true;
  509. break;
  510. }
  511. }
  512.  
  513. if(!bIsPlayerTied)
  514. {
  515. // PLAY SOUND TIED LEADER TO EACH PLAYER
  516. if(g_aLevelTiedLead_size && g_iLeaderId)
  517. {
  518. PlaySound(pevAttacker, g_aLevelTiedLead, g_aLevelTiedLead_size);
  519. PlaySound(g_iLeaderId, g_aLevelTiedLead, g_aLevelTiedLead_size);
  520. }
  521. g_iTiedLeaderNum++;
  522. g_iTiedLeaderId[g_iTiedLeaderNum] = pevAttacker;
  523.  
  524. get_user_name(pevAttacker, g_szTiedLeaderName, charsmax(g_szTiedLeaderName));
  525. }
  526. }
  527.  
  528. if(iAttackerLevel > g_iLeaderLevel)
  529. {
  530. if(g_iLeaderId != pevAttacker)
  531. {
  532. // PLAY SOUND LOST LEAD
  533. if(g_aLevelLostLead_size && g_iLeaderId)
  534. {
  535. PlaySound(g_iLeaderId, g_aLevelLostLead, g_aLevelLostLead_size);
  536. }
  537.  
  538. // PLAY SOUND LEAD
  539. if(g_aLevelLead_size)
  540. {
  541. PlaySound(pevAttacker, g_aLevelLead, g_aLevelLead_size);
  542. }
  543. g_iLeaderId = pevAttacker;
  544. get_user_name(g_iLeaderId, g_szLeaderName, charsmax(g_szLeaderName));
  545. }
  546. ResetTiedLeader();
  547. g_iLeaderLevel = iAttackerLevel;
  548. }
  549.  
  550. // Time to vote for map?
  551. if(iAttackerLevel == g_iLevelVote && !g_bVoteStarted)
  552. {
  553. g_bVoteStarted = true; // just to vote once
  554. StartMapVote();
  555. }
  556.  
  557. // Attacker can be winner
  558. if(iAttackerLevel > g_iMaxLevels)
  559. {
  560. bWinner = true;
  561.  
  562. remove_task(TASK_LEADER_DISPLAY);
  563.  
  564. g_iWinnerId = pevAttacker; // GAME OVER. Winner detected ;)
  565. g_iLastKilled = id; // We have looser, too : D
  566.  
  567. //PLAY WINNER SOUND
  568. if(g_aLevelWinner_size)
  569. {
  570. PlaySound(0, g_aLevelWinner, g_aLevelWinner_size);
  571. }
  572.  
  573. // If default MOTD used let's show it
  574. if(g_iWinnerMotd)
  575. {
  576. set_task( 1.0, "ShowWinnerMotd" );
  577. //ShowWinnerMotd();
  578. }
  579. set_task( 6.0, "DelayedMapChange" );
  580.  
  581. return HC_CONTINUE;
  582. }
  583.  
  584. if(bGiveNewWeapon) GiveBetterWeapon(pevAttacker, iAttackerLevel);
  585.  
  586. //SendScenarioIcon(pevAttacker, iNeedFrags, iAttackerFrags);
  587. RefreshFragInformer(pevAttacker, iNeedFrags, iAttackerFrags, iAttackerLevel);
  588.  
  589. g_iPlayerLevel[pevAttacker] = iAttackerLevel;
  590. g_iPlayerFrags[pevAttacker] = iAttackerFrags;
  591.  
  592. return HC_CONTINUE;
  593. }
  594.  
  595. public DelayedMapChange()
  596. {
  597. new szNextMap[32];
  598. get_cvar_string("amx_nextmap", szNextMap, charsmax(szNextMap));
  599.  
  600. server_cmd("changelevel %s", szNextMap);
  601. }
  602.  
  603. public CBasePlayer_Spawn(id)
  604. {
  605. if(!is_user_alive(id))
  606. {
  607. ClearFlag(IsPlayerAlive, id);
  608. return HC_CONTINUE;
  609. }
  610.  
  611. SetFlag(IsPlayerAlive, id);
  612.  
  613. if(g_iRandomSpawn)
  614. {
  615. spawn_Preset(id);
  616. }
  617.  
  618. new iLevel;
  619.  
  620. if(g_bIsWarpUp) iLevel = g_iWarmUpLevel;
  621. else
  622. {
  623. iLevel = g_iPlayerLevel[id];
  624. //DeleteStatusIcon(id, iLevel)
  625. SendStatusIcon(id, iLevel);
  626. RefreshFragInformer(id, g_iNeedFrags[iLevel], g_iPlayerFrags[id], iLevel);
  627. hide_hud(id);
  628. }
  629.  
  630. if(g_fProtectionTime) PlayerProtection(id);
  631.  
  632. rg_remove_all_items(id, false);
  633.  
  634. if(g_iArmorValue) rg_set_user_armor(id, g_iArmorValue, ARMOR_VESTHELM);
  635.  
  636. rg_give_item(id, "weapon_knife", GT_APPEND);
  637.  
  638. if(!iLevel || iLevel == g_iKnifeLevel) return HC_CONTINUE;
  639. else if( iLevel == g_iHeLevel ) rg_give_item(id, "weapon_hegrenade", GT_APPEND);
  640. else
  641. {
  642. rg_give_item(id, g_szWeaponLevelName[iLevel], GT_APPEND);
  643. cs_set_user_bpammo(id, g_iCswLevel[iLevel], g_iMaxBpAmmoLevel[iLevel]);
  644. ExecuteHamB(Ham_Weapon_RetireWeapon, get_member(id, m_rgpPlayerItems, 3));
  645. }
  646.  
  647. return HC_CONTINUE;
  648. }
  649.  
  650. public EventGameCommencing()
  651. {
  652. if(g_bGameCommencing) return;
  653.  
  654. g_bGameCommencing = true;
  655.  
  656. set_cvar_num("mp_round_infinite", 1);
  657.  
  658. if(g_iWarmUpTime)
  659. {
  660. g_bIsWarpUp = true;
  661. g_hookMsgRoundTime = register_message( g_MsgRoundTime, "Message_RoundTime" );
  662. set_task(1.0, "TaskCountdownRestart", _, _, _, "a", g_iWarmUpTime);
  663.  
  664. set_task( 5.0, "WarmpupStart" );
  665. }
  666. }
  667.  
  668. public WarmpupStart()
  669. {
  670. set_hudmessage(g_iColorRed, g_iColorGreen, g_iColorBlue, -1.0, 0.3, 0, 0.0, 5.0, 0.0, 0.0);
  671. ShowSyncHudMsg(0, CreateHudSyncObj(), "Bemelegítő kör!");
  672. }
  673.  
  674. public EventAmmoX(id)
  675. {
  676. new iLevel;
  677.  
  678. if(g_bIsWarpUp) iLevel = g_iWarmUpLevel;
  679. else iLevel = g_iPlayerLevel[id];
  680.  
  681. if(iLevel == g_iHeLevel)
  682. {
  683. new iAmount = read_data(2);
  684.  
  685. if(iAmount > 0)
  686. {
  687. remove_task(id + TASK_GIVEGRENADE_ID);
  688. return;
  689. }
  690.  
  691. set_task(g_fNadeRefreshTime, "GiveGrenade", id + TASK_GIVEGRENADE_ID);
  692.  
  693. if(!CheckFlag(IsPlayerBot, id)) ShowBar(id, g_fNadeRefreshTime);
  694. }
  695. }
  696.  
  697. public EventCurWeapon(id)
  698. {
  699. if(!CheckFlag(IsPlayerAlive, id)) return;
  700.  
  701. // have at least one bullet in AWP clip
  702. if(read_data(2) == CSW_AWP && read_data(3) > g_iAwpAmmo)
  703. {
  704. new wEnt = get_member(id, m_pActiveItem);
  705. cs_set_weapon_ammo(wEnt, g_iAwpAmmo);
  706.  
  707. message_begin(MSG_ONE,g_MsgCurWeapon,_,id);
  708. write_byte(g_iAwpAmmo); // current?
  709. write_byte(CSW_AWP); // weapon
  710. write_byte(g_iAwpAmmo); // clip
  711. message_end();
  712. }
  713. }
  714.  
  715. public Respawn(id)
  716. {
  717. id -= TASK_RESPAWN_ID;
  718.  
  719. if(CheckFlag(IsPlayerAlive, id) || !CheckFlag(IsPlayerConnected, id))
  720. return;
  721.  
  722. switch(get_member(id, m_iTeam))
  723. {
  724. case TT, CT: ExecuteHamB(Ham_CS_RoundRespawn, id);
  725. }
  726. }
  727.  
  728. public DisableProtection(id)
  729. {
  730. id -= TASK_PROTECTION_ID;
  731. //if(!CheckFlag(IsPlayerAlive, id) || !is_user_connected(id)) return;
  732. if(!is_user_alive(id)) return;
  733.  
  734. set_user_godmode(id);
  735.  
  736. if(g_iNoShotProtection) set_member(id, m_bIsDefusing, false);
  737.  
  738. if(g_iGlowEffect) set_user_rendering( id, kRenderFxNone, 0, 0, 0, kRenderNormal, 0 );
  739. }
  740.  
  741. public TaskCountdownRestart()
  742. {
  743. switch( --g_iWarmUpTime )
  744. {
  745. case 0:
  746. {
  747. g_bIsWarpUp = false;
  748. unregister_message( g_MsgRoundTime, g_hookMsgRoundTime );
  749.  
  750. set_cvar_num("sv_restart", 1);
  751.  
  752. set_task( 2.0, "EndHud" );
  753. }
  754. }
  755. }
  756.  
  757. public EndHud()
  758. {
  759. set_hudmessage(g_iColorRed, g_iColorGreen, g_iColorBlue, -1.0, 0.3, 0, 0.0, 5.0, 0.0, 0.0);
  760. ShowSyncHudMsg(0, CreateHudSyncObj(), "Bemelegítő kör vége!^nÉles kör!");
  761. }
  762.  
  763. public Message_RoundTime( msgid, dest, receiver )
  764. {
  765. const ARG_TIME_REMAINING = 1;
  766. if(g_bIsWarpUp) set_msg_arg_int( ARG_TIME_REMAINING, ARG_SHORT, g_iWarmUpTime );
  767. else set_msg_arg_int( ARG_TIME_REMAINING, ARG_SHORT, g_iPlayerFrags[receiver] );
  768. }
  769.  
  770. public ShowLeader()
  771. {
  772. if(!g_iLeaderId) return;
  773.  
  774. set_hudmessage( g_iColorRed, g_iColorGreen, g_iColorBlue, g_fDisplayPosX, g_fDisplayPosY, 0, 0.0, REFRESH_INTERVAL, 0.0, 0.0 );
  775.  
  776. switch(g_iTiedLeaderNum)
  777. {
  778. case 0: ShowSyncHudMsg(0, g_iHudLeaderSync, "Vezet: %s (%d - %s)", g_szLeaderName, g_iLeaderLevel, g_szShortWeaponName[g_iLeaderLevel]);
  779. case 1: ShowSyncHudMsg(0, g_iHudLeaderSync, "Vezetnek: %s + %s (%d - %s)", g_szLeaderName, g_szTiedLeaderName, g_iLeaderLevel, g_szShortWeaponName[g_iLeaderLevel]);
  780. default: ShowSyncHudMsg(0, g_iHudLeaderSync, "Vezetnek: %s + %d (%d - %s)", g_szLeaderName, g_iTiedLeaderNum, g_iLeaderLevel, g_szShortWeaponName[g_iLeaderLevel]);
  781. }
  782. }
  783.  
  784. public PlayWelcomeSound(id)
  785. {
  786. if(g_aLevelWelcome_size && CheckFlag(IsPlayerConnected, id))
  787. {
  788. PlaySound(id, g_aLevelWelcome, g_aLevelWelcome_size);
  789. }
  790. }
  791.  
  792. public GiveGrenade(id)
  793. {
  794. remove_task(id);
  795. id -= TASK_GIVEGRENADE_ID;
  796.  
  797. if(CheckFlag(IsPlayerAlive, id))
  798. rg_give_item(id, "weapon_hegrenade", GT_APPEND);
  799. }
  800.  
  801. public ShowWinnerMotd()
  802. {
  803. new szNextMap[32];
  804. new szNewMotd[2048], iLen = 0, iMax = charsmax(szNewMotd);
  805. new szWinnerName[32], szLastKilledName[32], szWinnerColor[8], szLoserColor[8];
  806. get_user_name(g_iWinnerId, szWinnerName, charsmax(szWinnerName));
  807. get_user_name(g_iLastKilled, szLastKilledName, charsmax(szLastKilledName));
  808.  
  809. get_team_color(g_iWinnerId, szWinnerColor, charsmax(szWinnerColor));
  810. get_team_color(g_iLastKilled, szLoserColor, charsmax(szLoserColor));
  811.  
  812. get_cvar_string("amx_nextmap", szNextMap, charsmax(szNextMap));
  813.  
  814.  
  815. iLen = copy(szNewMotd, charsmax(szNewMotd), "<!DOCTYPE html><html><head><meta charset='utf-8' /><style type='text/css'>body \
  816. {font-family:consolas;color:#00FF00;background-color:#000000;font-size: 20pt;}");
  817. iLen += formatex(szNewMotd[iLen], iMax - iLen, "hr {border:body;background-color:#%s;color:#%s;height:2px;} h3 {text-align:center;} #ul {text-align:center;} \
  818. wn {color:#%s;} ln {color:#%s;} wc {color:#FFFFFF;} nm {font-size: 17pt;}</style></head>",szWinnerColor, szWinnerColor, szWinnerColor, szLoserColor);
  819. iLen += formatex(szNewMotd[iLen], iMax - iLen, "<body><h3>[GUNGAME]</h3><div id='ul'><ul><hr><wn>%s</wn> <wc>nyert!</wc><hr></ul></div>", szWinnerName);
  820. iLen += formatex(szNewMotd[iLen], iMax - iLen, "<h3>utolsó halál: <ln>%s</ln></h3><h3><wc><nm>Következő pálya:</nm></wc>%s</h3></body></html>", szLastKilledName, szNextMap);
  821. /**width:100%; margin:0px auto;**/
  822. for(new id = 1; id <= g_iMaxPlayers; id++)
  823. {
  824. if(!CheckFlag(IsPlayerConnected, id)) continue;
  825.  
  826. show_motd(id, szNewMotd);
  827. }
  828. }
  829.  
  830. StartMapVote()
  831. {
  832. if(callfunc_begin(g_szVoteFunction, g_szCallPluginName) == 1)
  833. {
  834. //callfunc_push_int(0);
  835. callfunc_end();
  836. }
  837. }
  838.  
  839. PlayerProtection(id)
  840. {
  841. //if(!CheckFlag(IsPlayerAlive, id) || !is_user_connected(id)) return;
  842. if(!is_user_alive(id)) return;
  843.  
  844. set_user_godmode( id, .godmode = 1 );
  845.  
  846. if(g_iGlowEffect)
  847. {
  848. switch(get_member(id, m_iTeam))
  849. {
  850. case TT: set_user_rendering( id, kRenderFxGlowShell, RED_TEAM_COLOUR, kRenderNormal, GLOW_THICK );
  851. case CT: set_user_rendering( id, kRenderFxGlowShell, BLUE_TEAM_COLOUR, kRenderNormal, GLOW_THICK );
  852. }
  853. }
  854.  
  855. if(g_iProtectionBar) ShowBar(id, g_fProtectionTime);
  856.  
  857. if(g_iNoShotProtection) set_member(id, m_bIsDefusing, true);
  858.  
  859. new TaskID = TASK_PROTECTION_ID + id;
  860.  
  861. remove_task(TaskID);
  862. set_task( g_fProtectionTime, "DisableProtection", TaskID );
  863. }
  864.  
  865. ReadCfg()
  866. {
  867. new szFilePath[64];
  868.  
  869. get_localinfo("amxx_configsdir", szFilePath, charsmax(szFilePath));
  870. formatex(szFilePath, charsmax(szFilePath), "%s/re_gungame.ini",szFilePath);
  871.  
  872. new FileHandle = fopen(szFilePath, "rt");
  873.  
  874. if(!FileHandle)
  875. {
  876. new szErrorMsg[64];
  877. formatex(szErrorMsg, charsmax(szErrorMsg), "File doesnt exists: %s",szFilePath);
  878.  
  879. return set_fail_state(szErrorMsg);
  880. }
  881.  
  882. new szTemp[250], szKey[32], szValue[512];
  883. new iSection;
  884.  
  885. while(!feof(FileHandle))
  886. {
  887. fgets(FileHandle, szTemp, charsmax(szTemp));
  888. trim(szTemp);
  889.  
  890. if (szTemp[0] == '[')
  891. {
  892. iSection++;
  893. continue;
  894. }
  895.  
  896. if(!szTemp[0] || szTemp[0] == ';' || szTemp[0] == '/') continue;
  897.  
  898. strtok(szTemp, szKey, charsmax(szKey), szValue, charsmax(szValue), '=');
  899. trim(szKey);
  900. trim(szValue);
  901.  
  902. switch(iSection)
  903. {
  904. case BASIC:
  905. {
  906. if(equal(szKey, "game_name"))
  907. {
  908. copy(g_szGameName, charsmax(g_szGameName), szValue);
  909. }
  910. if(equal(szKey, "vote_before"))
  911. {
  912. g_iLevelBeforeVote = str_to_num(szValue);
  913. }
  914. else if(equal(szKey, "vote_function"))
  915. {
  916. copy(g_szVoteFunction, charsmax(g_szVoteFunction), szValue);
  917. }
  918. else if(equal(szKey, "vote_plugin"))
  919. {
  920. copy(g_szCallPluginName, charsmax(g_szCallPluginName), szValue);
  921. }
  922. else if(equal(szKey, "save_type"))
  923. {
  924. g_iLevelSaveType = str_to_num(szValue);
  925. }
  926. else if(equal(szKey, "newplayer_level"))
  927. {
  928. g_iNewPlayerLevel = str_to_num(szValue);
  929. }
  930. else if(equal(szKey, "display_leader"))
  931. {
  932. g_iDisplayLeader = str_to_num(szValue);
  933. }
  934. else if(equal(szKey, "display_pos_x"))
  935. {
  936. g_fDisplayPosX = str_to_float(szValue);
  937. }
  938. else if(equal(szKey, "display_pos_y"))
  939. {
  940. g_fDisplayPosY = str_to_float(szValue);
  941. }
  942. else if(equal(szKey, "hud_color_red"))
  943. {
  944. g_iColorRed = str_to_num(szValue);
  945. }
  946. else if(equal(szKey, "hud_color_green"))
  947. {
  948. g_iColorGreen = str_to_num(szValue);
  949. }
  950. else if(equal(szKey, "hud_color_blue"))
  951. {
  952. g_iColorBlue = str_to_num(szValue);
  953. }
  954. else if(equal(szKey, "winner_motd"))
  955. {
  956. g_iWinnerMotd = str_to_num(szValue);
  957. }
  958. else if(equal(szKey, "afk_protection"))
  959. {
  960. g_iAfkProtection = str_to_num(szValue);
  961. }
  962. else if(equal(szKey, "nade_refresh"))
  963. {
  964. g_fNadeRefreshTime = str_to_float(szValue);
  965. }
  966. else if(equal(szKey, "give_armor"))
  967. {
  968. g_iArmorValue = str_to_num(szValue);
  969. }
  970. else if(equal(szKey, "awp_ammo"))
  971. {
  972. g_iAwpAmmo = str_to_num(szValue);
  973. }
  974. }
  975. case DEATHMATCH:
  976. {
  977. if(equal(szKey, "spawn_delay"))
  978. {
  979. g_fSpawnDelay = str_to_float(szValue);
  980. }
  981. else if(equal(szKey, "protection_time"))
  982. {
  983. g_fProtectionTime = str_to_float(szValue);
  984. }
  985. else if(equal(szKey, "protection_bar"))
  986. {
  987. g_iProtectionBar = str_to_num(szValue);
  988. }
  989. else if(equal(szKey, "noshot_protection"))
  990. {
  991. g_iNoShotProtection = str_to_num(szValue);
  992. }
  993. else if(equal(szKey, "glow_effect"))
  994. {
  995. g_iGlowEffect = str_to_num(szValue);
  996. }
  997. else if(equal(szKey, "random_spawn"))
  998. {
  999. g_iRandomSpawn = str_to_num(szValue);
  1000. }
  1001. }
  1002. case WARMUP:
  1003. {
  1004. if(equal(szKey, "warmup_time"))
  1005. {
  1006. g_iWarmUpTime = str_to_num(szValue);
  1007. }
  1008. else if(equal(szKey, "warmup_weapon"))
  1009. {
  1010. formatex(g_szWarmUpWeapon, charsmax(g_szWarmUpWeapon), "weapon_%s", szValue);
  1011. }
  1012. }
  1013. case SOUND:
  1014. {
  1015. if(equal(szKey, "levelup"))
  1016. {
  1017. g_aLevelUp = ArrayCreate(SOUND_SIZE+1);
  1018. CopyToArray(szValue, LEVELUP);
  1019. }
  1020. else if(equal(szKey, "leveldown"))
  1021. {
  1022. g_aLevelDown = ArrayCreate(SOUND_SIZE+1);
  1023. CopyToArray(szValue, LEVELDOWN);
  1024. }
  1025. else if(equal(szKey, "levelsteal"))
  1026. {
  1027. g_aLevelSteal = ArrayCreate(SOUND_SIZE+1);
  1028. CopyToArray(szValue, LEVELSTEAL);
  1029. }
  1030. else if(equal(szKey, "nade"))
  1031. {
  1032. g_aLevelNade = ArrayCreate(SOUND_SIZE+1);
  1033. CopyToArray(szValue, LEVELNADE);
  1034. }
  1035. else if(equal(szKey, "knife"))
  1036. {
  1037. g_aLevelKnife = ArrayCreate(SOUND_SIZE+1);
  1038. CopyToArray(szValue, LEVELKNIFE);
  1039. }
  1040. else if(equal(szKey, "welcome"))
  1041. {
  1042. g_aLevelWelcome = ArrayCreate(SOUND_SIZE+1);
  1043. CopyToArray(szValue, LEVELWELCOME);
  1044. }
  1045. else if(equal(szKey, "winner"))
  1046. {
  1047. g_aLevelWinner = ArrayCreate(SOUND_SIZE+1);
  1048. CopyToArray(szValue, LEVELWINNER);
  1049. }
  1050. else if(equal(szKey, "lead"))
  1051. {
  1052. g_aLevelLead = ArrayCreate(SOUND_SIZE+1);
  1053. CopyToArray(szValue, LEVELLEAD);
  1054. }
  1055. else if(equal(szKey, "tiedlead"))
  1056. {
  1057. g_aLevelTiedLead = ArrayCreate(SOUND_SIZE+1);
  1058. CopyToArray(szValue, LEVELTIEDLEAD);
  1059. }
  1060. else if(equal(szKey, "lostlead"))
  1061. {
  1062. g_aLevelLostLead = ArrayCreate(SOUND_SIZE+1);
  1063. CopyToArray(szValue, LEVELLOSTLEAD);
  1064. }
  1065. }
  1066. case WEAPON:
  1067. {
  1068. if(equal(szKey, "glock18"))
  1069. {
  1070. g_szWeaponIcon[g_iMaxLevels] = "d_glock18";
  1071. SaveWeaponData(2, str_to_num(szValue), CSW_GLOCK18, 120, "weapon_glock18", szKey);
  1072. }
  1073. else if(equal(szKey, "usp"))
  1074. {
  1075. g_szWeaponIcon[g_iMaxLevels] = "d_usp";
  1076. SaveWeaponData(2, str_to_num(szValue), CSW_USP, 100, "weapon_usp", szKey);
  1077. }
  1078. else if(equal(szKey, "p228"))
  1079. {
  1080. g_szWeaponIcon[g_iMaxLevels] = "d_p228";
  1081. SaveWeaponData(2, str_to_num(szValue), CSW_P228, 52, "weapon_p228", szKey);
  1082. }
  1083. else if(equal(szKey, "deagle"))
  1084. {
  1085. g_szWeaponIcon[g_iMaxLevels] = "d_deagle";
  1086. SaveWeaponData(2, str_to_num(szValue), CSW_DEAGLE, 35, "weapon_deagle", szKey);
  1087. }
  1088. else if(equal(szKey, "fiveseven"))
  1089. {
  1090. g_szWeaponIcon[g_iMaxLevels] = "d_fiveseven";
  1091. SaveWeaponData(2, str_to_num(szValue), CSW_FIVESEVEN, 100, "weapon_fiveseven", szKey);
  1092. }
  1093. else if(equal(szKey, "elite"))
  1094. {
  1095. g_szWeaponIcon[g_iMaxLevels] = "d_elite";
  1096. SaveWeaponData(2, str_to_num(szValue), CSW_ELITE, 120, "weapon_elite", szKey);
  1097. }
  1098. else if(equal(szKey, "m3"))
  1099. {
  1100. g_szWeaponIcon[g_iMaxLevels] = "d_m3";
  1101. SaveWeaponData(1, str_to_num(szValue), CSW_M3, 32, "weapon_m3", szKey);
  1102. }
  1103. else if(equal(szKey, "xm1014"))
  1104. {
  1105. g_szWeaponIcon[g_iMaxLevels] = "d_xm1014";
  1106. SaveWeaponData(1, str_to_num(szValue), CSW_XM1014, 32, "weapon_xm1014", szKey);
  1107. }
  1108. if(equal(szKey, "tmp"))
  1109. {
  1110. g_szWeaponIcon[g_iMaxLevels] = "d_tmp";
  1111. SaveWeaponData(1, str_to_num(szValue), CSW_TMP, 120, "weapon_tmp", szKey);
  1112. }
  1113. else if(equal(szKey, "mac10"))
  1114. {
  1115. g_szWeaponIcon[g_iMaxLevels] = "d_mac10";
  1116. SaveWeaponData(1, str_to_num(szValue), CSW_MAC10, 100, "weapon_mac10", szKey);
  1117. }
  1118. else if(equal(szKey, "mp5navy"))
  1119. {
  1120. g_szWeaponIcon[g_iMaxLevels] = "d_mp5navy";
  1121. SaveWeaponData(1, str_to_num(szValue), CSW_MP5NAVY, 120, "weapon_mp5navy", szKey);
  1122. }
  1123. else if(equal(szKey, "ump45"))
  1124. {
  1125. g_szWeaponIcon[g_iMaxLevels] = "d_ump45";
  1126. SaveWeaponData(1, str_to_num(szValue), CSW_UMP45, 100, "weapon_ump45", szKey);
  1127. }
  1128. else if(equal(szKey, "p90"))
  1129. {
  1130. g_szWeaponIcon[g_iMaxLevels] = "d_p90";
  1131. SaveWeaponData(1, str_to_num(szValue), CSW_P90, 100, "weapon_p90", szKey);
  1132. }
  1133. else if(equal(szKey, "galil"))
  1134. {
  1135. g_szWeaponIcon[g_iMaxLevels] = "d_galil";
  1136. SaveWeaponData(1, str_to_num(szValue), CSW_GALIL, 90, "weapon_galil", szKey);
  1137. }
  1138. else if(equal(szKey, "famas"))
  1139. {
  1140. g_szWeaponIcon[g_iMaxLevels] = "d_famas";
  1141. SaveWeaponData(1, str_to_num(szValue), CSW_FAMAS, 90, "weapon_famas", szKey);
  1142. }
  1143. else if(equal(szKey, "ak47"))
  1144. {
  1145. g_szWeaponIcon[g_iMaxLevels] = "d_ak47";
  1146. SaveWeaponData(1, str_to_num(szValue), CSW_AK47, 90, "weapon_ak47", szKey);
  1147. }
  1148. if(equal(szKey, "scout"))
  1149. {
  1150. g_szWeaponIcon[g_iMaxLevels] = "d_scout";
  1151. SaveWeaponData(1, str_to_num(szValue), CSW_SCOUT, 90, "weapon_scout", szKey);
  1152. }
  1153. else if(equal(szKey, "m4a1"))
  1154. {
  1155. g_szWeaponIcon[g_iMaxLevels] = "d_m4a1";
  1156. SaveWeaponData(1, str_to_num(szValue), CSW_M4A1, 90, "weapon_m4a1", szKey);
  1157. }
  1158. else if(equal(szKey, "sg552"))
  1159. {
  1160. g_szWeaponIcon[g_iMaxLevels] = "d_sg552";
  1161. SaveWeaponData(1, str_to_num(szValue), CSW_SG552, 90, "weapon_sg552", szKey);
  1162. }
  1163. else if(equal(szKey, "sg550"))
  1164. {
  1165. g_szWeaponIcon[g_iMaxLevels] = "d_sg550";
  1166. SaveWeaponData(1, str_to_num(szValue), CSW_SG550, 90, "weapon_sg550", szKey);
  1167. }
  1168. else if(equal(szKey, "g3sg1"))
  1169. {
  1170. g_szWeaponIcon[g_iMaxLevels] = "d_g3sg1";
  1171. SaveWeaponData(1, str_to_num(szValue), CSW_G3SG1, 90, "weapon_g3sg1", szKey);
  1172. }
  1173. else if(equal(szKey, "aug"))
  1174. {
  1175. g_szWeaponIcon[g_iMaxLevels] = "d_aug";
  1176. SaveWeaponData(1, str_to_num(szValue), CSW_AUG, 90, "weapon_aug", szKey);
  1177. }
  1178. else if(equal(szKey, "m249"))
  1179. {
  1180. g_szWeaponIcon[g_iMaxLevels] = "d_m249";
  1181. SaveWeaponData(1, str_to_num(szValue), CSW_M249, 200, "weapon_m249", szKey);
  1182. }
  1183. else if(equal(szKey, "awp"))
  1184. {
  1185. g_szWeaponIcon[g_iMaxLevels] = "d_awp";
  1186. SaveWeaponData(1, str_to_num(szValue), CSW_AWP, 30, "weapon_awp", szKey);
  1187. }
  1188. else if(equal(szKey, "hegrenade"))
  1189. {
  1190. g_iHeLevel = g_iMaxLevels;
  1191. g_szWeaponIcon[g_iMaxLevels] = "d_grenade";
  1192. SaveWeaponData(4, str_to_num(szValue), CSW_HEGRENADE, 1, "weapon_hegrenade", szKey);
  1193. }
  1194. else if(equal(szKey, "knife"))
  1195. {
  1196. g_iKnifeLevel = g_iMaxLevels;
  1197. g_szWeaponIcon[g_iMaxLevels] = "d_knife";
  1198. SaveWeaponData(3, str_to_num(szValue), CSW_KNIFE, 1, "weapon_knife", szKey);
  1199. }
  1200. }
  1201. }
  1202. }
  1203. fclose(FileHandle);
  1204.  
  1205. if(g_iMaxLevels > MAX_LEVELS)
  1206. g_iMaxLevels = MAX_LEVELS;
  1207.  
  1208. return PLUGIN_CONTINUE;
  1209. }
  1210.  
  1211. SaveWeaponData(iSlot, iNeedFrags, CSW_ID, iMaxAmmo, szWeaponName[], szShortName[])
  1212. {
  1213. if(equali(szWeaponName,g_szWarmUpWeapon))
  1214. {
  1215. g_iWarmUpLevel = g_iMaxLevels;
  1216. }
  1217. g_iWeaponLevelSlot[g_iMaxLevels] = iSlot;
  1218. g_iCswLevel[g_iMaxLevels] = CSW_ID;
  1219. g_iMaxBpAmmoLevel[g_iMaxLevels] = iMaxAmmo;
  1220. formatex(g_szShortWeaponName[g_iMaxLevels], WEAPON_LEN, "%s", szShortName);
  1221. formatex(g_szWeaponLevelName[g_iMaxLevels], WEAPON_LEN, "%s", szWeaponName);
  1222. g_iNeedFrags[g_iMaxLevels] = iNeedFrags;
  1223. g_iMaxLevels++;
  1224. }
  1225.  
  1226. CopyToArray(szValue[], iArray)
  1227. {
  1228. new szTemp2[512], szSound[SOUND_SIZE + 1];
  1229. copy(szTemp2, SOUND_SIZE, szValue);
  1230.  
  1231.  
  1232. while(szTemp2[0])
  1233. {
  1234. strtok(szTemp2, szSound, SOUND_SIZE, szTemp2, charsmax(szTemp2), ';');
  1235. trim(szSound);
  1236.  
  1237. if(!file_exists(szSound))
  1238. {
  1239. log_to_file("GunGame_Error.txt", "File '%s' doesn't exist", szSound);
  1240. continue;
  1241. }
  1242.  
  1243. switch(iArray)
  1244. {
  1245. case LEVELUP:
  1246. {
  1247. ArrayPushString(g_aLevelUp, szSound);
  1248. g_aLevelUp_size++;
  1249. }
  1250. case LEVELDOWN:
  1251. {
  1252. ArrayPushString(g_aLevelDown, szSound);
  1253. g_aLevelDown_size++;
  1254. }
  1255. case LEVELSTEAL:
  1256. {
  1257. ArrayPushString(g_aLevelSteal, szSound);
  1258. g_aLevelSteal_size++;
  1259. }
  1260. case LEVELNADE:
  1261. {
  1262. ArrayPushString(g_aLevelNade, szSound);
  1263. g_aLevelNade_size++;
  1264. }
  1265. case LEVELKNIFE:
  1266. {
  1267. ArrayPushString(g_aLevelKnife, szSound);
  1268. g_aLevelKnife_size++;
  1269. }
  1270. case LEVELWELCOME:
  1271. {
  1272. ArrayPushString(g_aLevelWelcome, szSound);
  1273. g_aLevelWelcome_size++;
  1274. }
  1275. case LEVELWINNER:
  1276. {
  1277. ArrayPushString(g_aLevelWinner, szSound);
  1278. g_aLevelWinner_size++;
  1279. }
  1280. case LEVELLEAD:
  1281. {
  1282. ArrayPushString(g_aLevelLead, szSound);
  1283. g_aLevelLead_size++;
  1284. }
  1285. case LEVELTIEDLEAD:
  1286. {
  1287. ArrayPushString(g_aLevelTiedLead, szSound);
  1288. g_aLevelTiedLead_size++;
  1289. }
  1290. case LEVELLOSTLEAD:
  1291. {
  1292. ArrayPushString(g_aLevelLostLead, szSound);
  1293. g_aLevelLostLead_size++;
  1294. }
  1295. }
  1296. }
  1297. }
  1298.  
  1299. #define HUD_HIDE_TIMER (1<<4)
  1300. #define HUD_HIDE_MONEY (1<<5)
  1301.  
  1302. hide_hud(id)
  1303. {
  1304. if(CheckFlag(IsPlayerBot, id)) return;
  1305.  
  1306. // hide money
  1307. emessage_begin(MSG_ONE, g_MsgHideWeapon, _, id);
  1308. ewrite_byte(HUD_HIDE_TIMER|HUD_HIDE_MONEY);
  1309. emessage_end();
  1310.  
  1311. // hide crosshair that appears from hiding money
  1312. emessage_begin(MSG_ONE, g_MsgCrosshair, _, id);
  1313. ewrite_byte(0);
  1314. emessage_end();
  1315. }
  1316.  
  1317. #define NAME_LEN 31
  1318. #define IP_LEN 22
  1319. #define STEAM_LEN 34
  1320.  
  1321. SavePlayerData(id, CellNum)
  1322. {
  1323. g_eSavedData[CellNum][iSavedLevel] = g_iPlayerLevel[id];
  1324. g_eSavedData[CellNum][iSavedKills] = g_iPlayerFrags[id];
  1325. g_eSavedData[CellNum][iTimeStamp] = _:get_gametime();
  1326.  
  1327. switch(g_iLevelSaveType)
  1328. {
  1329. case 0: get_user_name(id, g_eSavedData[CellNum][szAuth], NAME_LEN);
  1330. case 1: get_user_ip(id, g_eSavedData[CellNum][szAuth], IP_LEN);
  1331. case 2: get_user_authid(id, g_eSavedData[CellNum][szAuth], STEAM_LEN);
  1332. }
  1333. }
  1334.  
  1335. bool:GetPlayerData(id)
  1336. {
  1337. new szAuthData[STEAM_LEN+1];
  1338. switch(g_iLevelSaveType)
  1339. {
  1340. case 0: get_user_name(id, szAuthData, NAME_LEN);
  1341. case 1: get_user_ip(id, szAuthData, IP_LEN);
  1342. case 2: get_user_authid(id, szAuthData, STEAM_LEN);
  1343. }
  1344.  
  1345. for( new i; i < MAX_SAVES + 1; i++)
  1346. {
  1347. if(!g_eSavedData[i][iSavedLevel]) continue;
  1348.  
  1349. if(!equal(szAuthData, g_eSavedData[i][szAuth])) continue;
  1350.  
  1351. g_iPlayerLevel[id] = g_eSavedData[i][iSavedLevel];
  1352. g_iPlayerFrags[id] = g_eSavedData[i][iSavedKills];
  1353.  
  1354. g_eSavedData[i][iSavedLevel] = 0;
  1355. g_eSavedData[i][iSavedKills] = 0;
  1356. g_eSavedData[i][iTimeStamp] = 0;
  1357. arrayset(g_eSavedData[i][szAuth], 0, STEAM_LEN + 1);
  1358.  
  1359. return true;
  1360. }
  1361. return false;
  1362. }
  1363.  
  1364. SaveDisconnectPlayer(id)
  1365. {
  1366. new iOldestStamp, iOldestPlayer;
  1367. new bool:bSaved = false;
  1368.  
  1369. for( new i; i < MAX_SAVES + 1; i++)
  1370. {
  1371. if(g_eSavedData[i][iTimeStamp] > iOldestStamp)
  1372. {
  1373. iOldestStamp = g_eSavedData[i][iTimeStamp];
  1374. iOldestPlayer = i;
  1375. }
  1376.  
  1377. if(g_eSavedData[i][iSavedLevel]) continue;
  1378.  
  1379. SavePlayerData(id, i);
  1380.  
  1381. bSaved = true;
  1382.  
  1383. break;
  1384. }
  1385. if(!bSaved)
  1386. {
  1387. SavePlayerData(id, iOldestPlayer);
  1388. }
  1389. }
  1390.  
  1391. ResetTiedLeader()
  1392. {
  1393. for(new i = 1; i <= g_iTiedLeaderNum; i++)
  1394. {
  1395. g_iTiedLeaderId[i] = 0;
  1396. }
  1397. g_iTiedLeaderNum = 0;
  1398. }
  1399.  
  1400. CalculateNewLeader()
  1401. {
  1402. g_iLeaderId = 0;
  1403. g_iLeaderLevel = 0;
  1404. ResetTiedLeader();
  1405.  
  1406. new iTempPlayerLevel;
  1407.  
  1408. for(new id = 1; id <= g_iMaxPlayers; id++)
  1409. {
  1410. if(!CheckFlag(IsPlayerConnected, id)) continue;
  1411.  
  1412. iTempPlayerLevel = g_iPlayerLevel[id];
  1413. if(iTempPlayerLevel == START_LEVEL) continue;
  1414.  
  1415. if(iTempPlayerLevel > g_iLeaderLevel)
  1416. {
  1417. g_iLeaderLevel = iTempPlayerLevel;
  1418. g_iLeaderId = id;
  1419. ResetTiedLeader();
  1420. }
  1421. else if(iTempPlayerLevel == g_iLeaderLevel)
  1422. {
  1423. g_iTiedLeaderNum++;
  1424. g_iTiedLeaderId[g_iTiedLeaderNum] = id;
  1425. }
  1426. }
  1427.  
  1428. if(g_iLeaderId)
  1429. {
  1430. get_user_name(g_iLeaderId, g_szLeaderName, charsmax(g_szLeaderName));
  1431. // PLAY SOUND LEAD
  1432. if(g_aLevelLead_size)
  1433. {
  1434. PlaySound(g_iLeaderId, g_aLevelLead, g_aLevelLead_size);
  1435. }
  1436. }
  1437. if(g_iTiedLeaderNum)
  1438. {
  1439. get_user_name(g_iTiedLeaderId[g_iTiedLeaderNum], g_szTiedLeaderName, charsmax(g_szTiedLeaderName));
  1440.  
  1441. for(new i = 1; i <= g_iTiedLeaderNum; i++)
  1442. {
  1443. if(g_aLevelTiedLead_size)
  1444. {
  1445. PlaySound(g_iTiedLeaderId[i], g_aLevelTiedLead, g_aLevelTiedLead_size);
  1446. }
  1447. }
  1448. }
  1449. }
  1450.  
  1451. get_death_reason(const id, const pevAttacker, &iType)
  1452. {
  1453. new iInflictor = get_entvar(id, var_dmg_inflictor);
  1454.  
  1455. if( iInflictor == pevAttacker )
  1456. {
  1457. new iWpnId = get_member(get_member(pevAttacker, m_pActiveItem), m_iId);
  1458.  
  1459. if(iWpnId == CSW_KNIFE) iType = KNIFE;
  1460. else iType = BULLET;
  1461. }
  1462. else
  1463. {
  1464. if(get_member(id, m_bKilledByGrenade)) iType = GRENADE;
  1465. else iType = WORLD;
  1466. }
  1467. }
  1468.  
  1469. GiveBetterWeapon(const id, const iLevel)
  1470. {
  1471. if(iLevel <= g_iMaxLevels && CheckFlag(IsPlayerAlive, id))
  1472. {
  1473. DeleteStatusIcon(id, iLevel);
  1474. SendStatusIcon(id, iLevel);
  1475. rg_remove_item(id, g_szWeaponLevelName[iLevel-1]);
  1476. rg_give_item(id, g_szWeaponLevelName[iLevel], GT_APPEND);
  1477. if(iLevel != g_iHeLevel && iLevel != g_iKnifeLevel)
  1478. {
  1479. cs_set_user_bpammo(id, g_iCswLevel[iLevel], g_iMaxBpAmmoLevel[iLevel]);
  1480. ExecuteHamB(Ham_Weapon_RetireWeapon, get_member(id, m_rgpPlayerItems, 3));
  1481. }
  1482. }
  1483. }
  1484.  
  1485. PlaySound(const id, Array:aArray, aSize)
  1486. {
  1487. if(CheckFlag(IsPlayerBot, id) || !CheckFlag(IsPlayerConnected, id)) return;
  1488.  
  1489. new szSound[SOUND_SIZE];
  1490. ArrayGetString(aArray, random_num(0, aSize-1), szSound, charsmax(szSound));
  1491.  
  1492. if(IsMp3Format(szSound)) client_cmd(id, "mp3 play %s", szSound);
  1493. else rh_emit_sound2(id, id, CHAN_STATIC, szSound[6], VOL_NORM, ATTN_NORM);
  1494. //client_cmd(id, "spk %s", szSound[6]);
  1495. }
  1496.  
  1497. PrecacheSounds(Array:aArray, aSize)
  1498. {
  1499. new szSound[SOUND_SIZE];
  1500. new iLen = charsmax(szSound);
  1501.  
  1502. for(new i; i < aSize; i++)
  1503. {
  1504. ArrayGetString(aArray, i, szSound, iLen );
  1505.  
  1506. if(IsMp3Format(szSound)) precache_generic(szSound);
  1507. else precache_sound(szSound[6]);
  1508. }
  1509. }
  1510.  
  1511. RefreshFragInformer(const id, const iNeedFrags, const iAttackerFrags, const iLevel)
  1512. {
  1513. if(CheckFlag(IsPlayerBot, id)) return;
  1514.  
  1515. static iLeftFrags; iLeftFrags = iNeedFrags - iAttackerFrags;
  1516.  
  1517. set_hudmessage( g_iColorRed, g_iColorGreen, g_iColorBlue, -1.0, 0.95, 0, 0.0, 20.0, 0.0, 0.0, -1);
  1518. ShowSyncHudMsg(id, g_iHudFragSync, "Jelenlegi szinted: %d - %s^nfegyverrel, hátravan: %d ölés", iLevel, g_szShortWeaponName[iLevel], iLeftFrags);
  1519. }
  1520.  
  1521. readSpawns()
  1522. {
  1523. //-617 2648 179 16 -22 0 0 -5 -22 0
  1524. // Origin (x,y,z), Angles (x,y,z), Team (0 = ALL, 1 = T, 2 = CT), vAngles(x,y,z),
  1525.  
  1526. new szMap[32], szConfig[32], MapFile[256];
  1527.  
  1528. get_mapname(szMap, 31);
  1529. get_localinfo("amxx_configsdir", szConfig, charsmax(szConfig));
  1530. format(MapFile, 255, "%s\gungame\%s.spawns.cfg", szConfig, szMap);
  1531. g_iTotalSpawns = 0;
  1532.  
  1533. if (file_exists(MapFile))
  1534. {
  1535. new szData[124], iLen;
  1536. new iLine = 0;
  1537. new pos[12][8];
  1538.  
  1539. while(g_iTotalSpawns < MAX_SPAWNS && (iLine = read_file(MapFile , iLine , szData , 123 , iLen) ) != 0 )
  1540. {
  1541. if (strlen(szData)<2 || szData[0] == '[')
  1542. continue;
  1543.  
  1544. parse(szData, pos[1], 7, pos[2], 7, pos[3], 7, pos[4], 7, pos[5], 7, pos[6], 7, pos[7], 7, pos[8], 7, pos[9], 7, pos[10], 7);
  1545.  
  1546. // Origin
  1547. g_iSpawnVecs[g_iTotalSpawns][0] = str_to_num(pos[1]);
  1548. g_iSpawnVecs[g_iTotalSpawns][1] = str_to_num(pos[2]);
  1549. g_iSpawnVecs[g_iTotalSpawns][2] = str_to_num(pos[3]);
  1550.  
  1551. //Angles
  1552. g_iSpawnAngles[g_iTotalSpawns][0] = str_to_num(pos[4]);
  1553. g_iSpawnAngles[g_iTotalSpawns][1] = str_to_num(pos[5]);
  1554. g_iSpawnAngles[g_iTotalSpawns][2] = str_to_num(pos[6]);
  1555.  
  1556. // Teams
  1557. g_iSpawnTeam[g_iTotalSpawns] = str_to_num(pos[7]);
  1558.  
  1559. //v-Angles
  1560. g_iSpawnVAngles[g_iTotalSpawns][0] = str_to_num(pos[8]);
  1561. g_iSpawnVAngles[g_iTotalSpawns][1] = str_to_num(pos[9]);
  1562. g_iSpawnVAngles[g_iTotalSpawns][2] = str_to_num(pos[10]);
  1563.  
  1564. g_iTotalSpawns++;
  1565. }
  1566. }
  1567. return PLUGIN_CONTINUE;
  1568. }
  1569.  
  1570. public spawn_Preset(id)
  1571. {
  1572. if (g_iTotalSpawns < 2) return PLUGIN_CONTINUE;
  1573.  
  1574. new Float:fSpawnVecs[3], Float:fSpawnAngles[3], Float:fSpawnVAngles[3];
  1575. new Float:loc[32][3], locnum;
  1576. new n, x, iNum, iFinal = -1;
  1577. new team = get_member(id, m_iTeam);
  1578.  
  1579. //cache locations
  1580. for(new pId; pId <= g_iMaxPlayers; pId++)
  1581. {
  1582. if(CheckFlag(IsPlayerAlive, pId) && pId != id && get_member(pId, m_iTeam) != team)
  1583. {
  1584. get_entvar(pId, var_origin, loc[locnum]);
  1585. locnum++;
  1586. }
  1587. }
  1588.  
  1589. iNum = 0;
  1590.  
  1591. //get a random spawn
  1592. n = random_num(0, g_iTotalSpawns-1);
  1593.  
  1594. while (iNum <= g_iTotalSpawns)
  1595. {
  1596. //have we visited all the spawns yet?
  1597. if(iNum == g_iTotalSpawns) break;
  1598.  
  1599. if(n < g_iTotalSpawns - 1) n++;
  1600. else n = 0;
  1601.  
  1602. // inc the number of spawns we've visited
  1603. iNum++;
  1604.  
  1605. if((team == 1 && g_iSpawnTeam[n] == 2) || (team == 2 && g_iSpawnTeam[n] == 1)) continue;
  1606.  
  1607. iFinal = n;
  1608. IVecFVec(g_iSpawnVecs[n], fSpawnVecs);
  1609.  
  1610. for (x = 0; x < locnum; x++)
  1611. {
  1612. new Float:distance = get_distance_f(fSpawnVecs, loc[x]);
  1613. if (distance < 500.0)
  1614. {
  1615. //invalidate
  1616. iFinal = -1;
  1617. break;
  1618. }
  1619. }
  1620.  
  1621. if (iFinal == -1) continue;
  1622.  
  1623. new trace = trace_hull(fSpawnVecs,1);
  1624.  
  1625. if(trace) continue;
  1626.  
  1627. if(locnum < 1) break;
  1628.  
  1629. if(iFinal != -1) break;
  1630. }
  1631.  
  1632. if (iFinal != -1)
  1633. {
  1634. new Float:mins[3], Float:maxs[3], Float:size[3];
  1635.  
  1636. IVecFVec(g_iSpawnVecs[iFinal], fSpawnVecs);
  1637. IVecFVec(g_iSpawnAngles[iFinal], fSpawnAngles);
  1638. IVecFVec(g_iSpawnVAngles[iFinal], fSpawnVAngles);
  1639.  
  1640. get_entvar(id, var_mins, mins);
  1641. get_entvar(id, var_maxs, maxs);
  1642.  
  1643. size[0] = maxs[0] - mins[0];
  1644. size[1] = maxs[1] - mins[1];
  1645. size[2] = maxs[2] - mins[2];
  1646.  
  1647. set_entvar(id, var_size, size);
  1648. set_entvar(id, var_origin, fSpawnVecs);
  1649. set_entvar(id, var_fixangle, 1);
  1650.  
  1651. set_entvar(id, var_angles, fSpawnAngles);
  1652. set_entvar(id, var_v_angle, fSpawnVAngles);
  1653. set_entvar(id, var_fixangle, 1);
  1654.  
  1655. return PLUGIN_HANDLED;
  1656. }
  1657.  
  1658. return PLUGIN_CONTINUE;
  1659. }
  1660.  
  1661. stock ShowBar(id, Float:fTime)
  1662. {
  1663. message_begin(MSG_ONE, g_MsgBarTime, _, id);
  1664. write_short(floatround(fTime, floatround_round));
  1665. message_end();
  1666. }
  1667.  
  1668. stock get_team_color(const id, szColor[], const iLen)
  1669. {
  1670. switch(get_member(id, m_iTeam))
  1671. {
  1672. case TT: formatex(szColor, iLen,"FF0000");
  1673. case CT: formatex(szColor, iLen,"1E90FF");
  1674. default: formatex(szColor, iLen,"FFFFFF");
  1675. }
  1676. }
  1677.  
  1678. /**
  1679. stock get_team_color(const id, szColor[], const iLen)
  1680. {
  1681. switch(get_member(id, m_iTeam))
  1682. {
  1683. case TT: formatex(szColor, iLen,"FF3F3F");
  1684. case CT: formatex(szColor, iLen,"99CCFF");
  1685. default: formatex(szColor, iLen,"FFFFFF");
  1686. }
  1687. }
  1688. **/
  1689.  
  1690. const ICON_ON = 1;
  1691. const ICON_OF = 0;
  1692. /**
  1693. stock SendScenarioIcon(id, iLevelKills, iKills)
  1694. {
  1695. static iKillsLeft; iKillsLeft = iLevelKills - iKills;
  1696.  
  1697. message_begin(MSG_ONE, g_MsgScenarioIcon, _, id);
  1698. write_byte(ICON_ON);
  1699. write_string(g_szScenarioIcons[iKillsLeft]);
  1700. write_byte(0); // no alpha value
  1701. message_end();
  1702. }
  1703. **/
  1704. stock SendStatusIcon(id, iLevel)
  1705. {
  1706. message_begin(MSG_ONE, g_MsgStatusIcon, {0,0,0}, id);
  1707. write_byte(ICON_ON);
  1708. write_string(g_szWeaponIcon[iLevel + 1]);
  1709. write_byte(g_iColorRed);
  1710. write_byte(g_iColorGreen);
  1711. write_byte(g_iColorBlue);
  1712. message_end();
  1713. }
  1714.  
  1715. stock DeleteStatusIcon(id, iLevel)
  1716. {
  1717. message_begin(MSG_ONE, g_MsgStatusIcon, {0,0,0}, id);
  1718. write_byte(ICON_OF);
  1719. write_string(g_szWeaponIcon[iLevel]);
  1720. message_end();
  1721. }