Advertisement
Guest User

Untitled

a guest
Jan 25th, 2020
131
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.06 KB | None | 0 0
  1. #include <zombie_escape>
  2. #include <cstrike>
  3.  
  4. // Uncomment to use custom model for nemesis
  5. // Note: This includes player model & claws
  6. #define USE_NEMESIS_MODEL
  7.  
  8. // Uncomment to use leap for nemesis
  9. // Leap Code: https://escapers-zone.net/viewtopic.php?p=10582#p10582
  10. #define USE_NEMESIS_LEAP
  11.  
  12. #define TASK_MAKE_NEMESIS 4949849
  13. #define TASK_AMBIENCESOUND 2020
  14. #define TASK_REAMBIENCESOUND 5050
  15.  
  16. // Access to start nemesis round
  17. #define STARTNEMESIS_ACCESS ADMIN_CVAR
  18.  
  19. // Settings file
  20. new const ZE_SETTING_FILE[] = "zombie_escape.ini"
  21.  
  22. #if defined USE_NEMESIS_MODEL
  23. // Default models
  24. new const g_szModels_Nemesis_Player[][] = { "revenant_red" }
  25. new const g_szModels_Nemesis_Claws[][] = { "models/zombie_escape/v_nem_knife.mdl" }
  26.  
  27. new Array:g_aModels_Nemesis_Player,
  28. Array:g_aModels_Nemesis_Claws
  29. #endif
  30.  
  31. #if defined USE_NEMESIS_LEAP
  32. native ze_get_longjump(id)
  33. native ze_remove_longjump(id)
  34. #endif
  35.  
  36. enum _:Colors
  37. {
  38. Red = 0,
  39. Green,
  40. Blue
  41. }
  42.  
  43. new g_iAmbianceSoundDuration = 160 // Set ambience duration = highest sound duration
  44. new const szAmbianceSound[][] =
  45. {
  46. "zombie_escape/ze_ambiance1.mp3"
  47. }
  48.  
  49. new bool:g_bIsNemesis[33],
  50. bool:g_bIsNextRoundNemesis = false,
  51. g_iCountDown,
  52. Array:g_szAmbianceSound
  53.  
  54. new g_pCvarNemesisHP,
  55. g_pCvarNemesisGravity,
  56. g_pCvarNemesisSpeed,
  57. g_pCvarNemesisGlow,
  58. g_pCvarNemesisGlowColor[Colors],
  59. g_pCvarNemesisKB,
  60. g_pCvarNemesisDmg,
  61. g_pCvarNemesisFreeze,
  62. g_pCvarNemesisFire
  63.  
  64. public plugin_natives()
  65. {
  66. register_native("ze_is_user_nemesis", "native_ze_is_user_nemesis", 1)
  67. register_native("ze_set_user_nemesis", "native_ze_set_user_nemesis", 1)
  68. }
  69.  
  70. public plugin_precache()
  71. {
  72. g_szAmbianceSound = ArrayCreate(64, 1)
  73. amx_load_setting_string_arr(ZE_SETTING_FILE, "Sounds", "Nemesis Round Ambiance", g_szAmbianceSound)
  74.  
  75. new iIndex, szSound[64]
  76. if (ArraySize(g_szAmbianceSound) == 0)
  77. {
  78. for (iIndex = 0; iIndex < sizeof szAmbianceSound; iIndex++)
  79. ArrayPushString(g_szAmbianceSound, szAmbianceSound[iIndex])
  80.  
  81. // Save to external file
  82. amx_save_setting_string_arr(ZE_SETTING_FILE, "Sounds", "Nemesis Round Ambiance", g_szAmbianceSound)
  83. }
  84.  
  85. for (iIndex = 0; iIndex < ArraySize(g_szAmbianceSound); iIndex++)
  86. {
  87. ArrayGetString(g_szAmbianceSound, iIndex, szSound, charsmax(szSound))
  88.  
  89. if (equal(szSound[strlen(szSound)-4], ".mp3"))
  90. {
  91. format(szSound, charsmax(szSound), "sound/%s", szSound)
  92. precache_generic(szSound)
  93. }
  94. else
  95. {
  96. precache_sound(szSound)
  97. }
  98. }
  99.  
  100. #if defined USE_NEMESIS_MODEL
  101. // Initialize arrays
  102. g_aModels_Nemesis_Player = ArrayCreate(32, 1)
  103. g_aModels_Nemesis_Claws = ArrayCreate(64, 1)
  104.  
  105. // Load from external file
  106. amx_load_setting_string_arr(ZE_SETTING_FILE, "Player Models", "NEMESIS MODEL", g_aModels_Nemesis_Player)
  107. amx_load_setting_string_arr(ZE_SETTING_FILE, "Weapon Models", "V_KNIFE NEMESIS", g_aModels_Nemesis_Claws)
  108.  
  109. // If we couldn't load from file, use and save default ones
  110. if (ArraySize(g_aModels_Nemesis_Player) == 0)
  111. {
  112. for (iIndex = 0; iIndex < sizeof g_szModels_Nemesis_Player; iIndex++)
  113. ArrayPushString(g_aModels_Nemesis_Player, g_szModels_Nemesis_Player[iIndex])
  114.  
  115. // Save to external file
  116. amx_save_setting_string_arr(ZE_SETTING_FILE, "Player Models", "NEMESIS", g_aModels_Nemesis_Player)
  117. }
  118.  
  119. if (ArraySize(g_aModels_Nemesis_Claws) == 0)
  120. {
  121. for (iIndex = 0; iIndex < sizeof g_szModels_Nemesis_Claws; iIndex++)
  122. ArrayPushString(g_aModels_Nemesis_Claws, g_szModels_Nemesis_Claws[iIndex])
  123.  
  124. // Save to external file
  125. amx_save_setting_string_arr(ZE_SETTING_FILE, "Weapon Models", "V_KNIFE NEMESIS", g_aModels_Nemesis_Claws)
  126. }
  127.  
  128. // Precache models
  129. new player_model[32], model[64], model_path[128]
  130.  
  131. for (iIndex = 0; iIndex < ArraySize(g_aModels_Nemesis_Player); iIndex++)
  132. {
  133. ArrayGetString(g_aModels_Nemesis_Player, iIndex, player_model, charsmax(player_model))
  134. formatex(model_path, charsmax(model_path), "models/player/%s/%s.mdl", player_model, player_model)
  135. precache_model(model_path)
  136. // Support modelT.mdl files
  137. formatex(model_path, charsmax(model_path), "models/player/%s/%sT.mdl", player_model, player_model)
  138. if (file_exists(model_path)) precache_model(model_path)
  139. }
  140.  
  141. for (iIndex = 0; iIndex < ArraySize(g_aModels_Nemesis_Claws); iIndex++)
  142. {
  143. ArrayGetString(g_aModels_Nemesis_Claws, iIndex, model, charsmax(model))
  144. precache_model(model)
  145. }
  146. #endif
  147. }
  148.  
  149. public plugin_init()
  150. {
  151. register_plugin("[ZE] Addons: Nemesis", "2.0", "Jack")
  152.  
  153. RegisterHam(Ham_TakeDamage, "player", "Fw_TakeDamage")
  154.  
  155. register_clcmd("ze_start_nemesis_next", "cmd_start_nemesis", STARTNEMESIS_ACCESS)
  156. register_concmd("ze_nemesis", "cmd_nemsis", STARTNEMESIS_ACCESS)
  157.  
  158. g_pCvarNemesisHP = register_cvar("ze_nemesis_hp", "600000") // Nemesis health - Set 0 to use zombie HP
  159. g_pCvarNemesisGravity = register_cvar("ze_nemesis_gravity", "600") // Nemesis gravity - Set 0 to use zombie gravity
  160. g_pCvarNemesisSpeed = register_cvar("ze_nemesis_speed", "400") // Nemesis speed - Set 0 to use zombie speed
  161. g_pCvarNemesisGlow = register_cvar("ze_nemesis_glow", "1") // Nemesis glow - 1 = enable | 0 = disable
  162. g_pCvarNemesisGlowColor[Red] = register_cvar("ze_nemesis_glow_r", "255") // Nemesis glow color RED
  163. g_pCvarNemesisGlowColor[Green] = register_cvar("ze_nemesis_glow_g", "255") // Nemesis glow color GREEN
  164. g_pCvarNemesisGlowColor[Blue] = register_cvar("ze_nemesis_glow_b", "255") // Nemesis glow color BLUE
  165. g_pCvarNemesisKB = register_cvar("ze_nemesis_kb", "100.0") // Nemesis knockback - Set 0 to use zombie knockback
  166. g_pCvarNemesisDmg = register_cvar("ze_nemesis_dmg", "450.0") // Nemesis damage
  167. g_pCvarNemesisFreeze = register_cvar("ze_nemesis_freeze", "1") // Nemesis get frozen? - 1 = doesn't get frozen | 0 = gets frozen
  168. g_pCvarNemesisFire = register_cvar("ze_nemesis_fire", "1") // Nemesis set on fire? - 1 = doesn't set on fire | 0 = set on fire
  169. }
  170.  
  171. public client_disconnected(id)
  172. {
  173. if (g_bIsNemesis[id])
  174. {
  175. new szPlayerName[2][32], iNewNemId
  176. get_user_name(id, szPlayerName[0], charsmax(szPlayerName))
  177. iNewNemId = GetRandomNemesis()
  178. get_user_name(iNewNemId, szPlayerName[1], charsmax(szPlayerName))
  179. g_bIsNemesis[id] = false
  180. Set_Nemesis(iNewNemId)
  181. ze_colored_print(0, "!g%s !thas left !n& !g%s !thas become nemesis!n.", szPlayerName[0], szPlayerName[1])
  182. }
  183. }
  184.  
  185. public client_putinserver(id)
  186. {
  187. if (g_bIsNemesis[id])
  188. g_bIsNemesis[id] = false
  189. }
  190. public ze_user_infected_pre(iVictim, iAttacker)
  191. {
  192. if (g_bIsNemesis[iAttacker] && !ze_is_user_zombie(iVictim))
  193. {
  194. ExecuteHamB(Ham_Killed, iVictim, iAttacker, 100)
  195. return 1
  196. }
  197.  
  198. return 0
  199. }
  200.  
  201. public Fw_TakeDamage(iVictim, iInfector, iAttacker, Float:iDamage)
  202. {
  203. if (iVictim == iAttacker || !is_user_alive(iAttacker))
  204. return HAM_IGNORED
  205.  
  206. if (g_bIsNemesis[iAttacker] && !ze_is_user_zombie(iVictim) && iInfector == iAttacker)
  207. {
  208. SetHamParamFloat(4, iDamage * get_pcvar_float(g_pCvarNemesisDmg))
  209. return HAM_HANDLED
  210. }
  211.  
  212. return HAM_IGNORED
  213. }
  214.  
  215. public ze_fire_pre(id)
  216. {
  217. if (g_bIsNemesis[id] && get_pcvar_num(g_pCvarNemesisFire))
  218. return PLUGIN_HANDLED
  219. return PLUGIN_CONTINUE
  220. }
  221.  
  222. public ze_frost_pre(id)
  223. {
  224. if (g_bIsNemesis[id] && get_pcvar_num(g_pCvarNemesisFreeze))
  225. return PLUGIN_HANDLED
  226. return PLUGIN_CONTINUE
  227. }
  228.  
  229. public ze_user_humanized(id)
  230. {
  231. UnSet_Nemesis(id)
  232. }
  233.  
  234. public ze_roundend()
  235. {
  236. remove_task(TASK_AMBIENCESOUND)
  237. remove_task(TASK_REAMBIENCESOUND)
  238. remove_task(TASK_MAKE_NEMESIS)
  239.  
  240. for (new id = 0; id <= get_member_game(m_nMaxPlayers); id++)
  241. {
  242. if (is_user_alive(id) && g_bIsNemesis[id])
  243. UnSet_Nemesis(id)
  244. }
  245. }
  246.  
  247. public ze_game_started_pre()
  248. {
  249. if (get_playersnum())
  250. {
  251. if (g_bIsNextRoundNemesis)
  252. {
  253. g_bIsNextRoundNemesis = false
  254. g_iCountDown = 22
  255. set_task(1.0, "StartNemesis", TASK_MAKE_NEMESIS, _, _, "b")
  256. set_task(3.0, "AmbianceSound", TASK_AMBIENCESOUND)
  257. return PLUGIN_HANDLED
  258. }
  259. }
  260. else
  261. {
  262. g_bIsNextRoundNemesis = false
  263. ze_colored_print(0, "!gThe server doesn't have enough players to start nemesis round !n(!tat least 1!n)!n.")
  264. }
  265.  
  266. return PLUGIN_CONTINUE
  267. }
  268.  
  269. public AmbianceSound()
  270. {
  271. // Stop All Sounds
  272. StopSound()
  273.  
  274. // Play The Ambiance Sound For All Players
  275. new szSound[64]
  276. ArrayGetString(g_szAmbianceSound, random_num(0, ArraySize(g_szAmbianceSound) - 1), szSound, charsmax(szSound))
  277.  
  278. for (new id = 1; id <= get_member_game(m_nMaxPlayers); id++)
  279. {
  280. if (!is_user_connected(id))
  281. continue
  282.  
  283. PlaySound(id, szSound)
  284. }
  285.  
  286. // We should Set Task back again to replay (Repeated 5 times MAX)
  287. set_task(float(g_iAmbianceSoundDuration), "AmbianceSound", TASK_REAMBIENCESOUND, _, _, "a", 5)
  288. }
  289.  
  290. public StartNemesis(taskid)
  291. {
  292. if (!g_iCountDown)
  293. {
  294. Set_Nemesis(GetRandomNemesis())
  295. remove_task(taskid)
  296. return
  297. }
  298.  
  299. set_hudmessage(random(256), random(256), random(256), -1.0, 0.21, 0, 0.8, 0.8)
  300. show_hudmessage(0, "Nemesis starts in %d second(s).", g_iCountDown--)
  301. }
  302.  
  303. public cmd_start_nemesis(id, level, cid)
  304. {
  305. if (!cmd_access(id, STARTNEMESIS_ACCESS, cid, 0))
  306. {
  307. client_print(id, print_console, "You have not access.")
  308. return PLUGIN_HANDLED
  309. }
  310.  
  311. g_bIsNextRoundNemesis = true
  312. client_print(id, print_console, "Nemesis round will start next round.")
  313. return PLUGIN_HANDLED
  314. }
  315.  
  316. public cmd_nemsis(id, level, cid)
  317. {
  318. if (!cmd_access(id, STARTNEMESIS_ACCESS, cid, 0))
  319. {
  320. client_print(id, print_console, "You have not access.")
  321. return PLUGIN_HANDLED
  322. }
  323.  
  324. // Retrieve arguments
  325. new arg[32], player
  326. read_argv(1, arg, charsmax(arg))
  327. player = cmd_target(id, arg, (CMDTARGET_ONLY_ALIVE | CMDTARGET_ALLOW_SELF))
  328.  
  329. // Invalid target
  330. if (!player || !is_user_alive(player))
  331. {
  332. ze_colored_print(id, "Invalid player.")
  333. return PLUGIN_HANDLED
  334. }
  335.  
  336. // Target not allowed to be nemesis
  337. if (g_bIsNemesis[player])
  338. {
  339. new player_name[32]
  340. get_user_name(player, player_name, charsmax(player_name))
  341. client_print(id, print_console, "[ZE] %s is already nemesis.", player_name)
  342. return PLUGIN_HANDLED
  343. }
  344.  
  345. Set_Nemesis(player)
  346. return PLUGIN_HANDLED
  347. }
  348.  
  349. public Set_Nemesis(id)
  350. {
  351. g_bIsNemesis[id] = true
  352.  
  353. if (!ze_is_user_zombie(id))
  354. ze_set_user_zombie(id)
  355.  
  356. #if defined USE_NEMESIS_LEAP
  357. ze_get_longjump(id)
  358. #endif
  359.  
  360. #if defined USE_NEMESIS_MODEL
  361. new szPlayerModel[32], szModel[64]
  362. ArrayGetString(g_aModels_Nemesis_Player, random_num(0, ArraySize(g_aModels_Nemesis_Player) - 1), szPlayerModel, charsmax(szPlayerModel))
  363. cs_set_user_model(id, szPlayerModel, true)
  364.  
  365. ArrayGetString(g_aModels_Nemesis_Claws, random_num(0, ArraySize(g_aModels_Nemesis_Claws) - 1), szModel, charsmax(szModel))
  366. cs_set_player_view_model(id, CSW_KNIFE, szModel)
  367. #endif
  368.  
  369. if (get_pcvar_num(g_pCvarNemesisHP))
  370. {
  371. set_entvar(id, var_health, get_pcvar_float(g_pCvarNemesisHP))
  372. }
  373.  
  374. if (get_pcvar_num(g_pCvarNemesisSpeed))
  375. {
  376. ze_set_zombie_speed(id, get_pcvar_num(g_pCvarNemesisSpeed))
  377. }
  378.  
  379. if (get_pcvar_num(g_pCvarNemesisGravity))
  380. {
  381. ze_set_user_gravity(id, get_pcvar_num(g_pCvarNemesisGravity))
  382. }
  383.  
  384. if (get_pcvar_num(g_pCvarNemesisKB))
  385. {
  386. ze_set_user_knockback(id, get_pcvar_float(g_pCvarNemesisKB))
  387. }
  388.  
  389. if (get_pcvar_num(g_pCvarNemesisGlow))
  390. {
  391. Set_Rendering(id, kRenderFxNone, 255, 0, 0, kRenderNormal, 15)
  392. }
  393.  
  394. new szName[32]
  395. get_user_name(id, szName, charsmax(szName))
  396. set_hudmessage(255, 0, 0, -1.0, 0.21, 0, 0.0, 5.0, 0.1, 1.5)
  397. show_hudmessage(id, "%s became Nemesis", szName)
  398. ze_colored_print(0, "!g%s !tbecame !gNemesis!n.", szName)
  399. ze_colored_print(id, "!gYou !tbecame !gNemesis!n.")
  400. }
  401.  
  402. public UnSet_Nemesis(id)
  403. {
  404. if (!g_bIsNemesis[id] || !is_user_alive(id))
  405. return
  406.  
  407. g_bIsNemesis[id] = false
  408.  
  409. #if defined USE_NEMESIS_LEAP
  410. ze_remove_longjump(id)
  411. #endif
  412.  
  413. if (get_pcvar_num(g_pCvarNemesisSpeed))
  414. {
  415. ze_reset_zombie_speed(id)
  416. }
  417.  
  418. if (get_pcvar_num(g_pCvarNemesisGravity))
  419. {
  420. ze_reset_user_gravity(id)
  421. }
  422.  
  423. if (get_pcvar_num(g_pCvarNemesisKB))
  424. {
  425. ze_reset_user_knockback(id)
  426. }
  427.  
  428. if (get_pcvar_num(g_pCvarNemesisGlow))
  429. {
  430. Set_Rendering(id)
  431. }
  432. #if defined USE_NEMESIS_MODEL
  433. new szPlayerModel[32], szModel[64]
  434. ArrayGetString(g_aModels_Nemesis_Player, random_num(0, ArraySize(g_aModels_Nemesis_Player) - 1), szPlayerModel, charsmax(szPlayerModel))
  435. cs_reset_user_model(id)
  436. #endif
  437. }
  438.  
  439. public GetRandomNemesis()
  440. {
  441. if (get_playersnum())
  442. {
  443. new iPlayers[32], iSelected[33], iCount = 0, iTotalPlayers, id
  444. get_players(iPlayers, iTotalPlayers)
  445.  
  446. for (new i = 0; i < iTotalPlayers; i++)
  447. {
  448. id = iPlayers[i]
  449.  
  450. if (is_user_alive(id) && !g_bIsNemesis[id])
  451. {
  452. iSelected[iCount++] = id
  453. }
  454. }
  455.  
  456. return iSelected[random(--iCount)]
  457. }
  458.  
  459. return 0
  460. }
  461.  
  462. public native_ze_is_user_nemesis(id)
  463. {
  464. if (!is_user_connected(id))
  465. {
  466. log_error(AMX_ERR_NATIVE, "[ZE] Invalid Player id (%d)", id)
  467. return -1
  468. }
  469.  
  470. return g_bIsNemesis[id]
  471. }
  472.  
  473. public native_ze_set_user_nemesis(id, bool:set)
  474. {
  475. if (!is_user_connected(id))
  476. {
  477. log_error(AMX_ERR_NATIVE, "[ZE] Invalid Player id (%d)", id)
  478. return false
  479. }
  480.  
  481. if (set)
  482. {
  483. if (!g_bIsNemesis[id])
  484. Set_Nemesis(id)
  485. }
  486. else
  487. {
  488. if (g_bIsNemesis[id])
  489. UnSet_Nemesis(id)
  490. }
  491.  
  492. return true
  493. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement