Advertisement
Abnormal202

Untitled

Jun 15th, 2017
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.36 KB | None | 0 0
  1. #using scripts\codescripts\struct;
  2. #using scripts\shared\array_shared;
  3. #using scripts\shared\callbacks_shared;
  4. #using scripts\shared\clientfield_shared;
  5. #using scripts\shared\flag_shared;
  6. #using scripts\shared\math_shared;
  7. #using scripts\shared\util_shared;
  8. #using scripts\shared\ai\zombie_utility;
  9. #using scripts\shared\ai\systems\gib;
  10. #using scripts\zm\_zm;
  11. #using scripts\zm\_zm_audio;
  12. #using scripts\zm\_zm_utility;
  13. #using scripts\zm\_zm_weapons;
  14. #insert scripts\shared\shared.gsh;
  15.  
  16. #define LUNAR_EFFECT "kurt/lunar_effect"
  17. #precache( "fx", LUNAR_EFFECT );
  18.  
  19. function init()
  20. {
  21. level.lander_is_coolingdown = false;
  22. level.lander_height = struct::get( "lander_max_height", "targetname" ).origin[2];
  23. level.lander_model = GetEnt( "zm_lunarmover", "targetname" );
  24. level.lander_link_mid = Spawn("script_origin", level.lander_model.origin );
  25. level.lander_link_mid SetModel("tag_origin");
  26. level.lander_link_mid LinkTo( level.lander_model );
  27. level.lander_link_players = [];
  28. level.lander_fx_points = [];
  29. for (i = 0; i < 4; i++)
  30. {
  31. level.lander_link_players[i] = Spawn("script_origin", level.lander_link_mid.origin);
  32. level.lander_link_players[i].isUsed = false;
  33. //level.lander_link_players[i] SetModel("tag_origin");
  34. }
  35. level.lander_link_players[0] LinkTo( level.lander_link_mid, "tag_origin", (40, 0, 0), (0, 0, 0));
  36. level.lander_link_players[1] LinkTo( level.lander_link_mid, "tag_origin", (-40, 0, 0), (0, 0, 0));
  37. level.lander_link_players[2] LinkTo( level.lander_link_mid, "tag_origin", (0, 40, 0), (0, 0, 0));
  38. level.lander_link_players[3] LinkTo( level.lander_link_mid, "tag_origin", (0, -40, 0), (0, 0, 0));
  39.  
  40. for (i = 0; i < 4; i++)
  41. {
  42. level.lander_fx_points[i] = Spawn("script_origin", level.lander_link_mid.origin);
  43. level.lander_fx_points[i] SetModel("tag_origin");
  44. }
  45. level.lander_fx_points[0] LinkTo( level.lander_link_mid, "tag_origin", (40, 0, -70), (0, 0, 0));
  46. level.lander_fx_points[1] LinkTo( level.lander_link_mid, "tag_origin", (-40, 0, -70), (0, 0, 0));
  47. level.lander_fx_points[2] LinkTo( level.lander_link_mid, "tag_origin", (0, 40, -70), (0, 0, 0));
  48. level.lander_fx_points[3] LinkTo( level.lander_link_mid, "tag_origin", (0, -40, -70), (0, 0, 0));
  49.  
  50. lander_clips = GetEntArray( "lander_clip", "targetname" );
  51. foreach (clip in lander_clips)
  52. {
  53. if (clip.script_noteworthy == "gate")
  54. {
  55. level.gate_clip = clip;
  56. level.gate_clip NotSolid();
  57. }
  58. clip LinkTo( level.lander_link_mid );
  59. }
  60.  
  61. level.lunar_gates = GetEntArray( "lunar_doors", "targetname" );
  62. foreach (gate in level.lunar_gates)
  63. {
  64. gate MoveTo( gate.origin - (0, 0, 38), 1.0 );
  65. }
  66.  
  67. lander_feet = GetEntArray( "lander_feet", "targetname" );
  68. foreach (foot in lander_feet)
  69. {
  70. foot LinkTo( level.lander_link_mid, "tag_origin", level.lander_link_mid.origin - foot.origin + (0, 0, 10), foot.angles);
  71. }
  72.  
  73. level.lunar_locs = [];
  74. level.lunar_base_loc = 0;
  75. lunar_trigs = GetEntArray( "zm_lunar_trig", "targetname" );
  76. foreach (trig in lunar_trigs)
  77. {
  78. if (trig.script_string == "base")
  79. {
  80. trig.hasLander = true;
  81. trig.isBase = true;
  82. level.lunar_base_loc = trig get_loc_from_trig();
  83. }
  84. else
  85. {
  86. trig.hasLander = false;
  87. trig.isBase = false;
  88. level.lunar_locs[level.lunar_locs.size] = trig get_loc_from_trig();
  89. }
  90. trig SetCursorHint( "HINT_NOICON" );
  91. if (trig.hasLander)
  92. {
  93. trig SetHintString( &"ZOMBIE_NEED_POWER" );
  94. }
  95. else
  96. {
  97. trig SetHintString( "" );
  98. }
  99. trig thread lunar_watchuse();
  100. }
  101.  
  102. callers = GetEntArray( "zm_lunar_call", "targetname" );
  103. foreach (call in callers)
  104. {
  105. call SetCursorHint( "HINT_NOICON" );
  106. call SetHintString( &"ZOMBIE_NEED_POWER" );
  107. call thread lunar_watchcall();
  108. }
  109. }
  110.  
  111. function lunar_watchuse()
  112. {
  113. self waittill("lunar_lander_power_on");
  114. if (self.hasLander)
  115. {
  116. self SetHintString( "Hold ^3&&1^7 to use Lander" );
  117. }
  118. while (1)
  119. {
  120. self waittill( "trigger", player );
  121. if (level.lander_is_coolingdown == false)
  122. {
  123. if (self.hasLander == true) //use lander
  124. {
  125. from = self get_loc_from_trig();
  126. if (self.isBase) //use random
  127. {
  128. to = get_random_lunar_loc();
  129. }
  130. else
  131. {
  132. to = level.lunar_base_loc;
  133. }
  134.  
  135. level.last_lander_used = self.script_string;
  136.  
  137. targetTrig = to get_trig_from_loc();
  138. update_base_hint_string(self, "", "");
  139. update_base_hint_string(targetTrig, "", "Lander incoming...");
  140. PlaySoundAtPosition( "lander_init", from.origin );
  141. link_all_near_players_and_raise_doors();
  142. lunar_fly_to_loc(from, to);
  143. unlink_all_players_on_lander_and_lower_doors();
  144. level notify("lander_used");
  145. }
  146. level.lander_is_coolingdown = true;
  147. update_all_cooldown();
  148. wait(7);
  149. level.lander_is_coolingdown = false;
  150. update_all_cooldown();
  151. }
  152.  
  153. wait(0.05);
  154. }
  155. }
  156.  
  157. function lunar_watchcall()
  158. {
  159. level flag::wait_till("power_on");
  160. if (self.script_string == "base")
  161. {
  162. self SetHintString( "" );
  163. }
  164. else
  165. {
  166. self SetHintString( "Hold ^3&&1^7 to call Lander" );
  167. }
  168. while (1)
  169. {
  170. self waittill( "trigger", player );
  171. if (level.lander_is_coolingdown == false)
  172. {
  173. to = self get_loc_from_trig();
  174. trig = to get_trig_from_loc();
  175. if (trig.hasLander == false)
  176. {
  177. PlaySoundAtPosition( "lander_init", to.origin );
  178. update_base_hint_string(self, "", "Lander incoming...");
  179. update_base_hint_string(trig, "", "");
  180. link_all_near_players_and_raise_doors();
  181. from = find_lunar_lander_loc();
  182. lunar_fly_to_loc(from, to);
  183. unlink_all_players_on_lander_and_lower_doors();
  184. level.lander_is_coolingdown = true;
  185. update_all_cooldown();
  186. wait(7);
  187. level.lander_is_coolingdown = false;
  188. update_all_cooldown();
  189. }
  190. }
  191. wait(0.05);
  192. }
  193. }
  194.  
  195. function get_random_lunar_loc()
  196. {
  197. return level.lunar_locs[RandomIntRange(0, level.lunar_locs.size)];
  198. }
  199.  
  200. //self = trigger
  201. function get_loc_from_trig()
  202. {
  203. locs = struct::get_array( "lander_location", "targetname" );
  204. foreach (loc in locs)
  205. {
  206. if (loc.script_string == self.script_string)
  207. {
  208. return loc;
  209. }
  210. }
  211. return undefined;
  212. }
  213.  
  214. //self = trigger
  215. function get_trig_from_loc()
  216. {
  217. lunar_trigs = GetEntArray( "zm_lunar_trig", "targetname" );
  218. foreach (trig in lunar_trigs)
  219. {
  220. if (trig.script_string == self.script_string)
  221. {
  222. return trig;
  223. }
  224. }
  225. return undefined;
  226. }
  227.  
  228. function find_lunar_lander_loc()
  229. {
  230. lunar_trigs = GetEntArray( "zm_lunar_trig", "targetname" );
  231. foreach (trig in lunar_trigs)
  232. {
  233. if (trig.hasLander == true)
  234. {
  235. return trig get_loc_from_trig();
  236. }
  237. }
  238. return undefined;
  239. }
  240.  
  241. function spawn_fx_and_linkto(effect, entToLinkto, offset, angles)
  242. {
  243. effectEnt = spawn("script_model", entToLinkto.origin);
  244. effectEnt SetModel("tag_origin");
  245. effectEnt LinkTo(entToLinkto, "tag_origin", offset, angles);
  246. PlayFXOnTag( effect, effectEnt, "tag_origin" );
  247. return effectEnt;
  248. }
  249.  
  250. //struct, struct
  251. function lunar_fly_to_loc(from, to)
  252. {
  253. fromTrig = from get_trig_from_loc();
  254. targetTrig = to get_trig_from_loc();
  255. fromTrig.hasLander = false;
  256. level.lander_link_mid PlaySoundOnTag( "lander_launch_1", "tag_origin" );
  257. level.lander_link_mid PlayLoopSound( "lander_fly_loop" );
  258. fx = spawn_fx_and_linkto( LUNAR_EFFECT, level.lander_link_mid, (35, 0, -110), (0, 0, 0));
  259. fx1 = spawn_fx_and_linkto( LUNAR_EFFECT, level.lander_link_mid, (-35, 0, -110), (0, 0, 0));
  260. fx2 = spawn_fx_and_linkto( LUNAR_EFFECT, level.lander_link_mid, (0, 35, -110), (0, 0, 0));
  261. fx3 = spawn_fx_and_linkto( LUNAR_EFFECT, level.lander_link_mid, (0, -35, -110), (0, 0, 0));
  262. level.lander_model thread lander_wiggle();
  263. level.lander_model MoveTo( (from.origin[0], from.origin[1], level.lander_height), 4.0, 1.0, 2.0 );
  264. wait(2.0);
  265. to lander_open_misc_parts();
  266. wait(2.1);
  267. level.lander_model MoveTo( (to.origin[0], to.origin[1], level.lander_height), 5.0, 1.0, 3.5);
  268. wait(5.1);
  269. level.lander_model MoveTo( to.origin, 4.5, 1.0, 3.0);
  270. PlaySoundAtPosition( "lander_incoming", to.origin );
  271. wait(3.5);
  272. level.lander_model thread kill_nearby_zombies_and_players();
  273. level.lander_model notify( "end_wiggle");
  274. level.lander_model RotateTo( (to.angles[0], level.lander_model.angles[1], to.angles[2]), 1.0 );
  275. level.lander_model waittill( "rotatedone" );
  276. level.lander_link_mid StopLoopSound(1);
  277. level.lander_model notify("lander_has_landed");
  278. fx Delete();
  279. fx1 Delete();
  280. fx2 Delete();
  281. fx3 Delete();
  282. to lander_close_misc_parts();
  283. wait(0.4);
  284. targetTrig.hasLander = true;
  285. }
  286.  
  287. function kill_nearby_zombies_and_players()
  288. {
  289. self endon("lander_has_landed");
  290. while (1)
  291. {
  292. zombies = GetAISpeciesArray( "axis" );
  293. foreach (zombie in zombies)
  294. {
  295. if (Distance(zombie.origin, self.origin - (0, 0, 75)) < 75)
  296. {
  297. GibServerUtils::GibHead( zombie );
  298. zombie DoDamage( zombie.health + 666, self.origin );
  299. }
  300. }
  301. players = GetPlayers();
  302. foreach (player in players)
  303. {
  304. if (player.isLinked == false)
  305. {
  306. if (Distance(player.origin, self.origin - (0, 0, 75)) < 75)
  307. {
  308. player DoDamage( player.health + 666, self.origin );
  309. }
  310. }
  311. }
  312. wait(1);
  313. }
  314. }
  315.  
  316. function update_base_hint_string(trig, land_str, call_str)
  317. {
  318. callers = GetEntArray( "zm_lunar_call", "targetname" );
  319. foreach (call in callers)
  320. {
  321. if (call.script_string == trig.script_string)
  322. {
  323. call SetHintString( call_str );
  324. trig SetHintString( land_str );
  325. }
  326. }
  327. }
  328.  
  329. function update_all_cooldown()
  330. {
  331. lunar_trigs = GetEntArray( "zm_lunar_trig", "targetname" );
  332. foreach (trig in lunar_trigs)
  333. {
  334. if (level.lander_is_coolingdown == true)
  335. {
  336. if (trig.hasLander == true)
  337. {
  338. update_base_hint_string(trig, "Lander is cooling down", "");
  339. }
  340. else
  341. {
  342. update_base_hint_string(trig, "", "Lander is cooling down");
  343. }
  344. }
  345. else
  346. {
  347. if (trig.hasLander == true)
  348. {
  349. PlaySoundAtPosition( "lander_refuel_done", trig.origin );
  350. wait(1.8);
  351. PlaySoundAtPosition( "lander_online", trig.origin );
  352. update_base_hint_string(trig, "Hold ^3&&1^7 to use Lander", "");
  353. }
  354. else
  355. {
  356. update_base_hint_string(trig, "", "Hold ^3&&1^7 to call Lander");
  357. }
  358. }
  359. }
  360. }
  361.  
  362. //self = loc
  363. function lander_open_misc_parts() //move doors apart, rise circle
  364. {
  365. ents = GetEntArray( "lander_moving", "targetname" );
  366. PlaySoundAtPosition( "gate_rise", self.origin + (0, 0, 5) );
  367. foreach (ent in ents)
  368. {
  369. if (ent.script_string == self.script_string)
  370. {
  371. ent MoveTo( ent.origin + ent.script_vector, 1.2 );
  372. }
  373. }
  374. }
  375.  
  376. function lander_close_misc_parts() //move doors apart, rise circle
  377. {
  378. ents = GetEntArray( "lander_moving", "targetname" );
  379. PlaySoundAtPosition( "gate_rise", self.origin + (0, 0, 5) );
  380. foreach (ent in ents)
  381. {
  382. if (ent.script_string == self.script_string)
  383. {
  384. ent MoveTo( ent.origin + (ent.script_vector * -1), 1.2 );
  385. }
  386. }
  387. }
  388.  
  389. //self = lander model
  390. function lander_wiggle()
  391. {
  392. self endon( "end_wiggle" );
  393. og_angles = self.angles;
  394. while (1)
  395. {
  396. new_angles = og_angles + (-2 + RandomFloat(4), -2 + RandomFloat(4), -2 + RandomFloat(4));
  397. rndtime = RandomFloatRange(0.6, 0.8);
  398. self rotateto(new_angles, rndtime);
  399. wait(rndtime - 0.05);
  400. }
  401. }
  402.  
  403. //self = player
  404. function player_get_linkto_point()
  405. {
  406. closest = -1;
  407. distance = (75 * 75);
  408. foreach (point in level.lander_link_players)
  409. {
  410. if (point.isUsed == false)
  411. {
  412. tmpDist = DistanceSquared(point.origin, self.origin);
  413. if (tmpDist < distance)
  414. {
  415. distance = tmpDist;
  416. closest = point;
  417. }
  418. }
  419. }
  420. if (closest != -1)
  421. {
  422. closest.isUsed = true;
  423. return closest;
  424. }
  425. else
  426. return undefined;
  427. }
  428.  
  429. function link_all_near_players_and_raise_doors()
  430. {
  431. level.gate_clip Solid();
  432. level.lander_link_mid gib_and_kill_near_zombies();
  433. players = GetPlayers();
  434. foreach (player in players)
  435. {
  436. point = player player_get_linkto_point();
  437. if (isdefined(point))
  438. {
  439. player.isLinked = true;
  440. player PlayerLinkTo(point);
  441. }
  442. else
  443. {
  444. player.isLinked = false;
  445. }
  446. }
  447. PlaySoundAtPosition( "gate_rise", level.lander_model.origin + (0, 0, 5) );
  448. PlaySoundAtPosition( "lander_start", level.lander_model.origin + (0, 0, 5) );
  449. foreach (gate in level.lunar_gates)
  450. {
  451. gate MoveTo(gate.origin + (0, 0, 38), 1.1);
  452. }
  453. level.lunar_gates[0] waittill( "movedone" );
  454. foreach (gate in level.lunar_gates)
  455. {
  456. gate LinkTo(level.lander_link_mid, "tag_origin", (0, 0, 0), gate.angles);
  457. }
  458. wait(1);
  459. }
  460.  
  461. function unlink_all_players_on_lander_and_lower_doors()
  462. {
  463. level.gate_clip NotSolid();
  464. players = GetPlayers();
  465. foreach (player in players)
  466. {
  467. if (player.isLinked == true)
  468. {
  469. player Unlink();
  470. player.isLinked = false;
  471. }
  472. }
  473. foreach (gate in level.lunar_gates)
  474. {
  475. gate Unlink();
  476. }
  477. foreach (gate in level.lunar_gates)
  478. {
  479. gate MoveTo(gate.origin - (0, 0, 38), 0.5);
  480. }
  481. foreach (point in level.lander_link_players)
  482. {
  483. point.isUsed = false;
  484. }
  485. PlaySoundAtPosition( "lander_gate_lower", level.lander_link_mid.origin );
  486. PlaySoundAtPosition( "lander_steam", level.lander_link_mid.origin );
  487. level.lunar_gates[0] waittill( "movedone" );
  488. wait(1);
  489. PlaySoundAtPosition( "lander_refuel", level.lander_link_mid.origin );
  490. wait(1.9);
  491. PlaySoundAtPosition( "lander_offline", level.lander_link_mid.origin );
  492.  
  493. }
  494.  
  495. //self = loc
  496. function gib_and_kill_near_zombies()
  497. {
  498. zombies = GetAISpeciesArray( "axis" );
  499. foreach (zombie in zombies)
  500. {
  501. if (Distance(zombie.origin, self.origin) < 100)
  502. {
  503. GibServerUtils::GibHead( zombie );
  504. zombie DoDamage( zombie.health + 666, self.origin );
  505. }
  506. }
  507. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement