Advertisement
Guest User

Untitled

a guest
Feb 19th, 2019
189
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 26.57 KB | None | 0 0
  1. // Босс скачан с сайта Zombie-Mod.ru
  2. #include <amxmodx>
  3. #include <amxmisc>
  4. #include <engine>
  5. #include <cstrike>
  6. #include <hamsandwich>
  7. #include <fakemeta>
  8. #include <fun>
  9. #include <zombieplague>
  10.  
  11. #define PLUGIN "[ZS] Alien Boss"
  12. #define VERSION "3.0"
  13. #define AUTHOR "Remake muxaz"
  14.  
  15. #define ANIM_DUMMY 0
  16. #define ANIM_DEATH 1
  17. #define ANIM_IDLE 2
  18. #define ANIM_WALK 3
  19. #define ANIM_RUN 4
  20. #define ANIM_SHOCKWAVE 5
  21. #define ANIM_JUSTICESWING 6
  22. #define ANIM_MAHADASH 7
  23.  
  24. #define ALIEN_HEALTH 100000.0
  25. //#define ALIEN_BONUS_KILL 5000
  26. #define ALIEN_ATTACK_DELAY 1.0
  27. #define ALIEN_ATTACK_DISTANCE 160.0
  28. #define ALIEN_DASH_DISTANCE 200.0
  29.  
  30. #define ALIEN_JUMP_AFTER_SWING_COUNT 4
  31.  
  32. #define ALIEN_TASK 231211
  33. #define ALIEN_TASK1 113713
  34. #define ALIEN_TASK2 123714
  35. #define ALIEN_TASK3 133715
  36. #define ALIEN_TASK4 143716
  37.  
  38. // Agression one - 1-ый уровенить агресси
  39. #define ALIEN_SPEED_AG1 220
  40. #define ALIEN_DAMAGE_ATTACK_AG1 100.0
  41. #define ALIEN_DASH_DAMAGE_AG1 100
  42. #define ALIEN_SHOCK_SCREEN_RADIUS_AGRES1 800
  43. #define ALIEN_SHOCK_SCREEN_DAMAGE_AGRES1 50
  44.  
  45. // Agression two - 2-ой уровень агресси когда мень 50 % жизни у алиена
  46. #define ALIEN_SPEED_AG2 260
  47. #define ALIEN_DAMAGE_ATTACK_AG2 100.0
  48. #define ALIEN_DASH_DAMAGE_AG2 150
  49. #define ALIEN_SHOCK_SCREEN_RADIUS_AGRES2 500
  50. #define ALIEN_SHOCK_SCREEN_DAMAGE_AGRES2 200
  51.  
  52. #define npc_classname "zs_alien"
  53. #define npc_model "models/zombie_plague/boss_alien.mdl"
  54. #define npc_sprite "sprites/zombie_plague/boss_health.spr"
  55. #define SPRITE_Z 250
  56.  
  57. new const g_AlienSound[][] =
  58. {
  59. "zombie_plague/boss_death.wav",
  60. "zombie_plague/boss_dash.wav",
  61. "zombie_plague/boss_swing.wav",
  62. "zombie_plague/boss_shokwave.wav"
  63. }
  64.  
  65. new const g_CountSound[][] =
  66. {
  67. "zombie_plague/vox/1.wav",
  68. "zombie_plague/vox/2.wav",
  69. "zombie_plague/vox/3.wav",
  70. "zombie_plague/vox/4.wav",
  71. "zombie_plague/vox/5.wav",
  72. "zombie_plague/vox/6.wav",
  73. "zombie_plague/vox/7.wav",
  74. "zombie_plague/vox/8.wav",
  75. "zombie_plague/vox/9.wav",
  76. "zombie_plague/vox/10.wav"
  77. }
  78.  
  79. enum
  80. {
  81. FM_CS_TEAM_UNASSIGNED = 0,
  82. FM_CS_TEAM_T,
  83. FM_CS_TEAM_CT,
  84. FM_CS_TEAM_SPECTATOR
  85. }
  86.  
  87. new Float:g_dmg[512]
  88. new Float:g_distance[512]
  89. new Float:g_lastat[512]
  90. new Float:g_atdelay[512]
  91. new g_speed[512]
  92. new g_moves[512]
  93. new g_alive[512]
  94. new g_target[512]
  95. //new g_reward[512]
  96. new g_animrun[512]
  97. new g_exprew[512]
  98. new g_animattack[512]
  99. new g_ability
  100. new g_timer
  101. new g_game_start
  102. new g_can_jump
  103. new g_maxplayers
  104. new g_pBeam
  105. new g_pSprite
  106. new g_jump_count[512]
  107. new bool:start_swing[512]
  108. new bool:start_knock[512]
  109. new bool:g_bAlienLevel
  110. new spr_blood_drop, spr_blood_spray
  111. new g_screenshake
  112. new const UNIT_SECOND = (1<<12)
  113.  
  114. // HoLLyWooD
  115. #define TASK_CREATE_NPC 123124
  116. #define ALIEN_CREATE_TASK 21341
  117. new Float:g_fUserDamage[33]
  118. new g_iRandomSkills = ALIEN_JUMP_AFTER_SWING_COUNT;
  119. new bool:g_bChangeLevel = false;
  120.  
  121. // Command for changelevel
  122. new const g_sVoteCommand[] = "amx_map zm_five";
  123.  
  124. new msgID_deathMsg, msgID_sayText;
  125. new g_szName[33][32]
  126.  
  127. public plugin_init()
  128. {
  129. register_plugin(PLUGIN, VERSION, AUTHOR)
  130.  
  131. RegisterHam(Ham_Killed, "info_target", "npc_killed");
  132. RegisterHam(Ham_Killed, "player", "player_killed");
  133. RegisterHam(Ham_Think, "info_target", "npc_think");
  134. RegisterHam(Ham_TraceAttack, "info_target", "npc_traceattack");
  135. RegisterHam(Ham_TakeDamage, "info_target", "npc_takedamage")
  136.  
  137. register_forward(FM_PlayerPreThink, "fw_PlayerPreThink");
  138. register_forward(FM_UpdateClientData, "fwd_UpdateClientData", 1);
  139.  
  140. register_logevent("round_end", 2, "1=Round_End")
  141. register_event("DeathMsg", "event_death", "ae")
  142.  
  143. register_clcmd("+attack", "block", g_timer)
  144.  
  145. g_screenshake = get_user_msgid("ScreenShake")
  146.  
  147. g_maxplayers = get_maxplayers()
  148.  
  149. g_pSprite = create_entity("info_target");
  150.  
  151. entity_set_model(g_pSprite, npc_sprite);
  152.  
  153. entity_set_int(g_pSprite, EV_INT_rendermode, kRenderTransTexture);
  154. entity_set_float(g_pSprite, EV_FL_renderamt, 0.0);
  155.  
  156. msgID_deathMsg = get_user_msgid("DeathMsg");
  157. msgID_sayText = get_user_msgid("SayText");
  158.  
  159. register_message(msgID_deathMsg, "msg_deathMsg")
  160. }
  161.  
  162. public plugin_precache()
  163. {
  164. new mapname[32]
  165. get_mapname(mapname, charsmax(mapname))
  166.  
  167. if(equali(mapname, "zp_boss_city"))
  168. {
  169. set_task(15.0, "begin_create_npc", TASK_CREATE_NPC);
  170. set_cvar_num("zp_delay", 99999);
  171. }else{
  172. pause("ad");
  173. }
  174.  
  175. precache_model(npc_model)
  176. precache_model(npc_sprite)
  177.  
  178. new i;
  179. for(i = 0 ; i < sizeof g_CountSound ; i++)
  180. precache_sound(g_CountSound[i]);
  181.  
  182. for(i = 0 ; i < sizeof g_AlienSound ; i++)
  183. precache_sound(g_AlienSound[i]);
  184.  
  185. spr_blood_drop = precache_model("sprites/blood.spr")
  186. spr_blood_spray = precache_model("sprites/bloodspray.spr")
  187. g_pBeam = precache_model( "sprites/shockwave.spr" )
  188. }
  189.  
  190. public block(id)
  191. return PLUGIN_HANDLED;
  192.  
  193. public begin_create_npc(){
  194. spawn_alien();
  195. }
  196.  
  197. public client_connect(id){
  198. g_fUserDamage[id] = 0.0
  199. }
  200.  
  201. public spawn_alien()
  202. {
  203. set_task(1.0, "count_start", ALIEN_TASK)
  204. g_timer = 15 //26
  205.  
  206. set_task(16.0, "create_alien", ALIEN_CREATE_TASK);
  207. }
  208.  
  209. public create_alien()
  210. {
  211. new Float:origin[3];
  212.  
  213. // Origins for center map
  214. origin[0] = -27.0
  215. origin[0] = 24.0
  216. origin[2] = 460.0
  217.  
  218. origin[1] += 50.0
  219.  
  220. new ent = npc_alien_spawn(1, 1);
  221.  
  222. set_pev(ent, pev_origin, origin);
  223.  
  224. start_swing[ent] = false
  225. start_knock[ent] = false
  226. g_ability = false
  227. g_game_start = false
  228. g_jump_count[ent] = 0
  229.  
  230. origin[2] += SPRITE_Z;
  231.  
  232. entity_set_origin(g_pSprite, origin);
  233.  
  234. entity_set_int(g_pSprite, EV_INT_rendermode, kRenderNormal);
  235. entity_set_float(g_pSprite, EV_FL_renderamt, 16.0);
  236.  
  237. entity_set_float(g_pSprite, EV_FL_frame, 100.0);
  238.  
  239. g_game_start = true;
  240. }
  241.  
  242. public npc_alien_spawn(anim_run, exprew)
  243. {
  244. new ent = create_entity("info_target");
  245.  
  246. if(!ent) return 0;
  247.  
  248. entity_set_string(ent, EV_SZ_classname, npc_classname);
  249. entity_set_model(ent, npc_model);
  250.  
  251. entity_set_int(ent, EV_INT_iuser4, 0);
  252. entity_set_int(ent, EV_INT_solid, SOLID_BBOX);
  253. entity_set_int(ent, EV_INT_movetype, MOVETYPE_PUSHSTEP);
  254.  
  255. entity_set_float(ent, EV_FL_takedamage, 1.0);
  256. entity_set_float(ent, EV_FL_gravity, 1.0);
  257. entity_set_float(ent, EV_FL_health, ALIEN_HEALTH);
  258. entity_set_float(ent, EV_FL_animtime, get_gametime());
  259. entity_set_float(ent, EV_FL_nextthink, get_gametime() + 1.0)
  260.  
  261. Util_PlayAnimation(ent, ANIM_SHOCKWAVE);
  262.  
  263. new Float: maxs[3] = { 16.0, 16.0, 60.0 }
  264. new Float: mins[3] = {-16.0, -16.0, -36.0}
  265.  
  266. entity_set_size(ent, mins, maxs)
  267.  
  268. g_alive[ent] = 1
  269. g_dmg[ent] = ALIEN_DAMAGE_ATTACK_AG1
  270. g_animrun[ent] = ANIM_RUN
  271. //g_reward[ent] = ALIEN_BONUS_KILL
  272. g_speed[ent] = ALIEN_SPEED_AG1
  273. g_distance[ent] = ALIEN_ATTACK_DISTANCE
  274. g_atdelay[ent] = ALIEN_ATTACK_DELAY
  275. g_lastat[ent] = 0.0
  276. g_exprew[ent] = exprew
  277. g_target[ent] = find_closes_enemy(ent)
  278.  
  279. set_task(5.0, "update_target", ent)
  280.  
  281. return ent;
  282. }
  283.  
  284. public npc_think(ent)
  285. {
  286. if(!is_valid_ent(ent))
  287. return;
  288.  
  289. static className[32], animation;
  290. animation = 0;
  291. entity_get_string(ent, EV_SZ_classname, className, charsmax(className))
  292.  
  293. if(!equali(className, npc_classname))
  294. return;
  295.  
  296. if (!g_bAlienLevel)
  297. if (entity_get_float(ent, EV_FL_health) <= (ALIEN_HEALTH / 2.0))
  298. {
  299. g_bAlienLevel = true;
  300.  
  301. g_speed[ent] = ALIEN_SPEED_AG2;
  302. g_dmg[ent] = ALIEN_DAMAGE_ATTACK_AG2;
  303. }
  304.  
  305. if(g_alive[ent])
  306. {
  307. new Float:vecOrigin[3];
  308.  
  309. entity_get_vector(ent, EV_VEC_origin, vecOrigin);
  310.  
  311. vecOrigin[2] += SPRITE_Z;
  312.  
  313. entity_set_origin(g_pSprite, vecOrigin);
  314.  
  315. if(g_game_start)
  316. {
  317. new Float:velocity[3]
  318. pev(ent,pev_velocity,velocity)
  319. velocity[0] += velocity[1] + velocity[2]
  320.  
  321. if(!is_user_alive(g_target[ent]))
  322. g_target[ent] = find_closes_enemy(ent)
  323.  
  324. new Float:angle[3], Float:zmaim[3]
  325. pev(g_target[ent], pev_origin, zmaim)
  326. aim_at_origin(ent, zmaim, angle)
  327. angle[0] = 0.0
  328. entity_set_vector(ent, EV_VEC_angles, angle)
  329.  
  330. if(g_target[ent])
  331. {
  332. new Float:origins[3]
  333. pev(ent, pev_origin, origins)
  334. new Float:flDistance = get_distance_f(origins, zmaim)
  335.  
  336. if(flDistance> 170.0)
  337. {
  338. if(g_moves[ent])
  339. {
  340. zmaim[0] += random_num(1, -1) * 80.0
  341. zmaim[1] += random_num(1, -1) * 80.0
  342. g_moves[ent] -= 1
  343. }
  344. else if(!g_moves[ent] && random_num(1, 5) == 1)
  345. g_moves[ent] = 20
  346. }
  347. if(flDistance <= ALIEN_ATTACK_DISTANCE) g_moves[ent] = 0
  348. if(flDistance <= g_distance[ent] && get_gametime() - g_lastat[ent] > g_atdelay[ent])
  349. {
  350. if(!start_swing[ent] && !start_knock[ent])
  351. {
  352. g_lastat[ent] = get_gametime()
  353.  
  354. new anim = ANIM_JUSTICESWING
  355.  
  356. Util_PlayAnimation(ent, ANIM_IDLE)
  357. Util_PlayAnimation(ent, anim)
  358.  
  359. ExecuteHamB(Ham_TakeDamage, g_target[ent] , 0, 0, g_dmg[ent], DMG_BULLET);
  360.  
  361. set_task(2.0, "reset_swing", ent + ALIEN_TASK3)
  362. start_swing[ent] = true
  363. g_animattack[ent] = anim
  364.  
  365. if(anim == ANIM_JUSTICESWING)
  366. emit_sound(ent, CHAN_VOICE, g_AlienSound[2], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
  367.  
  368. if(g_jump_count[ent] < g_iRandomSkills)
  369. g_jump_count[ent]++
  370. }
  371. }
  372. else
  373. {
  374. new Float:frames
  375. if(g_animattack[ent] == ANIM_JUSTICESWING) frames = 1.5
  376.  
  377. if(get_gametime() - g_lastat[ent] > frames)
  378. {
  379. if(flDistance <= g_distance[ent])
  380. Util_PlayAnimation(ent, ANIM_IDLE)
  381. else
  382. {
  383. if(g_jump_count[ent] == g_iRandomSkills && flDistance <= 400.0)
  384. {
  385. // change skill delay
  386. g_iRandomSkills = random_num(2,4);
  387.  
  388. if(!task_exists(ent + ALIEN_TASK2) && !task_exists(ent + ALIEN_TASK1))
  389. {
  390. new task_args[4]
  391. task_args[0] = ent
  392. task_args[1] = floatround(zmaim[0]*100000, floatround_floor)
  393. task_args[2] = floatround(zmaim[1]*100000, floatround_floor)
  394. task_args[3] = floatround(zmaim[2]*100000, floatround_floor)
  395.  
  396. if(!g_ability)
  397. {
  398. g_ability = true
  399. Util_PlayAnimation(ent, ANIM_MAHADASH)
  400. emit_sound(ent, CHAN_VOICE, g_AlienSound[1], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
  401.  
  402. set_task(0.8, "go_jump", ent + ALIEN_TASK1, task_args, 4)
  403.  
  404. animation = 1;
  405. }
  406. else
  407. {
  408. if (entity_get_float(ent, EV_FL_health) > (ALIEN_HEALTH / 2))
  409. {
  410. server_print("--------- 1");
  411. Util_PlayAnimation(ent, ANIM_SHOCKWAVE)
  412. start_knock[ent] = true
  413. set_task(2.1, "go_knock_agres1", ent + ALIEN_TASK1, task_args, 4)
  414. }
  415. else if (entity_get_float(ent, EV_FL_health) <= (ALIEN_HEALTH / 2))
  416. {
  417. server_print("--------- 2");
  418. Util_PlayAnimation(ent, ANIM_SHOCKWAVE)
  419. start_knock[ent] = true
  420. set_task(2.1, "go_knock_agres2", ent + ALIEN_TASK1, task_args, 4)
  421. }
  422.  
  423. animation = 2;
  424. }
  425. }
  426. }
  427. else
  428. {
  429. ent_move_to(ent, zmaim, g_speed[ent])
  430. Util_PlayAnimation(ent, g_animrun[ent])
  431. }
  432. }
  433. }
  434. }
  435. }
  436. if(!g_target[ent]) Util_PlayAnimation(ent, ANIM_IDLE)
  437. }
  438. else if(g_can_jump)
  439. Util_PlayAnimation(ent, ANIM_IDLE)
  440. else
  441. Util_PlayAnimation(ent, ANIM_IDLE)
  442. if(animation == 1)
  443. entity_set_float(ent, EV_FL_nextthink, get_gametime() + 0.8);
  444. else if(animation == 2)
  445. entity_set_float(ent, EV_FL_nextthink, get_gametime() + 2.1);
  446. else
  447. entity_set_float(ent, EV_FL_nextthink, get_gametime() + 0.01);
  448. }
  449. }
  450.  
  451. public check_dash_damage(ent, id)
  452. {
  453. ent = ent - ALIEN_TASK4
  454.  
  455. for(new i = 0; i < g_maxplayers; i++)
  456. {
  457. if(is_user_alive(i))
  458. {
  459. new Float:range_distance = entity_range(ent, i)
  460. new health = get_user_health(i)
  461.  
  462. if(ALIEN_DASH_DISTANCE < floatround(range_distance) < ALIEN_ATTACK_DISTANCE)
  463. {
  464. if (g_bAlienLevel)
  465. {
  466. if(health - ALIEN_DASH_DAMAGE_AG2 > 0)
  467. set_user_health(i, health - ALIEN_DASH_DAMAGE_AG2)
  468. else
  469. {
  470. user_silentkill(i)
  471. message_begin(MSG_ALL, get_user_msgid("DeathMsg"))
  472. write_byte(ent)
  473. write_byte(i)
  474. write_byte(0)
  475. write_string("Boss Alien")
  476. message_end()
  477. }
  478. }
  479. else
  480. {
  481. if(health - ALIEN_DASH_DAMAGE_AG1 > 0)
  482. set_user_health(i, health - ALIEN_DASH_DAMAGE_AG1)
  483. else
  484. {
  485. user_silentkill(i)
  486. message_begin(MSG_ALL, get_user_msgid("DeathMsg"))
  487. write_byte(ent)
  488. write_byte(i)
  489. write_byte(0)
  490. write_string("Boss Alien")
  491. message_end()
  492. }
  493. }
  494. }
  495. }
  496. }
  497. }
  498.  
  499. public go_knock_agres1(args[], id)
  500. {
  501. new ent = args[0]
  502. new Float:origin[3]
  503.  
  504. pev(ent,pev_origin,origin)
  505. message_begin(MSG_BROADCAST, SVC_TEMPENTITY );
  506. write_byte(TE_BEAMCYLINDER)
  507. write_coord(floatround(origin[0]))
  508. write_coord(floatround(origin[1]))
  509. write_coord(floatround(origin[2])-16)
  510. write_coord(floatround(origin[0]))
  511. write_coord(floatround(origin[1]))
  512. write_coord(floatround(0.0))
  513. write_short(g_pBeam) // sprite
  514. write_byte(0) // startframe
  515. write_byte(0) // framerate
  516. write_byte(25) // life
  517. write_byte(60) // width
  518. write_byte(0) // noise
  519. write_byte(255) // red
  520. write_byte(255) // green
  521. write_byte(0) // blue
  522. write_byte(200) // brightness
  523. write_byte(0) // speed
  524. message_end()
  525.  
  526. emit_sound(ent, CHAN_VOICE, g_AlienSound[3], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
  527.  
  528. set_task(1.0, "reset_knock", ent + ALIEN_TASK2)
  529.  
  530. static Float:flOrigin[3] , Float:flDistance , Float:flSpeed
  531. for(new iVictim=1;iVictim <= 32;iVictim++)
  532. {
  533. new health = get_user_health(iVictim)
  534.  
  535. if(is_user_connected(iVictim) && is_user_alive(iVictim))
  536. {
  537. pev(iVictim, pev_origin, flOrigin)
  538. flDistance = get_distance_f ( origin, flOrigin )
  539.  
  540. if(flDistance <= ALIEN_SHOCK_SCREEN_RADIUS_AGRES1)
  541. {
  542. ScreenShake(iVictim)
  543.  
  544. flSpeed = 1400.0
  545.  
  546. static Float:flNewSpeed
  547. flNewSpeed = flSpeed * ( 1.0 - ( flDistance / 1000.0 ) )
  548. set_user_health(iVictim, health - ALIEN_SHOCK_SCREEN_DAMAGE_AGRES1)
  549.  
  550. static Float:flVelocity [ 3 ]
  551. get_speed_vector ( origin, flOrigin, flNewSpeed, flVelocity )
  552.  
  553. set_pev ( iVictim, pev_velocity,flVelocity )
  554. }
  555. }
  556. }
  557. }
  558.  
  559. public go_knock_agres2(args[], id)
  560. {
  561. new ent = args[0]
  562. new Float:origin[3]
  563.  
  564. pev(ent,pev_origin,origin)
  565. message_begin(MSG_BROADCAST, SVC_TEMPENTITY );
  566. write_byte(TE_BEAMCYLINDER)
  567. write_coord(floatround(origin[0]))
  568. write_coord(floatround(origin[1]))
  569. write_coord(floatround(origin[2])-16)
  570. write_coord(floatround(origin[0]))
  571. write_coord(floatround(origin[1]))
  572. write_coord(floatround(0.0))
  573. write_short(g_pBeam) // sprite
  574. write_byte(0) // startframe
  575. write_byte(0) // framerate
  576. write_byte(10) // life
  577. write_byte(60) // width
  578. write_byte(0) // noise
  579. write_byte(250) // red
  580. write_byte(0) // green
  581. write_byte(0) // blue
  582. write_byte(200) // brightness
  583. write_byte(0) // speed
  584. message_end()
  585.  
  586. emit_sound(ent, CHAN_VOICE, g_AlienSound[3], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
  587.  
  588. set_task(1.0, "reset_knock", ent + ALIEN_TASK2)
  589.  
  590. static Float:flOrigin[3] , Float:flDistance , Float:flSpeed
  591. for(new iVictim=1;iVictim <= 32;iVictim++)
  592. {
  593. new health = get_user_health(iVictim)
  594.  
  595. if(is_user_connected(iVictim) && is_user_alive(iVictim))
  596. {
  597. pev(iVictim, pev_origin, flOrigin)
  598. flDistance = get_distance_f ( origin, flOrigin )
  599.  
  600. if(flDistance <= ALIEN_SHOCK_SCREEN_RADIUS_AGRES2)
  601. {
  602. ScreenShake(iVictim)
  603.  
  604. flSpeed = 1400.0
  605.  
  606. static Float:flNewSpeed
  607. flNewSpeed = flSpeed * ( 1.0 - ( flDistance / 1000.0 ) )
  608. set_user_health(iVictim, health - ALIEN_SHOCK_SCREEN_DAMAGE_AGRES2)
  609.  
  610. static Float:flVelocity [ 3 ]
  611. get_speed_vector ( origin, flOrigin, flNewSpeed, flVelocity )
  612.  
  613. set_pev ( iVictim, pev_velocity,flVelocity )
  614. }
  615. }
  616. }
  617. }
  618.  
  619. public ScreenShake(id)
  620. {
  621. if(!is_user_alive(id))
  622. return;
  623.  
  624. message_begin(MSG_ONE_UNRELIABLE, g_screenshake, _, id)
  625. write_short(UNIT_SECOND*7) // amplitude
  626. write_short(UNIT_SECOND*5) // duration
  627. write_short(UNIT_SECOND*15) // frequency
  628. message_end()
  629. }
  630.  
  631. public reset_knock(ent)
  632. {
  633. ent = ent - ALIEN_TASK2
  634.  
  635. start_knock[ent] = false
  636. g_ability = false
  637. g_jump_count[ent] = 0
  638. }
  639.  
  640. public go_jump(args[])
  641. {
  642. new ent = args[0]
  643. new Float:zmaim[3]
  644.  
  645. zmaim[0]=float(args[1]/100000)
  646. zmaim[1]=float(args[2]/100000)
  647. zmaim[2]=float(args[3]/100000)
  648.  
  649. ent_jump_to(ent, zmaim, 1700)
  650.  
  651. g_can_jump = true
  652.  
  653. set_task(0.6, "check_dash_damage", ent + ALIEN_TASK4)
  654. set_task(1.4, "reset_jump", ent + ALIEN_TASK2)
  655. }
  656.  
  657. public reset_swing(ent)
  658. {
  659. ent = ent - ALIEN_TASK3
  660. start_swing[ent] = false
  661. }
  662.  
  663. public reset_jump(ent)
  664. {
  665. ent = ent - ALIEN_TASK2
  666. g_jump_count[ent] = 0
  667. set_task(0.5, "reset_time", ent + 55555)
  668. }
  669.  
  670. public reset_time()
  671. g_can_jump = false
  672.  
  673. public zp_user_infected_pre(id, inflector, nemesis){
  674. zp_disinfect_user(id, 1);
  675. return ZP_PLUGIN_HANDLED;
  676. }
  677.  
  678. public zp_user_infect_attempt(id, inflector, nemesis){
  679. zp_disinfect_user(id, 1);
  680. return ZP_PLUGIN_HANDLED;
  681. }
  682.  
  683. public npc_takedamage(ent, inflictor, attacker, Float:damage, damage_type)
  684. {
  685. if(!is_user_alive(attacker) || !is_valid_ent(ent))
  686. return;
  687.  
  688. new className[32];
  689. entity_get_string(ent, EV_SZ_classname, className, charsmax(className))
  690.  
  691. if(!equali(className, npc_classname) || !g_alive[ent])
  692. return;
  693.  
  694. g_fUserDamage[attacker] += damage;
  695.  
  696. //client_print(attacker, print_center, "%f" , g_fUserDamage[attacker]);
  697. if(g_fUserDamage[attacker] >= 2000){
  698. g_fUserDamage[attacker] -= 2000;
  699.  
  700. zp_set_user_ammo_packs(attacker, zp_get_user_ammo_packs(attacker)+1);
  701. }
  702.  
  703. entity_set_float(g_pSprite, EV_FL_frame, entity_get_float(ent, EV_FL_health) / (ALIEN_HEALTH / 100.0));
  704. }
  705.  
  706. public fw_PlayerPreThink(id)
  707. {
  708. if(cs_get_user_team(id) == CS_TEAM_T)
  709. cs_set_user_team(id, CS_TEAM_CT)
  710. }
  711.  
  712. public force_team(id)
  713. {
  714. engclient_cmd(id, "jointeam", "2", "3")
  715. }
  716.  
  717. public npc_traceattack(ent, attacker, Float: damage, Float: direction[3], trace, damageBits)
  718. {
  719. if(!is_valid_ent(ent) || !g_alive[ent])
  720. return;
  721.  
  722. new className[32];
  723. entity_get_string(ent, EV_SZ_classname, className, charsmax(className))
  724.  
  725. if(!equali(className, npc_classname) || !g_alive[ent])
  726. return;
  727.  
  728. new Float: end[3]
  729. get_tr2(trace, TR_vecEndPos, end);
  730.  
  731. message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
  732. write_byte(TE_BLOODSPRITE)
  733. engfunc(EngFunc_WriteCoord, end[0])
  734. engfunc(EngFunc_WriteCoord, end[1])
  735. engfunc(EngFunc_WriteCoord, end[2])
  736. write_short(spr_blood_spray)
  737. write_short(spr_blood_drop)
  738. write_byte(247)
  739. write_byte(random_num(5, 10))
  740. message_end()
  741. }
  742.  
  743. public player_killed(ent, attacker)
  744. {
  745. for(new id=1;id<g_maxplayers;id++)
  746. {
  747. if(is_user_alive(id))
  748. return;
  749. }
  750.  
  751. begin_changelevel();
  752. client_print(0, print_chat, "Все люди умерли! Смена карты началась!");
  753. }
  754.  
  755. public npc_killed(ent, attacker)
  756. {
  757. new className[32];
  758. entity_get_string(ent, EV_SZ_classname, className, charsmax(className))
  759.  
  760. if(!equali(className, npc_classname) || !g_alive[ent])
  761. return HAM_IGNORED;
  762.  
  763. g_alive[ent] = 0
  764. Util_PlayAnimation(ent, ANIM_DEATH);
  765. emit_sound(ent, CHAN_VOICE, g_AlienSound[0], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
  766. remove_task(ent)
  767. set_pev(ent, pev_solid, SOLID_NOT)
  768. set_task(4.5, "npc_remove", ent)
  769.  
  770. entity_set_int(ent, EV_INT_iuser4, 1);
  771.  
  772. //cs_set_user_money(attacker, cs_get_user_money(attacker) + g_reward[ent])
  773.  
  774. zp_set_user_ammo_packs(attacker, zp_get_user_ammo_packs(attacker) + random_num(40,60));
  775.  
  776. entity_set_int(g_pSprite, EV_INT_rendermode, kRenderTransTexture);
  777. entity_set_float(g_pSprite, EV_FL_renderamt, 0.0);
  778.  
  779. begin_changelevel();
  780.  
  781. client_print(0, print_chat, "Босс умер! Смена карты началась!");
  782.  
  783. return HAM_SUPERCEDE;
  784. }
  785.  
  786. public round_end()
  787. {
  788. remove_task(ALIEN_TASK)
  789. remove_task(ALIEN_TASK1)
  790. remove_task(ALIEN_TASK2)
  791. remove_task(ALIEN_TASK3)
  792. remove_task(ALIEN_TASK4)
  793.  
  794. g_game_start = false
  795.  
  796. begin_changelevel();
  797. }
  798.  
  799. public event_death(id)
  800. {
  801. static ent = -1;
  802.  
  803. while ((ent = engfunc(EngFunc_FindEntityByString, ent, "classname", npc_classname)) != 0)
  804. {
  805. if(g_target[ent] == id)
  806. g_target[ent] = find_closes_enemy(ent)
  807. }
  808. client_cmd(id, "stopsound")
  809.  
  810. new iVictim = read_data(2)
  811. new iKiller = read_data(1)
  812. new iHS = read_data(3)
  813. new szWeapon[24]
  814. read_data(4, szWeapon, 23)
  815.  
  816. if(!is_user_connected(iVictim))
  817. {
  818. do_deathmsg(iKiller, iVictim, iHS, szWeapon)
  819. return PLUGIN_CONTINUE
  820. }
  821.  
  822. if(!is_user_connected(iKiller) && iKiller != ent)
  823. {
  824. do_deathmsg(iKiller, iVictim, iHS, szWeapon)
  825. return PLUGIN_CONTINUE
  826. }
  827.  
  828. if(iKiller != iVictim && iKiller == ent)
  829. {
  830. new iNewKiller
  831. for(new i = 1; i < g_maxplayers; i++){
  832. if(is_user_connected(i) && i != iVictim && !is_user_admin(id))
  833. {
  834. iNewKiller = i;
  835. break;
  836. }
  837. }
  838.  
  839. if(!iNewKiller || iNewKiller == iKiller)
  840. {
  841. do_deathmsg(iVictim, iVictim, iHS, szWeapon)
  842. return PLUGIN_HANDLED;
  843. }
  844.  
  845. new szName[32];
  846.  
  847. get_user_name(iNewKiller, szName, 31)
  848. g_szName[iNewKiller] = szName
  849.  
  850. set_msg_block(msgID_sayText, BLOCK_ONCE);
  851. set_user_info(iNewKiller, "name", "ALIEN BOSS");
  852.  
  853. new args[4]
  854.  
  855. args[0] = iVictim
  856. args[1] = iNewKiller
  857. args[2] = iHS
  858.  
  859. set_task(0.01, "player_diePost", 0, args, 3)
  860. }
  861. else
  862. {
  863. do_deathmsg(iVictim, iVictim, iHS, szWeapon)
  864. }
  865.  
  866. return PLUGIN_CONTINUE;
  867. }
  868.  
  869. public player_diePost(arg[])
  870. {
  871. new szWeapon[24] = "allien_boss_attack";
  872. new iKiller = arg[1]
  873.  
  874. new CsTeams:tempteam = cs_get_user_team(iKiller);
  875. cs_set_user_team(iKiller, CS_TEAM_T);
  876.  
  877. do_deathmsg(iKiller, arg[0], arg[2], szWeapon)
  878.  
  879. cs_set_user_team(iKiller, tempteam);
  880.  
  881. set_msg_block(msgID_sayText, BLOCK_ONCE)
  882. set_user_info(iKiller, "name", g_szName[iKiller])
  883.  
  884. return PLUGIN_CONTINUE
  885. }
  886.  
  887. public npc_remove(ent)
  888. {
  889. remove_task(ALIEN_TASK)
  890. remove_task(ALIEN_TASK1)
  891. remove_task(ALIEN_TASK2)
  892. remove_task(ALIEN_TASK3)
  893. remove_task(ALIEN_TASK4)
  894.  
  895. remove_entity(ent)
  896. remove_task(ent)
  897.  
  898. g_jump_count[ent] = 0
  899. g_game_start = false
  900. }
  901.  
  902. public count_start(ent)
  903. {
  904. g_timer = g_timer - 1
  905.  
  906. if(g_timer > 0)
  907. client_print(0, print_center, "Игра начнётся через %d секунд.", g_timer)
  908.  
  909. if(g_timer < 11)
  910. client_cmd(0, "spk zombie_plague/vox/%d", g_timer)
  911.  
  912. if(g_timer >= 0)
  913. set_task(1.0, "count_start", ALIEN_TASK)
  914.  
  915. if(g_timer == 0)
  916. {
  917. client_print(0, print_center, "Alien Boss появился убейте его!")
  918. g_game_start = true
  919. }
  920. }
  921.  
  922. public update_target(ent)
  923. {
  924. if(!is_valid_ent(ent))
  925. return;
  926.  
  927. g_target[ent] = find_closes_enemy(ent)
  928. set_task(5.0, "update_target", ent)
  929. }
  930.  
  931. public msg_deathMsg()
  932. return PLUGIN_HANDLED;
  933.  
  934. public begin_changelevel(){
  935. g_bChangeLevel = true;
  936.  
  937. new ent;
  938. if((ent = engfunc(EngFunc_FindEntityByString, ent, "classname", npc_classname)) != 0)
  939. npc_remove(ent);
  940.  
  941. for(new id=1; id<g_maxplayers; id++)
  942. {
  943. if(is_user_alive(id))
  944. {
  945. set_pev(id, pev_velocity, 1.0);
  946. set_pev(id, pev_maxspeed, 1.0);
  947. }
  948. }
  949.  
  950. server_cmd(g_sVoteCommand);
  951. }
  952.  
  953. public fwd_UpdateClientData(id, weapons, cd)
  954. {
  955. if(id < 0 || id > g_maxplayers)
  956. return FMRES_IGNORED
  957.  
  958. if(g_bChangeLevel)
  959. {
  960. set_cd(cd, CD_flNextAttack, 0.5)
  961. set_cd(cd, CD_MaxSpeed, 1.0)
  962. return FMRES_HANDLED
  963. }
  964.  
  965. return FMRES_IGNORED
  966. }
  967.  
  968. stock do_deathmsg(iKiller, iVictim, iHS, const szWeapon[])
  969. {
  970. message_begin(MSG_ALL, msgID_deathMsg)
  971. write_byte(iKiller)
  972. write_byte(iVictim)
  973. write_byte(iHS)
  974. write_string(szWeapon)
  975. message_end()
  976. }
  977.  
  978. stock find_closes_enemy(ent)
  979. {
  980. new enemy, Float:dist, Float:distmin, Float:origin[3], Float:originT[3]
  981. pev(ent, pev_origin, origin)
  982. origin[2] += 120.0
  983.  
  984. for(new id=1; id<=32; id++)
  985. {
  986. if (!is_user_alive(id)) continue;
  987.  
  988. dist = entity_range(ent, id)
  989. pev(id, pev_origin, originT)
  990. if ((!distmin || dist <= distmin))
  991. {
  992. distmin = dist
  993. enemy = id
  994. }
  995. }
  996.  
  997. return enemy
  998. }
  999.  
  1000. stock ent_move_to(ent, Float:target[3], speed)
  1001. {
  1002. static Float:vec[3]
  1003. aim_at_origin(ent, target, vec)
  1004. engfunc(EngFunc_MakeVectors, vec)
  1005. global_get(glb_v_forward, vec)
  1006. vec[0] *= speed
  1007. vec[1] *= speed
  1008. vec[2] *= speed * 0.1
  1009. set_pev(ent, pev_velocity, vec)
  1010.  
  1011. new Float:angle[3]
  1012. aim_at_origin(ent, target, angle)
  1013. angle[0] = 0.0
  1014. entity_set_vector(ent, EV_VEC_angles, angle)
  1015. }
  1016.  
  1017. stock ent_jump_to(ent, Float:target[3], speed)
  1018. {
  1019. static Float:vec[3]
  1020. aim_at_origin(ent, target, vec)
  1021. engfunc(EngFunc_MakeVectors, vec)
  1022. global_get(glb_v_forward, vec)
  1023. vec[0] *= speed
  1024. vec[1] *= speed
  1025. vec[2] *= speed * 0.1
  1026. set_pev(ent, pev_velocity, vec)
  1027.  
  1028. new Float:angle[3]
  1029. aim_at_origin(ent, target, angle)
  1030. angle[0] = 0.0
  1031. entity_set_vector(ent, EV_VEC_angles, angle)
  1032.  
  1033. }
  1034.  
  1035. stock aim_at_origin(id, Float:target[3], Float:angles[3])
  1036. {
  1037. static Float:vec[3]
  1038. pev(id, pev_origin, vec)
  1039. vec[0] = target[0] - vec[0]
  1040. vec[1] = target[1] - vec[1]
  1041. vec[2] = target[2] - vec[2]
  1042. engfunc(EngFunc_VecToAngles, vec, angles)
  1043. angles[0] *= -1.0, angles[2] = 0.0
  1044. }
  1045.  
  1046. stock get_speed_vector(const Float:origin1[3], const Float:origin2[3], Float:speed, Float:new_velocity[3])
  1047. {
  1048. new_velocity[0] = origin2[0] - origin1[0]
  1049. new_velocity[1] = origin2[1] - origin1[1]
  1050. new_velocity[2] = origin2[2] - origin1[2]
  1051. new Float:num = floatsqroot(speed*speed / (new_velocity[0]*new_velocity[0] + new_velocity[1]*new_velocity[1] + new_velocity[2]*new_velocity[2]))
  1052. new_velocity[0] *= num
  1053. new_velocity[1] *= num
  1054. new_velocity[2] *= num
  1055.  
  1056. return 1;
  1057. }
  1058.  
  1059. stock Util_PlayAnimation(index, sequence, Float: framerate = 1.0)
  1060. {
  1061. if(entity_get_int(index, EV_INT_sequence) == sequence) return;
  1062.  
  1063. entity_set_float(index, EV_FL_animtime, get_gametime());
  1064. entity_set_float(index, EV_FL_framerate, framerate);
  1065. entity_set_float(index, EV_FL_frame, 0.0);
  1066. entity_set_int(index, EV_INT_sequence, sequence);
  1067. }
  1068.  
  1069. stock bool:is_hull_vacant(const Float:origin[3], hull,id)
  1070. {
  1071. static tr
  1072. engfunc(EngFunc_TraceHull, origin, origin, 0, hull, id, tr)
  1073. if (!get_tr2(tr, TR_StartSolid) || !get_tr2(tr, TR_AllSolid))
  1074. return true
  1075.  
  1076. return false
  1077. }
  1078.  
  1079. stock fm_set_user_health(id, health)
  1080. {
  1081. (health > 0) ? set_pev(id, pev_health, float(health)) : dllfunc(DLLFunc_ClientKill, id);
  1082. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement