#include clientscripts\_utility; #include clientscripts\_music; #include clientscripts\_zombiemode_weapons; main() { level thread clientscripts\zombie_cosmodrome_ffotd::main_start(); level._uses_crossbow = true; level._power_on = false; level.rocket_num = 0; level._visionset_map_nopower = "zombie_cosmodrome_nopower"; level._visionset_priority_map_nopower = 1; level._visionset_map_sudden_power = "zombie_cosmodrome_powerUP"; level._visionset_priority_map_sudden_power = 2; level._visionset_map_poweron = "zombie_cosmodrome_powerON"; level._visionset_priority_map_poweron = 3; level._visionset_map_monkey = "zombie_cosmodrome_monkey"; level._visionset_priority_map_monkey = 4; level._visionset_map_begin = "zombie_cosmodrome_begin"; level._visionset_priority_map_begin = 5; level._visionset_map_monkeylandon = "flare"; level._visionset_priority_map_monkeylandon = 6; level._visionset_monkey_transition_time_on = 0.5; level._visionset_monkey_transition_time_off = 3.0; level._visionset_zombie_sudden_power_transition_time = 0.1; level._visionset_zombie_transition_time = 2.5; level._fog_settings_monkey = "monkey"; level._fog_settings_monkey_priority = 3; level._fog_settings_lander = "lander"; level._fog_settings_lander_priority = 2; level._fog_settings_default = "normal"; level._fog_settings_default_priority = 1; include_weapons(); PreCacheRumble( "damage_heavy" ); PrecacheRumble( "explosion_generic" ); clientscripts\_zombiemode::main(); register_clientflag_callback("actor", 0, ::actor_flag_soulpull_handler); register_clientflag_callback("scriptmover", 0, ::rocket_fx); register_clientflag_callback("scriptmover", 1, ::lander_engine_fx); register_clientflag_callback("scriptmover", 2, ::lander_status_light); register_clientflag_callback("scriptmover", 3, ::launch_panel_centrifuge_status); register_clientflag_callback("scriptmover", 4, ::launch_panel_baseentry_status); register_clientflag_callback("scriptmover", 5, ::launch_panel_storage_status); register_clientflag_callback("scriptmover", 6, ::launch_panel_catwalk_status); register_clientflag_callback("scriptmover", 7, ::lander_rumble_and_quake); level._SCRIPTMOVER_COSMODROME_CLIENT_FLAG_CENTRIFUGE_RUMBLE = 8; register_clientflag_callback( "scriptmover", level._SCRIPTMOVER_COSMODROME_CLIENT_FLAG_CENTRIFUGE_RUMBLE, ::centrifuge_rumble_control ); register_clientflag_callback("scriptmover", 9, ::lander_move_fx); register_clientflag_callback("player", 0 , ::player_lander_fog); level._SCRIPTMOVER_COSMODROME_CLIENT_FLAG_CENTRIFUGE_LIGHTS = 11; register_clientflag_callback( "scriptmover", level._SCRIPTMOVER_COSMODROME_CLIENT_FLAG_CENTRIFUGE_LIGHTS, ::centrifuge_warning_lights_init ); level._SCRIPTMOVER_COSMODROME_CLIENT_FLAG_MONKEY_LANDER_FX = 12; register_clientflag_callback( "scriptmover", level._SCRIPTMOVER_COSMODROME_CLIENT_FLAG_MONKEY_LANDER_FX, ::monkey_lander_fx ); level thread catwalk_lander_doors(); level thread base_entry_lander_doors(); level thread storage_lander_doors(); level thread centrifuge_lander_doors(); level thread lander_station_think(); level thread setup_fog(); level thread init_rocket_debris(); clientscripts\_zombiemode_weap_black_hole_bomb::init(); clientscripts\zombie_cosmodrome_fx::main(); thread clientscripts\zombie_cosmodrome_amb::main(); clientscripts\_zombiemode_deathcard::init(); level init_cosmodrome_box_screens(); OnPlayerConnect_Callback( ::cosmo_on_player_connect ); OnPlayerSpawned_Callback( ::cosmo_on_player_spawned ); waitforclient(0); level thread cosmodrome_ZPO_listener(); level thread cosmodrome_monkey_round_start_listener(); register_zombie_types(); level thread radar_dish_init(); players = GetLocalPlayers(); for ( i=0; i 1.0 ) { return LineEnd; } else { start_x = LineStart[0] + t * ( LineEnd[0] - LineStart[0] ); start_y = LineStart[1] + t * ( LineEnd[1] - LineStart[1] ); start_z = LineStart[2] + t * ( LineEnd[2] - LineStart[2] ); return (start_x,start_y,start_z); } } plane_position_updater (fake_ent, plane) { apex = 5000; soundid = -1; dx = undefined; last_time = undefined; last_pos = undefined; start_time = 0; while(IsDefined(plane)) { setfakeentorg(0, fake_ent, plane.origin); if((soundid < 0) && isdefined(last_pos)) { dx = plane.origin - last_pos; if(length(dx) > .01) { velocity = dx / (getrealtime()-last_time); assert(isdefined(velocity)); players = getlocalplayers(); assert(isdefined(players)); other_point = plane.origin + (velocity * 100000); player_origin = players[0] GetOrigin(); if( !isDefined( player_origin ) ) { continue; } point = closest_point_on_line_to_point(player_origin, plane.origin, other_point ); assert(isdefined(point)); dist = Distance( point, plane.origin ); assert(isdefined(dist)); time = dist / length(velocity); assert(isdefined(time)); if(time < apex) { soundid = playloopsound(0, fake_ent, "veh_mig_flyby", 0 ); playsound (0, "veh_mig_flyby_lfe", (0,0,0)); start_time = getRealTime(); } } } last_pos = plane.origin; last_time = GetRealTime(); if(start_time != 0) { } wait(0.1); } deletefakeent(0, fake_ent); } migs_fly_by() { points = getstructarray("spawn_flyby","targetname"); while(1) { point = random(points); planes = []; fake_ent_planes = []; planes[0] = spawn(0,point.origin,"script_origin"); planes[0] setmodel("t5_veh_jet_mig17"); planes[0].angles = point.angles; fake_ent_planes[0] = spawnfakeent( 0 ); wait(.1); if(randomint(100) > 50 ) { planes[1] = spawn(0,point.origin + ( -1100,0,0),"script_origin"); planes[1].angles = point.angles; planes[1] setmodel("t5_veh_jet_mig17"); fake_ent_planes[1] = spawnfakeent( 0 ); wait(.1); if(randomint(100) > 50 ) { planes[2] = spawn(0,point.origin + ( 1100,0,0),"script_origin"); planes[2].angles = point.angles; planes[2] setmodel("t5_veh_jet_mig17"); fake_ent_planes[2] = spawnfakeent( 0 ); wait(.1); } } for(i=0;i 2 && i == 0) { wait(.35); } } playsound (0, "veh_mig_flyby_2d", (0,0,0)); for(i=0;i RandomInt( 100 ) && IsDefined( level.magic_box_tv_random ) ) { self SetModel( level.magic_box_tv_random[ RandomInt( level.magic_box_tv_random.size ) ] ); wait( 2.0 ); } wait( 1.0 ); } } play_magic_box_tv_audio( state ) { alias = "amb_tv_static"; if( state == "n" ) { if( level._power_on == false ) { alias = undefined; } else { alias = "amb_tv_static"; } } else if( state == "f" ) { alias = "mus_fire_sale"; } else { alias = "amb_tv_static"; } if( !IsDefined(alias) ) { self stoploopsound( .5 ); } else { self PlayLoopSound( alias, .5 ); } } monkey_start_monitor() { while( 1 ) { level waittill( "monkey_start" ); players = GetLocalPlayers(); for( i = 0; i < players.size; i++ ) { players[i] clientscripts\_zombiemode::zombie_vision_set_apply( level._visionset_map_monkey, level._visionset_priority_map_monkey ); players[i] fog_apply( "monkey",level._fog_settings_monkey_priority ); } level._effect["eye_glow"] = level._effect["monkey_eye_glow"]; } } monkey_stop_monitor() { while( 1 ) { level waittill( "monkey_stop" ); players = GetLocalPlayers(); for( i = 0; i < players.size; i++ ) { players[i] clientscripts\_zombiemode::zombie_vision_set_remove( level._visionset_map_monkey ); players[i] fog_remove( "monkey" ); } level._effect["eye_glow"] = level._effect["zombie_eye_glow"]; } } monkey_land_on() { while ( 1 ) { level waittill( "MLO" ); players = GetLocalPlayers(); for( i = 0; i < players.size; i++ ) { players[i] clientscripts\_zombiemode::zombie_vision_set_apply( level._visionset_map_monkeylandon, level._visionset_priority_map_monkeylandon, level._visionset_monkey_transition_time_on ); } wait( 0.05 ); } } monkey_land_off() { while ( 1 ) { level waittill( "MLF" ); players = GetLocalPlayers(); for( i = 0; i < players.size; i++ ) { players[i] clientscripts\_zombiemode::zombie_vision_set_remove( level._visionset_map_monkeylandon, level._visionset_monkey_transition_time_off ); } wait( 0.05 ); } } cosmo_on_player_connect( int_local_client_num ) { self endon( "disconnect" ); while( !ClientHasSnapshot( int_local_client_num ) ) { wait( 0.05 ); } if( int_local_client_num != 0 ) { return; } players = GetLocalPlayers(); for( i = 0; i < players.size; i++ ) { players[i] thread cosmodrome_first_vision_set( i ); } } cosmo_on_player_spawned( int_local_client_num ) { self endon( "disconnect" ); while ( !self hasdobj( int_local_client_num ) ) { wait( 0.05 ); } if( int_local_client_num != 0 ) { return; } players = GetLocalPlayers(); for( i = 0; i < players.size; i++ ) { players[i] cosmodrome_vision_set( i ); players[i] fog_apply( "normal", level._fog_settings_default_priority ); } } cosmodrome_first_vision_set( int_client_num ) { self endon( "disconnect" ); self clientscripts\_zombiemode::zombie_vision_set_apply( level._visionset_map_begin, level._visionset_priority_map_begin, 0.1, int_client_num ); self clientscripts\_zombiemode::zombie_vision_set_apply( level._visionset_map_nopower, level._visionset_priority_map_nopower, 0.1, int_client_num ); level waittill( "ZID" ); self clientscripts\_zombiemode::zombie_vision_set_remove( level._visionset_map_begin, 8.5, int_client_num ); } cosmodrome_vision_set( int_client_num ) { self endon( "disconnect" ); if( level._power_on == true ) { self thread clientscripts\_zombiemode::zombie_vision_set_apply( level._visionset_map_poweron, level._visionset_priority_map_poweron, level._visionset_zombie_transition_time, int_client_num ); } else { self thread clientscripts\_zombiemode::zombie_vision_set_apply( level._visionset_map_nopower, level._visionset_priority_map_nopower, 0, int_client_num ); } } cosmodrome_power_vision_set_swap() { level waittill( "ZPO" ); players = GetLocalPlayers(); for( i = 0; i < players.size; i++ ) { players[i] clientscripts\_zombiemode::zombie_vision_set_apply( level._visionset_map_sudden_power, level._visionset_priority_map_sudden_power, level._visionset_zombie_sudden_power_transition_time, i ); } wait( 1.0 ); players = GetLocalPlayers(); for( i = 0; i < players.size; i++ ) { players[i] clientscripts\_zombiemode::zombie_vision_set_apply( level._visionset_map_poweron, level._visionset_priority_map_poweron, level._visionset_zombie_transition_time, i ); } } catwalk_lander_doors() { level thread catwalk_lander_doors_only(); while(1) { level waittill("CW_O"); level thread open_lander_bay_doors("catwalk_zip_door"); level waittill("CW_C"); level thread close_lander_bay_doors("catwalk_zip_door"); } } catwalk_lander_doors_only() { while(1) { level waittill("CWD"); level thread open_lander_bay_doors_only("catwalk_zip_door"); } } base_entry_lander_doors() { level thread base_entry_lander_doors_only(); while(1) { level waittill("BE_O"); level thread open_lander_bay_doors("base_entry_zip_door"); level waittill("BE_C"); level thread close_lander_bay_doors("base_entry_zip_door"); } } base_entry_lander_doors_only() { while(1) { level waittill("BED"); level thread open_lander_bay_doors_only("base_entry_zip_door"); } } storage_lander_doors() { level thread storage_lander_doors_only(); while(1) { level waittill("S_O"); level thread open_lander_bay_doors("storage_zip_door"); level waittill("S_C"); level thread close_lander_bay_doors("storage_zip_door"); } } storage_lander_doors_only() { while(1) { level waittill("SOD"); level thread open_lander_bay_doors_only("storage_zip_door"); } } centrifuge_lander_doors() { level thread centrifuge_lander_doors_only(); while(1) { level waittill("CF_O"); level thread open_lander_bay_doors("centrifuge_zip_door"); level waittill("CF_C"); level thread close_lander_bay_doors("centrifuge_zip_door"); } } centrifuge_lander_doors_only() { while(1) { level waittill("CFD"); level thread open_lander_bay_doors_only("centrifuge_zip_door"); } } open_lander_bay_doors(door_name) { println("***** -- Opening door"); players = GetLocalPlayers(); sound_count = 0; for(x=0;x 50 ) { side = AnglesToRight(self.angles); } else { side = AnglesToRight(self.angles) * - 1; } side = vector_scale( side, RandomIntRange( side_min, side_max ) ); point = self.origin + fwd + side; trace = bullettrace(point,point + (0,0,-10000),false,undefined); return trace["position"]; } rain_debris(clientnum) { rocket_debris = getentarray(clientnum,"rocket_explode_debris","targetname"); for(i=0;i<10;i++) { spot = self get_random_spot_in_player_view(1000,3500,50,1000); debris = spawn(clientnum,spot + (0,0,10000),"script_model"); debris.angles = (randomint(360),randomint(360),randomint(360));; debris setmodel(random(rocket_debris).model); debris thread debris_crash_and_burn(spot,clientnum,self); wait(randomfloatrange(.5,1.5)); } } debris_crash_and_burn(spot,client,player) { playfxontag(client,level._effect["debris_trail"] ,self,"tag_origin"); self moveto(spot,3.1); for(i=0;i<10;i++) { self rotateto( (randomint(360),randomint(360),randomint(360)),.3); wait(.3); } wait(3.1); player earthquake(0.4,0.5,self.origin,1200); playfx( client, level._effect["debris_hit"], self.origin ); wait(1); self delete(); } setup_lander_screens(clientnum) { screens = GetEntArray( clientnum,"lander_screens","targetname"); for(i=0;i (1500 * 1500)) { wait(.1); continue; } dist = distancesquared ( player.origin,self.origin); if(dist > 750*750 ) { player Earthquake( RandomFloatRange( 0.1, 0.15 ), RandomFloatRange(0.15, 0.16), self.origin, 1000 ); rumble = "slide_rumble"; } else { player Earthquake( RandomFloatRange( 0.15, 0.2 ), RandomFloatRange(0.15, 0.16), self.origin, 750 ); rumble = "damage_light"; } player PlayRumbleOnEntity(localClientNum,rumble); wait(.1); } } centrifuge_rumble_control( local_client_num, set, newEnt ) { if( local_client_num != 0 ) { return; } if( set ) { players = GetLocalPlayers(); for( i = 0; i < players.size; i++ ) { players[i] thread centrifuge_rumble_when_close( self, i ); } } else { level notify( "centrifuge_rumble_done" ); } } centrifuge_rumble_when_close( ent_centrifuge, int_client_num ) { self endon( "death" ); self endon( "disconnect" ); level endon( "centrifuge_rumble_done" ); rumble_range = 600*600; centrifuge_rumble = "damage_heavy"; client_num = undefined; while( IsDefined(self) ) { distance_to_centrifuge = DistanceSquared( self.origin, ent_centrifuge.origin ); if( ( distance_to_centrifuge < rumble_range ) && IsDefined(self)) { if( IsDefined( int_client_num ) ) { self PlayRumbleOnEntity( int_client_num, centrifuge_rumble ); } } if( ( distance_to_centrifuge > rumble_range ) ) { if( IsDefined( int_client_num ) && IsDefined(self)) { self StopRumble( int_client_num, centrifuge_rumble ); } } wait( 0.1 ); } } centrifuge_clean_rumble( int_client_num ) { self endon( "death" ); self endon( "disconnect" ); self StopRumble( int_client_num, "damage_heavy" ); } centrifuge_warning_lights_init( local_client_num, set, newEnt ) { while( !self hasdobj( local_client_num ) ) { wait(0.1); } if( local_client_num != 0 ) { return; } players = GetLocalPlayers(); for( i = 0; i < players.size; i++ ) { self centrifuge_warning_lights_off( i ); } if( set ) { players = GetLocalPlayers(); for( i = 0; i < players.size; i++ ) { self centrifuge_fx_spot_init( i ); self centrifuge_warning_lights_on( i ); } } } monkey_lander_fx_on() { self endon("switch_off_monkey_lander_fx"); PlaySound(0, "zmb_ape_intro_whoosh", self.origin); realWait( 2.5 ); self.fx = []; players = getlocalplayers(); ent_num = self GetEntityNumber(); for(i = 0; i < players.size; i ++) { player = players[i]; if(!IsDefined(player._monkey_lander_fx)) { player._monkey_lander_fx = []; } if(IsDefined(player._monkey_lander_fx[ent_num])) { DeleteFX(i, player._monkey_lander_fx[ent_num]); player._monkey_lander_fx[ent_num] = undefined; } player._monkey_lander_fx[ent_num] = PlayFXOnTag(i, level._effect["monkey_trail"],self,"tag_origin"); } } monkey_lander_delay_fx_off() { realWait( 5 ); self notify("switch_off_monkey_lander_fx"); players = getlocalplayers(); ent_num = self GetEntityNumber(); for(i = 0; i < players.size; i ++) { player = players[i]; if(IsDefined(player._monkey_lander_fx[ent_num])) { DeleteFX(i, player._monkey_lander_fx[ent_num]); player._monkey_lander_fx[ent_num] = undefined; } } } monkey_lander_fx_off() { self thread monkey_lander_delay_fx_off(); players = getlocalplayers(); ent_num = self GetEntityNumber(); for(i = 0; i < players.size; i ++) { player = players[i]; PlayFX(i, level._effect["monkey_spawn"], self.origin ); PlayRumbleOnPosition( i, "explosion_generic", self.origin ); player Earthquake( 0.5, 0.5, player.origin, 1000 ); } PlaySound( 0, "zmb_ape_intro_land", self.origin ); level notify( "MLO" ); wait( 0.5 ); level notify ( "MLF" ); } monkey_lander_fx(local_client_num, set, newEnt) { if( local_client_num != 0 ) { return; } while( !self hasdobj( local_client_num ) ) { wait(0.1); } if(set) { self thread monkey_lander_fx_on(); } else { self thread monkey_lander_fx_off(); } } centrifuge_fx_spot_init( int_client_num ) { self._centrifuge_lights_[int_client_num] = []; self._centrifuge_lights_[int_client_num] = add_to_array( self._centrifuge_lights_[int_client_num], "tag_light_bk_top", false ); self._centrifuge_lights_[int_client_num] = add_to_array( self._centrifuge_lights_[int_client_num], "tag_light_fnt_top", false ); self._centrifuge_sparks_[int_client_num] = []; self._centrifuge_sparks_[int_client_num] = add_to_array( self._centrifuge_sparks_[int_client_num], "tag_light_bk_bttm", false ); self._centrifuge_sparks_[int_client_num] = add_to_array( self._centrifuge_sparks_[int_client_num], "tag_light_fnt_bttm", false ); self._centrifuge_steams_[int_client_num] = []; self._centrifuge_steams_[int_client_num] = add_to_array( self._centrifuge_steams_[int_client_num], "tag_vent_bk_btm", false ); self._centrifuge_steams_[int_client_num] = add_to_array( self._centrifuge_steams_[int_client_num], "tag_vent_top_btm", false ); self._centrifuge_light_mdls_[int_client_num] = []; self._centrifuge_fx_setup = true; } centrifuge_warning_lights_on( client_num ) { for( i = 0; i < self._centrifuge_lights_[client_num].size; i++ ) { temp_mdl = Spawn( client_num, self GetTagOrigin( self._centrifuge_lights_[client_num][i] ), "script_model" ); temp_mdl.angles = self GetTagAngles( self._centrifuge_lights_[client_num][i] ); temp_mdl SetModel( "tag_origin" ); temp_mdl LinkTo( self, self._centrifuge_lights_[client_num][i] ); PlayFXOnTag( client_num, level._effect[ "centrifuge_warning_light" ], temp_mdl, "tag_origin" ); self._centrifuge_light_mdls_[client_num] = add_to_array( self._centrifuge_light_mdls_[client_num], temp_mdl, false ); } for( i = 0; i < self._centrifuge_sparks_[client_num].size; i++ ) { temp_mdl = Spawn( client_num, self GetTagOrigin( self._centrifuge_sparks_[client_num][i] ), "script_model" ); temp_mdl.angles = self GetTagAngles( self._centrifuge_sparks_[client_num][i] ); temp_mdl SetModel( "tag_origin" ); temp_mdl LinkTo( self, self._centrifuge_sparks_[client_num][i] ); PlayFXOnTag( client_num, level._effect[ "centrifuge_light_spark" ], temp_mdl, "tag_origin" ); self._centrifuge_light_mdls_[client_num] = add_to_array( self._centrifuge_light_mdls_[client_num], temp_mdl, false ); } self thread centrifuge_steam_warning( client_num ); } centrifuge_steam_warning( client_num ) { wait( 1.0 ); for( i = 0; i < self._centrifuge_steams_[client_num].size; i++ ) { PlayFXOnTag( client_num, level._effect[ "centrifuge_start_steam" ], self, self._centrifuge_steams_[client_num][i] ); } } centrifuge_warning_lights_off( client_num ) { if( !IsDefined( self._centrifuge_fx_setup ) ) { return; } wait( 0.2 ); for( i = 0; i < self._centrifuge_light_mdls_[client_num].size; i++ ) { if( IsDefined( self._centrifuge_light_mdls_[client_num][i] ) ) { self._centrifuge_light_mdls_[client_num][i] Unlink(); } } array_delete( self._centrifuge_light_mdls_[client_num] ); self._centrifuge_light_mdls_[client_num] = []; } fog_apply( str_fog, int_priority ) { self endon( "death" ); self endon( "disconnect" ); if( !IsDefined( self._zombie_fog_list ) ) { self._zombie_fog_list = []; } if( !IsDefined( str_fog ) || !IsDefined( int_priority ) ) { return; } already_in_array = false; if( self._zombie_fog_list.size != 0 ) { for( i = 0; i < self._zombie_fog_list.size; i++ ) { if( IsDefined( self._zombie_fog_list[i].fog_setting ) && self._zombie_fog_list[i].fog_setting == str_fog ) { already_in_array = true; if( self._zombie_fog_list[i].priority != int_priority ) { self._zombie_fog_list[i].priority = int_priority; } break; } } } if( !already_in_array ) { temp_struct = spawnStruct(); temp_struct.fog_setting = str_fog; temp_struct.priority = int_priority; self._zombie_fog_list = add_to_array( self._zombie_fog_list, temp_struct, false ); } fog_to_set = get_fog_by_priority(); set_fog(fog_to_set); } fog_remove( str_fog ) { self endon( "death" ); self endon( "disconnect" ); if( !IsDefined( str_fog ) ) { return; } if( !IsDefined( self._zombie_fog_list ) ) { self._zombie_fog_list = []; } temp_struct = undefined; for( i = 0; i < self._zombie_fog_list.size; i++ ) { if( IsDefined( self._zombie_fog_list[i].fog_setting ) && self._zombie_fog_list[i].fog_setting == str_fog ) { temp_struct = self._zombie_fog_list[i]; } } if( IsDefined( temp_struct ) ) { self._zombie_fog_list = array_remove( self._zombie_fog_list, temp_struct ); } fog_to_set = get_fog_by_priority(); set_fog(fog_to_set); } get_fog_by_priority() { if( !IsDefined( self._zombie_fog_list ) ) { return; } highest_score = 0; highest_score_fog = undefined; for( i = 0; i < self._zombie_fog_list.size; i++ ) { if( IsDefined( self._zombie_fog_list[i].priority ) && self._zombie_fog_list[i].priority > highest_score ) { highest_score = self._zombie_fog_list[i].priority; highest_score_fog = self._zombie_fog_list[i].fog_setting; } } return highest_score_fog; } setup_fog() { waitforclient(0); wait(1); players = getlocalplayers(); for(i=0;i