Advertisement
Guest User

Untitled

a guest
Apr 23rd, 2017
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 42.45 KB | None | 0 0
  1. /*==============================================================================================================
  2. Z O M B I E - P L A G U E
  3. ===============================================================================================================*/
  4.  
  5. /*====================
  6. INCLUDES
  7. ====================*/
  8.  
  9. #include <amxmodx>
  10. #include <amxmisc>
  11. #include <fun>
  12. #include <cstrike>
  13. #include <hamsandwich>
  14. #include <fakemeta>
  15. #include <engine>
  16. #include <dhudmessage>
  17. #include <oldmenu>
  18.  
  19. /*=================
  20. ENUMS
  21. =================*/
  22.  
  23. enum _:EXTRA_VARS
  24. {
  25. PLUGIN_NAME, PLUGIN_VERSION, PLUGIN_AUTHOR,
  26.  
  27. BIG_START_GAME_ROUND = 0, BIG_END_GAME_ROUND, BIG_REGISTER_HAMS_BOTS,
  28.  
  29. BIP_IS_CONNECTED = 0, BIP_IS_ALIVE, BIP_IS_ZOMBIE, BIP_RESPAWN_AS_ZOMBIE, MAX_PLAYER_BIT_VARS = 32,
  30.  
  31. CLASS_HUMAN = 0, CLASS_FIRST_ZOMBIE, CLASS_ZOMBIE,
  32.  
  33. TEAM_UNASSIGNED = 0, TEAM_TERRORIST, TEAM_COUNTER_TERRORIST, TEAM_SPECTATOR,
  34.  
  35. MODE_NONE = 0, MODE_INFECTION,
  36.  
  37. MESSAGE_HIDEWEAPON = 0, MESSAGE_CROSSHAIR, MESSAGE_TEAMINFO, MESSAGE_DEATHMSG, MESSAGE_SCOREATTRIB,
  38. MESSAGE_SCREENFADE, MESSAGE_SAYTEXT, MAX_CACHE_MESSAGES,
  39.  
  40. CVAR_DELAY = 0,
  41.  
  42. CVAR_RESPAWN,
  43. CVAR_RESPAWN_DELAY,
  44. CVAR_RESPAWN_AS,
  45. CVAR_RESPAWN_ZOMBIES,
  46. CVAR_RESPAWN_HUMANS,
  47. CVAR_INFECTION_RESPAWN,
  48.  
  49. MAX_CUSTOM_CVARS,
  50.  
  51. HIDE_HUDS = (1<<5)|(1<<3),
  52.  
  53. OFFSET_PRIVATE_DATA = 2, OFFSET_CBASEPLAYERITEM = 4, OFFSET_CBASEPLAYER = 5, OFFSET_ITEM_PLAYER = 41,
  54. OFFSET_CS_TEAM = 114, OFFSET_CLIENT_MAP_ZONE = 235, OFFSET_CLIENT_DEATHS = 444,
  55.  
  56. HUD_CHANNEL_ONE = 1, MAX_HUD_CHANNELS,
  57.  
  58. EFFECT_ZOMBIE = 0, EFFECT_FIRST_ZOMBIE, EFFECT_RESPAWN_ZOMBIE,
  59.  
  60. ENTITY_COUNT_DOWN = 0, ENTITY_CACHE_CVARS, ENTITY_HUD_STATS, MAX_CUSTOM_ENTITYS,
  61.  
  62. COUNT_ALIVE_PLAYERS, COUNT_PLAYING_PLAYERS = 0, COUNT_HUMANS,
  63.  
  64. HUMAN_THIS_LIGHT = 0, ZOMBIE_THIS_LIGHT, NVG_THIS_LIGHT,
  65.  
  66. FFADE_IN = 0x0000, FFADE_STAYOUT = 0x0004,
  67.  
  68. MAIN_MENU = 0, ARMAMENT_MAIN_MENU, ARMAMENT_INDUSTRY_MENU,
  69.  
  70. CHAT_COLOR_GREY = 40, CHAT_COLOR_RED, CHAT_COLOR_BLUE
  71. }
  72.  
  73. enum _:TASK_LIST (+= 10)
  74. {
  75. TASK_CHOOSE_ROUND_MOD = 1000
  76. }
  77.  
  78. enum _:CVARS_STRUCT
  79. {
  80. SZ_CVAR_NAME[27],
  81. SZ_CVAR_VALUE[5]
  82. }
  83.  
  84. enum GLOBAL_VARS
  85. {
  86. GI_MAX_PLAYERS,
  87. GI_FORWARD_SPAWN,
  88. GI_COUNT_DOWN,
  89. GI_CURRENT_ROUND_MODE,
  90.  
  91. GA_CACHE_MESSAGES[MAX_CACHE_MESSAGES],
  92. GA_CUSTOM_CVARS[MAX_CUSTOM_CVARS],
  93. GA_CACHE_CVARS[MAX_CUSTOM_CVARS],
  94. GA_HUD_CHANNEL[MAX_HUD_CHANNELS]
  95. }
  96.  
  97. enum _:PLAYER_VARS
  98. {
  99. PI_CLASS,
  100. PI_CURRENT_HEALTH,
  101. PI_CURRENT_ARMOR,
  102.  
  103. PSZ_CLIENT_NAME[32]
  104. }
  105.  
  106. /*==================
  107. MACROS
  108. ==================*/
  109.  
  110. #define M_PlayWithBots
  111.  
  112. #define M_SetGlobalBit(%1,%2) %1 |= (1<<%2)
  113. #define M_ClearGlobalBit(%1,%2) %1 &= ~(1<<%2)
  114. #define M_HasGlobalBit(%1,%2) (%1 & (1<<%2))
  115.  
  116. #define M_SetPlayerBit(%1,%2) %1 |= (1<<(%2&31))
  117. #define M_ClearPlayerBit(%1,%2) %1 &= ~(1<<(%2&31))
  118. #define M_HasPlayerBit(%1,%2) (%1 & (1<<(%2&31)))
  119.  
  120. #define M_SwitchGlobalBool(%1) %1 = !%1
  121. #define M_IsBoolActive(%1) (%1 ? true : false)
  122.  
  123. #define M_CountDownThink 1.0
  124. #define M_CacheCvarsThink 0.3
  125. #define M_HudStatsThink 0.1
  126.  
  127. /*==================
  128. CONSTS
  129. ==================*/
  130.  
  131. new const C_PluginInfo[][] =
  132. {
  133. "ZOMBIE PLAGUE",
  134. "0.1b",
  135. "Chamo. & matrix123"
  136. }
  137.  
  138. new const C_CsTeamNames[][] =
  139. {
  140. "UNASSIGNED",
  141. "TERRORIST",
  142. "CT",
  143. "SPECTATOR"
  144. }
  145.  
  146. new const C_CacheMessages[MAX_CACHE_MESSAGES][] =
  147. {
  148. "HideWeapon",
  149. "Crosshair",
  150. "TeamInfo",
  151. "DeathMsg",
  152. "ScoreAttrib",
  153. "ScreenFade",
  154. "SayText"
  155. }
  156.  
  157. new const C_CustomCvars[MAX_CUSTOM_CVARS][CVARS_STRUCT] =
  158. {
  159. { "ZP_Delay", "10" },
  160.  
  161. { "ZP_Respawn", "1" },
  162. { "ZP_Respawn_Delay", "5.0" },
  163. { "ZP_Respawn_As", "1" },
  164. { "ZP_Respawn_Zombies", "1" },
  165. { "ZP_Respawn_Humans", "1" },
  166. { "ZP_Respawn_On_Infection", "1" }
  167. }
  168.  
  169. new const C_LightStyleValues[][] =
  170. {
  171. "c",
  172. "h",
  173. "z"
  174. }
  175.  
  176. new const C_FogValues[][] =
  177. {
  178. "0.0050",
  179. "105 105 105"
  180. }
  181.  
  182. new const C_CountDownClassName[] = "CountDown"
  183. new const C_CacheCvarsClassName[] = "CacheCvars"
  184. new const C_HudStatsClassName[] = "HUDStats"
  185.  
  186. /*================
  187. VARS
  188. ================*/
  189.  
  190. // Integers
  191. new I_GlobalBitVars, I_PlayerBitVars[MAX_PLAYER_BIT_VARS];
  192.  
  193. // Arrays
  194. new A_GlobalVars[GLOBAL_VARS], A_PlayerVars[33][PLAYER_VARS], A_CustomEntitys[MAX_CUSTOM_ENTITYS]
  195.  
  196. /*=============================================================
  197. PLUGIN'S FORWARDS
  198. =============================================================*/
  199.  
  200. public plugin_precache()
  201. {
  202. new I_Ent = create_entity("hostage_entity")
  203.  
  204. if (is_valid_ent(I_Ent))
  205. {
  206. entity_set_origin(I_Ent, Float:{ 8192.0, 8192.0, 8192.0 })
  207. DispatchSpawn(I_Ent)
  208. }
  209.  
  210. do
  211. I_Ent = create_entity("env_snow");
  212. while (!is_valid_ent(I_Ent))
  213.  
  214. do
  215. I_Ent = create_entity("env_fog");
  216. while (!is_valid_ent(I_Ent))
  217.  
  218. if (is_valid_ent(I_Ent))
  219. {
  220. DispatchKeyValue(I_Ent, "density", C_FogValues[0]);
  221. DispatchKeyValue(I_Ent, "rendercolor", C_FogValues[1]);
  222. }
  223.  
  224. A_GlobalVars[GI_FORWARD_SPAWN] = register_forward(FM_Spawn, "FM_Spawn_Pre")
  225. }
  226.  
  227. public plugin_init()
  228. {
  229. register_plugin(C_PluginInfo[PLUGIN_NAME], C_PluginInfo[PLUGIN_VERSION], C_PluginInfo[PLUGIN_VERSION])
  230.  
  231. new I;
  232. new const C_WeaponsEntsNames[][] =
  233. {
  234. "", "weapon_p228", "", "weapon_scout", "weapon_hegrenade", "weapon_xm1014", "weapon_c4", "weapon_mac10",
  235. "weapon_aug", "weapon_smokegrenade", "weapon_elite", "weapon_fiveseven", "weapon_ump45", "weapon_sg550",
  236. "weapon_galil", "weapon_famas", "weapon_usp", "weapon_glock18", "weapon_awp", "weapon_mp5navy", "weapon_m249",
  237. "weapon_m3", "weapon_m4a1", "weapon_tmp", "weapon_g3sg1", "weapon_flashbang", "weapon_deagle", "weapon_sg552",
  238. "weapon_ak47", "weapon_knife", "weapon_p90"
  239. }
  240.  
  241. register_event("HLTV", "EVENT_HLTV", "a", "1=0", "2=0")
  242. register_logevent("LOGEVENT_RoundEnd", 2, "1=Round_End")
  243.  
  244. RegisterHam(Ham_Spawn, "player", "HAM_PLAYER_Spawn_Post", true)
  245. RegisterHam(Ham_TraceAttack, "player", "HAM_PLAYER_TraceAttack_Pre")
  246. RegisterHam(Ham_TakeDamage, "player", "HAM_PLAYER_TakeDamage_Pre")
  247. RegisterHam(Ham_Killed, "player", "HAM_PLAYER_Killed_Post", true)
  248.  
  249. for (I = 0; I < sizeof (C_WeaponsEntsNames); I++)
  250. {
  251. if (C_WeaponsEntsNames[I][0])
  252. RegisterHam(Ham_Item_Deploy, C_WeaponsEntsNames[I], "Ham_Item_Deploy_Post", true)
  253. }
  254.  
  255. RegisterHam(Ham_Touch, "weaponbox", "HAM_WEAPON_Touch_Pre")
  256. RegisterHam(Ham_Touch, "weapon_shield", "HAM_WEAPON_Touch_Pre")
  257.  
  258. register_think(C_CountDownClassName, "THINK_CountDown")
  259. register_think(C_CacheCvarsClassName, "THINK_CacheCvars")
  260. register_think(C_HudStatsClassName, "THINK_HudStats")
  261.  
  262. register_forward(FM_ClientKill, "FM_ClientKill_Pre")
  263. unregister_forward(FM_Spawn, A_GlobalVars[GI_FORWARD_SPAWN])
  264.  
  265. register_clcmd("chooseteam", "CLCOMMAND_ChooseTeam")
  266.  
  267. for (I = 0; I < MAX_CACHE_MESSAGES; I++)
  268. A_GlobalVars[GA_CACHE_MESSAGES][I] = get_user_msgid(C_CacheMessages[I])
  269.  
  270. register_message(get_user_msgid("TextMsg"), "MESSAGE_TextMsg")
  271. register_message(get_user_msgid("Health"), "MESSAGE_Health")
  272. register_message(get_user_msgid("StatusIcon"), "MESSAGE_StatusIcon")
  273. register_message(get_user_msgid("Battery"), "MESSAGE_Battery")
  274. register_message(get_user_msgid("NVGToggle"), "MESSAGE_NVGToggle")
  275.  
  276. A_GlobalVars[GI_MAX_PLAYERS] = get_maxplayers()
  277.  
  278. for (I = 0; I < MAX_CUSTOM_CVARS; I++)
  279. A_GlobalVars[GA_CUSTOM_CVARS][I] = register_cvar(C_CustomCvars[I][SZ_CVAR_NAME], C_CustomCvars[I][SZ_CVAR_VALUE])
  280.  
  281.  
  282. do
  283. A_CustomEntitys[ENTITY_COUNT_DOWN] = create_entity("info_target")
  284. while (!IsValidEntity(A_CustomEntitys[ENTITY_COUNT_DOWN]))
  285.  
  286. entity_set_string(A_CustomEntitys[ENTITY_COUNT_DOWN], EV_SZ_classname, C_CountDownClassName)
  287. entity_set_float(A_CustomEntitys[ENTITY_COUNT_DOWN], EV_FL_nextthink, (GetCurrentTime()+M_CountDownThink))
  288.  
  289. do
  290. A_CustomEntitys[ENTITY_CACHE_CVARS] = create_entity("info_target")
  291. while (!IsValidEntity(A_CustomEntitys[ENTITY_CACHE_CVARS]))
  292.  
  293. entity_set_string(A_CustomEntitys[ENTITY_CACHE_CVARS], EV_SZ_classname, C_CacheCvarsClassName)
  294. entity_set_float(A_CustomEntitys[ENTITY_CACHE_CVARS], EV_FL_nextthink, (GetCurrentTime()+M_CacheCvarsThink))
  295.  
  296. do
  297. A_CustomEntitys[ENTITY_HUD_STATS] = create_entity("info_target")
  298. while (!IsValidEntity(A_CustomEntitys[ENTITY_HUD_STATS]))
  299.  
  300. entity_set_string(A_CustomEntitys[ENTITY_HUD_STATS], EV_SZ_classname, C_HudStatsClassName)
  301. entity_set_float(A_CustomEntitys[ENTITY_HUD_STATS], EV_FL_nextthink, (GetCurrentTime()+M_HudStatsThink))
  302.  
  303. for (I = 0; I < MAX_HUD_CHANNELS; I++)
  304. A_GlobalVars[GA_HUD_CHANNEL][I] = CreateHudSyncObj()
  305.  
  306. oldmenu_register()
  307.  
  308.  
  309.  
  310.  
  311.  
  312.  
  313. //register_event("CurWeapon", "TEST", "b", "1=1")
  314. }
  315.  
  316. /*
  317. public TEST(id)
  318. {
  319. static lol;
  320.  
  321. if (++lol >= 100)
  322. return;
  323.  
  324. log_amx("TEST call after: %.10f game time", get_gametime())
  325. }
  326. */
  327.  
  328.  
  329.  
  330.  
  331. public plugin_cfg()
  332. {
  333. set_task(0.3, "EVENT_HLTV")
  334. }
  335.  
  336. /*=============================================================
  337. CLIENT'S FORWARDS
  338. =============================================================*/
  339.  
  340. public client_putinserver(I_Client)
  341. {
  342. M_SetPlayerBit(I_PlayerBitVars[BIP_IS_CONNECTED], I_Client)
  343. get_user_name(I_Client, A_PlayerVars[I_Client][PSZ_CLIENT_NAME], charsmax(A_PlayerVars[][PSZ_CLIENT_NAME]))
  344.  
  345. #if defined PlayWithBots
  346. {
  347. if (is_user_bot(I_Client))
  348. set_task(0.1, "RegisterHamsForBots", I_Client)
  349. }
  350. #endif
  351.  
  352. ResetPlayerVars(I_Client)
  353.  
  354. set_task(0.1, "SendTeamInfoChatColor", I_Client)
  355. }
  356.  
  357. public client_disconnect(I_Client)
  358. {
  359. M_ClearPlayerBit(I_PlayerBitVars[BIP_IS_CONNECTED], I_Client)
  360. ResetPlayerVars(I_Client)
  361. }
  362.  
  363. /*===================================================================
  364. HOOKED EVENTS & LOG-EVENTS CALLBACKS
  365. ===================================================================*/
  366.  
  367. // Events Callbacks
  368. public EVENT_HLTV()
  369. {
  370. M_ClearGlobalBit(I_GlobalBitVars, BIG_END_GAME_ROUND)
  371. M_ClearGlobalBit(I_GlobalBitVars, BIG_START_GAME_ROUND)
  372.  
  373. if (!A_GlobalVars[GI_COUNT_DOWN])
  374. entity_set_float(A_CustomEntitys[ENTITY_COUNT_DOWN], EV_FL_nextthink, (GetCurrentTime()+M_CountDownThink))
  375.  
  376. A_GlobalVars[GI_COUNT_DOWN] = A_GlobalVars[GA_CACHE_CVARS][CVAR_DELAY]
  377.  
  378. remove_task(TASK_CHOOSE_ROUND_MOD)
  379. set_task(float(A_GlobalVars[GI_COUNT_DOWN]), "ChooseRoundMod", TASK_CHOOSE_ROUND_MOD)
  380. }
  381.  
  382. // Log-Events Callbacks
  383. public LOGEVENT_RoundEnd()
  384. {
  385. M_SetGlobalBit(I_GlobalBitVars, BIG_END_GAME_ROUND)
  386.  
  387. set_task(0.2, "BalanceTeams")
  388. }
  389.  
  390. /*============================================================================
  391. HAMSANDWICH'S FORWARDS CALLBACKS
  392. ============================================================================*/
  393.  
  394. public HAM_PLAYER_Spawn_Post(const I_Player)
  395. {
  396. if (!is_user_alive(I_Player))
  397. return;
  398.  
  399. M_SetPlayerBit(I_PlayerBitVars[BIP_IS_ALIVE], I_Player)
  400.  
  401.  
  402. if (M_HasPlayerBit(I_PlayerBitVars[BIP_RESPAWN_AS_ZOMBIE], I_Player))
  403. {
  404. ZombieMe(I_Player, CLASS_ZOMBIE, _, true)
  405. return;
  406. }
  407.  
  408. strip_user_weapons(I_Player)
  409. give_item(I_Player, "weapon_knife")
  410.  
  411.  
  412. /*========== TESTS ==========*/
  413. give_item(I_Player, "weapon_m4a1")
  414. cs_set_user_bpammo(I_Player, CSW_M4A1, 500)
  415. cs_set_user_armor(I_Player, 150, CS_ARMOR_VESTHELM)
  416. /*========== TESTS ==========*/
  417.  
  418.  
  419.  
  420.  
  421.  
  422. set_task(0.01, "HideHUDs", I_Player)
  423.  
  424. M_ClearPlayerBit(I_PlayerBitVars[BIP_IS_ZOMBIE], I_Player)
  425. UpdatePlayerLight(I_Player, C_LightStyleValues[HUMAN_THIS_LIGHT])
  426. }
  427.  
  428. public HAM_PLAYER_TraceAttack_Pre(const I_Player, const I_Attacker, const Float:F_Damage, Float:F_Direction[3], const I_TraceHandle, const I_DamageBits)
  429. {
  430. if (!M_HasGlobalBit(I_GlobalBitVars, BIG_START_GAME_ROUND) || M_HasGlobalBit(I_GlobalBitVars, BIG_END_GAME_ROUND))
  431. return HAM_SUPERCEDE;
  432.  
  433. if (M_HasPlayerBit(I_PlayerBitVars[BIP_IS_ZOMBIE], I_Player) && M_HasPlayerBit(I_PlayerBitVars[BIP_IS_ZOMBIE], I_Attacker))
  434. return HAM_SUPERCEDE;
  435.  
  436. return HAM_IGNORED;
  437. }
  438.  
  439. public HAM_PLAYER_TakeDamage_Pre(const I_Player, const I_Inflictor, const I_Attacker, Float:F_Damage, const I_DamageBits)
  440. {
  441. if (!M_HasGlobalBit(I_GlobalBitVars, BIG_START_GAME_ROUND) || M_HasGlobalBit(I_GlobalBitVars, BIG_END_GAME_ROUND))
  442. return HAM_SUPERCEDE;
  443.  
  444. if (M_HasPlayerBit(I_PlayerBitVars[BIP_IS_ZOMBIE], I_Player) && M_HasPlayerBit(I_PlayerBitVars[BIP_IS_ZOMBIE], I_Attacker))
  445. return HAM_SUPERCEDE;
  446.  
  447. if (!M_HasPlayerBit(I_PlayerBitVars[BIP_IS_ZOMBIE], I_Attacker))
  448. {
  449. return HAM_IGNORED;
  450. }
  451.  
  452. if (GetCount(COUNT_HUMANS) < 2)
  453. return HAM_IGNORED;
  454.  
  455. static Float:F_Armor;
  456. F_Armor = entity_get_float(I_Player, EV_FL_armorvalue)
  457.  
  458. if (F_Armor > 0.0)
  459. {
  460. if ((F_Armor-F_Damage) > 0.1)
  461. entity_set_float(I_Player, EV_FL_armorvalue, (F_Armor-F_Damage))
  462. else
  463. cs_set_user_armor(I_Player, 0, CS_ARMOR_NONE)
  464. return HAM_SUPERCEDE;
  465. }
  466.  
  467. ZombieMe(I_Player, CLASS_ZOMBIE, I_Attacker)
  468. return HAM_SUPERCEDE;
  469. }
  470.  
  471. public Ham_Item_Deploy_Post(const I_Item)
  472. {
  473. if (!IsValidEntity(I_Item))
  474. return;
  475.  
  476. static I_ItemOwner, I_ItemWeaponID;
  477. I_ItemOwner = get_pdata_cbase(I_Item, OFFSET_ITEM_PLAYER, OFFSET_CBASEPLAYERITEM)
  478. I_ItemWeaponID = cs_get_weapon_id(I_Item)
  479.  
  480. ReplaceWeaponModels(I_ItemOwner, I_ItemWeaponID)
  481. }
  482.  
  483. public HAM_PLAYER_Killed_Post(const I_Player, const I_Attacker, const bool:BO_ShouldGib)
  484. {
  485. M_ClearPlayerBit(I_PlayerBitVars[BIP_IS_ALIVE], I_Player)
  486.  
  487. if (!IsAvailableRespawn(I_Player))
  488. return;
  489.  
  490. set_task(Float:A_GlobalVars[GA_CACHE_CVARS][CVAR_RESPAWN_DELAY], "RespawnPlayer", I_Player)
  491. }
  492.  
  493. public HAM_WEAPON_Touch_Pre()
  494. return HAM_SUPERCEDE;
  495.  
  496. /*========================================================================
  497. ENGINE'S FORWARDS CALLBACKS
  498. ========================================================================*/
  499.  
  500. public THINK_CountDown(const I_Entity)
  501. {
  502. if (!IsValidEntity(I_Entity))
  503. {
  504. log_amx("ZP ERROR: '%s' entity #%d is invalid!!!", C_CountDownClassName, I_Entity)
  505. return;
  506. }
  507.  
  508. static I_LastCall;
  509.  
  510. if (A_GlobalVars[GI_COUNT_DOWN] < 1 || (M_HasGlobalBit(I_GlobalBitVars, BIG_START_GAME_ROUND) || M_HasGlobalBit(I_GlobalBitVars, BIG_END_GAME_ROUND)))
  511. {
  512. A_GlobalVars[GI_COUNT_DOWN] = I_LastCall = 0
  513. return;
  514. }
  515.  
  516. static Float:F_XPos, Float:F_YPos, A_Color[3];
  517. GetCountDownProperties(I_LastCall, F_XPos, F_YPos, A_Color)
  518. I_LastCall++
  519.  
  520. set_dhudmessage(A_Color[0], A_Color[1], A_Color[2], F_XPos, F_YPos, 0, 0.0,(A_GlobalVars[GI_COUNT_DOWN] < 2 ? 1.5 : 0.4), 0.3, 0.3)
  521. show_dhudmessage(0, "******************************^nLA RONDA INICIARA EN:^n %d SEGUNDO%s^n******************************", A_GlobalVars[GI_COUNT_DOWN],
  522. A_GlobalVars[GI_COUNT_DOWN] < 2 ? "" : "S")
  523.  
  524. A_GlobalVars[GI_COUNT_DOWN]--
  525. entity_set_float(I_Entity, EV_FL_nextthink, (GetCurrentTime()+M_CountDownThink))
  526. }
  527.  
  528. public THINK_CacheCvars(const I_Entity)
  529. {
  530. if (!IsValidEntity(I_Entity))
  531. {
  532. log_amx("ZP ERROR: '%s' entity #%d is invalid!!!", C_CacheCvarsClassName, I_Entity)
  533. return;
  534. }
  535.  
  536. for (new I; I < MAX_CUSTOM_CVARS; I++)
  537. {
  538. if (I == CVAR_RESPAWN_DELAY)
  539. A_GlobalVars[GA_CACHE_CVARS][I] = _:get_pcvar_float(A_GlobalVars[GA_CUSTOM_CVARS][I])
  540. else
  541. A_GlobalVars[GA_CACHE_CVARS][I] = get_pcvar_num(A_GlobalVars[GA_CUSTOM_CVARS][I])
  542. }
  543.  
  544. entity_set_float(I_Entity, EV_FL_nextthink, (GetCurrentTime()+M_CacheCvarsThink))
  545. }
  546.  
  547. public THINK_HudStats(const I_Entity)
  548. {
  549. if (!IsValidEntity(I_Entity))
  550. {
  551. log_amx("ZP ERROR: '%s' entity #%d is invalid!!!", C_HudStatsClassName, I_Entity)
  552. return;
  553. }
  554.  
  555. if (!M_HasGlobalBit(I_GlobalBitVars, BIG_START_GAME_ROUND))
  556. {
  557. entity_set_float(I_Entity, EV_FL_nextthink, (GetCurrentTime()+M_HudStatsThink))
  558. return;
  559. }
  560.  
  561. static I_Players;
  562.  
  563. for (I_Players = 1; I_Players <= A_GlobalVars[GI_MAX_PLAYERS]; I_Players++)
  564. {
  565. if (!M_HasPlayerBit(I_PlayerBitVars[BIP_IS_CONNECTED], I_Players))
  566. continue;
  567.  
  568. if (M_HasPlayerBit(I_PlayerBitVars[BIP_IS_ALIVE], I_Players))
  569. {
  570. /*set_hudmessage(255, 255, 255, -1.0, 0.5, 0, 0.0, 1.5, 0.1, 0.1)
  571. ShowSyncHudMsg(I_Players, A_GlobalVars[GA_HUD_CHANNEL][HUD_CHANNEL_ONE], "Nombre: %s^nVida: %d | Chaleco: %d^nClase: %s",
  572. A_PlayerVars[I_Players][PSZ_CLIENT_NAME], A_PlayerVars[I_Players][PI_CURRENT_HEALTH], A_PlayerVars[I_Players][PI_CURRENT_ARMOR],
  573. M_HasPlayerBit(I_PlayerBitVars[BIP_IS_ZOMBIE], I_Players) ? "Zombie" : "Humano")
  574. */
  575.  
  576. set_hudmessage(255, 255, 255, 0.0, 0.8, 0, 0.0, 1.5, 0.1, 0.1, A_GlobalVars[GA_HUD_CHANNEL][HUD_CHANNEL_ONE])
  577. show_hudmessage(I_Players, "Nombre: %s^nVida: %d | Chaleco: %d^nClase: %s",
  578. A_PlayerVars[I_Players][PSZ_CLIENT_NAME], A_PlayerVars[I_Players][PI_CURRENT_HEALTH], A_PlayerVars[I_Players][PI_CURRENT_ARMOR],
  579. M_HasPlayerBit(I_PlayerBitVars[BIP_IS_ZOMBIE], I_Players) ? "Zombie" : "Humano")
  580. }
  581. }
  582.  
  583. entity_set_float(I_Entity, EV_FL_nextthink, (GetCurrentTime()+M_HudStatsThink))
  584. }
  585.  
  586. /*=========================================================================
  587. FAKEMETA'S FORWARDS CALLBACKS
  588. =========================================================================*/
  589.  
  590. public FM_Spawn_Pre(const I_Entity)
  591. {
  592. if (!IsValidEntity(I_Entity))
  593. return FMRES_IGNORED;
  594.  
  595. static SZ_ClassName[32];
  596. entity_get_string(I_Entity, EV_SZ_classname, SZ_ClassName, charsmax(SZ_ClassName))
  597.  
  598. static const ObjetiveEntitysClasNames[][] =
  599. {
  600. "func_bomb_target", "info_bomb_target", "info_vip_start", "func_vip_safetyzone", "func_escapezone",
  601. "hostage_entity", "monster_scientist", "func_hostage_rescue", "info_hostage_rescue", "item_longjump",
  602. "func_vehicle", "func_buyzone", "func_tankcontrols", "game_text", "armoury_entity"
  603. }
  604.  
  605. for (new I; I < sizeof (ObjetiveEntitysClasNames); I++)
  606. {
  607. if (equal(SZ_ClassName, ObjetiveEntitysClasNames[I]))
  608. {
  609. remove_entity(I_Entity)
  610. return FMRES_SUPERCEDE;
  611. }
  612. }
  613. return FMRES_IGNORED;
  614. }
  615.  
  616. public FM_ClientKill_Pre()
  617. return FMRES_SUPERCEDE;
  618.  
  619. /*=====================================================================
  620. HOOKED COMMANDS CALLBACKS
  621. =====================================================================*/
  622.  
  623. // Client commands (CLCOMMAND_*)
  624. public CLCOMMAND_ChooseTeam(const I_Client)
  625. {
  626. if (!is_user_alive(I_Client))
  627. return PLUGIN_CONTINUE;
  628.  
  629. ShowMenu(I_Client, MAIN_MENU)
  630. return PLUGIN_HANDLED;
  631. }
  632.  
  633. /*============================================================================
  634. HOOKED CLIENT MESSAGES CALLBACKS
  635. ============================================================================*/
  636.  
  637. public MESSAGE_TextMsg()
  638. {
  639. static SZ_Text[22];
  640. get_msg_arg_string(2, SZ_Text, charsmax(SZ_Text))
  641.  
  642. if (equal(SZ_Text, "#Game_will_restart_in"))
  643. {
  644. LOGEVENT_RoundEnd()
  645. }
  646. else if (equal(SZ_Text, "#Hostages_Not_Rescued") || equal(SZ_Text, "#Round_Draw") || equal(SZ_Text, "#Terrorists_Win") || equal(SZ_Text, "#CTs_Win"))
  647. return PLUGIN_HANDLED;
  648.  
  649. return PLUGIN_CONTINUE;
  650. }
  651.  
  652. public MESSAGE_Health(I_MsgID, I_MsgDest, I_MsgClient)
  653. {
  654. A_PlayerVars[I_MsgClient][PI_CURRENT_HEALTH] = get_user_health(I_MsgClient)
  655.  
  656. if (A_PlayerVars[I_MsgClient][PI_CURRENT_HEALTH] < 256)
  657. return;
  658.  
  659. set_msg_arg_int(1, ARG_BYTE, 255)
  660. }
  661.  
  662. public MESSAGE_StatusIcon(I_MsgID, I_MsgDest, I_MsgClient)
  663. {
  664. static SZ_Icon[8], bool:I_StatusEnable;
  665. get_msg_arg_string(2, SZ_Icon, charsmax(SZ_Icon))
  666. I_StatusEnable = bool:get_msg_arg_int(1)
  667.  
  668. if (equal(SZ_Icon, "buyzone") && I_StatusEnable)
  669. {
  670. static I_MapZone;
  671. I_MapZone = get_pdata_int(I_MsgClient, OFFSET_CLIENT_MAP_ZONE)
  672. set_pdata_int(I_MsgClient, OFFSET_CLIENT_MAP_ZONE, (I_MapZone & ~(1<<0)))
  673. return PLUGIN_HANDLED;
  674. }
  675. return PLUGIN_CONTINUE;
  676. }
  677.  
  678. public MESSAGE_Battery(I_MsgID, I_MsgDest, I_MsgClient)
  679. {
  680. A_PlayerVars[I_MsgClient][PI_CURRENT_ARMOR] = get_msg_arg_int(1)
  681. }
  682.  
  683. public MESSAGE_NVGToggle(I_MsgID, I_MsgDest, I_MsgClient)
  684. {
  685. static bool:BO_Flag;
  686. BO_Flag = bool:get_msg_arg_int(1)
  687.  
  688. switch (BO_Flag)
  689. {
  690. case true:
  691. {
  692. UpdatePlayerLight(I_MsgClient, C_LightStyleValues[NVG_THIS_LIGHT])
  693. UpdatePlayerNVG(I_MsgClient, _, _, FFADE_STAYOUT, { 255, 35, 35 }, 50)
  694. }
  695. case false:
  696. {
  697. UpdatePlayerNVG(I_MsgClient)
  698. UpdatePlayerLight(I_MsgClient, C_LightStyleValues[ZOMBIE_THIS_LIGHT])
  699. }
  700. }
  701. return PLUGIN_HANDLED;
  702. }
  703.  
  704. /*========================================================================
  705. SHOW MENUS & MENUS CALLBACKS
  706. ========================================================================*/
  707.  
  708. // Show menus
  709. ShowMenu(const I_Player, const I_MenuType)
  710. {
  711. new bool:BO_DiseableExitButton;
  712.  
  713. switch (I_MenuType)
  714. {
  715. case MAIN_MENU:
  716. {
  717. oldmenu_create("HM_Main", "\r********************^n\y%s \r%s^n********************^n\wEditado por: \y%s",
  718. C_PluginInfo[PLUGIN_NAME], C_PluginInfo[PLUGIN_VERSION], C_PluginInfo[PLUGIN_AUTHOR])
  719.  
  720. oldmenu_additem(1, 0, "\r[1]. \wARMAMENTO^n")
  721.  
  722. M_SwitchGlobalBool(BO_DiseableExitButton)
  723. }
  724. case ARMAMENT_MAIN_MENU:
  725. {
  726. oldmenu_create("HM_Armament", "\yARMAMENTO")
  727.  
  728. //oldmenu_additem(1, 0, "\r[1]. \yARSENAL DE ARMAS")
  729. oldmenu_additem(2, 0, "\r[2]. \wINDUSTRIA ARMAMENTÍSTICA^n")
  730.  
  731. M_SwitchGlobalBool(BO_DiseableExitButton)
  732. }
  733. case ARMAMENT_INDUSTRY_MENU:
  734. {
  735. oldmenu_create("HM_ArmamentIndustry", "\yINDUSTRIA ARMAMENTÍSTICA")
  736.  
  737. oldmenu_additem(1, 0, "\r[1]. \wCREAR ARMA^n")
  738.  
  739. M_SwitchGlobalBool(BO_DiseableExitButton)
  740. }
  741. }
  742.  
  743. if (M_IsBoolActive(BO_DiseableExitButton))
  744. oldmenu_additem(0, MENU_EXIT, "\r[0]. SALIR.")
  745.  
  746. oldmenu_display(I_Player, I_MenuType)
  747. }
  748.  
  749. // Menus callbacks
  750. public HM_Main(const I_Player, const I_Item, const I_Value, const I_Page)
  751. {
  752. if (I_Value == MENU_EXIT)
  753. return;
  754.  
  755. switch (I_Item)
  756. {
  757. case 1: ShowMenu(I_Player, ARMAMENT_MAIN_MENU)
  758. }
  759. }
  760.  
  761. public HM_Armament(const I_Player, const I_Item, const I_Value, const I_Page)
  762. {
  763. if (I_Value == MENU_EXIT)
  764. return;
  765.  
  766. switch (I_Item)
  767. {
  768. case 2: ShowMenu(I_Player, ARMAMENT_INDUSTRY_MENU)
  769. }
  770. }
  771.  
  772. public HM_ArmamentIndustry(const I_Player, const I_Item, const I_Value, const I_Page)
  773. {
  774. if (I_Value == MENU_EXIT)
  775. return;
  776. }
  777.  
  778. /*======================================================================
  779. PUBLIC & PRIVATE FUNCTIONS
  780. ======================================================================*/
  781.  
  782. // Public functions
  783. public ChooseRoundMod()
  784. StartRound(MODE_NONE)
  785.  
  786. public HideHUDs(const I_Player)
  787. {
  788. if (!M_HasPlayerBit(I_PlayerBitVars[BIP_IS_ALIVE], I_Player))
  789. return;
  790.  
  791. message_begin(MSG_ONE, A_GlobalVars[GA_CACHE_MESSAGES][MESSAGE_HIDEWEAPON], _, I_Player)
  792. write_byte(HIDE_HUDS)
  793. message_end()
  794.  
  795. message_begin(MSG_ONE, A_GlobalVars[GA_CACHE_MESSAGES][MESSAGE_CROSSHAIR], _, I_Player)
  796. write_byte(0)
  797. message_end()
  798. }
  799.  
  800. public SetUserTeamMSG(I_User)
  801. {
  802. message_begin(MSG_ALL, A_GlobalVars[GA_CACHE_MESSAGES][MESSAGE_TEAMINFO])
  803. write_byte(I_User)
  804. write_string(C_CsTeamNames[GetUserTeam(I_User)])
  805. message_end()
  806. }
  807.  
  808. public BalanceTeams()
  809. {
  810. static I_PlayersPlaying;
  811. I_PlayersPlaying = GetCount(COUNT_PLAYING_PLAYERS)
  812.  
  813. if (I_PlayersPlaying < 2)
  814. return;
  815.  
  816. static I_Player, A_PlayerTeam[33], I_CurrentTTs, I_MaxTTs;
  817. I_MaxTTs = (I_PlayersPlaying/2)
  818. I_CurrentTTs = 0
  819.  
  820. for (I_Player = 1; I_Player <= A_GlobalVars[GI_MAX_PLAYERS]; I_Player++)
  821. {
  822. if (!M_HasPlayerBit(I_PlayerBitVars[BIP_IS_ALIVE], I_Player))
  823. continue;
  824.  
  825. A_PlayerTeam[I_Player] = GetUserTeam(I_Player)
  826.  
  827. remove_task(I_Player)
  828. SetUserTeam(I_Player, TEAM_COUNTER_TERRORIST)
  829. A_PlayerTeam[I_Player] = TEAM_COUNTER_TERRORIST
  830. }
  831.  
  832. while (I_CurrentTTs < I_MaxTTs)
  833. {
  834. if (++I_Player > A_GlobalVars[GI_MAX_PLAYERS])
  835. I_Player = 1
  836.  
  837. if (!M_HasPlayerBit(I_PlayerBitVars[BIP_IS_ALIVE], I_Player))
  838. continue;
  839.  
  840. if (A_PlayerTeam[I_Player] != TEAM_COUNTER_TERRORIST)
  841. continue;
  842.  
  843. if (random_num(0, 1))
  844. {
  845. SetUserTeam(I_Player, TEAM_TERRORIST)
  846. A_PlayerTeam[I_Player] = TEAM_TERRORIST
  847. I_CurrentTTs++
  848. }
  849. }
  850. }
  851.  
  852. public RespawnPlayer(const I_Player)
  853. {
  854. if (!M_HasPlayerBit(I_PlayerBitVars[BIP_IS_CONNECTED], I_Player) || M_HasPlayerBit(I_PlayerBitVars[BIP_IS_ALIVE], I_Player))
  855. return;
  856.  
  857. ExecuteHamB(Ham_CS_RoundRespawn, I_Player)
  858. M_ClearPlayerBit(I_PlayerBitVars[BIP_RESPAWN_AS_ZOMBIE], I_Player)
  859.  
  860. switch (A_GlobalVars[GA_CACHE_CVARS][CVAR_RESPAWN_AS])
  861. {
  862. case 1: M_SetPlayerBit(I_PlayerBitVars[BIP_RESPAWN_AS_ZOMBIE], I_Player)
  863. case 3: if (random_num(0, 1)) M_SetPlayerBit(I_PlayerBitVars[BIP_RESPAWN_AS_ZOMBIE], I_Player)
  864. }
  865.  
  866. ExecuteHamB(Ham_CS_RoundRespawn, I_Player)
  867. }
  868.  
  869. public SendTeamInfoChatColor(const I_Player)
  870. {
  871. if (!M_HasPlayerBit(I_PlayerBitVars[BIP_IS_CONNECTED], I_Player))
  872. return;
  873.  
  874. for (new I; I < 3; I++)
  875. {
  876. message_begin(MSG_ONE, A_GlobalVars[GA_CACHE_MESSAGES][MESSAGE_TEAMINFO], _, I_Player)
  877. write_byte((I+CHAT_COLOR_GREY))
  878. write_string(C_CsTeamNames[I])
  879. message_end()
  880. }
  881. }
  882.  
  883. #if defined PlayWithBots
  884. public RegisterHamsForBots(const I_Bot)
  885. {
  886. if (M_HasGlobalBit(I_GlobalBitVars, BIG_REGISTER_HAMS_BOTS))
  887. return;
  888.  
  889. RegisterHamFromEntity(Ham_Spawn, I_Bot, "HAM_PLAYER_Spawn_Post", true)
  890. RegisterHamFromEntity(Ham_TraceAttack, I_Bot, "HAM_PLAYER_TraceAttack_Pre")
  891. RegisterHamFromEntity(Ham_TakeDamage, I_Bot, "HAM_PLAYER_TakeDamage_Pre")
  892. RegisterHamFromEntity(Ham_Killed, I_Bot, "HAM_PLAYER_Killed_Post", true)
  893. M_SetGlobalBit(I_GlobalBitVars, BIG_REGISTER_HAMS_BOTS)
  894. }
  895. #endif
  896.  
  897. // Private functions
  898. StartRound(const I_ModeType, I_PlayerSelected = 0)
  899. {
  900. static I_AlivePlayers;
  901. I_AlivePlayers = GetCount(COUNT_ALIVE_PLAYERS)
  902.  
  903. if (I_AlivePlayers < 1)
  904. {
  905. set_task(2.0, "ChooseRoundMod", TASK_CHOOSE_ROUND_MOD)
  906. return;
  907. }
  908.  
  909. static I_Players;
  910.  
  911. /*========== MODE INFECTION ==========*/
  912. if (I_ModeType == MODE_NONE)
  913. I_PlayerSelected = GetRandomAlive()
  914.  
  915. ZombieMe(I_PlayerSelected, CLASS_FIRST_ZOMBIE)
  916.  
  917. for (I_Players = 1; I_Players <= A_GlobalVars[GI_MAX_PLAYERS]; I_Players++)
  918. {
  919. if (!M_HasPlayerBit(I_PlayerBitVars[BIP_IS_ALIVE], I_Players) || M_HasPlayerBit(I_PlayerBitVars[BIP_IS_ZOMBIE], I_Players))
  920. continue;
  921.  
  922. if (GetUserTeam(I_Players) != TEAM_COUNTER_TERRORIST)
  923. {
  924. remove_task(I_Players)
  925. SetUserTeam(I_Players, TEAM_COUNTER_TERRORIST)
  926. UpdateUserTeam(I_Players)
  927. }
  928. }
  929.  
  930. set_dhudmessage(0, 255, 0, -1.0, 0.2, 0, 0.0, 3.0, 1.0, 1.0)
  931. show_dhudmessage(0, "==========================^n! %s ES EL PRIMER ZOMBIE !^n==========================", A_PlayerVars[I_PlayerSelected][PSZ_CLIENT_NAME])
  932. /*========== MODE INFECTION ==========*/
  933.  
  934.  
  935. M_SetGlobalBit(I_GlobalBitVars, BIG_START_GAME_ROUND)
  936. }
  937.  
  938. ZombieMe(const I_Player, const I_ZombieType, const I_Infector = 0, const bool:WasRespawn = false)
  939. {
  940. strip_user_weapons(I_Player)
  941. give_item(I_Player, "weapon_knife")
  942. cs_set_user_armor(I_Player, 0, CS_ARMOR_NONE)
  943.  
  944. if (I_Infector)
  945. {
  946. SendDeahMessage(I_Player, I_Infector)
  947. FixPlayerAttribute(I_Player)
  948. UpdateScore(I_Player, _, _, I_Infector)
  949. }
  950.  
  951. switch (I_ZombieType)
  952. {
  953. case CLASS_FIRST_ZOMBIE:
  954. {
  955. set_user_health(I_Player, 800)
  956. SendInfectionEffects(I_Player, EFFECT_FIRST_ZOMBIE)
  957. }
  958. case CLASS_ZOMBIE:
  959. {
  960. set_user_health(I_Player, 500)
  961. SendInfectionEffects(I_Player)
  962. }
  963. }
  964.  
  965. if (WasRespawn)
  966. SendInfectionEffects(I_Player, EFFECT_RESPAWN_ZOMBIE)
  967.  
  968. M_SetPlayerBit(I_PlayerBitVars[BIP_IS_ZOMBIE], I_Player)
  969. A_PlayerVars[I_Player][PI_CLASS] = I_ZombieType
  970.  
  971. SetUserTeam(I_Player, TEAM_TERRORIST)
  972. UpdatePlayerLight(I_Player, C_LightStyleValues[ZOMBIE_THIS_LIGHT])
  973. cs_set_user_nvg(I_Player, true)
  974. }
  975.  
  976. SendInfectionEffects(const I_Player, const I_EffectType = EFFECT_ZOMBIE)
  977. {
  978. static Float:F_Origin[3];
  979. entity_get_vector(I_Player, EV_VEC_origin, F_Origin)
  980.  
  981. switch (I_EffectType)
  982. {
  983. case EFFECT_FIRST_ZOMBIE:
  984. {
  985. message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
  986. write_byte(TE_IMPLOSION)
  987. engfunc(EngFunc_WriteCoord, F_Origin[0])
  988. engfunc(EngFunc_WriteCoord, F_Origin[1])
  989. engfunc(EngFunc_WriteCoord, F_Origin[2])
  990. write_byte(128)
  991. write_byte(20)
  992. write_byte(3)
  993. message_end()
  994. }
  995. case EFFECT_RESPAWN_ZOMBIE:
  996. {
  997. message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
  998. write_byte(TE_TELEPORT)
  999. engfunc(EngFunc_WriteCoord, F_Origin[0])
  1000. engfunc(EngFunc_WriteCoord, F_Origin[1])
  1001. engfunc(EngFunc_WriteCoord, F_Origin[2])
  1002. message_end()
  1003. }
  1004. }
  1005.  
  1006. message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
  1007. write_byte(TE_LAVASPLASH)
  1008. engfunc(EngFunc_WriteCoord, F_Origin[0])
  1009. engfunc(EngFunc_WriteCoord, F_Origin[1])
  1010. engfunc(EngFunc_WriteCoord, F_Origin[2])
  1011. message_end()
  1012. }
  1013.  
  1014. FixPlayerAttribute(const I_Player)
  1015. {
  1016. message_begin(MSG_ALL, A_GlobalVars[GA_CACHE_MESSAGES][MESSAGE_SCOREATTRIB])
  1017. write_byte(I_Player)
  1018. write_byte(0)
  1019. message_end()
  1020. }
  1021.  
  1022. UpdateUserTeam(const I_User)
  1023. {
  1024. static Float:F_CurrentTime, Float:F_ChangeTeamTime;
  1025. F_CurrentTime = get_gametime()
  1026.  
  1027. if ((F_CurrentTime-F_ChangeTeamTime) >= 0.1)
  1028. {
  1029. set_task(0.1, "SetUserTeamMSG", I_User)
  1030. F_ChangeTeamTime = (F_CurrentTime+0.1)
  1031. }
  1032. else
  1033. {
  1034. set_task(((F_ChangeTeamTime+0.1)-F_CurrentTime), "SetUserTeamMSG", I_User)
  1035. F_ChangeTeamTime = (F_ChangeTeamTime+0.1)
  1036. }
  1037. }
  1038.  
  1039. GetCountDownProperties(&I_LastCall, &Float:F_XPosition, &Float:F_YPosition, A_Color[3])
  1040. {
  1041. if (I_LastCall >= 10)
  1042. I_LastCall = 0
  1043.  
  1044. F_XPosition = -1.0
  1045. F_YPosition = 0.03+(I_LastCall*0.03)
  1046.  
  1047. switch (random_num(0, 5))
  1048. {
  1049. case 5: A_Color = { 255, 255, 255 }
  1050. case 4: A_Color = { 0, 255, 255 }
  1051. case 3: A_Color = { 255, 0, 255 }
  1052. case 2: A_Color = { 255, 255, 0 }
  1053. case 1: A_Color = { 255, 0, 255 }
  1054. default: A_Color = { 0, 255, 255 }
  1055. }
  1056. }
  1057.  
  1058. GetCount(const I_CountType)
  1059. {
  1060. static I_Team, I;
  1061. new I_Count;
  1062.  
  1063. switch (I_CountType)
  1064. {
  1065. case COUNT_ALIVE_PLAYERS:
  1066. {
  1067. for (I = 1; I <= A_GlobalVars[GI_MAX_PLAYERS]; I++)
  1068. {
  1069. if (!M_HasPlayerBit(I_PlayerBitVars[BIP_IS_ALIVE], I))
  1070. continue;
  1071.  
  1072. I_Count++
  1073. }
  1074. }
  1075. case COUNT_PLAYING_PLAYERS:
  1076. {
  1077. for (I = 1; I <= A_GlobalVars[GI_MAX_PLAYERS]; I++)
  1078. {
  1079. if (!M_HasPlayerBit(I_PlayerBitVars[BIP_IS_CONNECTED], I))
  1080. continue;
  1081.  
  1082. I_Team = GetUserTeam(I)
  1083.  
  1084. if (I_Team != TEAM_SPECTATOR && I_Team != TEAM_UNASSIGNED)
  1085. I_Count++
  1086. }
  1087. }
  1088. case COUNT_HUMANS:
  1089. {
  1090. for (I = 1; I <= A_GlobalVars[GI_MAX_PLAYERS]; I++)
  1091. {
  1092. if (!M_HasPlayerBit(I_PlayerBitVars[BIP_IS_ALIVE], I))
  1093. continue;
  1094.  
  1095. if (!M_HasPlayerBit(I_PlayerBitVars[BIP_IS_ZOMBIE], I))
  1096. I_Count++
  1097. }
  1098. }
  1099.  
  1100. }
  1101. return I_Count;
  1102. }
  1103.  
  1104. GetRandomAlive()
  1105. {
  1106. new A_Players[32], I_Num;
  1107. get_players(A_Players, I_Num, "a")
  1108. return A_Players[random(I_Num)];
  1109. }
  1110.  
  1111. ReplaceWeaponModels(const I_Player, const I_WeaponID)
  1112. {
  1113. if (I_WeaponID == CSW_KNIFE)
  1114. {
  1115. entity_set_string(I_Player, EV_SZ_weaponmodel, "")
  1116. return;
  1117. }
  1118. }
  1119.  
  1120. UpdatePlayerNVG(const I_Player, const I_Duration = 0, const I_HoldTime = 0, const I_Flags = FFADE_IN, A_Color[3] = { 0, 0, 0 }, I_Alpha = 0)
  1121. {
  1122. for (new i; i < sizeof (A_Color); i++)
  1123. {
  1124. if (A_Color[i] > 255)
  1125. A_Color[i] = 255
  1126. }
  1127.  
  1128. if (I_Alpha > 255)
  1129. I_Alpha = 255
  1130.  
  1131. message_begin(MSG_ONE, A_GlobalVars[GA_CACHE_MESSAGES][MESSAGE_SCREENFADE], _, I_Player)
  1132. write_short(I_Duration)
  1133. write_short(I_HoldTime)
  1134. write_short(I_Flags)
  1135. write_byte(A_Color[0])
  1136. write_byte(A_Color[1])
  1137. write_byte(A_Color[2])
  1138. write_byte(I_Alpha)
  1139. message_end()
  1140. }
  1141.  
  1142. ResetPlayerVars(const I_Player)
  1143. {
  1144. M_ClearPlayerBit(I_PlayerBitVars[BIP_IS_ALIVE], I_Player)
  1145. M_ClearPlayerBit(I_PlayerBitVars[BIP_IS_ZOMBIE], I_Player)
  1146. M_ClearPlayerBit(I_PlayerBitVars[BIP_RESPAWN_AS_ZOMBIE], I_Player)
  1147.  
  1148. A_PlayerVars[I_Player][PI_CLASS] = CLASS_HUMAN
  1149. A_PlayerVars[I_Player][PI_CURRENT_HEALTH] = A_PlayerVars[I_Player][PI_CURRENT_ARMOR] = 0
  1150. }
  1151.  
  1152. bool:IsValidEntity(const I_Entity)
  1153. return bool:is_valid_ent(I_Entity);
  1154.  
  1155. bool:IsAvailableRespawn(const I_Player)
  1156. {
  1157. if (!A_GlobalVars[GA_CACHE_CVARS][CVAR_RESPAWN])
  1158. return false;
  1159.  
  1160. if ((M_HasPlayerBit(I_PlayerBitVars[BIP_IS_ZOMBIE], I_Player) && !A_GlobalVars[GA_CACHE_CVARS][CVAR_RESPAWN_ZOMBIES]) ||
  1161. (!M_HasPlayerBit(I_PlayerBitVars[BIP_IS_ZOMBIE], I_Player) && !A_GlobalVars[GA_CACHE_CVARS][CVAR_RESPAWN_HUMANS]))
  1162. return false;
  1163.  
  1164. switch (A_GlobalVars[GI_CURRENT_ROUND_MODE])
  1165. {
  1166. case MODE_INFECTION: if (!A_GlobalVars[GA_CACHE_CVARS][CVAR_INFECTION_RESPAWN]) return false;
  1167. }
  1168.  
  1169. return true;
  1170. }
  1171.  
  1172. Float:GetCurrentTime()
  1173. return get_gametime();
  1174.  
  1175. /*==================================================
  1176. STOCKS
  1177. ==================================================*/
  1178.  
  1179.  
  1180. stock GetUserTeam(const I_User)
  1181. {
  1182. if (pev_valid(I_User) != OFFSET_PRIVATE_DATA)
  1183. return TEAM_UNASSIGNED;
  1184.  
  1185. return get_pdata_int(I_User, OFFSET_CS_TEAM, OFFSET_CBASEPLAYER);
  1186. }
  1187.  
  1188. stock SetUserTeam(const I_User, const I_Team)
  1189. {
  1190. if (pev_valid(I_User) != OFFSET_PRIVATE_DATA)
  1191. return;
  1192.  
  1193. set_pdata_int(I_User, OFFSET_CS_TEAM, I_Team, OFFSET_CBASEPLAYER);
  1194. UpdateUserTeam(I_User)
  1195. }
  1196.  
  1197. stock SendDeahMessage(const I_Player, const I_Attacker, const bool:IsHeadShot = false, const WeaponName[] = "infection")
  1198. {
  1199. message_begin(MSG_ALL, A_GlobalVars[GA_CACHE_MESSAGES][MESSAGE_DEATHMSG])
  1200. write_byte(I_Attacker)
  1201. write_byte(I_Player)
  1202. write_byte(IsHeadShot)
  1203. write_string(WeaponName)
  1204. message_end()
  1205. }
  1206.  
  1207. stock UpdateScore(const I_Player, const I_PlayerFrags = 0, const I_PlayerDeaths = 1, const I_Attacker, const I_AttackerFrags = 1, const I_AttackerDeaths = 0)
  1208. {
  1209. static I_NewFrags, I_NewDeaths;
  1210.  
  1211. if (I_Player)
  1212. {
  1213. I_NewFrags = (get_user_frags(I_Player)+I_PlayerFrags)
  1214. set_user_frags(I_Player, I_NewFrags)
  1215.  
  1216. I_NewDeaths = (cs_get_user_deaths(I_Player)+I_PlayerDeaths)
  1217. cs_set_user_deaths(I_Player, I_NewDeaths)
  1218. }
  1219.  
  1220. if (I_Attacker)
  1221. {
  1222. I_NewFrags = (get_user_frags(I_Attacker)+I_AttackerFrags)
  1223. set_user_frags(I_Attacker, I_NewFrags)
  1224.  
  1225. I_NewDeaths = (cs_get_user_deaths(I_Attacker)+I_AttackerDeaths)
  1226. cs_set_user_deaths(I_Attacker, I_NewDeaths)
  1227. }
  1228. }
  1229.  
  1230. stock UpdatePlayerLight(const I_Player, const SZ_LightValue[])
  1231. {
  1232. message_begin(MSG_ONE, SVC_LIGHTSTYLE, _, I_Player)
  1233. write_byte(0)
  1234. write_string(SZ_LightValue)
  1235. message_end()
  1236. }
  1237.  
  1238. stock SendPrint(const I_Target = 0, const I_ColorChat, const SZ_Text[], any:...)
  1239. {
  1240. static SZ_Message[190];
  1241. vformat(SZ_Message, charsmax(SZ_Message), SZ_Text, 4)
  1242. replace_all(SZ_Message, charsmax(SZ_Message), "!y", "^1")
  1243. replace_all(SZ_Message, charsmax(SZ_Message), "!color", "^3")
  1244. replace_all(SZ_Message, charsmax(SZ_Message), "!g", "^4")
  1245.  
  1246. message_begin((I_Target ? MSG_ONE : MSG_BROADCAST), A_GlobalVars[GA_CACHE_MESSAGES][MESSAGE_SAYTEXT], _, I_Target)
  1247. write_byte((I_ColorChat ? I_ColorChat : 33))
  1248. write_string(SZ_Message)
  1249. message_end()
  1250. }
  1251.  
  1252. /*=========================================================================================================*/
  1253.  
  1254. /*
  1255. public StartMode(Mode, Id)
  1256. {
  1257. static PlayersNum;
  1258. PlayersNum = GetCount(COUNT_ALIVES)
  1259.  
  1260. if (PlayersNum < 1)
  1261. {
  1262. set_task(2.0, "ChooseModeStart", TASK_START_MODE)
  1263. return;
  1264. }
  1265.  
  1266. static PlayerId, Zombies, MaxZombies, ModeChance;
  1267. GVars[G_NEW_ROUND] = false
  1268. ModeChance = BASE_num(1, get_pcvar_num(GVars[G_CVARS][CVAR_MODES_CHANCE]))
  1269.  
  1270. if ((get_pcvar_num(GVars[G_CVARS][CVAR_MULTI]) && ModeChance == get_pcvar_num(GVars[G_CVARS][CVAR_MULTI_CHANCE]) && PlayersNum >= get_pcvar_num(GVars[G_CVARS][CVAR_MULTI_MIN_PLAYERS]) && GVars[G_LAST_MODE] != MODE_MULTI) || Mode == MODE_MULTI)
  1271. {
  1272. GVars[G_LAST_MODE] = GVars[G_CURRENT_MODE] = MODE_MULTI
  1273. Zombies = 0
  1274. MaxZombies = (PlayersNum/4)
  1275.  
  1276. while (Zombies < MaxZombies)
  1277. {
  1278. if (++Id > GVars[G_MAX_PLAYERS])
  1279. Id = 1
  1280.  
  1281. if (!PVars[Id][P_IS_ALIVE] || PVars[Id][P_CLASS] >= ZOMBIE)
  1282. continue;
  1283.  
  1284. if (BASE_num(0, 1))
  1285. {
  1286. Zombieme(Id, _, _, _, 1)
  1287. Zombies++
  1288. }
  1289. }
  1290.  
  1291. for (Id = 1; Id <= GVars[G_MAX_PLAYERS]; Id++)
  1292. {
  1293. if (!PVars[Id][P_IS_ALIVE] || PVars[Id][P_CLASS] >= ZOMBIE)
  1294. continue;
  1295.  
  1296. if (GetUserTeam(Id) != TEAM_COUNTER_TERRORIST)
  1297. {
  1298. remove_task(Id+TASK_CHANGE_TEAM)
  1299. SetUserTeam(Id, TEAM_COUNTER_TERRORIST)
  1300. UpdateUserTeam(Id)
  1301. }
  1302. }
  1303.  
  1304. set_dhudmessage(0, 255, 0, -1.0, 0.2, 0, 0.0, 3.0, 1.0, 1.0)
  1305. show_dhudmessage(0, "======================^n¡ MODO INFECCIÓN MÚLTIPLE !^n======================")
  1306. PlaySound(REGISTER_SOUNDS[MULTI_MODE])
  1307. }
  1308. else if ((get_pcvar_num(GVars[G_CVARS][CVAR_SWARM]) && ModeChance == get_pcvar_num(GVars[G_CVARS][CVAR_SWARM_CHANCE]) && PlayersNum >= get_pcvar_num(GVars[G_CVARS][CVAR_SWARM_MIN_PLAYERS]) && GVars[G_LAST_MODE] != MODE_SWARM) || Mode == MODE_SWARM)
  1309. {
  1310. GVars[G_LAST_MODE] = GVars[G_CURRENT_MODE] = MODE_SWARM
  1311.  
  1312. if (!GetCount(COUNT_ALIVE_TTS))
  1313. {
  1314. Id = GetRandomAlive(BASE_num(1, PlayersNum))
  1315. remove_task(Id+TASK_CHANGE_TEAM)
  1316. SetUserTeam(Id, TEAM_TERRORIST)
  1317. UpdateUserTeam(Id)
  1318. }
  1319. else if (!GetCount(COUNT_ALIVE_CTS))
  1320. {
  1321. Id = GetRandomAlive(BASE_num(1, PlayersNum))
  1322. remove_task(Id+TASK_CHANGE_TEAM)
  1323. SetUserTeam(Id, TEAM_COUNTER_TERRORIST)
  1324. UpdateUserTeam(Id)
  1325. }
  1326.  
  1327. for (Id = 1; Id <= GVars[G_MAX_PLAYERS]; Id++)
  1328. {
  1329. if (!PVars[Id][P_IS_ALIVE])
  1330. continue;
  1331.  
  1332. if (GetUserTeam(Id) != TEAM_TERRORIST)
  1333. continue;
  1334.  
  1335. Zombieme(Id, _, _, _, 1)
  1336. }
  1337.  
  1338. set_dhudmessage(0, 255, 0, -1.0, 0.2, 0, 0.0, 3.0, 1.0, 1.0)
  1339. show_dhudmessage(0, "===============^n¡ MODO SWARM !^n===============")
  1340. PlaySound(REGISTER_SOUNDS[SWARM_MODE])
  1341. }
  1342. else if ((get_pcvar_num(GVars[G_CVARS][CVAR_SURVIVOR]) && ModeChance == get_pcvar_num(GVars[G_CVARS][CVAR_SURVIVOR_CHANCE]) && PlayersNum >= get_pcvar_num(GVars[G_CVARS][CVAR_SURVIVOR_MIN_PLAYERS]) && GVars[G_LAST_MODE] != MODE_SURVIVOR) || Mode == MODE_SURVIVOR)
  1343. {
  1344. GVars[G_LAST_MODE] = GVars[G_CURRENT_MODE] = MODE_SURVIVOR
  1345.  
  1346. if (Mode == MODE_NONE)
  1347. Id = GetRandomAlive(BASE_num(1, PlayersNum))
  1348.  
  1349. PlayerId = Id
  1350. Humanme(Id, 1)
  1351.  
  1352. for (Id = 1; Id <= GVars[G_MAX_PLAYERS]; Id++)
  1353. {
  1354. if (!PVars[Id][P_IS_ALIVE])
  1355. continue;
  1356.  
  1357. if (PVars[Id][P_CLASS] == SURVIVOR || PVars[Id][P_CLASS] >= ZOMBIE)
  1358. continue;
  1359.  
  1360. Zombieme(Id, _, _, _, 1)
  1361. }
  1362.  
  1363. set_dhudmessage(0, 0, 255, -1.0, 0.2, 0, 0.0, 3.0, 1.0, 1.0)
  1364. show_dhudmessage(0, "======================^n¡ MODO SURVIVOR !^n%s ES EL SURVIVOR^n======================", PVars[PlayerId][P_PLAYER_NAME])
  1365. PlaySound(REGISTER_SOUNDS[SURVIVOR_MODE])
  1366. }
  1367. else if ((get_pcvar_num(GVars[G_CVARS][CVAR_SNIPER]) && ModeChance == get_pcvar_num(GVars[G_CVARS][CVAR_SNIPER_CHANCE]) && PlayersNum >= get_pcvar_num(GVars[G_CVARS][CVAR_SNIPER_MIN_PLAYERS]) && GVars[G_LAST_MODE] != MODE_SNIPER) || Mode == MODE_SNIPER)
  1368. {
  1369. GVars[G_LAST_MODE] = GVars[G_CURRENT_MODE] = MODE_SNIPER
  1370.  
  1371. if (Mode == MODE_NONE)
  1372. Id = GetRandomAlive(BASE_num(1, PlayersNum))
  1373.  
  1374. PlayerId = Id
  1375. Humanme(Id, 2)
  1376.  
  1377. for (Id = 1; Id <= GVars[G_MAX_PLAYERS]; Id++)
  1378. {
  1379. if (!PVars[Id][P_IS_ALIVE])
  1380. continue;
  1381.  
  1382. if (PVars[Id][P_CLASS] == SNIPER || PVars[Id][P_CLASS] >= ZOMBIE)
  1383. continue;
  1384.  
  1385. Zombieme(Id, _, _, _, 1)
  1386. }
  1387.  
  1388. set_dhudmessage(0, 0, 255, -1.0, 0.2, 0, 0.0, 3.0, 1.0, 1.0)
  1389. show_dhudmessage(0, "======================^n¡ MODO SNIPER !^n%s ES EL SNIPER^n======================", PVars[PlayerId][P_PLAYER_NAME])
  1390. }
  1391. else if ((get_pcvar_num(GVars[G_CVARS][CVAR_NEMESIS]) && ModeChance == get_pcvar_num(GVars[G_CVARS][CVAR_NEMESIS_CHANCE]) && PlayersNum >= get_pcvar_num(GVars[G_CVARS][CVAR_NEMESIS_MIN_PLAYERS]) && GVars[G_LAST_MODE] != MODE_NEMESIS) || Mode == MODE_NEMESIS)
  1392. {
  1393. GVars[G_LAST_MODE] = GVars[G_CURRENT_MODE] = MODE_NEMESIS
  1394.  
  1395. if (Mode == MODE_NONE)
  1396. Id = GetRandomAlive(BASE_num(1, PlayersNum))
  1397.  
  1398. PlayerId = Id
  1399. Zombieme(Id, _, 1)
  1400.  
  1401. for (Id = 1; Id <= GVars[G_MAX_PLAYERS]; Id++)
  1402. {
  1403. if (!PVars[Id][P_IS_ALIVE] || PVars[Id][P_CLASS] >= ZOMBIE)
  1404. continue;
  1405.  
  1406. if (GetUserTeam(Id) != TEAM_COUNTER_TERRORIST)
  1407. {
  1408. remove_task(Id+TASK_CHANGE_TEAM)
  1409. SetUserTeam(Id, TEAM_COUNTER_TERRORIST)
  1410. UpdateUserTeam(Id)
  1411. }
  1412. }
  1413.  
  1414. set_dhudmessage(255, 0, 0, -1.0, 0.2, 0, 0.0, 3.0, 1.0, 1.0)
  1415. show_dhudmessage(0, "======================^n¡ MODO NEMESIS !^n%s ES EL NEMESIS^n======================", PVars[PlayerId][P_PLAYER_NAME])
  1416. PlaySound(REGISTER_SOUNDS[NEMESIS_MODE])
  1417. }
  1418. else if ((get_pcvar_num(GVars[G_CVARS][CVAR_PLAGUE]) && ModeChance == get_pcvar_num(GVars[G_CVARS][CVAR_PLAGUE_CHANCE]) && PlayersNum >= get_pcvar_num(GVars[G_CVARS][CVAR_PLAGUE_MIN_PLAYERS]) && GVars[G_LAST_MODE] != MODE_PLAGUE) || Mode == MODE_PLAGUE)
  1419. {
  1420. GVars[G_LAST_MODE] = GVars[G_CURRENT_MODE] = MODE_PLAGUE
  1421.  
  1422. static MaxSurvivors, Survivors, Nemesis, MaxNemesis;
  1423. MaxSurvivors = get_pcvar_num(GVars[G_CVARS][CVAR_PLAGUE_SURV_NUM])
  1424. MaxNemesis = get_pcvar_num(GVars[G_CVARS][CVAR_PLAGUE_NEM_NUM])
  1425. Survivors = Nemesis = 0
  1426.  
  1427. while (Survivors < MaxSurvivors)
  1428. {
  1429. Id = GetRandomAlive(BASE_num(1, PlayersNum))
  1430.  
  1431. if (PVars[Id][P_CLASS] == SURVIVOR)
  1432. continue;
  1433.  
  1434. Humanme(Id, 1)
  1435. Survivors++
  1436. set_user_health(Id, floatround((float(get_user_health(Id))*get_pcvar_num(GVars[G_CVARS][CVAR_PLAGUE_SURV_MULTI_HP]))))
  1437. }
  1438.  
  1439. while (Nemesis < MaxNemesis)
  1440. {
  1441. Id = GetRandomAlive(BASE_num(1, PlayersNum))
  1442.  
  1443. if (PVars[Id][P_CLASS] == SURVIVOR || PVars[Id][P_CLASS] == NEMESIS)
  1444. continue;
  1445.  
  1446. Zombieme(Id, _, 1)
  1447. Nemesis++
  1448. set_user_health(Id, floatround((float(get_user_health(Id))*get_pcvar_num(GVars[G_CVARS][CVAR_PLAGUE_NEM_MULTI_HP]))))
  1449. }
  1450.  
  1451. MaxZombies = ((PlayersNum-(get_pcvar_num(GVars[G_CVARS][CVAR_PLAGUE_SURV_NUM])+get_pcvar_num(GVars[G_CVARS][CVAR_PLAGUE_NEM_NUM])))/2)
  1452. Zombies = 0
  1453.  
  1454. while (Zombies < MaxZombies)
  1455. {
  1456. if (++Id > GVars[G_MAX_PLAYERS])
  1457. Id = 1
  1458.  
  1459. if (!PVars[Id][P_IS_ALIVE] || PVars[Id][P_CLASS] >= ZOMBIE || PVars[Id][P_CLASS] == SURVIVOR)
  1460. continue;
  1461.  
  1462. if (BASE_num(0, 1))
  1463. {
  1464. Zombieme(Id, _, _, _, 1)
  1465. Zombies++
  1466. }
  1467. }
  1468.  
  1469. for (Id = 1; Id <= GVars[G_MAX_PLAYERS]; Id++)
  1470. {
  1471. if (!PVars[Id][P_IS_ALIVE] || PVars[Id][P_CLASS] >= ZOMBIE || PVars[Id][P_CLASS] == SURVIVOR)
  1472. continue;
  1473.  
  1474. if (GetUserTeam(Id) != TEAM_COUNTER_TERRORIST)
  1475. {
  1476. remove_task(Id+TASK_CHANGE_TEAM)
  1477. SetUserTeam(Id, TEAM_COUNTER_TERRORIST)
  1478. UpdateUserTeam(Id)
  1479. }
  1480. }
  1481.  
  1482. set_dhudmessage(255, 0, 0, -1.0, 0.2, 0, 0.0, 3.0, 1.0, 1.0)
  1483. show_dhudmessage(0, "================^n¡ MODO PLAGUE !^n================")
  1484. PlaySound(REGISTER_SOUNDS[PLAGUE_MODE])
  1485. }
  1486. else
  1487. {
  1488. GVars[G_LAST_MODE] = GVars[G_CURRENT_MODE] = MODE_INFECTION
  1489.  
  1490. if (Mode == MODE_NONE)
  1491. Id = GetRandomAlive(BASE_num(1, PlayersNum))
  1492.  
  1493. PlayerId = Id
  1494. emit_sound(Id, CHAN_VOICE, REGISTER_SOUNDS[BASE_num(ZOMBIE_COMING1, ZOMBIE_COMING3)], 1.0, ATTN_NORM, 0, PITCH_NORM)
  1495. Zombieme(Id)
  1496.  
  1497. for (Id = 1; Id <= GVars[G_MAX_PLAYERS]; Id++)
  1498. {
  1499. if (!PVars[Id][P_IS_ALIVE] || PVars[Id][P_CLASS] >= ZOMBIE)
  1500. continue;
  1501.  
  1502. if (GetUserTeam(Id) != TEAM_COUNTER_TERRORIST)
  1503. {
  1504. remove_task(Id+TASK_CHANGE_TEAM)
  1505. SetUserTeam(Id, TEAM_COUNTER_TERRORIST)
  1506. UpdateUserTeam(Id)
  1507. }
  1508. }
  1509.  
  1510. set_dhudmessage(0, 255, 0, -1.0, 0.2, 0, 0.0, 3.0, 1.0, 1.0)
  1511. show_dhudmessage(0, "==========================^n! %s ES EL PRIMER ZOMBIE !^n==========================", PVars[PlayerId][P_PLAYER_NAME])
  1512. }
  1513. }
  1514. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement