// IW6 GSC SOURCE // Generated by https://github.com/xensik/gsc-tool main() { maps\mp\mp_ca_rumble_precache::main(); maps\createart\mp_ca_rumble_art::main(); maps\mp\mp_ca_rumble_fx::main(); level thread update_mortars(); level.air_raid_active = 0; level.mapcustomcratefunc = ::rumblecustomcratefunc; level.mapcustomkillstreakfunc = ::rumblecustomkillstreakfunc; level.mapcustombotkillstreakfunc = ::rumblecustombotkillstreakfunc; maps\mp\_load::main(); maps\mp\_compass::setupminimap( "compass_map_mp_ca_rumble" ); setdvar( "r_lightGridEnableTweaks", 1 ); setdvar( "r_lightGridIntensity", 1.33 ); if ( level.ps3 ) { setdvar( "sm_sunShadowScale", "0.55" ); setdvar( "sm_sunsamplesizenear", ".15" ); } else if ( level.xenon ) { setdvar( "sm_sunShadowScale", "0.56" ); setdvar( "sm_sunsamplesizenear", ".22" ); } else { setdvar( "sm_sunShadowScale", "0.9" ); setdvar( "sm_sunsamplesizenear", ".27" ); } maps\mp\_utility::setdvar_cg_ng( "r_specularColorScale", 1.7, 5 ); game["attackers"] = "allies"; game["defenders"] = "axis"; game["allies_outfit"] = "urban"; game["axis_outfit"] = "woodland"; fixmlgcameraposition(); thread setup_fish(); thread setup_destructibles(); thread setup_metal_detectors(); thread setup_watertanks(); thread setup_bouys(); thread setup_dock_boats(); thread setup_monitors(); thread update_destroyer(); thread update_trolley(); thread update_lighthouse_light(); thread setup_fountain_fx(); thread update_artillery_fx(); thread update_heli_fx(); thread update_flybyjet_fx(); thread maps\mp\_dlcalienegg::setupeggformap( "alienEasterEgg" ); level thread initextracollision(); } initextracollision() { var_0 = getent( "clip128x128x256", "targetname" ); var_1 = spawn( "script_model", ( -459.25, 1848, 487.75 ) ); var_1.angles = ( 270, 322.793, 37.2067 ); var_1 clonebrushmodeltoscriptmodel( var_0 ); var_2 = getent( "clip256x256x128", "targetname" ); var_3 = spawn( "script_model", ( -1984, 344, -120 ) ); var_3.angles = ( 0, 0, 0 ); var_3 clonebrushmodeltoscriptmodel( var_2 ); } rumblecustomcratefunc() { if ( !isdefined( game["player_holding_level_killstrek"] ) ) game["player_holding_level_killstrek"] = 0; if ( !maps\mp\_utility::allowlevelkillstreaks() || game["player_holding_level_killstrek"] ) return; maps\mp\killstreaks\_airdrop::addcratetype( "airdrop_assault", "warhawk_mortars", 85, maps\mp\killstreaks\_airdrop::killstreakcratethink, maps\mp\killstreaks\_airdrop::get_friendly_crate_model(), maps\mp\killstreaks\_airdrop::get_enemy_crate_model(), &"KILLSTREAKS_HINTS_WARHAWK_MORTARS" ); level thread watch_for_rumble_mortars_crate(); } watch_for_rumble_mortars_crate() { for (;;) { level waittill( "createAirDropCrate", var_0 ); if ( isdefined( var_0 ) && isdefined( var_0.cratetype ) && var_0.cratetype == "warhawk_mortars" ) { maps\mp\killstreaks\_airdrop::changecrateweight( "airdrop_assault", "warhawk_mortars", 0 ); var_1 = wait_for_capture( var_0 ); if ( !var_1 ) { maps\mp\killstreaks\_airdrop::changecrateweight( "airdrop_assault", "warhawk_mortars", 85 ); continue; } game["player_holding_level_killstrek"] = 1; break; } } } wait_for_capture( var_0 ) { var_1 = watch_for_air_drop_death( var_0 ); return !isdefined( var_1 ); } watch_for_air_drop_death( var_0 ) { var_0 endon( "captured" ); var_0 waittill( "death" ); waittillframeend; return 1; } rumblecustomkillstreakfunc() { level.killstreakfuncs["warhawk_mortars"] = ::tryuserumblemortars; level.killstreakweildweapons["warhawk_mortar_mp"] = "warhawk_mortars"; } rumblecustombotkillstreakfunc() { maps\mp\bots\_bots_ks::bot_register_killstreak_func( "warhawk_mortars", maps\mp\bots\_bots_ks::bot_killstreak_simple_use ); } tryuserumblemortars( var_0, var_1 ) { if ( level.air_raid_active ) { self iprintlnbold( &"KILLSTREAKS_AIR_SPACE_TOO_CROWDED" ); return 0; } game["player_holding_level_killstrek"] = 0; level notify( "rumble_mortar_killstreak", self ); return 1; } mortars_activate_at_end_of_match() { level endon( "rumble_mortar_killstreak" ); level waittill( "spawning_intermission" ); level.ending_flourish = 1; mortar_fire( 0.1, 0.3, 6, level.players[0] ); } update_mortars() { level endon( "stop_dynamic_events" ); common_scripts\utility::waitframe(); level.mortar_sources = common_scripts\utility::getstructarray( "rumble_mortar_source", "targetname" ); foreach ( var_1 in level.mortar_sources ) { if ( !isdefined( var_1.radius ) ) var_1.radius = 300; } level.mortar_targets = common_scripts\utility::getstructarray( "rumble_mortar_target", "targetname" ); foreach ( var_4 in level.mortar_targets ) { if ( !isdefined( var_4.radius ) ) var_4.radius = 100; } for (;;) { level.air_raid_active = 0; level.air_raid_team_called = "none"; thread mortars_activate_at_end_of_match(); level waittill( "rumble_mortar_killstreak", var_6 ); level.air_raid_active = 1; level.air_raid_team_called = var_6.team; thread mortar_siren( 10 ); wait 3; mortar_fire( 0.5, 0.6, 25, var_6 ); } } mortar_siren( var_0 ) { if ( !isdefined( level.mortar_siren_ent ) ) level.mortar_siren_ent = getent( "mortar_siren", "targetname" ); if ( isdefined( level.mortar_siren_ent ) ) level.mortar_siren_ent playsound( "mortar_siren" ); wait( var_0 ); if ( isdefined( level.mortar_siren_ent ) ) level.mortar_siren_ent stopsounds(); } mortar_fire( var_0, var_1, var_2, var_3 ) { var_4 = gettime() + var_2 * 1000; var_5 = random_mortars_get_source_structs( level.air_raid_team_called ); if ( var_5.size <= 0 ) return; var_6 = 0; while ( var_4 > gettime() ) { var_7 = 12; var_8 = 0; foreach ( var_10 in level.players ) { if ( !maps\mp\_utility::isreallyalive( var_10 ) ) continue; if ( level.teambased ) { if ( var_10.team == level.air_raid_team_called ) continue; } else if ( isdefined( var_3 ) && var_10 == var_3 ) continue; if ( var_10.spawntime + 8000 > gettime() ) continue; var_11 = var_10 getvelocity(); var_12 = randomfloatrange( 3, 4 ); var_13 = var_10.origin + var_11 * var_12; var_14 = getnodesinradiussorted( var_13, 100, 0, 60 ); foreach ( var_16 in var_14 ) { if ( nodeexposedtosky( var_16 ) ) { var_17 = common_scripts\utility::random( var_5 ); if ( random_mortars_fire( var_17.origin, var_16.origin, undefined, var_3, 1, 1 ) ) { wait( randomfloatrange( var_0, var_1 ) ); var_8++; break; } } } } if ( level.mortar_targets.size > 0 ) { for ( var_5 = common_scripts\utility::array_randomize( var_5 ); var_8 < var_7; var_8++ ) { var_17 = var_5[var_6]; var_6++; if ( var_6 >= var_5.size ) var_6 = 0; var_20 = common_scripts\utility::random( level.mortar_targets ); var_21 = random_point_in_circle( var_17.origin, var_17.radius ); var_22 = random_point_in_circle( var_20.origin, var_20.radius ); thread random_mortars_fire( var_21, var_22, undefined, var_3, 0, 1 ); wait( randomfloatrange( var_0, var_1 ) ); } continue; } break; } } random_point_in_circle( var_0, var_1 ) { if ( var_1 > 0 ) { var_2 = anglestoforward( ( 0, randomfloatrange( 0, 360 ), 0 ) ); var_3 = randomfloatrange( 0, var_1 ); var_0 = var_0 + var_2 * var_3; } return var_0; } random_mortars_fire( var_0, var_1, var_2, var_3, var_4, var_5 ) { playsoundatpos( var_0, "mortar_launch" ); var_6 = ( 0, 0, -800 ); if ( !isdefined( var_2 ) ) { if ( isdefined( level.ending_flourish ) && level.ending_flourish ) var_2 = 2.5; else var_2 = randomfloatrange( 10.0, 12.0 ); } var_7 = trajectorycalculateinitialvelocity( var_0, var_1, var_6, var_2 ); if ( isdefined( var_4 ) && var_4 ) { var_8 = trajectorycomputedeltaheightattime( var_7[2], -1 * var_6[2], var_2 / 2 ); var_9 = ( var_1 - var_0 ) / 2 + var_0 + ( 0, 0, var_8 ); if ( bullettracepassed( var_9, var_1, 0, undefined ) ) { thread random_mortars_fire_run( var_0, var_1, var_2, var_3, var_7, var_5 ); return 1; } else return 0; } random_mortars_fire_run( var_0, var_1, var_2, var_3, var_7, var_5 ); } random_mortars_fire_run( var_0, var_1, var_2, var_3, var_4, var_5 ) { var_6 = 350; var_7 = random_mortars_get_model( var_0 ); var_7.origin = var_0; var_7.in_use = 1; common_scripts\utility::waitframe(); playfxontag( common_scripts\utility::getfx( "random_mortars_trail" ), var_7, "tag_fx" ); var_7.angles = vectortoangles( var_4 ) * ( -1, 1, 1 ); maps\mp\_utility::delaythread( var_2 - 2.0, ::random_mortars_incoming_sound, var_1 ); var_7 movegravity( var_4, var_2 - 0.05 ); var_7 waittill( "movedone" ); if ( level.createfx_enabled && !isdefined( level.players ) ) level.players = []; if ( isdefined( var_3 ) ) var_7 radiusdamage( var_1, 250, 750, 500, var_3, "MOD_EXPLOSIVE", "warhawk_mortar_mp" ); else var_7 radiusdamage( var_1, 140, 5, 5, undefined, "MOD_EXPLOSIVE", "warhawk_mortar_mp" ); playrumbleonposition( "artillery_rumble", var_1 ); var_8 = var_6 * var_6; foreach ( var_10 in level.players ) { if ( var_10 maps\mp\_utility::isusingremote() ) continue; if ( distancesquared( var_1, var_10.origin ) > var_8 ) continue; if ( var_10 damageconetrace( var_1 ) ) var_10 thread maps\mp\gametypes\_shellshock::dirteffect( var_1 ); } if ( var_5 ) playfx( common_scripts\utility::getfx( "mortar_impact_00" ), var_1 ); var_7 delete(); } random_mortars_incoming_sound( var_0 ) { playsoundatpos( var_0, "mortar_incoming" ); } random_mortars_get_model( var_0 ) { var_1 = spawn( "script_model", var_0 ); var_1 setmodel( "projectile_rpg7" ); return var_1; } random_mortars_get_source_structs( var_0 ) { var_1 = []; if ( level.teambased ) { foreach ( var_3 in level.mortar_sources ) { if ( isdefined( var_3.script_team ) && var_3.script_team == var_0 ) var_1[var_1.size] = var_3; } } if ( var_1.size == 0 ) var_1 = level.mortar_sources; return var_1; } setup_destructibles() { var_0 = getentarray( "dest_orca", "targetname" ); var_1 = getentarray( "dest_shark", "targetname" ); if ( var_1.size ) { foreach ( var_3 in var_1 ) var_3 thread update_destructibles( level._effect["vfx_mp_ca_rumble_shark_hit"], level._effect["vfx_mp_ca_rumble_shark_death"] ); } if ( var_0.size ) { foreach ( var_6 in var_0 ) var_6 thread update_destructibles( level._effect["vfx_mp_ca_rumble_orca_hit"], level._effect["vfx_mp_ca_rumble_orca_death"] ); } } update_destructibles( var_0, var_1 ) { self show(); self setcandamage( 1 ); var_2 = undefined; var_3 = randomintrange( 2, 4 ); while ( var_3 > 0 ) { self waittill( "damage", var_4, var_5, var_6, var_7, var_8 ); var_3--; var_2 = var_6; thread play_hit( var_0, var_7, var_6 ); if ( issubstr( var_8, "MELEE" ) || issubstr( var_8, "GRENADE" ) ) { var_3 = 0; continue; } if ( issubstr( var_8, "BULLET" ) ) { if ( var_4 > 60.0 ) { var_3 = 0; continue; } if ( isdefined( var_5 ) && isdefined( var_5 getcurrentweapon() ) && weaponclass( var_5 getcurrentweapon() ) == "sniper" ) var_3 = 0; } } if ( !isdefined( var_2 ) ) self waittill( "damage", var_4, var_5, var_6, var_7, var_8 ); else var_6 = var_2; self hide(); self setcandamage( 0 ); thread play_hit( var_1, self getorigin(), var_6 ); } play_hit( var_0, var_1, var_2 ) { var_3 = spawnfx( var_0, var_1, anglestoforward( var_2 ), anglestoup( var_2 ) ); triggerfx( var_3 ); wait 5.0; var_3 delete(); } setup_fish() { var_0 = getent( "bannerfish", "targetname" ); if ( isdefined( var_0 ) ) var_0 thread update_fish(); } #using_animtree("mp_ca_rumble_animtree"); update_fish() { for (;;) { var_0 = randomint( 3 ); self scriptmodelclearanim(); if ( var_0 == 0 ) { self scriptmodelplayanim( "mp_ca_rumble_fish_swim_anim" ); wait( getanimlength( %mp_ca_rumble_fish_swim_anim ) ); continue; } if ( var_0 == 1 ) { self scriptmodelplayanim( "mp_ca_rumble_fish_swim_anim_b" ); wait( getanimlength( %mp_ca_rumble_fish_swim_anim_b ) ); continue; } self scriptmodelplayanim( "mp_ca_rumble_fish_swim_anim_c" ); wait( getanimlength( %mp_ca_rumble_fish_swim_anim_c ) ); } } setup_metal_detectors() { var_0 = getentarray( "metal_detector_trigger", "targetname" ); if ( var_0.size > 0 ) common_scripts\utility::array_thread( var_0, ::update_metal_detector ); } update_metal_detector() { self endon( "detector_destroyed" ); var_0 = []; var_1 = getentarray( "metal_detector_device", "targetname" ); foreach ( var_3 in var_1 ) { if ( distancesquared( var_3.origin, self.origin ) < 10000.0 ) { var_3.md_health = 100.0; var_3.light_on = getent( var_3.target, "targetname" ); var_3.light_off = getent( var_3.light_on.target, "targetname" ); var_3.light_broke = getent( var_3.light_off.target, "targetname" ); var_3 thread metal_detector_damage_monitor( self ); var_0 = common_scripts\utility::array_add( var_0, var_3 ); } } thread metal_detector_monitor_alive( var_0 ); for (;;) { foreach ( var_3 in var_0 ) var_3 thread metal_detector_on(); self waittill( "trigger" ); foreach ( var_3 in var_0 ) var_3 thread metal_detector_off(); wait 5.0; } } metal_detector_monitor_alive( var_0 ) { self waittill( "detector_damaged" ); foreach ( var_2 in var_0 ) var_2 dodamage( 10000, var_2.origin ); self notify( "detector_destroyed" ); } metal_detector_damage_monitor( var_0 ) { self.light_on thread metal_detectorpart_damage_monitor( self ); self.light_off thread metal_detectorpart_damage_monitor( self ); self setcandamage( 1 ); while ( self.md_health > 0.0 ) { self waittill( "damage", var_1, var_2, var_3, var_4, var_5 ); if ( isplayer( var_2 ) ) self.maintain_fx = 1; self.md_health = self.md_health - var_1; } thread metal_detector_broke( var_0 ); } metal_detectorpart_damage_monitor( var_0 ) { var_0 endon( "detector_destroyed" ); self setcandamage( 1 ); for (;;) { self waittill( "damage", var_1, var_2, var_3, var_4, var_5 ); var_0 dodamage( 10000, var_0.origin ); } } metal_detector_on() { if ( self.md_health <= 0.0 ) return; self.light_on show(); self.light_off hide(); self.light_broke hide(); self playsound( "metaldetector_reset" ); } metal_detector_off() { if ( self.md_health <= 0.0 ) return; self.light_on hide(); self.light_off show(); self.light_broke hide(); self playsound( "metaldetector_alarm" ); } metal_detector_broke( var_0 ) { var_0 notify( "detector_damaged" ); self.light_on hide(); self.light_off hide(); self.light_broke show(); if ( isdefined( self.maintain_fx ) && self.maintain_fx == 1 ) { for (;;) { self.light_broke playsound( "metaldetector_sparks" ); playfx( level._effect["vfx_metaldetector_explosion"], self.light_broke.origin + ( 0, 0, 7.5 ) ); wait( randomfloatrange( 45.0, 150.0 ) ); } } } setup_bouys() { var_0 = getentarray( "harbor_bouy", "targetname" ); if ( var_0.size <= 0 ) return; common_scripts\utility::array_thread( var_0, ::update_bouy ); } update_bouy() { var_0 = self.origin; var_1 = self.angles; var_2 = 225.0; for (;;) { var_3 = ( 10, 10, 0 ) + common_scripts\utility::randomvector( 10.0 ); var_3 = var_3 * ( 3, 3, 2 ); var_4 = var_0 + var_3; var_5 = max( 3.0, distancesquared( self.origin, var_4 ) / var_2 ); self rotateto( vectortoangles( var_4 - var_0 ), var_5, 1.5, 1.5 ); self moveto( var_4, var_5, 1.5, 1.5 ); wait( var_5 ); } } setup_dock_boats() { var_0 = getentarray( "dock_boats", "targetname" ); if ( var_0.size <= 0 ) return; common_scripts\utility::array_thread( var_0, ::update_dock_boat ); } update_dock_boat() { var_0 = self.angles; var_1 = 1; var_2 = 1.5; for (;;) { var_3 = ( 0.0, 0.0, randomfloatrange( 6.0, 8.0 ) ); var_4 = max( 2.0, var_3[2] / var_2 ); if ( var_1 ) var_3 = var_3 * -1.0; var_1 = !var_1; self rotateto( var_0 + var_3, var_4, 1.0, 1.0 ); wait( var_4 ); } } setup_monitors() { var_0 = getentarray( "rumble_monitor", "targetname" ); if ( var_0.size <= 0 ) return; common_scripts\utility::array_thread( var_0, ::update_monitor ); } update_monitor() { var_0 = getent( self.target, "targetname" ); if ( !isdefined( var_0 ) ) return; self show(); self setcandamage( 1 ); var_0 hide(); self waittill( "damage" ); self hide(); var_0 show(); var_0 playsound( "flatscreen_sparks" ); playfx( level._effect["vfx_flatscreen_explosion"], var_0.origin ); } setup_watertanks() { level.tank_hitfx_throttle = 600; level.tank_hitfx_throttle_max = 1200; level.next_tank_hitfx_time = -1.0; var_0 = getentarray( "watertank_glass", "targetname" ); if ( var_0.size > 0 ) { for ( var_1 = 0; var_1 < var_0.size; var_1++ ) var_0[var_1] thread update_watertank( var_1 ); } var_0 = getentarray( "watertank_invulnerable", "targetname" ); common_scripts\utility::array_thread( var_0, ::update_watertank_invulnerable ); } update_watertank( var_0 ) { var_1 = getent( self.target, "targetname" ); if ( !isdefined( var_1 ) ) return; var_2 = getent( var_1.target, "targetname" ); if ( !isdefined( var_2 ) ) return; var_3 = getent( var_2.target, "targetname" ); if ( !isdefined( var_3 ) ) return; var_1 thread update_watertank_fish(); var_1.destroyexplosiveoncollision = 0; var_3 hide(); self setcandamage( 1 ); self.tank_damage = 0; var_4 = 41.5; var_5 = var_1.origin[2] + var_4; var_6 = 2.0; var_7 = 4.0; var_8 = 1.0; var_9 = 2.0; while ( self.tank_damage < 1200.0 ) { self waittill( "damage", var_10, var_11, var_12, var_13, var_14 ); self.tank_damage = self.tank_damage + var_10; if ( !issubstr( var_14, "BULLET" ) ) continue; if ( !can_allocate_new_tank_crack() ) continue; var_15 = var_1.origin[2] + var_4; if ( var_13[2] >= var_15 ) continue; var_16 = get_watertank_hit_angle( var_11, var_12, var_13 ); if ( !isdefined( var_16 ) ) continue; var_17 = min( var_7 * var_6, var_15 - var_2.origin[2] ); var_18 = max( var_2.origin[2], max( var_13[2], var_15 - var_17 ) ); var_19 = var_18 - var_15; var_20 = abs( var_19 ) / var_6; var_20 = max( var_20, var_8 + var_9 ); thread spawn_watertank_hit( level._effect["vfx_watertank_bullet_hit"], var_11, var_16, var_13, var_20, var_1, var_4 ); if ( var_18 >= var_5 ) continue; var_5 = var_18; var_1 movez( var_19, var_20, var_8, var_9 ); } self playsound( "water_tank_splash" ); var_1 notify( "tank_destroyed" ); wait 0.05; var_21 = self getlinkedchildren(); foreach ( var_23 in var_21 ) var_23 notify( "detonateExplosive" ); self delete(); var_1 delete(); var_3 show(); var_3 scriptmodelplayanim( "mp_ca_rumble_glass_anim" ); if ( var_0 == 0 ) { playfx( level._effect["vfx_glass_shatter_splash"], ( -46.0003, 1409.25, 138.056 ), anglestoforward( ( 0, 0, 0 ) ), anglestoup( ( 0, 0, 0 ) ) ); playfx( level._effect["vfx_glass_ground_splash"], ( -39.7033, 1414.08, 89 ), anglestoforward( ( 270, 0, 0 ) ), anglestoup( ( 0, 0, 0 ) ) ); } else { playfx( level._effect["vfx_glass_shatter_splash"], ( -47.9208, 1144.29, 141.575 ), anglestoforward( ( 0, 0, 0 ) ), anglestoup( ( 0, 0, 0 ) ) ); playfx( level._effect["vfx_glass_ground_splash"], ( -51.5828, 1139.69, 89 ), anglestoforward( ( 270, 0, 0 ) ), anglestoup( ( 0, 0, 0 ) ) ); } } update_watertank_fish() { self endon( "death" ); wait 2.0; var_0 = level._effect["vfx_fish_school"]; var_1 = spawn( "script_model", self.origin ); var_1 setmodel( "tag_origin" ); var_1 linkto( self ); thread maintain_watertank_fish( var_0, var_1 ); self waittill( "tank_destroyed" ); killfxontag( var_0, var_1, "tag_origin" ); wait 0.05; var_1 delete(); } maintain_watertank_fish( var_0, var_1 ) { self endon( "tank_destroyed" ); for (;;) { playfxontag( var_0, var_1, "tag_origin" ); wait 5.0; stopfxontag( var_0, var_1, "tag_origin" ); wait 1.0; } } spawn_watertank_hit( var_0, var_1, var_2, var_3, var_4, var_5, var_6 ) { allocate_new_tank_crack(); var_7 = spawnfx( var_0, var_3, var_2 ); triggerfx( var_7 ); var_7 playsound( "water_tank_hit" ); var_8 = gettime() + var_4 * 1000.0; var_7 monitor_watertank_hit( var_5, var_8, var_6 ); var_7 stopsounds(); wait 0.05; var_7 delete(); } monitor_watertank_hit( var_0, var_1, var_2 ) { var_0 endon( "tank_destroyed" ); while ( gettime() < var_1 ) { if ( self.origin[2] >= var_0.origin[2] + var_2 - 1.0 ) break; wait 0.05; } } update_watertank_invulnerable() { self setcandamage( 1 ); for (;;) { self waittill( "damage", var_0, var_1, var_2, var_3, var_4 ); if ( !issubstr( var_4, "BULLET" ) ) continue; if ( !can_allocate_new_tank_crack() ) continue; var_5 = get_watertank_hit_angle( var_1, var_2, var_3 ); if ( !isdefined( var_5 ) ) continue; allocate_new_tank_crack(); var_5 = vectortoangles( var_5 ); playfx( level._effect["vfx_watertank_bullet_hit"], var_3, anglestoforward( var_5 ), anglestoup( var_5 ) ); playsoundatpos( var_3, "water_tank_hit" ); } } get_watertank_hit_angle( var_0, var_1, var_2 ) { var_3 = var_0.origin; var_4 = var_2 - var_3; var_5 = bullettrace( var_3, var_3 + 1.5 * var_4, 0, var_0, 0 ); if ( isdefined( var_5["normal"] ) && isdefined( var_5["entity"] ) && var_5["entity"] == self ) return var_5["normal"]; return undefined; } can_allocate_new_tank_crack() { if ( gettime() < level.next_tank_hitfx_time ) return 0; return 1; } allocate_new_tank_crack() { level.next_tank_hitfx_time = gettime() + randomfloatrange( level.tank_hitfx_throttle, level.tank_hitfx_throttle_max ); } update_trolley() { common_scripts\utility::waitframe(); var_0 = getent( "moving_trolley", "targetname" ); if ( !isdefined( var_0 ) ) return; var_0.destroyairdroponcollision = 1; var_0.destroydroneoncollision = 0; var_1 = maps\mp\gametypes\_gameobjects::getnextobjid(); objective_add( var_1, "active", var_0.origin, "waypoint_trolley" ); objective_onentitywithrotation( var_1, var_0 ); self.curobjid = var_1; var_2 = common_scripts\utility::getstructarray( "trolley_light", "targetname" ); common_scripts\utility::array_thread( var_2, ::trolley_attach_lights, var_0 ); var_3 = getent( "moving_trolley_mesh", "targetname" ); if ( isdefined( var_3 ) ) var_3 linkto( var_0 ); var_4 = getentarray( "moving_trolley_extras", "targetname" ); if ( var_4.size > 0 ) { foreach ( var_6 in var_4 ) var_6 linkto( var_0 ); } var_8 = getentarray( "moving_trolley_wheel", "targetname" ); if ( var_8.size <= 0 ) return; var_9 = []; var_10 = []; for ( var_11 = 0; var_11 < var_8.size; var_11++ ) { var_9[var_11] = var_0.origin - var_8[var_11].origin; var_10[var_11] = var_0.angles - var_8[var_11].angles; } var_12 = getent( "trolley_path_start", "targetname" ); if ( !isdefined( var_12 ) ) return; var_0.origin = var_12.origin; var_0.angles = var_12.angles; for ( var_11 = 0; var_11 < var_8.size; var_11++ ) { var_8[var_11].origin = var_12.origin - rotatevector( var_9[var_11], var_12.angles ); var_8[var_11].angles = var_12.angles + var_10[var_11]; } var_0.enabled = 1; var_0 thread monitor_trolley_dvar(); var_13 = 140.0; var_14 = 0.0; var_15 = 0.0; if ( isdefined( var_12.script_accel ) ) var_15 = var_12.script_accel; var_12 = getent( var_12.target, "targetname" ); while ( isdefined( var_12 ) ) { if ( !var_0.enabled ) { wait 0.05; continue; } var_14 = 0.0; if ( isdefined( var_12.script_decel ) ) var_14 = var_12.script_decel; var_16 = var_13; var_16 = var_16 / max( 1, getdvarint( "trolley_throttle", 1 ) ); if ( isdefined( var_12.script_physics ) ) var_16 = var_16 * var_12.script_physics; var_17 = distance( var_0.origin, var_12.origin ) / var_16; var_17 = max( var_17, var_14 + var_15 ); var_0 moveto( var_12.origin, var_17, var_15, var_14 ); var_0 rotateto( var_12.angles, var_17, var_15, var_14 ); var_18 = var_16 * 2.1; if ( isdefined( var_12.script_anglevehicle ) && var_12.script_anglevehicle == 1 ) var_18 = var_18 * -1.0; var_19 = var_12.angles[1]; for ( var_11 = 0; var_11 < var_8.size; var_11++ ) { var_20 = var_12.origin - rotatevector( var_9[var_11], var_12.angles ); var_8[var_11] moveto( var_20, var_17, var_15, var_14 ); var_21 = ( var_19 + var_10[var_11][1] - var_8[var_11].angles[1] ) / var_17; var_22 = var_18; if ( isdefined( var_8[var_11].script_index ) && var_8[var_11].script_index == 1 ) var_22 = var_22 * -1.0; var_8[var_11] rotatevelocity( ( 0, var_21, var_22 ), var_17, var_15, var_14 ); } if ( var_15 > 0.0 ) { var_3 playsoundonmovingent( "trolley_bell" ); var_3 playsoundonmovingent( "trolley_start" ); wait( var_15 - 0.2 ); var_3 playloopsound( "trolley_motor" ); wait 0.2; } wait( var_17 - ( var_15 + var_14 ) ); if ( var_14 > 0.0 ) { var_3 playsoundonmovingent( "trolley_stop" ); wait 0.2; var_3 stoploopsound( "trolley_motor" ); wait( var_14 - 0.2 ); } if ( isdefined( var_12.script_node_pausetime ) ) wait( var_12.script_node_pausetime ); for ( var_11 = 0; var_11 < var_8.size; var_11++ ) var_8[var_11].angles = ( var_8[var_11].angles[0], var_19 + var_10[var_11][1], var_8[var_11].angles[2] ); var_15 = 0.0; if ( isdefined( var_12.script_accel ) ) var_15 = var_12.script_accel; if ( isdefined( var_12.script_index ) ) var_3 playsoundonmovingent( "trolley_corner" ); var_12 = getent( var_12.target, "targetname" ); } } trolley_attach_lights( var_0 ) { var_1 = spawn( "script_model", self.origin ); var_1.angles = self.angles; var_1 setmodel( "tag_origin" ); var_1 linkto( var_0 ); for (;;) { playfxontag( level._effect["vfx_pot_lights_trolley"], var_1, "tag_origin" ); wait( randomfloatrange( 4.0, 6.0 ) ); stopfxontag( level._effect["vfx_pot_lights_trolley"], var_1, "tag_origin" ); common_scripts\utility::waitframe(); } } monitor_trolley_dvar() { var_0 = "trolley_toggle"; var_1 = 0; var_2 = "trolley_throttle"; var_3 = 1; for (;;) { var_4 = getdvarint( var_0, var_1 ); if ( var_4 == var_1 ) { common_scripts\utility::waitframe(); continue; } self.enabled = !self.enabled; } } update_destroyer() { var_0 = getent( "roaming_destroyer", "targetname" ); if ( !isdefined( var_0 ) ) return; var_1 = getent( var_0.target, "targetname" ); if ( !isdefined( var_1 ) ) return; var_0.origin = var_1.origin; var_0.angles = var_1.angles; var_2 = 500.0; var_3 = 0.0; var_4 = 0.0; var_1 = getent( var_1.target, "targetname" ); if ( isdefined( var_1.script_decel ) ) var_4 = var_1.script_decel; while ( isdefined( var_1 ) ) { var_5 = var_2; if ( isdefined( var_1.script_physics ) ) var_5 = var_1.script_physics; var_3 = 0.0; if ( isdefined( var_1.script_accel ) ) var_3 = var_1.script_accel; var_6 = distance( var_0.origin, var_1.origin ) / var_5; var_7 = max( var_6, var_3 + var_4 ); var_0 moveto( var_1.origin, var_7, var_3, var_4 ); var_0 rotateto( var_1.angles, var_7, var_3, var_4 ); wait( var_7 ); var_8 = getent( var_1.target, "targetname" ); if ( isdefined( var_8 ) ) { if ( isdefined( var_8.script_node_pausetime ) ) wait( var_8.script_node_pausetime ); var_4 = 0.0; if ( isdefined( var_8.script_decel ) ) var_4 = var_8.script_decel; } var_1 = var_8; } } update_lighthouse_light() { var_0 = getent( "lighthouse_light", "targetname" ); if ( !isdefined( var_0 ) ) return; if ( !isdefined( var_0.animation ) ) return; var_0 scriptmodelplayanim( "mp_ca_rumble_lighthouse_rotate" ); } update_artillery_fx() { var_0 = level._effect["vfx_battleship_firing_timing"]; var_1 = ( 14701.5, -17741.3, 854.587 ); var_2 = anglestoforward( ( 354.236, 135.865, 13.443 ) ); var_3 = anglestoup( ( 354.236, 135.865, 13.443 ) ); var_4 = spawn( "script_model", var_1 ); var_4 setmodel( "tag_origin" ); var_5 = "emt_rumb_dist_arty_fire"; wait( randomfloatrange( 5.0, 20.0 ) ); for (;;) { var_6 = 30.0 + randomfloat( 20.0 ); var_4.origin = var_1 + ( 0, 0, 1000 ); var_4 moveto( var_4.origin + ( -55000, -60000, 16000 ), lookupsoundlength( var_5 ) * 0.001, 0.2 ); var_4 playsoundonmovingent( var_5 ); playfx( var_0, var_1, var_2, var_3 ); wait( var_6 ); } } update_heli_fx() { var_0 = level._effect["vfx_heli_timing"]; var_1 = ( 19354.8, -24794.2, 539.564 ); var_2 = anglestoforward( ( 0, 190, 0 ) ); var_3 = anglestoup( ( 0, 190, 0 ) ); var_4 = spawn( "script_model", var_1 ); var_4 setmodel( "tag_origin" ); var_5 = "scn_rumb_chopper_by"; wait( randomfloatrange( 5.0, 20.0 ) ); for (;;) { var_6 = 60.0 + randomfloat( 30.0 ); var_4.origin = var_1 + ( 0, 0, 700 ); var_4 moveto( var_4.origin + ( -55000, -10000, 3000 ), 40.0, 10.0 ); var_4 playsoundonmovingent( var_5 ); playfx( var_0, var_1, var_2, var_3 ); wait( var_6 ); } } update_flybyjet_fx() { var_0 = level._effect["vfx_jet_flyby_timing"]; var_1 = ( 22547.9, -308.47, 1440.73 ); var_2 = anglestoforward( ( 0.855041, 223.034, -0.529352 ) ); var_3 = anglestoup( ( 0.855041, 223.034, -0.529352 ) ); var_4 = spawn( "script_model", var_1 ); var_4 setmodel( "tag_origin" ); var_5 = "scn_rumb_jets_by"; wait( randomfloatrange( 5.0, 20.0 ) ); for (;;) { var_6 = 90.0 + randomfloat( 30.0 ); var_4.origin = var_1 + ( 0, 0, 1000 ); var_4 moveto( var_4.origin + ( -55000, -55000, 0 ), 20.0, 0.6 ); var_4 playsoundonmovingent( var_5 ); playfx( var_0, var_1, var_2, var_3 ); wait( var_6 ); } } setup_fountain_fx() { thread update_fountain_fx( ( 200.517, 631.669, 12 ), 1.1 ); thread update_fountain_fx( ( -47.933, 575.054, 26 ) ); thread update_fountain_fx( ( -300.421, 633.173, 8 ), 1.1 ); wait 1.0; for (;;) { level notify( "spawn_stair_fountain_fx" ); wait 8.0; } } update_fountain_fx( var_0, var_1 ) { var_2 = level._effect["vfx_water_fountain"]; var_3 = "emt_rumb_fount_spray"; for (;;) { level waittill( "spawn_stair_fountain_fx" ); if ( isdefined( var_1 ) && var_1 > 0.0 ) wait( var_1 ); playfx( var_2, var_0, anglestoforward( ( 0, 0, 0 ) ), anglestoup( ( 0, 0, 0 ) ) ); playsoundatpos( var_0, var_3 ); wait 1.1; playsoundatpos( var_0 + ( 0, 32, 36 ), var_3 ); wait 1.1; playsoundatpos( var_0 + ( 0, 80, 68 ), var_3 ); wait 1.1; playsoundatpos( var_0 + ( 0, 120, 96 ), var_3 ); } } fixmlgcameraposition() { var_0 = getentarray( "mp_mlg_camera", "classname" ); if ( isdefined( var_0 ) && var_0.size ) { foreach ( var_2 in var_0 ) { if ( var_2.origin == ( -1064, -224, 272 ) ) { var_2.origin = ( -632, -1712, 368 ); var_2.angles = ( 10, 113, -1.174 ); break; } } } }