Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #using scripts\codescripts\struct;
- #using scripts\shared\array_shared;
- #using scripts\shared\callbacks_shared;
- #using scripts\shared\clientfield_shared;
- #using scripts\shared\flag_shared;
- #using scripts\shared\math_shared;
- #using scripts\shared\util_shared;
- #using scripts\shared\ai\zombie_utility;
- #using scripts\shared\ai\systems\gib;
- #using scripts\zm\_zm;
- #using scripts\zm\_zm_audio;
- #using scripts\zm\_zm_utility;
- #using scripts\zm\_zm_weapons;
- #insert scripts\shared\shared.gsh;
- #define LUNAR_EFFECT "kurt/lunar_effect"
- #precache( "fx", LUNAR_EFFECT );
- function init()
- {
- level.lander_is_coolingdown = false;
- level.lander_height = struct::get( "lander_max_height", "targetname" ).origin[2];
- level.lander_model = GetEnt( "zm_lunarmover", "targetname" );
- level.lander_link_mid = Spawn("script_origin", level.lander_model.origin );
- level.lander_link_mid SetModel("tag_origin");
- level.lander_link_mid LinkTo( level.lander_model );
- level.lander_link_players = [];
- level.lander_fx_points = [];
- for (i = 0; i < 4; i++)
- {
- level.lander_link_players[i] = Spawn("script_origin", level.lander_link_mid.origin);
- level.lander_link_players[i].isUsed = false;
- //level.lander_link_players[i] SetModel("tag_origin");
- }
- level.lander_link_players[0] LinkTo( level.lander_link_mid, "tag_origin", (40, 0, 0), (0, 0, 0));
- level.lander_link_players[1] LinkTo( level.lander_link_mid, "tag_origin", (-40, 0, 0), (0, 0, 0));
- level.lander_link_players[2] LinkTo( level.lander_link_mid, "tag_origin", (0, 40, 0), (0, 0, 0));
- level.lander_link_players[3] LinkTo( level.lander_link_mid, "tag_origin", (0, -40, 0), (0, 0, 0));
- for (i = 0; i < 4; i++)
- {
- level.lander_fx_points[i] = Spawn("script_origin", level.lander_link_mid.origin);
- level.lander_fx_points[i] SetModel("tag_origin");
- }
- level.lander_fx_points[0] LinkTo( level.lander_link_mid, "tag_origin", (40, 0, -70), (0, 0, 0));
- level.lander_fx_points[1] LinkTo( level.lander_link_mid, "tag_origin", (-40, 0, -70), (0, 0, 0));
- level.lander_fx_points[2] LinkTo( level.lander_link_mid, "tag_origin", (0, 40, -70), (0, 0, 0));
- level.lander_fx_points[3] LinkTo( level.lander_link_mid, "tag_origin", (0, -40, -70), (0, 0, 0));
- lander_clips = GetEntArray( "lander_clip", "targetname" );
- foreach (clip in lander_clips)
- {
- if (clip.script_noteworthy == "gate")
- {
- level.gate_clip = clip;
- level.gate_clip NotSolid();
- }
- clip LinkTo( level.lander_link_mid );
- }
- level.lunar_gates = GetEntArray( "lunar_doors", "targetname" );
- foreach (gate in level.lunar_gates)
- {
- gate MoveTo( gate.origin - (0, 0, 38), 1.0 );
- }
- lander_feet = GetEntArray( "lander_feet", "targetname" );
- foreach (foot in lander_feet)
- {
- foot LinkTo( level.lander_link_mid, "tag_origin", level.lander_link_mid.origin - foot.origin + (0, 0, 10), foot.angles);
- }
- level.lunar_locs = [];
- level.lunar_base_loc = 0;
- lunar_trigs = GetEntArray( "zm_lunar_trig", "targetname" );
- foreach (trig in lunar_trigs)
- {
- if (trig.script_string == "base")
- {
- trig.hasLander = true;
- trig.isBase = true;
- level.lunar_base_loc = trig get_loc_from_trig();
- }
- else
- {
- trig.hasLander = false;
- trig.isBase = false;
- level.lunar_locs[level.lunar_locs.size] = trig get_loc_from_trig();
- }
- trig SetCursorHint( "HINT_NOICON" );
- if (trig.hasLander)
- {
- trig SetHintString( &"ZOMBIE_NEED_POWER" );
- }
- else
- {
- trig SetHintString( "" );
- }
- trig thread lunar_watchuse();
- }
- callers = GetEntArray( "zm_lunar_call", "targetname" );
- foreach (call in callers)
- {
- call SetCursorHint( "HINT_NOICON" );
- call SetHintString( &"ZOMBIE_NEED_POWER" );
- call thread lunar_watchcall();
- }
- }
- function lunar_watchuse()
- {
- self waittill("lunar_lander_power_on");
- if (self.hasLander)
- {
- self SetHintString( "Hold ^3&&1^7 to use Lander" );
- }
- while (1)
- {
- self waittill( "trigger", player );
- if (level.lander_is_coolingdown == false)
- {
- if (self.hasLander == true) //use lander
- {
- from = self get_loc_from_trig();
- if (self.isBase) //use random
- {
- to = get_random_lunar_loc();
- }
- else
- {
- to = level.lunar_base_loc;
- }
- level.last_lander_used = self.script_string;
- targetTrig = to get_trig_from_loc();
- update_base_hint_string(self, "", "");
- update_base_hint_string(targetTrig, "", "Lander incoming...");
- PlaySoundAtPosition( "lander_init", from.origin );
- link_all_near_players_and_raise_doors();
- lunar_fly_to_loc(from, to);
- unlink_all_players_on_lander_and_lower_doors();
- level notify("lander_used");
- }
- level.lander_is_coolingdown = true;
- update_all_cooldown();
- wait(7);
- level.lander_is_coolingdown = false;
- update_all_cooldown();
- }
- wait(0.05);
- }
- }
- function lunar_watchcall()
- {
- level flag::wait_till("power_on");
- if (self.script_string == "base")
- {
- self SetHintString( "" );
- }
- else
- {
- self SetHintString( "Hold ^3&&1^7 to call Lander" );
- }
- while (1)
- {
- self waittill( "trigger", player );
- if (level.lander_is_coolingdown == false)
- {
- to = self get_loc_from_trig();
- trig = to get_trig_from_loc();
- if (trig.hasLander == false)
- {
- PlaySoundAtPosition( "lander_init", to.origin );
- update_base_hint_string(self, "", "Lander incoming...");
- update_base_hint_string(trig, "", "");
- link_all_near_players_and_raise_doors();
- from = find_lunar_lander_loc();
- lunar_fly_to_loc(from, to);
- unlink_all_players_on_lander_and_lower_doors();
- level.lander_is_coolingdown = true;
- update_all_cooldown();
- wait(7);
- level.lander_is_coolingdown = false;
- update_all_cooldown();
- }
- }
- wait(0.05);
- }
- }
- function get_random_lunar_loc()
- {
- return level.lunar_locs[RandomIntRange(0, level.lunar_locs.size)];
- }
- //self = trigger
- function get_loc_from_trig()
- {
- locs = struct::get_array( "lander_location", "targetname" );
- foreach (loc in locs)
- {
- if (loc.script_string == self.script_string)
- {
- return loc;
- }
- }
- return undefined;
- }
- //self = trigger
- function get_trig_from_loc()
- {
- lunar_trigs = GetEntArray( "zm_lunar_trig", "targetname" );
- foreach (trig in lunar_trigs)
- {
- if (trig.script_string == self.script_string)
- {
- return trig;
- }
- }
- return undefined;
- }
- function find_lunar_lander_loc()
- {
- lunar_trigs = GetEntArray( "zm_lunar_trig", "targetname" );
- foreach (trig in lunar_trigs)
- {
- if (trig.hasLander == true)
- {
- return trig get_loc_from_trig();
- }
- }
- return undefined;
- }
- function spawn_fx_and_linkto(effect, entToLinkto, offset, angles)
- {
- effectEnt = spawn("script_model", entToLinkto.origin);
- effectEnt SetModel("tag_origin");
- effectEnt LinkTo(entToLinkto, "tag_origin", offset, angles);
- PlayFXOnTag( effect, effectEnt, "tag_origin" );
- return effectEnt;
- }
- //struct, struct
- function lunar_fly_to_loc(from, to)
- {
- fromTrig = from get_trig_from_loc();
- targetTrig = to get_trig_from_loc();
- fromTrig.hasLander = false;
- level.lander_link_mid PlaySoundOnTag( "lander_launch_1", "tag_origin" );
- level.lander_link_mid PlayLoopSound( "lander_fly_loop" );
- fx = spawn_fx_and_linkto( LUNAR_EFFECT, level.lander_link_mid, (35, 0, -110), (0, 0, 0));
- fx1 = spawn_fx_and_linkto( LUNAR_EFFECT, level.lander_link_mid, (-35, 0, -110), (0, 0, 0));
- fx2 = spawn_fx_and_linkto( LUNAR_EFFECT, level.lander_link_mid, (0, 35, -110), (0, 0, 0));
- fx3 = spawn_fx_and_linkto( LUNAR_EFFECT, level.lander_link_mid, (0, -35, -110), (0, 0, 0));
- level.lander_model thread lander_wiggle();
- level.lander_model MoveTo( (from.origin[0], from.origin[1], level.lander_height), 4.0, 1.0, 2.0 );
- wait(2.0);
- to lander_open_misc_parts();
- wait(2.1);
- level.lander_model MoveTo( (to.origin[0], to.origin[1], level.lander_height), 5.0, 1.0, 3.5);
- wait(5.1);
- level.lander_model MoveTo( to.origin, 4.5, 1.0, 3.0);
- PlaySoundAtPosition( "lander_incoming", to.origin );
- wait(3.5);
- level.lander_model thread kill_nearby_zombies_and_players();
- level.lander_model notify( "end_wiggle");
- level.lander_model RotateTo( (to.angles[0], level.lander_model.angles[1], to.angles[2]), 1.0 );
- level.lander_model waittill( "rotatedone" );
- level.lander_link_mid StopLoopSound(1);
- level.lander_model notify("lander_has_landed");
- fx Delete();
- fx1 Delete();
- fx2 Delete();
- fx3 Delete();
- to lander_close_misc_parts();
- wait(0.4);
- targetTrig.hasLander = true;
- }
- function kill_nearby_zombies_and_players()
- {
- self endon("lander_has_landed");
- while (1)
- {
- zombies = GetAISpeciesArray( "axis" );
- foreach (zombie in zombies)
- {
- if (Distance(zombie.origin, self.origin - (0, 0, 75)) < 75)
- {
- GibServerUtils::GibHead( zombie );
- zombie DoDamage( zombie.health + 666, self.origin );
- }
- }
- players = GetPlayers();
- foreach (player in players)
- {
- if (player.isLinked == false)
- {
- if (Distance(player.origin, self.origin - (0, 0, 75)) < 75)
- {
- player DoDamage( player.health + 666, self.origin );
- }
- }
- }
- wait(1);
- }
- }
- function update_base_hint_string(trig, land_str, call_str)
- {
- callers = GetEntArray( "zm_lunar_call", "targetname" );
- foreach (call in callers)
- {
- if (call.script_string == trig.script_string)
- {
- call SetHintString( call_str );
- trig SetHintString( land_str );
- }
- }
- }
- function update_all_cooldown()
- {
- lunar_trigs = GetEntArray( "zm_lunar_trig", "targetname" );
- foreach (trig in lunar_trigs)
- {
- if (level.lander_is_coolingdown == true)
- {
- if (trig.hasLander == true)
- {
- update_base_hint_string(trig, "Lander is cooling down", "");
- }
- else
- {
- update_base_hint_string(trig, "", "Lander is cooling down");
- }
- }
- else
- {
- if (trig.hasLander == true)
- {
- PlaySoundAtPosition( "lander_refuel_done", trig.origin );
- wait(1.8);
- PlaySoundAtPosition( "lander_online", trig.origin );
- update_base_hint_string(trig, "Hold ^3&&1^7 to use Lander", "");
- }
- else
- {
- update_base_hint_string(trig, "", "Hold ^3&&1^7 to call Lander");
- }
- }
- }
- }
- //self = loc
- function lander_open_misc_parts() //move doors apart, rise circle
- {
- ents = GetEntArray( "lander_moving", "targetname" );
- PlaySoundAtPosition( "gate_rise", self.origin + (0, 0, 5) );
- foreach (ent in ents)
- {
- if (ent.script_string == self.script_string)
- {
- ent MoveTo( ent.origin + ent.script_vector, 1.2 );
- }
- }
- }
- function lander_close_misc_parts() //move doors apart, rise circle
- {
- ents = GetEntArray( "lander_moving", "targetname" );
- PlaySoundAtPosition( "gate_rise", self.origin + (0, 0, 5) );
- foreach (ent in ents)
- {
- if (ent.script_string == self.script_string)
- {
- ent MoveTo( ent.origin + (ent.script_vector * -1), 1.2 );
- }
- }
- }
- //self = lander model
- function lander_wiggle()
- {
- self endon( "end_wiggle" );
- og_angles = self.angles;
- while (1)
- {
- new_angles = og_angles + (-2 + RandomFloat(4), -2 + RandomFloat(4), -2 + RandomFloat(4));
- rndtime = RandomFloatRange(0.6, 0.8);
- self rotateto(new_angles, rndtime);
- wait(rndtime - 0.05);
- }
- }
- //self = player
- function player_get_linkto_point()
- {
- closest = -1;
- distance = (75 * 75);
- foreach (point in level.lander_link_players)
- {
- if (point.isUsed == false)
- {
- tmpDist = DistanceSquared(point.origin, self.origin);
- if (tmpDist < distance)
- {
- distance = tmpDist;
- closest = point;
- }
- }
- }
- if (closest != -1)
- {
- closest.isUsed = true;
- return closest;
- }
- else
- return undefined;
- }
- function link_all_near_players_and_raise_doors()
- {
- level.gate_clip Solid();
- level.lander_link_mid gib_and_kill_near_zombies();
- players = GetPlayers();
- foreach (player in players)
- {
- point = player player_get_linkto_point();
- if (isdefined(point))
- {
- player.isLinked = true;
- player PlayerLinkTo(point);
- }
- else
- {
- player.isLinked = false;
- }
- }
- PlaySoundAtPosition( "gate_rise", level.lander_model.origin + (0, 0, 5) );
- PlaySoundAtPosition( "lander_start", level.lander_model.origin + (0, 0, 5) );
- foreach (gate in level.lunar_gates)
- {
- gate MoveTo(gate.origin + (0, 0, 38), 1.1);
- }
- level.lunar_gates[0] waittill( "movedone" );
- foreach (gate in level.lunar_gates)
- {
- gate LinkTo(level.lander_link_mid, "tag_origin", (0, 0, 0), gate.angles);
- }
- wait(1);
- }
- function unlink_all_players_on_lander_and_lower_doors()
- {
- level.gate_clip NotSolid();
- players = GetPlayers();
- foreach (player in players)
- {
- if (player.isLinked == true)
- {
- player Unlink();
- player.isLinked = false;
- }
- }
- foreach (gate in level.lunar_gates)
- {
- gate Unlink();
- }
- foreach (gate in level.lunar_gates)
- {
- gate MoveTo(gate.origin - (0, 0, 38), 0.5);
- }
- foreach (point in level.lander_link_players)
- {
- point.isUsed = false;
- }
- PlaySoundAtPosition( "lander_gate_lower", level.lander_link_mid.origin );
- PlaySoundAtPosition( "lander_steam", level.lander_link_mid.origin );
- level.lunar_gates[0] waittill( "movedone" );
- wait(1);
- PlaySoundAtPosition( "lander_refuel", level.lander_link_mid.origin );
- wait(1.9);
- PlaySoundAtPosition( "lander_offline", level.lander_link_mid.origin );
- }
- //self = loc
- function gib_and_kill_near_zombies()
- {
- zombies = GetAISpeciesArray( "axis" );
- foreach (zombie in zombies)
- {
- if (Distance(zombie.origin, self.origin) < 100)
- {
- GibServerUtils::GibHead( zombie );
- zombie DoDamage( zombie.health + 666, self.origin );
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement