HLMOD.HU Forrás Megtekintés - www.hlmod.hu
  1. /* Biohazard mod
  2. *
  3. * by Cheap_Suit
  4. *
  5. * This program is free software; you can redistribute it and/or modify it
  6. * under the terms of the GNU General Public License as published by the
  7. * Free Software Foundation; either version 2 of the License, or (at
  8. * your option) any later version.
  9. *
  10. * This program is distributed in the hope that it will be useful, but
  11. * WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  13. * General Public License for more details.
  14. *
  15. * You should have received a copy of the GNU General Public License
  16. * along with this program; if not, write to the Free Software Foundation,
  17. * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  18. *
  19. * In addition, as a special exception, the author gives permission to
  20. * link the code of this program with the Half-Life Game Engine ("HL
  21. * Engine") and Modified Game Libraries ("MODs") developed by Valve,
  22. * L.L.C ("Valve"). You must obey the GNU General Public License in all
  23. * respects for all of the code used other than the HL Engine and MODs
  24. * from Valve. If you modify this file, you may extend this exception
  25. * to your version of the file, but you are not obligated to do so. If
  26. * you do not wish to do so, delete this exception statement from your
  27. * version.
  28. */
  29.  
  30. #define VERSION "2.00 Beta 3"
  31.  
  32. #include <amxmodx>
  33. #include <amxmisc>
  34. #include <fakemeta>
  35. #include <hamsandwich>
  36. #include <xs>
  37.  
  38. #tryinclude "biohazard.cfg"
  39.  
  40. #if !defined _biohazardcfg_included
  41. #assert Biohazard configuration file required!
  42. #elseif AMXX_VERSION_NUM < 180
  43. #assert AMX Mod X v1.8.0 or greater required!
  44. #endif
  45.  
  46. #define OFFSET_DEATH 444
  47. #define OFFSET_TEAM 114
  48. #define OFFSET_ARMOR 112
  49. #define OFFSET_NVG 129
  50. #define OFFSET_CSMONEY 115
  51. #define OFFSET_PRIMARYWEAPON 116
  52. #define OFFSET_WEAPONTYPE 43
  53. #define OFFSET_CLIPAMMO 51
  54. #define EXTRAOFFSET_WEAPONS 4
  55.  
  56. #define OFFSET_AMMO_338MAGNUM 377
  57. #define OFFSET_AMMO_762NATO 378
  58. #define OFFSET_AMMO_556NATOBOX 379
  59. #define OFFSET_AMMO_556NATO 380
  60. #define OFFSET_AMMO_BUCKSHOT 381
  61. #define OFFSET_AMMO_45ACP 382
  62. #define OFFSET_AMMO_57MM 383
  63. #define OFFSET_AMMO_50AE 384
  64. #define OFFSET_AMMO_357SIG 385
  65. #define OFFSET_AMMO_9MM 386
  66.  
  67. #define OFFSET_LASTPRIM 368
  68. #define OFFSET_LASTSEC 369
  69. #define OFFSET_LASTKNI 370
  70.  
  71. #define TASKID_STRIPNGIVE 698
  72. #define TASKID_NEWROUND 641
  73. #define TASKID_INITROUND 222
  74. #define TASKID_STARTROUND 153
  75. #define TASKID_BALANCETEAM 375
  76. #define TASKID_UPDATESCR 264
  77. #define TASKID_SPAWNDELAY 786
  78. #define TASKID_WEAPONSMENU 564
  79. #define TASKID_CHECKSPAWN 423
  80. #define TASKID_CZBOTPDATA 312
  81.  
  82. #define EQUIP_PRI (1<<0)
  83. #define EQUIP_SEC (1<<1)
  84. #define EQUIP_GREN (1<<2)
  85. #define EQUIP_ALL (1<<0 | 1<<1 | 1<<2)
  86.  
  87. #define HAS_NVG (1<<0)
  88. #define ATTRIB_BOMB (1<<1)
  89. #define DMG_HEGRENADE (1<<24)
  90.  
  91. #define MODEL_CLASSNAME "player_model"
  92. #define IMPULSE_FLASHLIGHT 100
  93.  
  94. #define MAX_SPAWNS 128
  95. #define MAX_CLASSES 10
  96. #define MAX_DATA 11
  97.  
  98. #define DATA_HEALTH 0
  99. #define DATA_SPEED 1
  100. #define DATA_GRAVITY 2
  101. #define DATA_ATTACK 3
  102. #define DATA_DEFENCE 4
  103. #define DATA_HEDEFENCE 5
  104. #define DATA_HITSPEED 6
  105. #define DATA_HITDELAY 7
  106. #define DATA_REGENDLY 8
  107. #define DATA_HITREGENDLY 9
  108. #define DATA_KNOCKBACK 10
  109.  
  110. #define fm_get_user_team(%1) get_pdata_int(%1, OFFSET_TEAM)
  111. #define fm_get_user_deaths(%1) get_pdata_int(%1, OFFSET_DEATH)
  112. #define fm_set_user_deaths(%1,%2) set_pdata_int(%1, OFFSET_DEATH, %2)
  113. #define fm_get_user_money(%1) get_pdata_int(%1, OFFSET_CSMONEY)
  114. #define fm_get_user_armortype(%1) get_pdata_int(%1, OFFSET_ARMOR)
  115. #define fm_set_user_armortype(%1,%2) set_pdata_int(%1, OFFSET_ARMOR, %2)
  116. #define fm_get_weapon_id(%1) get_pdata_int(%1, OFFSET_WEAPONTYPE, EXTRAOFFSET_WEAPONS)
  117. #define fm_get_weapon_ammo(%1) get_pdata_int(%1, OFFSET_CLIPAMMO, EXTRAOFFSET_WEAPONS)
  118. #define fm_set_weapon_ammo(%1,%2) set_pdata_int(%1, OFFSET_CLIPAMMO, %2, EXTRAOFFSET_WEAPONS)
  119. #define fm_reset_user_primary(%1) set_pdata_int(%1, OFFSET_PRIMARYWEAPON, 0)
  120. #define fm_lastprimary(%1) get_pdata_cbase(id, OFFSET_LASTPRIM)
  121. #define fm_lastsecondry(%1) get_pdata_cbase(id, OFFSET_LASTSEC)
  122. #define fm_lastknife(%1) get_pdata_cbase(id, OFFSET_LASTKNI)
  123. #define fm_get_user_model(%1,%2,%3) engfunc(EngFunc_InfoKeyValue, engfunc(EngFunc_GetInfoKeyBuffer, %1), "model", %2, %3)
  124.  
  125. #define _random(%1) random_num(0, %1 - 1)
  126. #define AMMOWP_NULL (1<<0 | 1<<CSW_KNIFE | 1<<CSW_FLASHBANG | 1<<CSW_HEGRENADE | 1<<CSW_SMOKEGRENADE | 1<<CSW_C4)
  127.  
  128. enum
  129. {
  130. MAX_CLIP = 0,
  131. MAX_AMMO
  132. }
  133.  
  134. enum
  135. {
  136. MENU_PRIMARY = 1,
  137. MENU_SECONDARY
  138. }
  139.  
  140. enum
  141. {
  142. CS_TEAM_UNASSIGNED = 0,
  143. CS_TEAM_T,
  144. CS_TEAM_CT,
  145. CS_TEAM_SPECTATOR
  146. }
  147.  
  148. enum
  149. {
  150. CS_ARMOR_NONE = 0,
  151. CS_ARMOR_KEVLAR,
  152. CS_ARMOR_VESTHELM
  153. }
  154.  
  155. enum
  156. {
  157. KBPOWER_357SIG = 0,
  158. KBPOWER_762NATO,
  159. KBPOWER_BUCKSHOT,
  160. KBPOWER_45ACP,
  161. KBPOWER_556NATO,
  162. KBPOWER_9MM,
  163. KBPOWER_57MM,
  164. KBPOWER_338MAGNUM,
  165. KBPOWER_556NATOBOX,
  166. KBPOWER_50AE
  167. }
  168.  
  169. new const g_weapon_ammo[][] =
  170. {
  171. { -1, -1 },
  172. { 13, 52 },
  173. { -1, -1 },
  174. { 10, 90 },
  175. { -1, -1 },
  176. { 7, 32 },
  177. { -1, -1 },
  178. { 30, 100 },
  179. { 30, 90 },
  180. { -1, -1 },
  181. { 30, 120 },
  182. { 20, 100 },
  183. { 25, 100 },
  184. { 30, 90 },
  185. { 35, 90 },
  186. { 25, 90 },
  187. { 12, 100 },
  188. { 20, 120 },
  189. { 10, 30 },
  190. { 30, 120 },
  191. { 100, 200 },
  192. { 8, 32 },
  193. { 30, 90 },
  194. { 30, 120 },
  195. { 20, 90 },
  196. { -1, -1 },
  197. { 7, 35 },
  198. { 30, 90 },
  199. { 30, 90 },
  200. { -1, -1 },
  201. { 50, 100 }
  202. }
  203.  
  204. new const g_weapon_knockback[] =
  205. {
  206. -1,
  207. KBPOWER_357SIG,
  208. -1,
  209. KBPOWER_762NATO,
  210. -1,
  211. KBPOWER_BUCKSHOT,
  212. -1,
  213. KBPOWER_45ACP,
  214. KBPOWER_556NATO,
  215. -1,
  216. KBPOWER_9MM,
  217. KBPOWER_57MM,
  218. KBPOWER_45ACP,
  219. KBPOWER_556NATO,
  220. KBPOWER_556NATO,
  221. KBPOWER_556NATO,
  222. KBPOWER_45ACP,
  223. KBPOWER_9MM,
  224. KBPOWER_338MAGNUM,
  225. KBPOWER_9MM,
  226. KBPOWER_556NATOBOX,
  227. KBPOWER_BUCKSHOT,
  228. KBPOWER_556NATO,
  229. KBPOWER_9MM,
  230. KBPOWER_762NATO,
  231. -1,
  232. KBPOWER_50AE,
  233. KBPOWER_556NATO,
  234. KBPOWER_762NATO,
  235. -1,
  236. KBPOWER_57MM
  237. }
  238.  
  239. new const g_remove_entities[][] =
  240. {
  241. "func_bomb_target",
  242. "info_bomb_target",
  243. "hostage_entity",
  244. "monster_scientist",
  245. "func_hostage_rescue",
  246. "info_hostage_rescue",
  247. "info_vip_start",
  248. "func_vip_safetyzone",
  249. "func_escapezone",
  250. "func_buyzone"
  251. }
  252.  
  253. new const g_dataname[][] =
  254. {
  255. "HEALTH",
  256. "SPEED",
  257. "GRAVITY",
  258. "ATTACK",
  259. "DEFENCE",
  260. "HEDEFENCE",
  261. "HITSPEED",
  262. "HITDELAY",
  263. "REGENDLY",
  264. "HITREGENDLY",
  265. "KNOCKBACK"
  266. }
  267. new const g_teaminfo[][] =
  268. {
  269. "UNASSIGNED",
  270. "TERRORIST",
  271. "CT",
  272. "SPECTATOR"
  273. }
  274.  
  275. new g_maxplayers, g_spawncount, g_buyzone, g_botclient_pdata, g_sync_hpdisplay,
  276. g_sync_msgdisplay, g_fwd_spawn, g_fwd_result, g_fwd_infect, g_fwd_gamestart,
  277. g_msg_flashlight, g_msg_teaminfo, g_msg_scoreattrib, g_msg_money, g_msg_scoreinfo,
  278. g_msg_deathmsg , g_msg_screenfade, Float:g_buytime, Float:g_spawns[MAX_SPAWNS+1][9],
  279. Float:g_vecvel[3], bool:g_brestorevel, bool:g_infecting, bool:g_gamestarted,
  280. bool:g_roundstarted, bool:g_roundended, bool:g_czero, g_class_name[MAX_CLASSES+1][32],
  281. g_classcount, g_class_desc[MAX_CLASSES+1][32], g_class_pmodel[MAX_CLASSES+1][64],
  282. g_class_wmodel[MAX_CLASSES+1][64], Float:g_class_data[MAX_CLASSES+1][MAX_DATA]
  283.  
  284. new cvar_randomspawn, cvar_skyname, cvar_autoteambalance[4], cvar_starttime, cvar_autonvg,
  285. cvar_winsounds, cvar_weaponsmenu, cvar_lights, cvar_killbonus, cvar_enabled,
  286. cvar_gamedescription, cvar_botquota, cvar_maxzombies, cvar_flashbang, cvar_buytime,
  287. cvar_respawnaszombie, cvar_punishsuicide, cvar_infectmoney, cvar_showtruehealth,
  288. cvar_obeyarmor, cvar_impactexplode, cvar_caphealthdisplay, cvar_zombie_hpmulti,
  289. cvar_randomclass, cvar_zombiemulti, cvar_knockback, cvar_knockback_dist, cvar_ammo,
  290. cvar_knockback_duck, cvar_killreward, cvar_painshockfree, cvar_zombie_class,
  291. cvar_shootobjects, cvar_pushpwr_weapon, cvar_pushpwr_zombie
  292.  
  293. new bool:g_zombie[33], bool:g_falling[33], bool:g_disconnected[33], bool:g_blockmodel[33],
  294. bool:g_showmenu[33], bool:g_menufailsafe[33], bool:g_preinfect[33], bool:g_welcomemsg[33],
  295. bool:g_suicide[33], Float:g_regendelay[33], Float:g_hitdelay[33], g_mutate[33], g_victim[33],
  296. g_modelent[33], g_menuposition[33], g_player_class[33], g_player_weapons[33][2]
  297.  
  298. public plugin_precache()
  299. {
  300. register_plugin("Biohazard", VERSION, "cheap_suit")
  301. register_cvar("bh_version", VERSION, FCVAR_SPONLY|FCVAR_SERVER)
  302. set_cvar_string("bh_version", VERSION)
  303.  
  304. cvar_enabled = register_cvar("bh_enabled", "1")
  305.  
  306. if(!get_pcvar_num(cvar_enabled))
  307. return
  308.  
  309. cvar_gamedescription = register_cvar("bh_gamedescription", "Biohazard")
  310. cvar_skyname = register_cvar("bh_skyname", "drkg")
  311. cvar_lights = register_cvar("bh_lights", "d")
  312. cvar_starttime = register_cvar("bh_starttime", "15.0")
  313. cvar_buytime = register_cvar("bh_buytime", "0")
  314. cvar_randomspawn = register_cvar("bh_randomspawn", "0")
  315. cvar_punishsuicide = register_cvar("bh_punishsuicide", "1")
  316. cvar_winsounds = register_cvar("bh_winsounds", "1")
  317. cvar_autonvg = register_cvar("bh_autonvg", "1")
  318. cvar_respawnaszombie = register_cvar("bh_respawnaszombie", "1")
  319. cvar_painshockfree = register_cvar("bh_painshockfree", "1")
  320. cvar_knockback = register_cvar("bh_knockback", "1")
  321. cvar_knockback_duck = register_cvar("bh_knockback_duck", "1")
  322. cvar_knockback_dist = register_cvar("bh_knockback_dist", "280.0")
  323. cvar_obeyarmor = register_cvar("bh_obeyarmor", "0")
  324. cvar_infectmoney = register_cvar("bh_infectionmoney", "0")
  325. cvar_caphealthdisplay = register_cvar("bh_caphealthdisplay", "1")
  326. cvar_weaponsmenu = register_cvar("bh_weaponsmenu", "1")
  327. cvar_ammo = register_cvar("bh_ammo", "1")
  328. cvar_maxzombies = register_cvar("bh_maxzombies", "31")
  329. cvar_flashbang = register_cvar("bh_flashbang", "1")
  330. cvar_impactexplode = register_cvar("bh_impactexplode", "1")
  331. cvar_showtruehealth = register_cvar("bh_showtruehealth", "1")
  332. cvar_zombiemulti = register_cvar("bh_zombie_countmulti", "0.15")
  333. cvar_zombie_hpmulti = register_cvar("bh_zombie_hpmulti", "2.0")
  334. cvar_zombie_class = register_cvar("bh_zombie_class", "1")
  335. cvar_randomclass = register_cvar("bh_randomclass", "1")
  336. cvar_killbonus = register_cvar("bh_kill_bonus", "1")
  337. cvar_killreward = register_cvar("bh_kill_reward", "2")
  338. cvar_shootobjects = register_cvar("bh_shootobjects", "1")
  339. cvar_pushpwr_weapon = register_cvar("bh_pushpwr_weapon", "2.0")
  340. cvar_pushpwr_zombie = register_cvar("bh_pushpwr_zombie", "5.0")
  341.  
  342. new file[64]
  343. get_configsdir(file, 63)
  344. format(file, 63, "%s/bh_cvars.cfg", file)
  345.  
  346. if(file_exists(file))
  347. server_cmd("exec %s", file)
  348.  
  349. new mapname[32]
  350. get_mapname(mapname, 31)
  351. register_spawnpoints(mapname)
  352.  
  353. register_zombieclasses("bh_zombieclass.ini")
  354. register_dictionary("biohazard.txt")
  355.  
  356. precache_model(DEFAULT_PMODEL)
  357. precache_model(DEFAULT_WMODEL)
  358.  
  359. new i
  360. for(i = 0; i < g_classcount; i++)
  361. {
  362. precache_model(g_class_pmodel[i])
  363. precache_model(g_class_wmodel[i])
  364. }
  365.  
  366. for(i = 0; i < sizeof g_zombie_miss_sounds; i++)
  367. precache_sound(g_zombie_miss_sounds[i])
  368.  
  369. for(i = 0; i < sizeof g_zombie_hit_sounds; i++)
  370. precache_sound(g_zombie_hit_sounds[i])
  371.  
  372. for(i = 0; i < sizeof g_scream_sounds; i++)
  373. precache_sound(g_scream_sounds[i])
  374.  
  375. for(i = 0; i < sizeof g_zombie_die_sounds; i++)
  376. precache_sound(g_zombie_die_sounds[i])
  377.  
  378. for(i = 0; i < sizeof g_zombie_win_sounds; i++)
  379. precache_sound(g_zombie_win_sounds[i])
  380.  
  381. g_fwd_spawn = register_forward(FM_Spawn, "fwd_spawn")
  382.  
  383. g_buyzone = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "func_buyzone"))
  384. if(g_buyzone)
  385. {
  386. dllfunc(DLLFunc_Spawn, g_buyzone)
  387. set_pev(g_buyzone, pev_solid, SOLID_NOT)
  388. }
  389.  
  390. new ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_bomb_target"))
  391. if(ent)
  392. {
  393. dllfunc(DLLFunc_Spawn, ent)
  394. set_pev(ent, pev_solid, SOLID_NOT)
  395. }
  396.  
  397. #if FOG_ENABLE
  398. ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "env_fog"))
  399. if(ent)
  400. {
  401. fm_set_kvd(ent, "density", FOG_DENSITY, "env_fog")
  402. fm_set_kvd(ent, "rendercolor", FOG_COLOR, "env_fog")
  403. }
  404. #endif
  405. }
  406.  
  407. public plugin_init()
  408. {
  409. if(!get_pcvar_num(cvar_enabled))
  410. return
  411.  
  412. cvar_botquota = get_cvar_pointer("bot_quota")
  413. cvar_autoteambalance[0] = get_cvar_pointer("mp_autoteambalance")
  414. cvar_autoteambalance[1] = get_pcvar_num(cvar_autoteambalance[0])
  415. set_pcvar_num(cvar_autoteambalance[0], 0)
  416.  
  417. register_clcmd("jointeam", "cmd_jointeam")
  418. register_clcmd("say /class", "cmd_classmenu")
  419. register_clcmd("say /guns", "cmd_enablemenu")
  420. register_clcmd("say /help", "cmd_helpmotd")
  421. register_clcmd("amx_infect", "cmd_infectuser", ADMIN_BAN, "<name or #userid>")
  422.  
  423. register_menu("Equipment", 1023, "action_equip")
  424. register_menu("Primary", 1023, "action_prim")
  425. register_menu("Secondary", 1023, "action_sec")
  426. register_menu("Class", 1023, "action_class")
  427.  
  428. unregister_forward(FM_Spawn, g_fwd_spawn)
  429. register_forward(FM_CmdStart, "fwd_cmdstart")
  430. register_forward(FM_EmitSound, "fwd_emitsound")
  431. register_forward(FM_GetGameDescription, "fwd_gamedescription")
  432. register_forward(FM_CreateNamedEntity, "fwd_createnamedentity")
  433. register_forward(FM_ClientKill, "fwd_clientkill")
  434. register_forward(FM_PlayerPreThink, "fwd_player_prethink")
  435. register_forward(FM_PlayerPreThink, "fwd_player_prethink_post", 1)
  436. register_forward(FM_PlayerPostThink, "fwd_player_postthink")
  437. register_forward(FM_SetClientKeyValue, "fwd_setclientkeyvalue")
  438.  
  439. RegisterHam(Ham_TakeDamage, "player", "bacon_takedamage_player")
  440. RegisterHam(Ham_Killed, "player", "bacon_killed_player")
  441. RegisterHam(Ham_Spawn, "player", "bacon_spawn_player_post", 1)
  442. RegisterHam(Ham_TraceAttack, "player", "bacon_traceattack_player")
  443. RegisterHam(Ham_TraceAttack, "func_pushable", "bacon_traceattack_pushable")
  444. RegisterHam(Ham_Use, "func_tank", "bacon_use_tank")
  445. RegisterHam(Ham_Use, "func_tankmortar", "bacon_use_tank")
  446. RegisterHam(Ham_Use, "func_tankrocket", "bacon_use_tank")
  447. RegisterHam(Ham_Use, "func_tanklaser", "bacon_use_tank")
  448. RegisterHam(Ham_Use, "func_pushable", "bacon_use_pushable")
  449. RegisterHam(Ham_Touch, "func_pushable", "bacon_touch_pushable")
  450. RegisterHam(Ham_Touch, "weaponbox", "bacon_touch_weapon")
  451. RegisterHam(Ham_Touch, "armoury_entity", "bacon_touch_weapon")
  452. RegisterHam(Ham_Touch, "weapon_shield", "bacon_touch_weapon")
  453. RegisterHam(Ham_Touch, "grenade", "bacon_touch_grenade")
  454.  
  455. register_message(get_user_msgid("Health"), "msg_health")
  456. register_message(get_user_msgid("TextMsg"), "msg_textmsg")
  457. register_message(get_user_msgid("SendAudio"), "msg_sendaudio")
  458. register_message(get_user_msgid("StatusIcon"), "msg_statusicon")
  459. register_message(get_user_msgid("ScoreAttrib"), "msg_scoreattrib")
  460. register_message(get_user_msgid("DeathMsg"), "msg_deathmsg")
  461. register_message(get_user_msgid("ScreenFade"), "msg_screenfade")
  462. register_message(get_user_msgid("TeamInfo"), "msg_teaminfo")
  463. register_message(get_user_msgid("ClCorpse"), "msg_clcorpse")
  464. register_message(get_user_msgid("WeapPickup"), "msg_weaponpickup")
  465. register_message(get_user_msgid("AmmoPickup"), "msg_ammopickup")
  466.  
  467. register_event("TextMsg", "event_textmsg", "a", "2=#Game_will_restart_in")
  468. register_event("HLTV", "event_newround", "a", "1=0", "2=0")
  469. register_event("CurWeapon", "event_curweapon", "be", "1=1")
  470. register_event("ArmorType", "event_armortype", "be")
  471. register_event("Damage", "event_damage", "be")
  472.  
  473. register_logevent("logevent_round_start", 2, "1=Round_Start")
  474. register_logevent("logevent_round_end", 2, "1=Round_End")
  475.  
  476. g_msg_flashlight = get_user_msgid("Flashlight")
  477. g_msg_teaminfo = get_user_msgid("TeamInfo")
  478. g_msg_scoreattrib = get_user_msgid("ScoreAttrib")
  479. g_msg_scoreinfo = get_user_msgid("ScoreInfo")
  480. g_msg_deathmsg = get_user_msgid("DeathMsg")
  481. g_msg_money = get_user_msgid("Money")
  482. g_msg_screenfade = get_user_msgid("ScreenFade")
  483.  
  484. g_fwd_infect = CreateMultiForward("event_infect", ET_IGNORE, FP_CELL, FP_CELL)
  485. g_fwd_gamestart = CreateMultiForward("event_gamestart", ET_IGNORE)
  486.  
  487. g_sync_hpdisplay = CreateHudSyncObj()
  488. g_sync_msgdisplay = CreateHudSyncObj()
  489.  
  490. g_maxplayers = get_maxplayers()
  491.  
  492. new mod[3]
  493. get_modname(mod, 2)
  494.  
  495. g_czero = (mod[0] == 'c' && mod[1] == 'z') ? true : false
  496.  
  497. new skyname[32]
  498. get_pcvar_string(cvar_skyname, skyname, 31)
  499.  
  500. if(strlen(skyname) > 0)
  501. set_cvar_string("sv_skyname", skyname)
  502.  
  503. new lights[2]
  504. get_pcvar_string(cvar_lights, lights, 1)
  505.  
  506. if(strlen(lights) > 0)
  507. {
  508. set_task(3.0, "task_lights", _, _, _, "b")
  509.  
  510. set_cvar_num("sv_skycolor_r", 0)
  511. set_cvar_num("sv_skycolor_g", 0)
  512. set_cvar_num("sv_skycolor_b", 0)
  513. }
  514.  
  515. if(get_pcvar_num(cvar_showtruehealth))
  516. set_task(0.1, "task_showtruehealth", _, _, _, "b")
  517. }
  518.  
  519. public plugin_end()
  520. {
  521. if(get_pcvar_num(cvar_enabled))
  522. set_pcvar_num(cvar_autoteambalance[0], cvar_autoteambalance[1])
  523. }
  524.  
  525. public plugin_natives()
  526. {
  527. register_library("biohazardf")
  528. register_native("preinfect_user", "native_preinfect_user", 1)
  529. register_native("infect_user", "native_infect_user", 1)
  530. register_native("cure_user", "native_cure_user", 1)
  531. register_native("register_class", "native_register_class", 1)
  532. register_native("get_class_id", "native_get_class_id", 1)
  533. register_native("set_class_pmodel", "native_set_class_pmodel", 1)
  534. register_native("set_class_wmodel", "native_set_class_wmodel", 1)
  535. register_native("set_class_data", "native_set_class_data", 1)
  536. register_native("get_class_data", "native_get_class_data", 1)
  537. register_native("game_started", "native_game_started", 1)
  538. register_native("is_user_zombie", "native_is_user_zombie", 1)
  539. register_native("is_user_infected", "native_is_user_infected", 1)
  540. register_native("get_user_class", "native_get_user_class", 1)
  541. }
  542.  
  543. public client_connect(id)
  544. {
  545. g_showmenu[id] = true
  546. g_welcomemsg[id] = true
  547. g_blockmodel[id] = true
  548. g_zombie[id] = false
  549. g_preinfect[id] = false
  550. g_disconnected[id] = false
  551. g_falling[id] = false
  552. g_menufailsafe[id] = false
  553. g_victim[id] = 0
  554. g_mutate[id] = -1
  555. g_player_class[id] = 0
  556. g_player_weapons[id][0] = -1
  557. g_player_weapons[id][1] = -1
  558. g_regendelay[id] = 0.0
  559. g_hitdelay[id] = 0.0
  560.  
  561. remove_user_model(g_modelent[id])
  562. }
  563.  
  564. public client_putinserver(id)
  565. {
  566. if(!g_botclient_pdata && g_czero)
  567. {
  568. static param[1]
  569. param[0] = id
  570.  
  571. if(!task_exists(TASKID_CZBOTPDATA))
  572. set_task(1.0, "task_botclient_pdata", TASKID_CZBOTPDATA, param, 1)
  573. }
  574.  
  575. if(get_pcvar_num(cvar_randomclass) && g_classcount > 1)
  576. g_player_class[id] = _random(g_classcount)
  577. }
  578.  
  579. public client_disconnect(id)
  580. {
  581. remove_task(TASKID_STRIPNGIVE + id)
  582. remove_task(TASKID_UPDATESCR + id)
  583. remove_task(TASKID_SPAWNDELAY + id)
  584. remove_task(TASKID_WEAPONSMENU + id)
  585. remove_task(TASKID_CHECKSPAWN + id)
  586.  
  587. g_disconnected[id] = true
  588. remove_user_model(g_modelent[id])
  589. }
  590.  
  591. public cmd_jointeam(id)
  592. {
  593. if(is_user_alive(id) && g_zombie[id])
  594. {
  595. client_print(id, print_center, "%L", id, "CMD_TEAMCHANGE")
  596. return PLUGIN_HANDLED
  597. }
  598. return PLUGIN_CONTINUE
  599. }
  600.  
  601. public cmd_classmenu(id)
  602. if(g_classcount > 1) display_classmenu(id, g_menuposition[id] = 0)
  603.  
  604. public cmd_enablemenu(id)
  605. {
  606. if(get_pcvar_num(cvar_weaponsmenu))
  607. {
  608. client_print(id, print_chat, "%L", id, g_showmenu[id] == false ? "MENU_REENABLED" : "MENU_ALENABLED")
  609. g_showmenu[id] = true
  610. }
  611. }
  612.  
  613. public cmd_helpmotd(id)
  614. {
  615. static motd[2048]
  616. formatex(motd, 2047, "%L", id, "HELP_MOTD")
  617. replace(motd, 2047, "#Version#", VERSION)
  618.  
  619. show_motd(id, motd, "Biohazard Help")
  620. }
  621.  
  622. public cmd_infectuser(id, level, cid)
  623. {
  624. if(!cmd_access(id, level, cid, 2))
  625. return PLUGIN_HANDLED_MAIN
  626.  
  627. static arg1[32]
  628. read_argv(1, arg1, 31)
  629.  
  630. static target
  631. target = cmd_target(id, arg1, (CMDTARGET_OBEY_IMMUNITY|CMDTARGET_ALLOW_SELF|CMDTARGET_ONLY_ALIVE))
  632.  
  633. if(!is_user_connected(target) || g_zombie[target])
  634. return PLUGIN_HANDLED_MAIN
  635.  
  636. if(!allow_infection())
  637. {
  638. console_print(id, "%L", id, "CMD_MAXZOMBIES")
  639. return PLUGIN_HANDLED_MAIN
  640. }
  641.  
  642. if(!g_gamestarted)
  643. {
  644. console_print(id, "%L", id, "CMD_GAMENOTSTARTED")
  645. return PLUGIN_HANDLED_MAIN
  646. }
  647.  
  648. static name[32]
  649. get_user_name(target, name, 31)
  650.  
  651. console_print(id, "%L", id, "CMD_INFECTED", name)
  652. infect_user(target, 0)
  653.  
  654. return PLUGIN_HANDLED_MAIN
  655. }
  656.  
  657. public msg_teaminfo(msgid, dest, id)
  658. {
  659. if(!g_gamestarted)
  660. return PLUGIN_CONTINUE
  661.  
  662. static team[2]
  663. get_msg_arg_string(2, team, 1)
  664.  
  665. if(team[0] != 'U')
  666. return PLUGIN_CONTINUE
  667.  
  668. id = get_msg_arg_int(1)
  669. if(is_user_alive(id) || !g_disconnected[id])
  670. return PLUGIN_CONTINUE
  671.  
  672. g_disconnected[id] = false
  673. id = randomly_pick_zombie()
  674. if(id)
  675. {
  676. fm_set_user_team(id, g_zombie[id] ? CS_TEAM_CT : CS_TEAM_T, 0)
  677. set_pev(id, pev_deadflag, DEAD_RESPAWNABLE)
  678. }
  679. return PLUGIN_CONTINUE
  680. }
  681.  
  682. public msg_screenfade(msgid, dest, id)
  683. {
  684. if(!get_pcvar_num(cvar_flashbang))
  685. return PLUGIN_CONTINUE
  686.  
  687. if(!g_zombie[id] || !is_user_alive(id))
  688. {
  689. static data[4]
  690. data[0] = get_msg_arg_int(4)
  691. data[1] = get_msg_arg_int(5)
  692. data[2] = get_msg_arg_int(6)
  693. data[3] = get_msg_arg_int(7)
  694.  
  695. if(data[0] == 255 && data[1] == 255 && data[2] == 255 && data[3] > 199)
  696. return PLUGIN_HANDLED
  697. }
  698. return PLUGIN_CONTINUE
  699. }
  700.  
  701. public msg_scoreattrib(msgid, dest, id)
  702. {
  703. static attrib
  704. attrib = get_msg_arg_int(2)
  705.  
  706. if(attrib == ATTRIB_BOMB)
  707. set_msg_arg_int(2, ARG_BYTE, 0)
  708. }
  709.  
  710. public msg_statusicon(msgid, dest, id)
  711. {
  712. static icon[3]
  713. get_msg_arg_string(2, icon, 2)
  714.  
  715. return (icon[0] == 'c' && icon[1] == '4') ? PLUGIN_HANDLED : PLUGIN_CONTINUE
  716. }
  717.  
  718. public msg_weaponpickup(msgid, dest, id)
  719. return g_zombie[id] ? PLUGIN_HANDLED : PLUGIN_CONTINUE
  720.  
  721. public msg_ammopickup(msgid, dest, id)
  722. return g_zombie[id] ? PLUGIN_HANDLED : PLUGIN_CONTINUE
  723.  
  724. public msg_deathmsg(msgid, dest, id)
  725. {
  726. static killer
  727. killer = get_msg_arg_int(1)
  728.  
  729. if(is_user_connected(killer) && g_zombie[killer])
  730. set_msg_arg_string(4, g_zombie_weapname)
  731. }
  732.  
  733. public msg_sendaudio(msgid, dest, id)
  734. {
  735. if(!get_pcvar_num(cvar_winsounds))
  736. return PLUGIN_CONTINUE
  737.  
  738. static audiocode [22]
  739. get_msg_arg_string(2, audiocode, 21)
  740.  
  741. if(equal(audiocode[7], "terwin"))
  742. set_msg_arg_string(2, g_zombie_win_sounds[_random(sizeof g_zombie_win_sounds)])
  743. else if(equal(audiocode[7], "ctwin"))
  744. set_msg_arg_string(2, g_survivor_win_sounds[_random(sizeof g_survivor_win_sounds)])
  745.  
  746. return PLUGIN_CONTINUE
  747. }
  748.  
  749. public msg_health(msgid, dest, id)
  750. {
  751. if(!get_pcvar_num(cvar_caphealthdisplay))
  752. return PLUGIN_CONTINUE
  753.  
  754. static health
  755. health = get_msg_arg_int(1)
  756.  
  757. if(health > 255)
  758. set_msg_arg_int(1, ARG_BYTE, 255)
  759.  
  760. return PLUGIN_CONTINUE
  761. }
  762.  
  763. public msg_textmsg(msgid, dest, id)
  764. {
  765. if(get_msg_arg_int(1) != 4)
  766. return PLUGIN_CONTINUE
  767.  
  768. static txtmsg[25], winmsg[32]
  769. get_msg_arg_string(2, txtmsg, 24)
  770.  
  771. if(equal(txtmsg[1], "Game_bomb_drop"))
  772. return PLUGIN_HANDLED
  773.  
  774. else if(equal(txtmsg[1], "Terrorists_Win"))
  775. {
  776. formatex(winmsg, 31, "%L", LANG_SERVER, "WIN_TXT_ZOMBIES")
  777. set_msg_arg_string(2, winmsg)
  778. }
  779. else if(equal(txtmsg[1], "Target_Saved") || equal(txtmsg[1], "CTs_Win"))
  780. {
  781. formatex(winmsg, 31, "%L", LANG_SERVER, "WIN_TXT_SURVIVORS")
  782. set_msg_arg_string(2, winmsg)
  783. }
  784. return PLUGIN_CONTINUE
  785. }
  786.  
  787. public msg_clcorpse(msgid, dest, id)
  788. {
  789. id = get_msg_arg_int(12)
  790. if(!g_zombie[id])
  791. return PLUGIN_CONTINUE
  792.  
  793. static ent
  794. ent = fm_find_ent_by_owner(-1, MODEL_CLASSNAME, id)
  795.  
  796. if(ent)
  797. {
  798. static model[64]
  799. pev(ent, pev_model, model, 63)
  800.  
  801. set_msg_arg_string(1, model)
  802. }
  803. return PLUGIN_CONTINUE
  804. }
  805.  
  806. public logevent_round_start()
  807. {
  808. g_roundended = false
  809. g_roundstarted = true
  810.  
  811. if(get_pcvar_num(cvar_weaponsmenu))
  812. {
  813. static id, team
  814. for(id = 1; id <= g_maxplayers; id++) if(is_user_alive(id))
  815. {
  816. team = fm_get_user_team(id)
  817. if(team == CS_TEAM_T || team == CS_TEAM_CT)
  818. {
  819. if(is_user_bot(id))
  820. bot_weapons(id)
  821. else
  822. {
  823. if(g_showmenu[id])
  824. {
  825. add_delay(id, "display_equipmenu")
  826.  
  827. g_menufailsafe[id] = true
  828. set_task(10.0, "task_weaponsmenu", TASKID_WEAPONSMENU + id)
  829. }
  830. else
  831. equipweapon(id, EQUIP_ALL)
  832. }
  833. }
  834. }
  835. }
  836. }
  837.  
  838. public logevent_round_end()
  839. {
  840. g_gamestarted = false
  841. g_roundstarted = false
  842. g_roundended = true
  843.  
  844. remove_task(TASKID_BALANCETEAM)
  845. remove_task(TASKID_INITROUND)
  846. remove_task(TASKID_STARTROUND)
  847.  
  848. set_task(0.1, "task_balanceteam", TASKID_BALANCETEAM)
  849. }
  850.  
  851. public event_textmsg()
  852. {
  853. g_gamestarted = false
  854. g_roundstarted = false
  855. g_roundended = true
  856.  
  857. static seconds[5]
  858. read_data(3, seconds, 4)
  859.  
  860. static Float:tasktime
  861. tasktime = float(str_to_num(seconds)) - 0.5
  862.  
  863. remove_task(TASKID_BALANCETEAM)
  864.  
  865. set_task(tasktime, "task_balanceteam", TASKID_BALANCETEAM)
  866. }
  867.  
  868. public event_newround()
  869. {
  870. g_gamestarted = false
  871.  
  872. static buytime
  873. buytime = get_pcvar_num(cvar_buytime)
  874.  
  875. if(buytime)
  876. g_buytime = buytime + get_gametime()
  877.  
  878. static id
  879. for(id = 0; id <= g_maxplayers; id++)
  880. {
  881. if(is_user_connected(id))
  882. g_blockmodel[id] = true
  883. }
  884.  
  885. remove_task(TASKID_NEWROUND)
  886. remove_task(TASKID_INITROUND)
  887. remove_task(TASKID_STARTROUND)
  888.  
  889. set_task(0.1, "task_newround", TASKID_NEWROUND)
  890. set_task(get_pcvar_float(cvar_starttime), "task_initround", TASKID_INITROUND)
  891. }
  892.  
  893. public event_curweapon(id)
  894. {
  895. if(!is_user_alive(id))
  896. return PLUGIN_CONTINUE
  897.  
  898. static weapon
  899. weapon = read_data(2)
  900.  
  901. if(g_zombie[id])
  902. {
  903. if(weapon != CSW_KNIFE && !task_exists(TASKID_STRIPNGIVE + id))
  904. set_task(0.1, "task_stripngive", TASKID_STRIPNGIVE + id)
  905.  
  906. return PLUGIN_CONTINUE
  907. }
  908.  
  909. static ammotype
  910. ammotype = get_pcvar_num(cvar_ammo)
  911.  
  912. if(!ammotype || (AMMOWP_NULL & (1<<weapon)))
  913. return PLUGIN_CONTINUE
  914.  
  915. static maxammo
  916. switch(ammotype)
  917. {
  918. case 1: maxammo = g_weapon_ammo[weapon][MAX_AMMO]
  919. case 2: maxammo = g_weapon_ammo[weapon][MAX_CLIP]
  920. }
  921.  
  922. if(!maxammo)
  923. return PLUGIN_CONTINUE
  924.  
  925. switch(ammotype)
  926. {
  927. case 1:
  928. {
  929. static ammo
  930. ammo = fm_get_user_bpammo(id, weapon)
  931.  
  932. if(ammo < 1)
  933. fm_set_user_bpammo(id, weapon, maxammo)
  934. }
  935. case 2:
  936. {
  937. static clip; clip = read_data(3)
  938. if(clip < 1)
  939. {
  940. static weaponname[32]
  941. get_weaponname(weapon, weaponname, 31)
  942.  
  943. static ent
  944. ent = fm_find_ent_by_owner(-1, weaponname, id)
  945.  
  946. fm_set_weapon_ammo(ent, maxammo)
  947. }
  948. }
  949. }
  950. return PLUGIN_CONTINUE
  951. }
  952.  
  953. public event_armortype(id)
  954. {
  955. if(!is_user_alive(id) || !g_zombie[id])
  956. return PLUGIN_CONTINUE
  957.  
  958. if(fm_get_user_armortype(id) != CS_ARMOR_NONE)
  959. fm_set_user_armortype(id, CS_ARMOR_NONE)
  960.  
  961. return PLUGIN_CONTINUE
  962. }
  963.  
  964. public event_damage(victim)
  965. {
  966. if(!is_user_alive(victim) || !g_gamestarted)
  967. return PLUGIN_CONTINUE
  968.  
  969. if(g_zombie[victim])
  970. {
  971. static Float:gametime
  972. gametime = get_gametime()
  973.  
  974. g_regendelay[victim] = gametime + g_class_data[g_player_class[victim]][DATA_HITREGENDLY]
  975. g_hitdelay[victim] = gametime + g_class_data[g_player_class[victim]][DATA_HITDELAY]
  976. }
  977. else
  978. {
  979. static attacker
  980. attacker = get_user_attacker(victim)
  981.  
  982. if(!is_user_alive(attacker) || !g_zombie[attacker] || g_infecting)
  983. return PLUGIN_CONTINUE
  984.  
  985. if(g_victim[attacker] == victim)
  986. {
  987. g_infecting = true
  988. g_victim[attacker] = 0
  989.  
  990. message_begin(MSG_ALL, g_msg_deathmsg)
  991. write_byte(attacker)
  992. write_byte(victim)
  993. write_byte(0)
  994. write_string(g_infection_name)
  995. message_end()
  996.  
  997. message_begin(MSG_ALL, g_msg_scoreattrib)
  998. write_byte(victim)
  999. write_byte(0)
  1000. message_end()
  1001.  
  1002. infect_user(victim, attacker)
  1003.  
  1004. static Float:frags, deaths
  1005. pev(attacker, pev_frags, frags)
  1006. deaths = fm_get_user_deaths(victim)
  1007.  
  1008. set_pev(attacker, pev_frags, frags + 1.0)
  1009. fm_set_user_deaths(victim, deaths + 1)
  1010.  
  1011. fm_set_user_money(attacker, get_pcvar_num(cvar_infectmoney))
  1012.  
  1013. static params[2]
  1014. params[0] = attacker
  1015. params[1] = victim
  1016.  
  1017. set_task(0.3, "task_updatescore", TASKID_UPDATESCR, params, 2)
  1018. }
  1019. g_infecting = false
  1020. }
  1021. return PLUGIN_CONTINUE
  1022. }
  1023.  
  1024. public fwd_player_prethink(id)
  1025. {
  1026. if(!is_user_alive(id) || !g_zombie[id])
  1027. return FMRES_IGNORED
  1028.  
  1029. static flags
  1030. flags = pev(id, pev_flags)
  1031.  
  1032. if(flags & FL_ONGROUND)
  1033. {
  1034. if(get_pcvar_num(cvar_painshockfree))
  1035. {
  1036. pev(id, pev_velocity, g_vecvel)
  1037. g_brestorevel = true
  1038. }
  1039. }
  1040. else
  1041. {
  1042. static Float:fallvelocity
  1043. pev(id, pev_flFallVelocity, fallvelocity)
  1044.  
  1045. g_falling[id] = fallvelocity >= 350.0 ? true : false
  1046. }
  1047.  
  1048. if(g_gamestarted)
  1049. {
  1050. static Float:gametime
  1051. gametime = get_gametime()
  1052.  
  1053. static pclass
  1054. pclass = g_player_class[id]
  1055.  
  1056. static Float:health
  1057. pev(id, pev_health, health)
  1058.  
  1059. if(health < g_class_data[pclass][DATA_HEALTH] && g_regendelay[id] < gametime)
  1060. {
  1061. set_pev(id, pev_health, health + 1.0)
  1062. g_regendelay[id] = gametime + g_class_data[pclass][DATA_REGENDLY]
  1063. }
  1064. }
  1065. return FMRES_IGNORED
  1066. }
  1067.  
  1068. public fwd_player_prethink_post(id)
  1069. {
  1070. if(!g_brestorevel)
  1071. return FMRES_IGNORED
  1072.  
  1073. g_brestorevel = false
  1074.  
  1075. static flag
  1076. flag = pev(id, pev_flags)
  1077.  
  1078. if(!(flag & FL_ONTRAIN))
  1079. {
  1080. static ent
  1081. ent = pev(id, pev_groundentity)
  1082.  
  1083. if(pev_valid(ent) && (flag & FL_CONVEYOR))
  1084. {
  1085. static Float:vectemp[3]
  1086. pev(id, pev_basevelocity, vectemp)
  1087.  
  1088. xs_vec_add(g_vecvel, vectemp, g_vecvel)
  1089. }
  1090.  
  1091. if(g_hitdelay[id] > get_gametime() && (!(pev(id, pev_flags) & FL_DUCKING)))
  1092. xs_vec_mul_scalar(g_vecvel, g_class_data[g_player_class[id]][DATA_HITSPEED], g_vecvel)
  1093.  
  1094. set_pev(id, pev_velocity, g_vecvel)
  1095. return FMRES_HANDLED
  1096. }
  1097. return FMRES_IGNORED
  1098. }
  1099.  
  1100. public fwd_player_postthink(id)
  1101. {
  1102. if(!is_user_alive(id))
  1103. return FMRES_IGNORED
  1104.  
  1105. if(g_zombie[id] && g_falling[id] && (pev(id, pev_flags) & FL_ONGROUND))
  1106. {
  1107. set_pev(id, pev_watertype, CONTENTS_WATER)
  1108. g_falling[id] = false
  1109. }
  1110.  
  1111. if(get_pcvar_num(cvar_buytime))
  1112. {
  1113. if(pev_valid(g_buyzone) && g_buytime > get_gametime())
  1114. dllfunc(DLLFunc_Touch, g_buyzone, id)
  1115. }
  1116. return FMRES_IGNORED
  1117. }
  1118.  
  1119. public fwd_emitsound(id, channel, sample[], Float:volume, Float:attn, flag, pitch)
  1120. {
  1121. if(channel == CHAN_ITEM && sample[6] == 'n' && sample[7] == 'v' && sample[8] == 'g')
  1122. return FMRES_SUPERCEDE
  1123.  
  1124. if(!is_user_connected(id) || !g_zombie[id])
  1125. return FMRES_IGNORED
  1126.  
  1127. if(sample[8] == 'k' && sample[9] == 'n' && sample[10] == 'i')
  1128. {
  1129. if(sample[14] == 's' && sample[15] == 'l' && sample[16] == 'a')
  1130. {
  1131. emit_sound(id, channel, g_zombie_miss_sounds[_random(sizeof g_zombie_miss_sounds)], volume, attn, flag, pitch)
  1132. return FMRES_SUPERCEDE
  1133. }
  1134. else if(sample[14] == 'h' && sample[15] == 'i' && sample[16] == 't' || sample[14] == 's' && sample[15] == 't' && sample[16] == 'a')
  1135. {
  1136. if(sample[17] == 'w' && sample[18] == 'a' && sample[19] == 'l')
  1137. emit_sound(id, channel, g_zombie_miss_sounds[_random(sizeof g_zombie_miss_sounds)], volume, attn, flag, pitch)
  1138. else
  1139. emit_sound(id, channel, g_zombie_hit_sounds[_random(sizeof g_zombie_hit_sounds)], volume, attn, flag, pitch)
  1140.  
  1141. return FMRES_SUPERCEDE
  1142. }
  1143. }
  1144. else if(sample[7] == 'd' && (sample[8] == 'i' && sample[9] == 'e' || sample[12] == '6'))
  1145. {
  1146. emit_sound(id, channel, g_zombie_die_sounds[_random(sizeof g_zombie_die_sounds)], volume, attn, flag, pitch)
  1147. return FMRES_SUPERCEDE
  1148. }
  1149. return FMRES_IGNORED
  1150. }
  1151.  
  1152. public fwd_cmdstart(id, handle, seed)
  1153. {
  1154. if(!is_user_alive(id) || !g_zombie[id])
  1155. return FMRES_IGNORED
  1156.  
  1157. static impulse
  1158. impulse = get_uc(handle, UC_Impulse)
  1159.  
  1160. if(impulse == IMPULSE_FLASHLIGHT)
  1161. {
  1162. set_uc(handle, UC_Impulse, 0)
  1163. return FMRES_SUPERCEDE
  1164. }
  1165. return FMRES_IGNORED
  1166. }
  1167.  
  1168. public fwd_spawn(ent)
  1169. {
  1170. if(!pev_valid(ent))
  1171. return FMRES_IGNORED
  1172.  
  1173. static classname[32]
  1174. pev(ent, pev_classname, classname, 31)
  1175.  
  1176. static i
  1177. for(i = 0; i < sizeof g_remove_entities; ++i)
  1178. {
  1179. if(equal(classname, g_remove_entities[i]))
  1180. {
  1181. engfunc(EngFunc_RemoveEntity, ent)
  1182. return FMRES_SUPERCEDE
  1183. }
  1184. }
  1185. return FMRES_IGNORED
  1186. }
  1187.  
  1188. public fwd_gamedescription()
  1189. {
  1190. static gamename[32]
  1191. get_pcvar_string(cvar_gamedescription, gamename, 31)
  1192.  
  1193. forward_return(FMV_STRING, gamename)
  1194.  
  1195. return FMRES_SUPERCEDE
  1196. }
  1197.  
  1198. public fwd_createnamedentity(entclassname)
  1199. {
  1200. static classname[10]
  1201. engfunc(EngFunc_SzFromIndex, entclassname, classname, 9)
  1202.  
  1203. return (classname[7] == 'c' && classname[8] == '4') ? FMRES_SUPERCEDE : FMRES_IGNORED
  1204. }
  1205.  
  1206. public fwd_clientkill(id)
  1207. {
  1208. if(get_pcvar_num(cvar_punishsuicide) && is_user_alive(id))
  1209. g_suicide[id] = true
  1210. }
  1211.  
  1212. public fwd_setclientkeyvalue(id, infobuffer, const key[])
  1213. {
  1214. if(!equal(key, "model") || !g_blockmodel[id])
  1215. return FMRES_IGNORED
  1216.  
  1217. static model[32]
  1218. fm_get_user_model(id, model, 31)
  1219.  
  1220. if(equal(model, "gordon"))
  1221. return FMRES_IGNORED
  1222.  
  1223. g_blockmodel[id] = false
  1224.  
  1225. return FMRES_SUPERCEDE
  1226. }
  1227.  
  1228. public bacon_touch_weapon(ent, id)
  1229. return (is_user_alive(id) && g_zombie[id]) ? HAM_SUPERCEDE : HAM_IGNORED
  1230.  
  1231. public bacon_use_tank(ent, caller, activator, use_type, Float:value)
  1232. return (is_user_alive(caller) && g_zombie[caller]) ? HAM_SUPERCEDE : HAM_IGNORED
  1233.  
  1234. public bacon_use_pushable(ent, caller, activator, use_type, Float:value)
  1235. return HAM_SUPERCEDE
  1236.  
  1237. public bacon_traceattack_player(victim, attacker, Float:damage, Float:direction[3], tracehandle, damagetype)
  1238. {
  1239. if(!g_gamestarted)
  1240. return HAM_SUPERCEDE
  1241.  
  1242. if(!get_pcvar_num(cvar_knockback) || !(damagetype & DMG_BULLET))
  1243. return HAM_IGNORED
  1244.  
  1245. if(!is_user_connected(attacker) || !g_zombie[victim])
  1246. return HAM_IGNORED
  1247.  
  1248. static kbpower
  1249. kbpower = g_weapon_knockback[get_user_weapon(attacker)]
  1250.  
  1251. if(kbpower != -1)
  1252. {
  1253. static flags
  1254. flags = pev(victim, pev_flags)
  1255.  
  1256. if(get_pcvar_num(cvar_knockback_duck) && ((flags & FL_DUCKING) && (flags & FL_ONGROUND)))
  1257. return HAM_IGNORED
  1258.  
  1259. static Float:origins[2][3]
  1260. pev(victim, pev_origin, origins[0])
  1261. pev(attacker, pev_origin, origins[1])
  1262.  
  1263. if(get_distance_f(origins[0], origins[1]) <= get_pcvar_float(cvar_knockback_dist))
  1264. {
  1265. static Float:velocity[3]
  1266. pev(victim, pev_velocity, velocity)
  1267.  
  1268. static Float:tempvec
  1269. tempvec = velocity[2]
  1270.  
  1271. xs_vec_mul_scalar(direction, damage, direction)
  1272. xs_vec_mul_scalar(direction, g_class_data[g_player_class[victim]][DATA_KNOCKBACK], direction)
  1273. xs_vec_mul_scalar(direction, g_knockbackpower[kbpower], direction)
  1274.  
  1275. xs_vec_add(direction, velocity, velocity)
  1276. velocity[2] = tempvec
  1277.  
  1278. set_pev(victim, pev_velocity, velocity)
  1279.  
  1280. return HAM_HANDLED
  1281. }
  1282. }
  1283. return HAM_IGNORED
  1284. }
  1285.  
  1286. public bacon_touch_grenade(ent, world)
  1287. {
  1288. if(!get_pcvar_num(cvar_impactexplode))
  1289. return HAM_IGNORED
  1290.  
  1291. static model[12]
  1292. pev(ent, pev_model, model, 11)
  1293.  
  1294. if(model[9] == 'h' && model[10] == 'e')
  1295. {
  1296. set_pev(ent, pev_dmgtime, 0.0)
  1297.  
  1298. return HAM_HANDLED
  1299. }
  1300. return HAM_IGNORED
  1301. }
  1302.  
  1303. public bacon_takedamage_player(victim, inflictor, attacker, Float:damage, damagetype)
  1304. {
  1305. if(damagetype & DMG_GENERIC || victim == attacker || !is_user_alive(victim) || !is_user_connected(attacker))
  1306. return HAM_IGNORED
  1307.  
  1308. if(!g_gamestarted || (!g_zombie[victim] && !g_zombie[attacker]) || ((damagetype & DMG_HEGRENADE) && g_zombie[attacker]))
  1309. return HAM_SUPERCEDE
  1310.  
  1311. if(!g_zombie[attacker])
  1312. {
  1313. static pclass
  1314. pclass = g_player_class[victim]
  1315.  
  1316. damage *= (damagetype & DMG_HEGRENADE) ? g_class_data[pclass][DATA_HEDEFENCE] : g_class_data[pclass][DATA_DEFENCE]
  1317. SetHamParamFloat(4, damage)
  1318. }
  1319. else
  1320. {
  1321. if(get_user_weapon(attacker) != CSW_KNIFE)
  1322. return HAM_SUPERCEDE
  1323.  
  1324. damage *= g_class_data[g_player_class[attacker]][DATA_ATTACK]
  1325.  
  1326. static Float:armor
  1327. pev(victim, pev_armorvalue, armor)
  1328.  
  1329. if(get_pcvar_num(cvar_obeyarmor) && armor > 0.0)
  1330. {
  1331. armor -= damage
  1332.  
  1333. if(armor < 0.0)
  1334. armor = 0.0
  1335.  
  1336. set_pev(victim, pev_armorvalue, armor)
  1337. SetHamParamFloat(4, 0.0)
  1338. }
  1339. else
  1340. {
  1341. static bool:infect
  1342. infect = allow_infection()
  1343.  
  1344. g_victim[attacker] = infect ? victim : 0
  1345.  
  1346. if(!g_infecting)
  1347. SetHamParamFloat(4, infect ? 0.0 : damage)
  1348. else
  1349. SetHamParamFloat(4, 0.0)
  1350. }
  1351. }
  1352. return HAM_HANDLED
  1353. }
  1354.  
  1355. public bacon_killed_player(victim, killer, shouldgib)
  1356. {
  1357. if(!is_user_alive(killer) || g_zombie[killer] || !g_zombie[victim])
  1358. return HAM_IGNORED
  1359.  
  1360. static killbonus
  1361. killbonus = get_pcvar_num(cvar_killbonus)
  1362.  
  1363. if(killbonus)
  1364. set_pev(killer, pev_frags, pev(killer, pev_frags) + float(killbonus))
  1365.  
  1366. static killreward
  1367. killreward = get_pcvar_num(cvar_killreward)
  1368.  
  1369. if(!killreward)
  1370. return HAM_IGNORED
  1371.  
  1372. static weapon, maxclip, ent, weaponname[32]
  1373. switch(killreward)
  1374. {
  1375. case 1:
  1376. {
  1377. weapon = get_user_weapon(killer)
  1378. maxclip = g_weapon_ammo[weapon][MAX_CLIP]
  1379. if(maxclip)
  1380. {
  1381. get_weaponname(weapon, weaponname, 31)
  1382. ent = fm_find_ent_by_owner(-1, weaponname, killer)
  1383.  
  1384. fm_set_weapon_ammo(ent, maxclip)
  1385. }
  1386. }
  1387. case 2:
  1388. {
  1389. if(!user_has_weapon(killer, CSW_HEGRENADE))
  1390. bacon_give_weapon(killer, "weapon_hegrenade")
  1391. }
  1392. case 3:
  1393. {
  1394. weapon = get_user_weapon(killer)
  1395. maxclip = g_weapon_ammo[weapon][MAX_CLIP]
  1396. if(maxclip)
  1397. {
  1398. get_weaponname(weapon, weaponname, 31)
  1399. ent = fm_find_ent_by_owner(-1, weaponname, killer)
  1400.  
  1401. fm_set_weapon_ammo(ent, maxclip)
  1402. }
  1403.  
  1404. if(!user_has_weapon(killer, CSW_HEGRENADE))
  1405. bacon_give_weapon(killer, "weapon_hegrenade")
  1406. }
  1407. }
  1408. return HAM_IGNORED
  1409. }
  1410.  
  1411. public bacon_spawn_player_post(id)
  1412. {
  1413. if(!is_user_alive(id))
  1414. return HAM_IGNORED
  1415.  
  1416. static team
  1417. team = fm_get_user_team(id)
  1418.  
  1419. if(team != CS_TEAM_T && team != CS_TEAM_CT)
  1420. return HAM_IGNORED
  1421.  
  1422. if(g_zombie[id])
  1423. {
  1424. if(get_pcvar_num(cvar_respawnaszombie) && !g_roundended)
  1425. {
  1426. set_zombie_attibutes(id)
  1427.  
  1428. return HAM_IGNORED
  1429. }
  1430. else
  1431. cure_user(id)
  1432. }
  1433. else if(pev(id, pev_rendermode) == kRenderTransTexture)
  1434. reset_user_model(id)
  1435.  
  1436. set_task(0.3, "task_spawned", TASKID_SPAWNDELAY + id)
  1437. set_task(5.0, "task_checkspawn", TASKID_CHECKSPAWN + id)
  1438.  
  1439. return HAM_IGNORED
  1440. }
  1441.  
  1442. public bacon_touch_pushable(ent, id)
  1443. {
  1444. static movetype
  1445. pev(id, pev_movetype)
  1446.  
  1447. if(movetype == MOVETYPE_NOCLIP || movetype == MOVETYPE_NONE)
  1448. return HAM_IGNORED
  1449.  
  1450. if(is_user_alive(id))
  1451. {
  1452. set_pev(id, pev_movetype, MOVETYPE_WALK)
  1453.  
  1454. if(!(pev(id, pev_flags) & FL_ONGROUND))
  1455. return HAM_SUPERCEDE
  1456. }
  1457.  
  1458. if(!get_pcvar_num(cvar_shootobjects))
  1459. return HAM_IGNORED
  1460.  
  1461. static Float:velocity[2][3]
  1462. pev(ent, pev_velocity, velocity[0])
  1463.  
  1464. if(vector_length(velocity[0]) > 0.0)
  1465. {
  1466. pev(id, pev_velocity, velocity[1])
  1467. velocity[1][0] += velocity[0][0]
  1468. velocity[1][1] += velocity[0][1]
  1469.  
  1470. set_pev(id, pev_velocity, velocity[1])
  1471. }
  1472. return HAM_SUPERCEDE
  1473. }
  1474.  
  1475. public bacon_traceattack_pushable(ent, attacker, Float:damage, Float:direction[3], tracehandle, damagetype)
  1476. {
  1477. if(!get_pcvar_num(cvar_shootobjects) || !is_user_alive(attacker))
  1478. return HAM_IGNORED
  1479.  
  1480. static Float:velocity[3]
  1481. pev(ent, pev_velocity, velocity)
  1482.  
  1483. static Float:tempvec
  1484. tempvec = velocity[2]
  1485.  
  1486. xs_vec_mul_scalar(direction, damage, direction)
  1487. xs_vec_mul_scalar(direction, g_zombie[attacker] ?
  1488. get_pcvar_float(cvar_pushpwr_zombie) : get_pcvar_float(cvar_pushpwr_weapon), direction)
  1489. xs_vec_add(direction, velocity, velocity)
  1490. velocity[2] = tempvec
  1491.  
  1492. set_pev(ent, pev_velocity, velocity)
  1493.  
  1494. return HAM_HANDLED
  1495. }
  1496.  
  1497. public task_spawned(taskid)
  1498. {
  1499. static id
  1500. id = taskid - TASKID_SPAWNDELAY
  1501.  
  1502. if(is_user_alive(id))
  1503. {
  1504. if(g_welcomemsg[id])
  1505. {
  1506. g_welcomemsg[id] = false
  1507.  
  1508. static message[192]
  1509. formatex(message, 191, "%L", id, "WELCOME_TXT")
  1510. replace(message, 191, "#Version#", VERSION)
  1511.  
  1512. client_print(id, print_chat, message)
  1513. }
  1514.  
  1515. if(g_suicide[id])
  1516. {
  1517. g_suicide[id] = false
  1518.  
  1519. user_silentkill(id)
  1520. remove_task(TASKID_CHECKSPAWN + id)
  1521.  
  1522. client_print(id, print_chat, "%L", id, "SUICIDEPUNISH_TXT")
  1523.  
  1524. return
  1525. }
  1526.  
  1527. if(get_pcvar_num(cvar_weaponsmenu) && g_roundstarted && g_showmenu[id])
  1528. is_user_bot(id) ? bot_weapons(id) : display_equipmenu(id)
  1529.  
  1530. if(!g_gamestarted)
  1531. client_print(id, print_chat, "%L %L", id, "SCAN_RESULTS", id, g_preinfect[id] ? "SCAN_INFECTED" : "SCAN_CLEAN")
  1532. else
  1533. {
  1534. static team
  1535. team = fm_get_user_team(id)
  1536.  
  1537. if(team == CS_TEAM_T)
  1538. fm_set_user_team(id, CS_TEAM_CT)
  1539. }
  1540. }
  1541. }
  1542.  
  1543. public task_checkspawn(taskid)
  1544. {
  1545. static id
  1546. id = taskid - TASKID_CHECKSPAWN
  1547.  
  1548. if(!is_user_connected(id) || is_user_alive(id) || g_roundended)
  1549. return
  1550.  
  1551. static team
  1552. team = fm_get_user_team(id)
  1553.  
  1554. if(team == CS_TEAM_T || team == CS_TEAM_CT)
  1555. ExecuteHamB(Ham_CS_RoundRespawn, id)
  1556. }
  1557.  
  1558. public task_showtruehealth()
  1559. {
  1560. set_hudmessage(_, _, _, 0.03, 0.93, _, 0.2, 0.2)
  1561.  
  1562. static id, Float:health, class
  1563. for(id = 1; id <= g_maxplayers; id++) if(is_user_alive(id) && !is_user_bot(id) && g_zombie[id])
  1564. {
  1565. pev(id, pev_health, health)
  1566. class = g_player_class[id]
  1567.  
  1568. if(g_classcount > 1)
  1569. ShowSyncHudMsg(id, g_sync_hpdisplay, "Health: %0.f Class: %s (%s)", health, g_class_name[class], g_class_desc[class])
  1570. else
  1571. ShowSyncHudMsg(id, g_sync_hpdisplay, "Health: %0.f", health)
  1572. }
  1573. }
  1574.  
  1575. public task_lights()
  1576. {
  1577. static light[2]
  1578. get_pcvar_string(cvar_lights, light, 1)
  1579.  
  1580. engfunc(EngFunc_LightStyle, 0, light)
  1581. }
  1582.  
  1583. public task_updatescore(params[])
  1584. {
  1585. if(!g_gamestarted)
  1586. return
  1587.  
  1588. static attacker
  1589. attacker = params[0]
  1590.  
  1591. static victim
  1592. victim = params[1]
  1593.  
  1594. if(!is_user_connected(attacker))
  1595. return
  1596.  
  1597. static frags, deaths, team
  1598. frags = get_user_frags(attacker)
  1599. deaths = fm_get_user_deaths(attacker)
  1600. team = get_user_team(attacker)
  1601.  
  1602. message_begin(MSG_BROADCAST, g_msg_scoreinfo)
  1603. write_byte(attacker)
  1604. write_short(frags)
  1605. write_short(deaths)
  1606. write_short(0)
  1607. write_short(team)
  1608. message_end()
  1609.  
  1610. if(!is_user_connected(victim))
  1611. return
  1612.  
  1613. frags = get_user_frags(victim)
  1614. deaths = fm_get_user_deaths(victim)
  1615. team = get_user_team(victim)
  1616.  
  1617. message_begin(MSG_BROADCAST, g_msg_scoreinfo)
  1618. write_byte(victim)
  1619. write_short(frags)
  1620. write_short(deaths)
  1621. write_short(0)
  1622. write_short(team)
  1623. message_end()
  1624. }
  1625.  
  1626. public task_weaponsmenu(taskid)
  1627. {
  1628. static id
  1629. id = taskid - TASKID_WEAPONSMENU
  1630.  
  1631. if(is_user_alive(id) && !g_zombie[id] && g_menufailsafe[id])
  1632. display_equipmenu(id)
  1633. }
  1634.  
  1635. public task_stripngive(taskid)
  1636. {
  1637. static id
  1638. id = taskid - TASKID_STRIPNGIVE
  1639.  
  1640. if(is_user_alive(id))
  1641. {
  1642. fm_strip_user_weapons(id)
  1643. fm_reset_user_primary(id)
  1644. bacon_give_weapon(id, "weapon_knife")
  1645.  
  1646. set_pev(id, pev_weaponmodel2, "")
  1647. set_pev(id, pev_viewmodel2, g_class_wmodel[g_player_class[id]])
  1648. set_pev(id, pev_maxspeed, g_class_data[g_player_class[id]][DATA_SPEED])
  1649. }
  1650. }
  1651.  
  1652. public task_newround()
  1653. {
  1654. static players[32], num, zombies, i, id
  1655. get_players(players, num, "a")
  1656.  
  1657. if(num > 1)
  1658. {
  1659. for(i = 0; i < num; i++)
  1660. g_preinfect[players[i]] = false
  1661.  
  1662. zombies = clamp(floatround(num * get_pcvar_float(cvar_zombiemulti)), 1, 31)
  1663.  
  1664. i = 0
  1665. while(i < zombies)
  1666. {
  1667. id = players[_random(num)]
  1668. if(!g_preinfect[id])
  1669. {
  1670. g_preinfect[id] = true
  1671. i++
  1672. }
  1673. }
  1674. }
  1675.  
  1676. if(!get_pcvar_num(cvar_randomspawn) || g_spawncount <= 0)
  1677. return
  1678.  
  1679. static team
  1680. for(i = 0; i < num; i++)
  1681. {
  1682. id = players[i]
  1683.  
  1684. team = fm_get_user_team(id)
  1685. if(team != CS_TEAM_T && team != CS_TEAM_CT || pev(id, pev_iuser1))
  1686. continue
  1687.  
  1688. static spawn_index
  1689. spawn_index = _random(g_spawncount)
  1690.  
  1691. static Float:spawndata[3]
  1692. spawndata[0] = g_spawns[spawn_index][0]
  1693. spawndata[1] = g_spawns[spawn_index][1]
  1694. spawndata[2] = g_spawns[spawn_index][2]
  1695.  
  1696. if(!fm_is_hull_vacant(spawndata, HULL_HUMAN))
  1697. {
  1698. static i
  1699. for(i = spawn_index + 1; i != spawn_index; i++)
  1700. {
  1701. if(i >= g_spawncount) i = 0
  1702.  
  1703. spawndata[0] = g_spawns[i][0]
  1704. spawndata[1] = g_spawns[i][1]
  1705. spawndata[2] = g_spawns[i][2]
  1706.  
  1707. if(fm_is_hull_vacant(spawndata, HULL_HUMAN))
  1708. {
  1709. spawn_index = i
  1710. break
  1711. }
  1712. }
  1713. }
  1714.  
  1715. spawndata[0] = g_spawns[spawn_index][0]
  1716. spawndata[1] = g_spawns[spawn_index][1]
  1717. spawndata[2] = g_spawns[spawn_index][2]
  1718. engfunc(EngFunc_SetOrigin, id, spawndata)
  1719.  
  1720. spawndata[0] = g_spawns[spawn_index][3]
  1721. spawndata[1] = g_spawns[spawn_index][4]
  1722. spawndata[2] = g_spawns[spawn_index][5]
  1723. set_pev(id, pev_angles, spawndata)
  1724.  
  1725. spawndata[0] = g_spawns[spawn_index][6]
  1726. spawndata[1] = g_spawns[spawn_index][7]
  1727. spawndata[2] = g_spawns[spawn_index][8]
  1728. set_pev(id, pev_v_angle, spawndata)
  1729.  
  1730. set_pev(id, pev_fixangle, 1)
  1731. }
  1732. }
  1733.  
  1734. public task_initround()
  1735. {
  1736. static zombiecount, newzombie
  1737. zombiecount = 0
  1738. newzombie = 0
  1739.  
  1740. static players[32], num, i, id
  1741. get_players(players, num, "a")
  1742.  
  1743. for(i = 0; i < num; i++) if(g_preinfect[players[i]])
  1744. {
  1745. newzombie = players[i]
  1746. zombiecount++
  1747. }
  1748.  
  1749. if(zombiecount > 1)
  1750. newzombie = 0
  1751. else if(zombiecount < 1)
  1752. newzombie = players[_random(num)]
  1753.  
  1754. for(i = 0; i < num; i++)
  1755. {
  1756. id = players[i]
  1757. if(id == newzombie || g_preinfect[id])
  1758. infect_user(id, 0)
  1759. else
  1760. {
  1761. fm_set_user_team(id, CS_TEAM_CT, 0)
  1762. add_delay(id, "update_team")
  1763. }
  1764. }
  1765.  
  1766. set_hudmessage(_, _, _, _, _, 1)
  1767. if(newzombie)
  1768. {
  1769. static name[32]
  1770. get_user_name(newzombie, name, 31)
  1771.  
  1772. ShowSyncHudMsg(0, g_sync_msgdisplay, "%L", LANG_PLAYER, "INFECTED_HUD", name)
  1773. client_print(0, print_chat, "%L", LANG_PLAYER, "INFECTED_TXT", name)
  1774. }
  1775. else
  1776. {
  1777. ShowSyncHudMsg(0, g_sync_msgdisplay, "%L", LANG_PLAYER, "INFECTED_HUD2")
  1778. client_print(0, print_chat, "%L", LANG_PLAYER, "INFECTED_TXT2")
  1779. }
  1780.  
  1781. set_task(0.51, "task_startround", TASKID_STARTROUND)
  1782. }
  1783.  
  1784. public task_startround()
  1785. {
  1786. g_gamestarted = true
  1787. ExecuteForward(g_fwd_gamestart, g_fwd_result)
  1788. }
  1789.  
  1790. public task_balanceteam()
  1791. {
  1792. static players[3][32], count[3]
  1793. get_players(players[CS_TEAM_UNASSIGNED], count[CS_TEAM_UNASSIGNED])
  1794.  
  1795. count[CS_TEAM_T] = 0
  1796. count[CS_TEAM_CT] = 0
  1797.  
  1798. static i, id, team
  1799. for(i = 0; i < count[CS_TEAM_UNASSIGNED]; i++)
  1800. {
  1801. id = players[CS_TEAM_UNASSIGNED][i]
  1802. team = fm_get_user_team(id)
  1803.  
  1804. if(team == CS_TEAM_T || team == CS_TEAM_CT)
  1805. players[team][count[team]++] = id
  1806. }
  1807.  
  1808. if(abs(count[CS_TEAM_T] - count[CS_TEAM_CT]) <= 1)
  1809. return
  1810.  
  1811. static maxplayers
  1812. maxplayers = (count[CS_TEAM_T] + count[CS_TEAM_CT]) / 2
  1813.  
  1814. if(count[CS_TEAM_T] > maxplayers)
  1815. {
  1816. for(i = 0; i < (count[CS_TEAM_T] - maxplayers); i++)
  1817. fm_set_user_team(players[CS_TEAM_T][i], CS_TEAM_CT, 0)
  1818. }
  1819. else
  1820. {
  1821. for(i = 0; i < (count[CS_TEAM_CT] - maxplayers); i++)
  1822. fm_set_user_team(players[CS_TEAM_CT][i], CS_TEAM_T, 0)
  1823. }
  1824. }
  1825.  
  1826. public task_botclient_pdata(id)
  1827. {
  1828. if(g_botclient_pdata || !is_user_connected(id))
  1829. return
  1830.  
  1831. if(get_pcvar_num(cvar_botquota) && is_user_bot(id))
  1832. {
  1833. RegisterHamFromEntity(Ham_TakeDamage, id, "bacon_takedamage_player")
  1834. RegisterHamFromEntity(Ham_Killed, id, "bacon_killed_player")
  1835. RegisterHamFromEntity(Ham_TraceAttack, id, "bacon_traceattack_player")
  1836. RegisterHamFromEntity(Ham_Spawn, id, "bacon_spawn_player_post", 1)
  1837.  
  1838. g_botclient_pdata = 1
  1839. }
  1840. }
  1841.  
  1842. public bot_weapons(id)
  1843. {
  1844. g_player_weapons[id][0] = _random(sizeof g_primaryweapons)
  1845. g_player_weapons[id][1] = _random(sizeof g_secondaryweapons)
  1846.  
  1847. equipweapon(id, EQUIP_ALL)
  1848. }
  1849.  
  1850. public update_team(id)
  1851. {
  1852. if(!is_user_connected(id))
  1853. return
  1854.  
  1855. static team
  1856. team = fm_get_user_team(id)
  1857.  
  1858. if(team == CS_TEAM_T || team == CS_TEAM_CT)
  1859. {
  1860. emessage_begin(MSG_ALL, g_msg_teaminfo)
  1861. ewrite_byte(id)
  1862. ewrite_string(g_teaminfo[team])
  1863. emessage_end()
  1864. }
  1865. }
  1866.  
  1867. public infect_user(victim, attacker)
  1868. {
  1869. if(!is_user_alive(victim))
  1870. return
  1871.  
  1872. message_begin(MSG_ONE, g_msg_screenfade, _, victim)
  1873. write_short(1<<10)
  1874. write_short(1<<10)
  1875. write_short(0)
  1876. write_byte((g_mutate[victim] != -1) ? 255 : 100)
  1877. write_byte(100)
  1878. write_byte(100)
  1879. write_byte(250)
  1880. message_end()
  1881.  
  1882. if(g_mutate[victim] != -1)
  1883. {
  1884. g_player_class[victim] = g_mutate[victim]
  1885. g_mutate[victim] = -1
  1886.  
  1887. set_hudmessage(_, _, _, _, _, 1)
  1888. ShowSyncHudMsg(victim, g_sync_msgdisplay, "%L", victim, "MUTATION_HUD", g_class_name[g_player_class[victim]])
  1889. }
  1890.  
  1891. fm_set_user_team(victim, CS_TEAM_T)
  1892. set_zombie_attibutes(victim)
  1893.  
  1894. emit_sound(victim, CHAN_STATIC, g_scream_sounds[_random(sizeof g_scream_sounds)], VOL_NORM, ATTN_NONE, 0, PITCH_NORM)
  1895. ExecuteForward(g_fwd_infect, g_fwd_result, victim, attacker)
  1896. }
  1897.  
  1898. public cure_user(id)
  1899. {
  1900. if(!is_user_alive(id))
  1901. return
  1902.  
  1903. g_zombie[id] = false
  1904. g_falling[id] = false
  1905.  
  1906. reset_user_model(id)
  1907. fm_set_user_nvg(id, 0)
  1908. set_pev(id, pev_gravity, 1.0)
  1909.  
  1910. static viewmodel[64]
  1911. pev(id, pev_viewmodel2, viewmodel, 63)
  1912.  
  1913. if(equal(viewmodel, g_class_wmodel[g_player_class[id]]))
  1914. {
  1915. static weapon
  1916. weapon = fm_lastknife(id)
  1917.  
  1918. if(pev_valid(weapon))
  1919. ExecuteHam(Ham_Item_Deploy, weapon)
  1920. }
  1921. }
  1922.  
  1923. public display_equipmenu(id)
  1924. {
  1925. static menubody[512], len
  1926. len = formatex(menubody, 511, "\y%L^n^n", id, "MENU_TITLE1")
  1927.  
  1928. static bool:hasweap
  1929. hasweap = ((g_player_weapons[id][0]) != -1 && (g_player_weapons[id][1] != -1)) ? true : false
  1930.  
  1931. len += formatex(menubody[len], 511 - len,"\w1. %L^n", id, "MENU_NEWWEAPONS")
  1932. len += formatex(menubody[len], 511 - len,"%s2. %L^n", hasweap ? "\w" : "\d", id, "MENU_PREVSETUP")
  1933. len += formatex(menubody[len], 511 - len,"%s3. %L^n^n", hasweap ? "\w" : "\d", id, "MENU_DONTSHOW")
  1934. len += formatex(menubody[len], 511 - len,"\w5. %L^n", id, "MENU_EXIT")
  1935.  
  1936. static keys
  1937. keys = (MENU_KEY_1|MENU_KEY_5)
  1938.  
  1939. if(hasweap)
  1940. keys |= (MENU_KEY_2|MENU_KEY_3)
  1941.  
  1942. show_menu(id, keys, menubody, -1, "Equipment")
  1943. }
  1944.  
  1945. public action_equip(id, key)
  1946. {
  1947. if(!is_user_alive(id) || g_zombie[id])
  1948. return PLUGIN_HANDLED
  1949.  
  1950. switch(key)
  1951. {
  1952. case 0: display_weaponmenu(id, MENU_PRIMARY, g_menuposition[id] = 0)
  1953. case 1: equipweapon(id, EQUIP_ALL)
  1954. case 2:
  1955. {
  1956. g_showmenu[id] = false
  1957. equipweapon(id, EQUIP_ALL)
  1958. client_print(id, print_chat, "%L", id, "MENU_CMDENABLE")
  1959. }
  1960. }
  1961.  
  1962. if(key > 0)
  1963. {
  1964. g_menufailsafe[id] = false
  1965. remove_task(TASKID_WEAPONSMENU + id)
  1966. }
  1967. return PLUGIN_HANDLED
  1968. }
  1969.  
  1970.  
  1971. public display_weaponmenu(id, menuid, pos)
  1972. {
  1973. if(pos < 0 || menuid < 0)
  1974. return
  1975.  
  1976. static start
  1977. start = pos * 8
  1978.  
  1979. static maxitem
  1980. maxitem = menuid == MENU_PRIMARY ? sizeof g_primaryweapons : sizeof g_secondaryweapons
  1981.  
  1982. if(start >= maxitem)
  1983. start = pos = g_menuposition[id]
  1984.  
  1985. static menubody[512], len
  1986. len = formatex(menubody, 511, "\y%L\w^n^n", id, menuid == MENU_PRIMARY ? "MENU_TITLE2" : "MENU_TITLE3")
  1987.  
  1988. static end
  1989. end = start + 8
  1990. if(end > maxitem)
  1991. end = maxitem
  1992.  
  1993. static keys
  1994. keys = MENU_KEY_0
  1995.  
  1996. static a, b
  1997. b = 0
  1998.  
  1999. for(a = start; a < end; ++a)
  2000. {
  2001. keys |= (1<<b)
  2002. len += formatex(menubody[len], 511 - len,"%d. %s^n", ++b, menuid == MENU_PRIMARY ? g_primaryweapons[a][0]: g_secondaryweapons[a][0])
  2003. }
  2004.  
  2005. if(end != maxitem)
  2006. {
  2007. formatex(menubody[len], 511 - len, "^n9. %L^n0. %L", id, "MENU_MORE", id, pos ? "MENU_BACK" : "MENU_EXIT")
  2008. keys |= MENU_KEY_9
  2009. }
  2010. else
  2011. formatex(menubody[len], 511 - len, "^n0. %L", id, pos ? "MENU_BACK" : "MENU_EXIT")
  2012.  
  2013. show_menu(id, keys, menubody, -1, menuid == MENU_PRIMARY ? "Primary" : "Secondary")
  2014. }
  2015.  
  2016. public action_prim(id, key)
  2017. {
  2018. if(!is_user_alive(id) || g_zombie[id])
  2019. return PLUGIN_HANDLED
  2020.  
  2021. switch(key)
  2022. {
  2023. case 8: display_weaponmenu(id, MENU_PRIMARY, ++g_menuposition[id])
  2024. case 9: display_weaponmenu(id, MENU_PRIMARY, --g_menuposition[id])
  2025. default:
  2026. {
  2027. g_player_weapons[id][0] = g_menuposition[id] * 8 + key
  2028. equipweapon(id, EQUIP_PRI)
  2029.  
  2030. display_weaponmenu(id, MENU_SECONDARY, g_menuposition[id] = 0)
  2031. }
  2032. }
  2033. return PLUGIN_HANDLED
  2034. }
  2035.  
  2036. public action_sec(id, key)
  2037. {
  2038. if(!is_user_alive(id) || g_zombie[id])
  2039. return PLUGIN_HANDLED
  2040.  
  2041. switch(key)
  2042. {
  2043. case 8: display_weaponmenu(id, MENU_SECONDARY, ++g_menuposition[id])
  2044. case 9: display_weaponmenu(id, MENU_SECONDARY, --g_menuposition[id])
  2045. default:
  2046. {
  2047. g_menufailsafe[id] = false
  2048. remove_task(TASKID_WEAPONSMENU + id)
  2049.  
  2050. g_player_weapons[id][1] = g_menuposition[id] * 8 + key
  2051. equipweapon(id, EQUIP_SEC)
  2052. equipweapon(id, EQUIP_GREN)
  2053. }
  2054. }
  2055. return PLUGIN_HANDLED
  2056. }
  2057.  
  2058. public display_classmenu(id, pos)
  2059. {
  2060. if(pos < 0)
  2061. return
  2062.  
  2063. static start
  2064. start = pos * 8
  2065.  
  2066. static maxitem
  2067. maxitem = g_classcount
  2068.  
  2069. if(start >= maxitem)
  2070. start = pos = g_menuposition[id]
  2071.  
  2072. static menubody[512], len
  2073. len = formatex(menubody, 511, "\y%L\w^n^n", id, "MENU_TITLE4")
  2074.  
  2075. static end
  2076. end = start + 8
  2077.  
  2078. if(end > maxitem)
  2079. end = maxitem
  2080.  
  2081. static keys
  2082. keys = MENU_KEY_0
  2083.  
  2084. static a, b
  2085. b = 0
  2086.  
  2087. for(a = start; a < end; ++a)
  2088. {
  2089. keys |= (1<<b)
  2090. len += formatex(menubody[len], 511 - len,"%d. %s^n", ++b, g_class_name[a])
  2091. }
  2092.  
  2093. if(end != maxitem)
  2094. {
  2095. formatex(menubody[len], 511 - len, "^n9. %L^n0. %L", id, "MENU_MORE", id, pos ? "MENU_BACK" : "MENU_EXIT")
  2096. keys |= MENU_KEY_9
  2097. }
  2098. else
  2099. formatex(menubody[len], 511 - len, "^n0. %L", id, pos ? "MENU_BACK" : "MENU_EXIT")
  2100.  
  2101. show_menu(id, keys, menubody, -1, "Class")
  2102. }
  2103.  
  2104. public action_class(id, key)
  2105. {
  2106. switch(key)
  2107. {
  2108. case 8: display_classmenu(id, ++g_menuposition[id])
  2109. case 9: display_classmenu(id, --g_menuposition[id])
  2110. default:
  2111. {
  2112. g_mutate[id] = g_menuposition[id] * 8 + key
  2113. client_print(id, print_chat, "%L", id, "MENU_CHANGECLASS", g_class_name[g_mutate[id]])
  2114. }
  2115. }
  2116. return PLUGIN_HANDLED
  2117. }
  2118.  
  2119. public register_spawnpoints(const mapname[])
  2120. {
  2121. new configdir[32]
  2122. get_configsdir(configdir, 31)
  2123.  
  2124. new csdmfile[64], line[64], data[10][6]
  2125. formatex(csdmfile, 63, "%s/csdm/%s.spawns.cfg", configdir, mapname)
  2126.  
  2127. if(file_exists(csdmfile))
  2128. {
  2129. new file
  2130. file = fopen(csdmfile, "rt")
  2131.  
  2132. while(file && !feof(file))
  2133. {
  2134. fgets(file, line, 63)
  2135. if(!line[0] || str_count(line,' ') < 2)
  2136. continue
  2137.  
  2138. parse(line, data[0], 5, data[1], 5, data[2], 5, data[3], 5, data[4], 5, data[5], 5, data[6], 5, data[7], 5, data[8], 5, data[9], 5)
  2139.  
  2140. g_spawns[g_spawncount][0] = floatstr(data[0]), g_spawns[g_spawncount][1] = floatstr(data[1])
  2141. g_spawns[g_spawncount][2] = floatstr(data[2]), g_spawns[g_spawncount][3] = floatstr(data[3])
  2142. g_spawns[g_spawncount][4] = floatstr(data[4]), g_spawns[g_spawncount][5] = floatstr(data[5])
  2143. g_spawns[g_spawncount][6] = floatstr(data[7]), g_spawns[g_spawncount][7] = floatstr(data[8])
  2144. g_spawns[g_spawncount][8] = floatstr(data[9])
  2145.  
  2146. if(++g_spawncount >= MAX_SPAWNS)
  2147. break
  2148. }
  2149. if(file)
  2150. fclose(file)
  2151. }
  2152. }
  2153.  
  2154. public register_zombieclasses(filename[])
  2155. {
  2156. new configdir[32]
  2157. get_configsdir(configdir, 31)
  2158.  
  2159. new configfile[64]
  2160. formatex(configfile, 63, "%s/%s", configdir, filename)
  2161.  
  2162. if(get_pcvar_num(cvar_zombie_class) && file_exists(configfile))
  2163. {
  2164. new line[128], leftstr[32], rightstr[64], classname[32], data[MAX_DATA], i
  2165.  
  2166. new file
  2167. file = fopen(configfile, "rt")
  2168.  
  2169. while(file && !feof(file))
  2170. {
  2171. fgets(file, line, 127), trim(line)
  2172. if(!line[0] || line[0] == ';') continue
  2173.  
  2174. if(line[0] == '[' && line[strlen(line) - 1] == ']')
  2175. {
  2176. copy(classname, strlen(line) - 2, line[1])
  2177.  
  2178. if(register_class(classname) == -1)
  2179. break
  2180.  
  2181. continue
  2182. }
  2183. strtok(line, leftstr, 31, rightstr, 63, '=', 1)
  2184.  
  2185. if(equali(leftstr, "DESC"))
  2186. copy(g_class_desc[g_classcount - 1], 31, rightstr)
  2187. else if(equali(leftstr, "PMODEL"))
  2188. copy(g_class_pmodel[g_classcount - 1], 63, rightstr)
  2189. else if(equali(leftstr, "WMODEL"))
  2190. copy(g_class_wmodel[g_classcount - 1], 63, rightstr)
  2191.  
  2192. for(i = 0; i < MAX_DATA; i++)
  2193. data[i] = equali(leftstr, g_dataname[i])
  2194.  
  2195. for(i = 0; i < MAX_DATA; i++) if(data[i])
  2196. {
  2197. g_class_data[g_classcount - 1][i] = floatstr(rightstr)
  2198. break
  2199. }
  2200. }
  2201. if(file) fclose(file)
  2202. }
  2203. else
  2204. register_class("default")
  2205. }
  2206.  
  2207. public register_class(classname[])
  2208. {
  2209. if(g_classcount >= MAX_CLASSES)
  2210. return -1
  2211.  
  2212. copy(g_class_name[g_classcount], 31, classname)
  2213. copy(g_class_pmodel[g_classcount], 63, DEFAULT_PMODEL)
  2214. copy(g_class_wmodel[g_classcount], 63, DEFAULT_WMODEL)
  2215.  
  2216. g_class_data[g_classcount][DATA_HEALTH] = DEFAULT_HEALTH
  2217. g_class_data[g_classcount][DATA_SPEED] = DEFAULT_SPEED
  2218. g_class_data[g_classcount][DATA_GRAVITY] = DEFAULT_GRAVITY
  2219. g_class_data[g_classcount][DATA_ATTACK] = DEFAULT_ATTACK
  2220. g_class_data[g_classcount][DATA_DEFENCE] = DEFAULT_DEFENCE
  2221. g_class_data[g_classcount][DATA_HEDEFENCE] = DEFAULT_HEDEFENCE
  2222. g_class_data[g_classcount][DATA_HITSPEED] = DEFAULT_HITSPEED
  2223. g_class_data[g_classcount][DATA_HITDELAY] = DEFAULT_HITDELAY
  2224. g_class_data[g_classcount][DATA_REGENDLY] = DEFAULT_REGENDLY
  2225. g_class_data[g_classcount][DATA_HITREGENDLY] = DEFAULT_HITREGENDLY
  2226. g_class_data[g_classcount++][DATA_KNOCKBACK] = DEFAULT_KNOCKBACK
  2227.  
  2228. return (g_classcount - 1)
  2229. }
  2230.  
  2231. public native_register_class(classname[], description[])
  2232. {
  2233. param_convert(1)
  2234. param_convert(2)
  2235.  
  2236. static classid
  2237. classid = register_class(classname)
  2238.  
  2239. if(classid != -1)
  2240. copy(g_class_desc[classid], 31, description)
  2241.  
  2242. return classid
  2243. }
  2244.  
  2245. public native_set_class_pmodel(classid, player_model[])
  2246. {
  2247. param_convert(2)
  2248. copy(g_class_pmodel[classid], 63, player_model)
  2249. }
  2250.  
  2251. public native_set_class_wmodel(classid, weapon_model[])
  2252. {
  2253. param_convert(2)
  2254. copy(g_class_wmodel[classid], 63, weapon_model)
  2255. }
  2256.  
  2257. public native_is_user_zombie(index)
  2258. return g_zombie[index] == true ? 1 : 0
  2259.  
  2260. public native_get_user_class(index)
  2261. return g_player_class[index]
  2262.  
  2263. public native_is_user_infected(index)
  2264. return g_preinfect[index] == true ? 1 : 0
  2265.  
  2266. public native_game_started()
  2267. return g_gamestarted
  2268.  
  2269. public native_preinfect_user(index, bool:yesno)
  2270. {
  2271. if(is_user_alive(index) && !g_gamestarted)
  2272. g_preinfect[index] = yesno
  2273. }
  2274.  
  2275. public native_infect_user(victim, attacker)
  2276. {
  2277. if(allow_infection() && g_gamestarted)
  2278. infect_user(victim, attacker)
  2279. }
  2280.  
  2281. public native_cure_user(index)
  2282. cure_user(index)
  2283.  
  2284. public native_get_class_id(classname[])
  2285. {
  2286. param_convert(1)
  2287.  
  2288. static i
  2289. for(i = 0; i < g_classcount; i++)
  2290. {
  2291. if(equali(classname, g_class_name[i]))
  2292. return i
  2293. }
  2294. return -1
  2295. }
  2296.  
  2297. public Float:native_get_class_data(classid, dataid)
  2298. return g_class_data[classid][dataid]
  2299.  
  2300. public native_set_class_data(classid, dataid, Float:value)
  2301. g_class_data[classid][dataid] = value
  2302.  
  2303. stock bool:fm_is_hull_vacant(const Float:origin[3], hull)
  2304. {
  2305. static tr
  2306. tr = 0
  2307.  
  2308. engfunc(EngFunc_TraceHull, origin, origin, 0, hull, 0, tr)
  2309. return (!get_tr2(tr, TR_StartSolid) && !get_tr2(tr, TR_AllSolid) && get_tr2(tr, TR_InOpen)) ? true : false
  2310. }
  2311.  
  2312. stock fm_set_kvd(entity, const key[], const value[], const classname[] = "")
  2313. {
  2314. set_kvd(0, KV_ClassName, classname)
  2315. set_kvd(0, KV_KeyName, key)
  2316. set_kvd(0, KV_Value, value)
  2317. set_kvd(0, KV_fHandled, 0)
  2318.  
  2319. return dllfunc(DLLFunc_KeyValue, entity, 0)
  2320. }
  2321.  
  2322. stock fm_strip_user_weapons(index)
  2323. {
  2324. static stripent
  2325. if(!pev_valid(stripent))
  2326. {
  2327. stripent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "player_weaponstrip"))
  2328. dllfunc(DLLFunc_Spawn, stripent), set_pev(stripent, pev_solid, SOLID_NOT)
  2329. }
  2330. dllfunc(DLLFunc_Use, stripent, index)
  2331.  
  2332. return 1
  2333. }
  2334.  
  2335. stock fm_set_entity_visibility(index, visible = 1)
  2336. set_pev(index, pev_effects, visible == 1 ? pev(index, pev_effects) & ~EF_NODRAW : pev(index, pev_effects) | EF_NODRAW)
  2337.  
  2338. stock fm_find_ent_by_owner(index, const classname[], owner)
  2339. {
  2340. static ent
  2341. ent = index
  2342.  
  2343. while((ent = engfunc(EngFunc_FindEntityByString, ent, "classname", classname)) && pev(ent, pev_owner) != owner) {}
  2344.  
  2345. return ent
  2346. }
  2347.  
  2348. stock bacon_give_weapon(index, weapon[])
  2349. {
  2350. if(!equal(weapon,"weapon_", 7))
  2351. return 0
  2352.  
  2353. static ent
  2354. ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, weapon))
  2355.  
  2356. if(!pev_valid(ent))
  2357. return 0
  2358.  
  2359. set_pev(ent, pev_spawnflags, SF_NORESPAWN)
  2360. dllfunc(DLLFunc_Spawn, ent)
  2361.  
  2362. if(!ExecuteHamB(Ham_AddPlayerItem, index, ent))
  2363. {
  2364. if(pev_valid(ent)) set_pev(ent, pev_flags, pev(ent, pev_flags) | FL_KILLME)
  2365. return 0
  2366. }
  2367. ExecuteHamB(Ham_Item_AttachToPlayer, ent, index)
  2368.  
  2369. return 1
  2370. }
  2371.  
  2372. stock bacon_strip_weapon(index, weapon[])
  2373. {
  2374. if(!equal(weapon, "weapon_", 7))
  2375. return 0
  2376.  
  2377. static weaponid
  2378. weaponid = get_weaponid(weapon)
  2379.  
  2380. if(!weaponid)
  2381. return 0
  2382.  
  2383. static weaponent
  2384. weaponent = fm_find_ent_by_owner(-1, weapon, index)
  2385.  
  2386. if(!weaponent)
  2387. return 0
  2388.  
  2389. if(get_user_weapon(index) == weaponid)
  2390. ExecuteHamB(Ham_Weapon_RetireWeapon, weaponent)
  2391.  
  2392. if(!ExecuteHamB(Ham_RemovePlayerItem, index, weaponent))
  2393. return 0
  2394.  
  2395. ExecuteHamB(Ham_Item_Kill, weaponent)
  2396. set_pev(index, pev_weapons, pev(index, pev_weapons) & ~(1<<weaponid))
  2397.  
  2398. return 1
  2399. }
  2400.  
  2401. stock fm_set_user_team(index, team, update = 1)
  2402. {
  2403. set_pdata_int(index, OFFSET_TEAM, team)
  2404. if(update)
  2405. {
  2406. emessage_begin(MSG_ALL, g_msg_teaminfo)
  2407. ewrite_byte(index)
  2408. ewrite_string(g_teaminfo[team])
  2409. emessage_end()
  2410. }
  2411. return 1
  2412. }
  2413.  
  2414. stock fm_get_user_bpammo(index, weapon)
  2415. {
  2416. static offset
  2417. switch(weapon)
  2418. {
  2419. case CSW_AWP: offset = OFFSET_AMMO_338MAGNUM
  2420. case CSW_SCOUT, CSW_AK47, CSW_G3SG1: offset = OFFSET_AMMO_762NATO
  2421. case CSW_M249: offset = OFFSET_AMMO_556NATOBOX
  2422. case CSW_FAMAS, CSW_M4A1, CSW_AUG,
  2423. CSW_SG550, CSW_GALI, CSW_SG552: offset = OFFSET_AMMO_556NATO
  2424. case CSW_M3, CSW_XM1014: offset = OFFSET_AMMO_BUCKSHOT
  2425. case CSW_USP, CSW_UMP45, CSW_MAC10: offset = OFFSET_AMMO_45ACP
  2426. case CSW_FIVESEVEN, CSW_P90: offset = OFFSET_AMMO_57MM
  2427. case CSW_DEAGLE: offset = OFFSET_AMMO_50AE
  2428. case CSW_P228: offset = OFFSET_AMMO_357SIG
  2429. case CSW_GLOCK18, CSW_TMP, CSW_ELITE,
  2430. CSW_MP5NAVY: offset = OFFSET_AMMO_9MM
  2431. default: offset = 0
  2432. }
  2433. return offset ? get_pdata_int(index, offset) : 0
  2434. }
  2435.  
  2436. stock fm_set_user_bpammo(index, weapon, amount)
  2437. {
  2438. static offset
  2439. switch(weapon)
  2440. {
  2441. case CSW_AWP: offset = OFFSET_AMMO_338MAGNUM
  2442. case CSW_SCOUT, CSW_AK47, CSW_G3SG1: offset = OFFSET_AMMO_762NATO
  2443. case CSW_M249: offset = OFFSET_AMMO_556NATOBOX
  2444. case CSW_FAMAS, CSW_M4A1, CSW_AUG,
  2445. CSW_SG550, CSW_GALI, CSW_SG552: offset = OFFSET_AMMO_556NATO
  2446. case CSW_M3, CSW_XM1014: offset = OFFSET_AMMO_BUCKSHOT
  2447. case CSW_USP, CSW_UMP45, CSW_MAC10: offset = OFFSET_AMMO_45ACP
  2448. case CSW_FIVESEVEN, CSW_P90: offset = OFFSET_AMMO_57MM
  2449. case CSW_DEAGLE: offset = OFFSET_AMMO_50AE
  2450. case CSW_P228: offset = OFFSET_AMMO_357SIG
  2451. case CSW_GLOCK18, CSW_TMP, CSW_ELITE,
  2452. CSW_MP5NAVY: offset = OFFSET_AMMO_9MM
  2453. default: offset = 0
  2454. }
  2455.  
  2456. if(offset)
  2457. set_pdata_int(index, offset, amount)
  2458.  
  2459. return 1
  2460. }
  2461.  
  2462. stock fm_set_user_nvg(index, onoff = 1)
  2463. {
  2464. static nvg
  2465. nvg = get_pdata_int(index, OFFSET_NVG)
  2466.  
  2467. set_pdata_int(index, OFFSET_NVG, onoff == 1 ? nvg | HAS_NVG : nvg & ~HAS_NVG)
  2468. return 1
  2469. }
  2470.  
  2471. stock fm_set_user_money(index, addmoney, update = 1)
  2472. {
  2473. static money
  2474. money = fm_get_user_money(index) + addmoney
  2475.  
  2476. set_pdata_int(index, OFFSET_CSMONEY, money)
  2477.  
  2478. if(update)
  2479. {
  2480. message_begin(MSG_ONE, g_msg_money, _, index)
  2481. write_long(clamp(money, 0, 16000))
  2482. write_byte(1)
  2483. message_end()
  2484. }
  2485. return 1
  2486. }
  2487.  
  2488. stock str_count(str[], searchchar)
  2489. {
  2490. static maxlen
  2491. maxlen = strlen(str)
  2492.  
  2493. static i, count
  2494. count = 0
  2495.  
  2496. for(i = 0; i <= maxlen; i++) if(str[i] == searchchar)
  2497. count++
  2498.  
  2499. return count
  2500. }
  2501.  
  2502. stock reset_user_model(index)
  2503. {
  2504. set_pev(index, pev_rendermode, kRenderNormal)
  2505. set_pev(index, pev_renderamt, 0.0)
  2506.  
  2507. if(pev_valid(g_modelent[index]))
  2508. fm_set_entity_visibility(g_modelent[index], 0)
  2509. }
  2510.  
  2511. stock remove_user_model(ent)
  2512. {
  2513. static id
  2514. id = pev(ent, pev_owner)
  2515.  
  2516. if(pev_valid(ent))
  2517. engfunc(EngFunc_RemoveEntity, ent)
  2518.  
  2519. g_modelent[id] = 0
  2520. }
  2521.  
  2522. stock set_zombie_attibutes(index)
  2523. {
  2524. if(!is_user_alive(index))
  2525. return
  2526.  
  2527. g_zombie[index] = true
  2528.  
  2529. if(!task_exists(TASKID_STRIPNGIVE + index))
  2530. set_task(0.1, "task_stripngive", TASKID_STRIPNGIVE + index)
  2531.  
  2532. static Float:health
  2533. health = g_class_data[g_player_class[index]][DATA_HEALTH]
  2534.  
  2535. if(g_preinfect[index])
  2536. health *= get_pcvar_float(cvar_zombie_hpmulti)
  2537.  
  2538. set_pev(index, pev_health, health)
  2539. set_pev(index, pev_gravity, g_class_data[g_player_class[index]][DATA_GRAVITY])
  2540. set_pev(index, pev_body, 0)
  2541. set_pev(index, pev_armorvalue, 0.0)
  2542. set_pev(index, pev_renderamt, 0.0)
  2543. set_pev(index, pev_rendermode, kRenderTransTexture)
  2544.  
  2545. fm_set_user_armortype(index, CS_ARMOR_NONE)
  2546. fm_set_user_nvg(index)
  2547.  
  2548. if(get_pcvar_num(cvar_autonvg))
  2549. engclient_cmd(index, "nightvision")
  2550.  
  2551. if(!pev_valid(g_modelent[index]))
  2552. {
  2553. static ent
  2554. ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target"))
  2555. if(pev_valid(ent))
  2556. {
  2557. engfunc(EngFunc_SetModel, ent, g_class_pmodel[g_player_class[index]])
  2558. set_pev(ent, pev_classname, MODEL_CLASSNAME)
  2559. set_pev(ent, pev_movetype, MOVETYPE_FOLLOW)
  2560. set_pev(ent, pev_aiment, index)
  2561. set_pev(ent, pev_owner, index)
  2562.  
  2563. g_modelent[index] = ent
  2564. }
  2565. }
  2566. else
  2567. {
  2568. engfunc(EngFunc_SetModel, g_modelent[index], g_class_pmodel[g_player_class[index]])
  2569. fm_set_entity_visibility(g_modelent[index], 1)
  2570. }
  2571.  
  2572. static effects
  2573. effects = pev(index, pev_effects)
  2574.  
  2575. if(effects & EF_DIMLIGHT)
  2576. {
  2577. message_begin(MSG_ONE, g_msg_flashlight, _, index)
  2578. write_byte(0)
  2579. write_byte(100)
  2580. message_end()
  2581.  
  2582. set_pev(index, pev_effects, effects & ~EF_DIMLIGHT)
  2583. }
  2584. }
  2585.  
  2586. stock bool:allow_infection()
  2587. {
  2588. static count[2]
  2589. count[0] = 0
  2590. count[1] = 0
  2591.  
  2592. static index, maxzombies
  2593. for(index = 1; index <= g_maxplayers; index++)
  2594. {
  2595. if(is_user_connected(index) && g_zombie[index])
  2596. count[0]++
  2597. else if(is_user_alive(index))
  2598. count[1]++
  2599. }
  2600.  
  2601. maxzombies = clamp(get_pcvar_num(cvar_maxzombies), 1, 31)
  2602. return (count[0] < maxzombies && count[1] > 1) ? true : false
  2603. }
  2604.  
  2605. stock randomly_pick_zombie()
  2606. {
  2607. static data[4]
  2608. data[0] = 0
  2609. data[1] = 0
  2610. data[2] = 0
  2611. data[3] = 0
  2612.  
  2613. static index, players[2][32]
  2614. for(index = 1; index <= g_maxplayers; index++)
  2615. {
  2616. if(!is_user_alive(index))
  2617. continue
  2618.  
  2619. if(g_zombie[index])
  2620. {
  2621. data[0]++
  2622. players[0][data[2]++] = index
  2623. }
  2624. else
  2625. {
  2626. data[1]++
  2627. players[1][data[3]++] = index
  2628. }
  2629. }
  2630.  
  2631. if(data[0] > 0 && data[1] < 1)
  2632. return players[0][_random(data[2])]
  2633.  
  2634. return (data[0] < 1 && data[1] > 0) ? players[1][_random(data[3])] : 0
  2635. }
  2636.  
  2637. stock equipweapon(id, weapon)
  2638. {
  2639. if(!is_user_alive(id))
  2640. return
  2641.  
  2642. static weaponid[2], weaponent, weapname[32]
  2643.  
  2644. if(weapon & EQUIP_PRI)
  2645. {
  2646. weaponent = fm_lastprimary(id)
  2647. weaponid[1] = get_weaponid(g_primaryweapons[g_player_weapons[id][0]][1])
  2648.  
  2649. if(pev_valid(weaponent))
  2650. {
  2651. weaponid[0] = fm_get_weapon_id(weaponent)
  2652. if(weaponid[0] != weaponid[1])
  2653. {
  2654. get_weaponname(weaponid[0], weapname, 31)
  2655. bacon_strip_weapon(id, weapname)
  2656. }
  2657. }
  2658. else
  2659. weaponid[0] = -1
  2660.  
  2661. if(weaponid[0] != weaponid[1])
  2662. bacon_give_weapon(id, g_primaryweapons[g_player_weapons[id][0]][1])
  2663.  
  2664. fm_set_user_bpammo(id, weaponid[1], g_weapon_ammo[weaponid[1]][MAX_AMMO])
  2665. }
  2666.  
  2667. if(weapon & EQUIP_SEC)
  2668. {
  2669. weaponent = fm_lastsecondry(id)
  2670. weaponid[1] = get_weaponid(g_secondaryweapons[g_player_weapons[id][1]][1])
  2671.  
  2672. if(pev_valid(weaponent))
  2673. {
  2674. weaponid[0] = fm_get_weapon_id(weaponent)
  2675. if(weaponid[0] != weaponid[1])
  2676. {
  2677. get_weaponname(weaponid[0], weapname, 31)
  2678. bacon_strip_weapon(id, weapname)
  2679. }
  2680. }
  2681. else
  2682. weaponid[0] = -1
  2683.  
  2684. if(weaponid[0] != weaponid[1])
  2685. bacon_give_weapon(id, g_secondaryweapons[g_player_weapons[id][1]][1])
  2686.  
  2687. fm_set_user_bpammo(id, weaponid[1], g_weapon_ammo[weaponid[1]][MAX_AMMO])
  2688. }
  2689.  
  2690. if(weapon & EQUIP_GREN)
  2691. {
  2692. static i
  2693. for(i = 0; i < sizeof g_grenades; i++) if(!user_has_weapon(id, get_weaponid(g_grenades[i])))
  2694. bacon_give_weapon(id, g_grenades[i])
  2695. }
  2696. }
  2697.  
  2698. stock add_delay(index, const task[])
  2699. {
  2700. switch(index)
  2701. {
  2702. case 1..8: set_task(0.1, task, index)
  2703. case 9..16: set_task(0.2, task, index)
  2704. case 17..24: set_task(0.3, task, index)
  2705. case 25..32: set_task(0.4, task, index)
  2706. }
  2707. }