HLMOD.HU Forrás Megtekintés - www.hlmod.hu
  1. /* Plugin generated by AMXX-Studio */
  2.  
  3. #include <amxmodx>
  4. #include <amxmisc>
  5. #include <engine>
  6. #include <fakemeta>
  7. #include <fun>
  8. #include <hamsandwich>
  9.  
  10. #define PLUGIN "He-Grenade_Game"
  11. #define AUTHOR "RauliTop"
  12. #define VERSION "1.1"
  13.  
  14. // Task IDs
  15. #define TASK_TIME 200
  16. #define TASK_SHOWHUD 300
  17. #define ID_SHOWHUD (taskid - TASK_SHOWHUD)
  18. #define TASK_REMOVE_PROTECTION 400
  19. #define ID_REMOVE_PROTECTION (taskid - TASK_REMOVE_PROTECTION)
  20.  
  21. /*================================================================================
  22. [Plugin Customization]
  23. =================================================================================*/
  24.  
  25. // Sounds when round start and finish
  26. new const sound_start[][] = { "misc/hgg_start.wav" }
  27. new const sound_finish[][] = { "misc/hgg_end.wav" }
  28.  
  29. #define MAX_LVL 12
  30.  
  31. new const required_frags[MAX_LVL] = { 0, 2, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50 }
  32. new const weapon_name[MAX_LVL][] = { "Füst Gránát", "Vakító Gránát", "USP", "Deagle", "Elite", "Mac10", "MP5", "M3 Super 90", "Galil", "M4A1", "Scout", "AWP" }
  33. new const weapon_ent[MAX_LVL][] = { "weapon_smokegrenade", "weapon_flashbang", "weapon_usp", "weapon_deagle", "weapon_elite", "weapon_mac10", "weapon_mp5navy", "weapon_m3", "weapon_galil", "weapon_m4a1", "weapon_scout", "weapon_awp" }
  34.  
  35. /*================================================================================
  36. [Constants, No Customization!]
  37. =================================================================================*/
  38.  
  39. // Max BP ammo for weapons
  40. new const MAXBPAMMO[] = { -1, 52, -1, 90, 1, 32, 1, 100, 90, 1, 120, 100, 100, 90, 90, 90, 100, 120,
  41. 30, 120, 200, 32, 90, 120, 90, 2, 35, 90, 90, -1, 100 }
  42.  
  43. // Ammo Type Names for weapons
  44. new const AMMOTYPE[][] = { "", "357sig", "", "762nato", "", "buckshot", "", "45acp", "556nato", "", "9mm", "57mm", "45acp",
  45. "556nato", "556nato", "556nato", "45acp", "9mm", "338magnum", "9mm", "556natobox", "buckshot",
  46. "556nato", "9mm", "762nato", "", "50ae", "556nato", "762nato", "", "57mm" }
  47.  
  48. // Entities to remove
  49. new const g_EntitiesObjetives[][] = { "info_hostage_rescue", "func_hostage_rescue", "hostage_entity", "monster_scientist",
  50. "info_bomb_target", "func_bomb_target", "info_vip_start", "func_vip_safetyzone", "func_escapezone", "func_vehicle" }
  51.  
  52. /*================================================================================
  53. [CVAR pointers]
  54. =================================================================================*/
  55.  
  56. new cvar_roundtime, cvar_ammo, cvar_spawndelay, cvar_spawnprotection
  57.  
  58. /*================================================================================
  59. [Global variables]
  60. =================================================================================*/
  61.  
  62. new g_fwSpawn
  63. new g_minutes, g_seconds
  64. new g_MsgSync, g_MsgSync2, g_MsgSync3
  65. new g_weaponlevel[33], g_respawn_timeleft[33]
  66.  
  67. /*================================================================================
  68. [Precache and Init]
  69. =================================================================================*/
  70.  
  71. public plugin_precache()
  72. {
  73. // Sounds
  74. new i
  75. for (i = 0; i < sizeof sound_start; i++)
  76. engfunc(EngFunc_PrecacheSound, sound_start[i])
  77. for (i = 0; i < sizeof sound_finish; i++)
  78. engfunc(EngFunc_PrecacheSound, sound_finish[i])
  79.  
  80. // Prevent some entities from spawning
  81. g_fwSpawn = register_forward(FM_Spawn, "fw_Spawn", 0)
  82. }
  83.  
  84. public plugin_init()
  85. {
  86. // Register plugin call
  87. register_plugin(PLUGIN, VERSION, AUTHOR)
  88.  
  89. // Events
  90. register_event("HLTV", "event_round_start", "a", "1=0", "2=0")
  91. register_logevent("logevent_round_start",2, "1=Round_Start")
  92. register_logevent("logevent_round_end", 2, "1=Round_End")
  93. register_event("CurWeapon" , "Event_CurWeapon" , "be" , "1=1")
  94.  
  95. // Forwards
  96. RegisterHam(Ham_Spawn, "player", "fw_PlayerSpawn_Post", 1)
  97. RegisterHam(Ham_Killed, "player", "fw_PlayerKilled")
  98. register_forward(FM_GetGameDescription, "fw_GetGameDescription")
  99. register_forward(FM_SetModel, "fw_SetModel")
  100. unregister_forward(FM_Spawn, g_fwSpawn)
  101.  
  102. // Message hooks
  103. set_msg_block(get_user_msgid("ClCorpse"), BLOCK_SET)
  104. register_message(get_user_msgid("StatusIcon"), "message_statusicon")
  105. register_message(get_user_msgid("Scenario"), "message_scenario")
  106. register_message(get_user_msgid("HostagePos"), "message_hostagepos")
  107. register_message(get_user_msgid("TextMsg"), "message_textmsg")
  108. register_message(get_user_msgid("SendAudio"), "message_sendaudio")
  109.  
  110. // CVARS
  111. cvar_roundtime = register_cvar("hgg_roundtime", "400")
  112. cvar_ammo = register_cvar("hgg_wpn_ammo", "0")
  113. cvar_spawndelay = register_cvar("hgg_spawndelay", "5")
  114. cvar_spawnprotection = register_cvar("hgg_spawnprotection", "5")
  115.  
  116. // Create the HUD Sync Objects
  117. g_MsgSync = CreateHudSyncObj()
  118. g_MsgSync2 = CreateHudSyncObj()
  119. g_MsgSync3 = CreateHudSyncObj()
  120. }
  121.  
  122. public plugin_cfg()
  123. {
  124. set_task(0.5, "event_round_start")
  125. set_task(0.5, "logevent_round_start")
  126. }
  127.  
  128. /*================================================================================
  129. [Main Events]
  130. =================================================================================*/
  131.  
  132. // Event Round Start
  133. public event_round_start()
  134. {
  135. // Start time task
  136. g_minutes = 0
  137. g_seconds = get_pcvar_num(cvar_roundtime)
  138. while (g_seconds > 60)
  139. {
  140. g_seconds -= 60
  141. g_minutes++
  142. }
  143. set_task(1.0, "CheckTime", TASK_TIME, _, _, "b")
  144. }
  145.  
  146. // Check time task
  147. public CheckTime()
  148. {
  149. g_seconds--
  150.  
  151. if (g_seconds < 1 && g_minutes > 0)
  152. {
  153. g_minutes--
  154. g_seconds += 59
  155. }
  156.  
  157. // Time over
  158. if (g_minutes == 0 && g_seconds < 1) server_cmd("sv_restart 3")
  159. }
  160.  
  161. // Log Event Round Start
  162. public logevent_round_start()
  163. {
  164. // Play start round sound
  165. PlaySound(sound_start[random_num(0, charsmax(sound_start))])
  166. }
  167.  
  168. // Log Event Round End
  169. public logevent_round_end()
  170. {
  171. // Prevent this from getting called twice when restarting (bugfix)
  172. static Float:lastendtime, Float:current_time
  173. current_time = get_gametime()
  174. if (current_time - lastendtime < 0.5) return;
  175. lastendtime = current_time
  176.  
  177. // Get players
  178. static iPlayers[32], iNum, iBestPlayer, i, id
  179. get_players(iPlayers, iNum)
  180.  
  181. for (i = 0; i < iNum; i++)
  182. {
  183. id = iPlayers[i]
  184.  
  185. // Reset vars
  186. g_weaponlevel[id] = 1
  187. g_respawn_timeleft[id] = 0
  188.  
  189. // Select best player
  190. if (!iBestPlayer)
  191. iBestPlayer = iPlayers[0]
  192.  
  193. if (get_user_frags(id) > get_user_frags(iBestPlayer))
  194. iBestPlayer = id
  195. }
  196.  
  197. // Get best player's name and frags
  198. static szName[32], frags
  199. get_user_name(iBestPlayer, szName, charsmax(szName))
  200. frags = get_user_frags(iBestPlayer)
  201.  
  202. // Win print message
  203. client_print(0, print_chat, "[HGG] %s nyert ebben a körben felszerelést.", szName, frags)
  204.  
  205. // Win HUD
  206. set_hudmessage(200, 0, 0, -1.0, 0.17, 1, 6.0, 1.0, 0.1, 6.0)
  207. ShowSyncHudMsg(0, g_MsgSync, "%s nyert ebben a körben %d felszerelést!", szName, frags)
  208.  
  209. // Remove time task
  210. remove_task(TASK_TIME)
  211.  
  212. // Play finish round sound
  213. PlaySound(sound_finish[random_num(0, charsmax(sound_finish))])
  214. }
  215.  
  216. // Plays a sound on clients
  217. PlaySound(const sound[])
  218. {
  219. client_cmd(0, "spk ^"%s^"", sound)
  220. }
  221.  
  222. // Current Weapon Event
  223. public Event_CurWeapon(id)
  224. {
  225. // Not alive
  226. if (!is_user_alive(id)) return;
  227.  
  228. new get_weapon = read_data(2)
  229.  
  230. // Already has grenade?
  231. if (get_weapon == CSW_HEGRENADE) return;
  232.  
  233. set_task(0.5, "givehe", id)
  234. }
  235.  
  236. // Simple, Give a HE Grenade
  237. public givehe(id)
  238. {
  239. // Not alive
  240. if (!is_user_alive(id)) return;
  241.  
  242. give_item(id, "weapon_hegrenade")
  243. }
  244.  
  245. /*================================================================================
  246. [Main Forwards]
  247. =================================================================================*/
  248.  
  249. // Client joins the game
  250. public client_putinserver(id)
  251. {
  252. // Initialize player vars
  253. g_weaponlevel[id] = 1
  254. g_respawn_timeleft[id] = 0
  255.  
  256. // Set player HUD task
  257. set_task(1.0, "ShowHUD", id+TASK_SHOWHUD, _, _, "b")
  258. }
  259.  
  260. // Client disconnect
  261. public client_disconnect(id)
  262. {
  263. // Remove tasks
  264. remove_task(id+TASK_SHOWHUD)
  265. remove_task(id+TASK_REMOVE_PROTECTION)
  266. }
  267.  
  268. // Entity Spawn Forward
  269. public fw_Spawn(entity)
  270. {
  271. // Invalid entity
  272. if (!pev_valid(entity)) return FMRES_IGNORED;
  273.  
  274. // Get classname
  275. new classname[32]
  276. pev(entity, pev_classname, classname, charsmax(classname))
  277.  
  278. // Check whether it needs to be removed
  279. for (new i = 0; i < sizeof g_EntitiesObjetives; i++)
  280. {
  281. if (equal(classname, g_EntitiesObjetives[i]))
  282. {
  283. engfunc(EngFunc_RemoveEntity, entity)
  284. return FMRES_SUPERCEDE;
  285. }
  286. }
  287.  
  288. return FMRES_IGNORED;
  289. }
  290.  
  291. // Ham Player Spawn Post Forward
  292. public fw_PlayerSpawn_Post(id)
  293. {
  294. // Not alive
  295. if (!is_user_alive(id)) return;
  296.  
  297. // Remove weapons
  298. set_task(0.1, "remove_weapons", id)
  299.  
  300. // Give extra weapon
  301. set_task(1.0, "give_extra_weapon", id)
  302. }
  303.  
  304. // Ham Player Killed Forward
  305. public fw_PlayerKilled(victim, killer)
  306. {
  307. // Respawn player died
  308. begin_respawn(victim)
  309.  
  310. // Remove tasks
  311. remove_task(victim+TASK_REMOVE_PROTECTION)
  312.  
  313. // Determine whether the player killed himself
  314. static selfkill
  315. selfkill = (victim == killer || !is_user_connected(killer)) ? true : false
  316.  
  317. // Killed by a non-player entity or self killed
  318. if (selfkill) return;
  319.  
  320. // Check level killer
  321. update_level(killer)
  322. }
  323.  
  324. // Forward Get Game Description
  325. public fw_GetGameDescription()
  326. {
  327. // Return the mod name
  328. forward_return(FMV_STRING, "He-Grenade Game")
  329.  
  330. return FMRES_SUPERCEDE;
  331. }
  332.  
  333. // Forward Set Model
  334. public fw_SetModel(entity, model[])
  335. {
  336. // Get owner entity
  337. new owner = pev(entity,pev_owner)
  338.  
  339. // No owner?
  340. if (!is_user_connected(owner)) return FMRES_IGNORED;
  341.  
  342. // If owner is dead, remove it
  343. if (get_user_health(owner) <= 0)
  344. {
  345. dllfunc(DLLFunc_Think,entity)
  346. return FMRES_SUPERCEDE;
  347. }
  348.  
  349. // Get entity's classname
  350. static class[10]
  351. pev(entity, pev_classname, class, charsmax(class))
  352.  
  353. // Check if it's a weapon box
  354. if (equal(class, "weaponbox"))
  355. {
  356. // They get automatically removed when thinking
  357. set_pev(entity, pev_nextthink, get_gametime())
  358. }
  359.  
  360. return FMRES_IGNORED;
  361. }
  362.  
  363. // Hud Task
  364. public ShowHUD(taskid)
  365. {
  366. static id
  367. id = ID_SHOWHUD
  368.  
  369. // Player died?
  370. if (!is_user_alive(id))
  371. {
  372. // Get spectating target
  373. id = pev(id, pev_iuser2)
  374.  
  375. // Target not alive
  376. if (!is_user_alive(id)) return;
  377. }
  378.  
  379. // Get minutes left
  380. static minutes[4]
  381. num_to_str(g_minutes, minutes, charsmax(minutes))
  382.  
  383. // Spectating someone else?
  384. if (id != ID_SHOWHUD)
  385. {
  386. set_hudmessage(200, 200, 200, 0.03, 0.23, 0, 6.0, 1.1, 0.0, 0.0, -1)
  387. ShowSyncHudMsg(id, g_MsgSync2, "Szint: %d^nFelszerelés: %d^nExtra Fegyver: %s^nHátralévõ idõ: %s%s%d seconds", g_weaponlevel[id], get_user_frags(id), weapon_name[g_weaponlevel[id]-1], g_minutes > 0 ? minutes : "", g_minutes > 0 ? " minutes " : "", g_seconds)
  388. }
  389. else
  390. {
  391. set_hudmessage(200, 200, 200, 0.03, 0.23, 0, 6.0, 1.1, 0.0, 0.0, -1)
  392. ShowSyncHudMsg(ID_SHOWHUD, g_MsgSync2, "Szint: %d^nFelszerelés: %d^nExtra Fegyver: %s^nHátralévõ idõ: %s%s%d seconds", g_weaponlevel[ID_SHOWHUD], get_user_frags(ID_SHOWHUD), weapon_name[g_weaponlevel[ID_SHOWHUD]-1], g_minutes > 0 ? minutes : "", g_minutes > 0 ? " minutes " : "", g_seconds)
  393. }
  394. }
  395.  
  396. // Update level
  397. update_level(id)
  398. {
  399. static level; level = g_weaponlevel[id]
  400.  
  401. // Gheck required frags to level up
  402. while (get_user_frags(id) >= required_frags[g_weaponlevel[id]-1] && g_weaponlevel[id] < MAX_LVL)
  403. {
  404. // Level up
  405. g_weaponlevel[id]++
  406.  
  407. // Update weapon
  408. set_task(0.1, "remove_weapons", id)
  409. set_task(0.5, "give_extra_weapon", id)
  410. }
  411.  
  412. // Only show one message if level up more than one
  413. if (g_weaponlevel[id] > level)
  414. client_print(id, print_chat, "[HGG] Gratulálunk! Szintet léptél: %d", g_weaponlevel[id])
  415.  
  416. // Max. level
  417. if (g_weaponlevel[id] >= MAX_LVL) server_cmd("sv_restart 3")
  418. }
  419.  
  420. // Remove weapons
  421. public remove_weapons(id)
  422. {
  423. // Not alive
  424. if (!is_user_alive(id)) return;
  425.  
  426. strip_user_weapons(id)
  427. give_item(id, "weapon_knife")
  428. give_item(id, "weapon_hegrenade")
  429. }
  430.  
  431. // Give extra weapon
  432. public give_extra_weapon(id)
  433. {
  434. // Not alive
  435. if (!is_user_alive(id)) return;
  436.  
  437. // Get the weapon level and id
  438. new weapon = g_weaponlevel[id]-1
  439. new weapon_id = get_weaponid(weapon_ent[weapon])
  440.  
  441. // Give weapon with ammo
  442. give_item(id, weapon_ent[weapon])
  443. if (get_pcvar_num(cvar_ammo)) ExecuteHamB(Ham_GiveAmmo, id, MAXBPAMMO[weapon_id], AMMOTYPE[weapon_id], MAXBPAMMO[weapon_id])
  444. }
  445.  
  446. // Before respawn
  447. begin_respawn(id)
  448. {
  449. // Not connected or already alive
  450. if (!is_user_connected(id) || is_user_alive(id)) return;
  451.  
  452. // Get spawn delay cvar
  453. new Float:delay = get_pcvar_float(cvar_spawndelay)
  454. if (delay < 0.1) delay = 0.1
  455.  
  456. g_respawn_timeleft[id] = floatround(delay)
  457.  
  458. // Countdown message
  459. respawn_countdown(id)
  460.  
  461. // Respawn player
  462. set_task(delay, "respawn", id)
  463. }
  464.  
  465. // Show respawn countdown to a player
  466. public respawn_countdown(id)
  467. {
  468. // Not connected or already alive
  469. if (!is_user_connected(id) || is_user_alive(id))
  470. {
  471. g_respawn_timeleft[id] = 0
  472. return;
  473. }
  474.  
  475. set_hudmessage(255, 255, 255, -1.0, 0.75, 0, 6.0, 1.0, 0.1, 0.5)
  476. ShowSyncHudMsg(id, g_MsgSync3, "Újraéledés %d másodperc %s", g_respawn_timeleft[id], g_respawn_timeleft[id] > 1 ? "s" : "")
  477.  
  478. if (--g_respawn_timeleft[id] >= 1) set_task(1.0, "respawn_countdown", id)
  479. }
  480.  
  481. // Make respawn
  482. public respawn(id)
  483. {
  484. // Not connected or already alive
  485. if (!is_user_connected(id) || is_user_alive(id)) return;
  486.  
  487. // Respawn player
  488. ExecuteHamB(Ham_CS_RoundRespawn, id)
  489.  
  490. // Get spawn protection cvar
  491. new Float:time = get_pcvar_float(cvar_spawnprotection)
  492.  
  493. // Spawn protection
  494. if (time > 0.0)
  495. {
  496. set_user_godmode(id, 1)
  497. set_rendering(id, kRenderFxGlowShell, 200, 200, 100, kRenderNormal, 8) // goldenish
  498. set_task(time, "remove_spawn_protection", id+TASK_REMOVE_PROTECTION)
  499. }
  500. }
  501.  
  502. // Spawn protection effects
  503. public remove_spawn_protection(taskid)
  504. {
  505. static id
  506. id = ID_REMOVE_PROTECTION
  507.  
  508. // Not connected
  509. if (!is_user_connected(id)) return;
  510.  
  511. // Stop protection
  512. set_user_godmode(id, 0)
  513. set_rendering(id)
  514. }
  515.  
  516. /*================================================================================
  517. [Message hooks]
  518. =================================================================================*/
  519.  
  520. // Block some icons
  521. public message_statusicon(msgid, msgdest, id)
  522. {
  523. static szIcon[8]
  524. get_msg_arg_string(2, szIcon, charsmax(szIcon))
  525.  
  526. if (equal(szIcon, "buyzone") && get_msg_arg_int(1))
  527. {
  528. set_pdata_int(id, 235, get_pdata_int(id, 235) & ~(1<<0))
  529. return PLUGIN_HANDLED;
  530. }
  531.  
  532. return PLUGIN_CONTINUE;
  533. }
  534.  
  535. // Block hostage HUD display
  536. public message_scenario()
  537. {
  538. if (get_msg_args() > 1)
  539. {
  540. static sprite[8]
  541. get_msg_arg_string(2, sprite, charsmax(sprite))
  542.  
  543. if (equal(sprite, "hostage"))
  544. return PLUGIN_HANDLED;
  545. }
  546.  
  547. return PLUGIN_CONTINUE;
  548. }
  549.  
  550. // Block hostages from appearing on radar
  551. public message_hostagepos()
  552. {
  553. return PLUGIN_HANDLED;
  554. }
  555.  
  556. // Block some text messages
  557. public message_textmsg()
  558. {
  559. static textmsg[22]
  560. get_msg_arg_string(2, textmsg, charsmax(textmsg))
  561.  
  562. // Game restarting or commencing
  563. if (equal(textmsg, "#Game_will_restart_in") || equal(textmsg, "#Game_Commencing"))
  564. {
  565. logevent_round_end()
  566. }
  567. // Block round end related messages
  568. else if (equal(textmsg, "#Hostages_Not_Rescued") || equal(textmsg, "#Round_Draw") || equal(textmsg, "#Terrorists_Win") || equal(textmsg, "#CTs_Win"))
  569. {
  570. return PLUGIN_HANDLED;
  571. }
  572.  
  573. if (get_msg_args() != 5) return PLUGIN_CONTINUE;
  574. get_msg_arg_string(5, textmsg, charsmax(textmsg))
  575.  
  576. // Block grenade messages
  577. if (equal(textmsg, "#Fire_in_the_hole") || equal(textmsg, "%s (RÁDIÓ): MEGY A GRÁNÁT!"))
  578. {
  579. return PLUGIN_HANDLED;
  580. }
  581.  
  582. return PLUGIN_CONTINUE;
  583. }
  584.  
  585. // Block CS round win and grenades audio messages
  586. public message_sendaudio()
  587. {
  588. static audio[17], string[24]
  589. get_msg_arg_string(2, audio, charsmax(audio))
  590. get_msg_arg_string(2, string, charsmax(string))
  591.  
  592. if (equal(audio[7], "terwin") || equal(audio[7], "ctwin") || equal(audio[7], "rounddraw") || equal(string, "%!MRAD_FIREINHOLE"))
  593. return PLUGIN_HANDLED;
  594.  
  595. return PLUGIN_CONTINUE;
  596. }
  597. /* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
  598. *{\\ rtf1\\ ansi\\ deff0{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ lang1045\\ f0\\ fs16 \n\\ par }
  599. */
  600.