iw6-scripts-dev/maps/mp/mp_strikezone.gsc
2024-12-11 11:28:08 +01:00

884 lines
20 KiB
Plaintext

#include common_scripts\utility;
#include maps\mp\_utility;
#include maps\mp\gametypes\_hud_util;
main()
{
maps\mp\mp_strikezone_precache::main();
maps\createart\mp_strikezone_art::main();
maps\mp\mp_strikezone_fx::main();
maps\mp\_teleport::main();
maps\mp\_teleport::teleport_set_minimap_for_zone("start", "compass_map_mp_strikezone");
maps\mp\_teleport::teleport_set_minimap_for_zone("destroyed", "compass_map_mp_strikezone_after");
maps\mp\_teleport::teleport_set_a10_splines_for_zone("start", [1,2,3,4], [2,1,4,3]);
maps\mp\_teleport::teleport_set_a10_splines_for_zone("destroyed", [5,6,7,8], [6,5,8,7]);
maps\mp\_teleport::teleport_origin_use_offset(false);
maps\mp\_teleport::teleport_set_pre_func( ::pre_teleport, "destroyed");
maps\mp\_teleport::teleport_set_post_func( ::post_teleport, "destroyed");
maps\mp\_teleport::teleport_set_post_func( ::pre_teleport_to_start, "start");
level.doNuke_fx = ::doNuke_fx_strikezone;
level thread sunflare();
level thread flip_sky();
level thread init_destroyed_zone();
level.mapCustomCrateFunc = ::strikezoneCustomCrateFunc;
level.mapCustomKillstreakFunc = ::strikezoneCustomKillstreakFunc;
level.mapCustomBotKillstreakFunc = ::strikezoneCustomBotKillstreakFunc;
maps\mp\_load::main();
thread maps\mp\_fx::func_glass_handler(); // Text on glass
flag_init("nuke_event_active");
level.vision_set_stage = 0;
setdvar("r_reactiveMotionWindAmplitudeScale", .3);
setdvar("r_reactiveMotionWindFrequencyScale", .5);
setdvar( "r_lightGridEnableTweaks", 1 );
setdvar( "r_lightGridIntensity", 1.33 );
setdvar_cg_ng( "r_diffuseColorScale" , 1.639, 1.5 );
setdvar_cg_ng( "r_specularcolorscale", 2.5, 3 );
setdvar( "r_ssaorejectdepth", 1500);
setdvar( "r_ssaofadedepth", 1200);
game["attackers"] = "allies";
game["defenders"] = "axis";
game[ "allies_outfit" ] = "urban";
game[ "axis_outfit" ] = "desert";
if( level.ps3 )
{
setdvar( "sm_sunShadowScale", "0.6" ); // optimization
}
else if( level.xenon )
{
setdvar( "sm_sunShadowScale", "0.7" ); // optimization
}
level.pre_org = getstruct("world_origin_pre", "targetname");
level.post_org = getstruct("world_origin_post", "targetname");
level.mid_z = 0;
if(IsDefined(level.post_org) && IsDefined(level.pre_org))
{
level.mid_z = (level.pre_org.origin[2] + level.post_org.origin[2])/2;
}
flag_init( "teleport_to_destroyed" );
flag_init( "start_fog_fade_in" );
flag_init( "start_fog_fade_out" );
level thread nuke_activate_at_end_of_match();
//level thread generic_swing_ents();
level thread fall_objects();
level thread ronnie_talks();
level thread connect_watch();
/#
level thread vision_set_stage_test();
#/
level thread initExtraCollision();
}
/#
vision_set_stage_test()
{
SetDevDvar("vision_set_stage_fade_time", "1");
dvar_name = "vision_set_stage";
default_value = -1;
SetDevDvarIfUninitialized(dvar_name, default_value);
while(1)
{
value = GetDvarInt(dvar_name, default_value);
if(value<0)
{
waitframe();
}
else
{
set_vision_set_stage(value, GetDvarFloat("vision_set_stage_fade_time"));
SetDvar(dvar_name, default_value);
}
}
}
#/
initExtraCollision()
{
collision1 = GetEnt( "clip128x128x128", "targetname" );
collision1Ent = spawn( "script_model", (1488, 448, 34992) );
collision1Ent.angles = ( 0, 0, 0);
collision1Ent CloneBrushmodelToScriptmodel( collision1 );
collision2 = GetEnt( "clip256x256x8", "targetname" );
collision2Ent = spawn( "script_model", (-1589.73, 167.941, 34846) );
collision2Ent.angles = ( 7.64427, 359.534, -40.4325 );
collision2Ent CloneBrushmodelToScriptmodel( collision2 );
//next gen displacement bugs
if ( is_gen4() )
{
//IWSIX-148692
collision3 = GetEnt( "player256x256x128", "targetname" );
collision3Ent = spawn( "script_model", (1091.96, -1218, 35088) );
collision3Ent.angles = ( 0, 60, -90 );
collision3Ent CloneBrushmodelToScriptmodel( collision3 );
//IWSIX-148679
collision4 = GetEnt( "player256x256x128", "targetname" );
collision4Ent = spawn( "script_model", (1314.31, -727.89, 34967.3) );
collision4Ent.angles = ( 345.369, 351.123, 18.9223 );
collision4Ent CloneBrushmodelToScriptmodel( collision4 );
//IWSIX-148673
collision5 = GetEnt( "player256x256x128", "targetname" );
collision5Ent = spawn( "script_model", (955.98, 485.142, 34875.7) );
collision5Ent.angles = ( 336.26, 306.702, -30.7675 );
collision5Ent CloneBrushmodelToScriptmodel( collision5 );
}
}
flip_sky()
{
sky = GetEnt("after_sky", "targetname");
if(IsDefined(sky))
{
sky.angles = (180,0,0);
}
}
connect_watch()
{
while(1)
{
level waittill("connected", player);
if(IsDefined(level.vision_set_stage))
player VisionSetStage(level.vision_set_stage, .1);
player thread watch_throwing_knife();
PlayFXOnTagForClients(level._effect["vfx_sunflare"],level.sunflare_ent,"tag_origin",player);
}
}
watch_throwing_knife()
{
self endon( "disconnect" );
while(1)
{
self waittill( "grenade_fire", knife, weaponName );
if( IsDefined(weaponName) && IsDefined(knife) && weaponName == "throwingknife_mp")
{
level thread watch_throwing_knife_land(knife);
}
}
}
watch_throwing_knife_land(knife)
{
knife endon("death");
knife waittill("missile_stuck", hitEnt);
level notify("hit_by_knife", knife, hitEnt);
}
sunflare()
{
pre_nuke_origin = (-2827.98, -25930.5, 12914.9);
pre_nuke_angles = (270, 0, 0);
post_nuke_origin = (-1831.25, -12492.3, 41020.6);
post_nuke_angles = (270, 0, 0);
level.sunflare_ent = spawn("script_model", pre_nuke_origin);
level.sunflare_ent SetModel("tag_origin");
level.sunflare_ent.angles = pre_nuke_angles;
flag_wait("teleport_setup_complete");
if(level.teleport_zone_current != "start")
{
level.sunflare_ent.origin = post_nuke_origin;
level.sunflare_ent.angles = post_nuke_angles;
}
while(1)
{
level waittill("teleport_to_zone", new_zone_name);
if(new_zone_name == "start")
{
level.sunflare_ent.origin = pre_nuke_origin;
level.sunflare_ent.angles = pre_nuke_angles;
}
else
{
level.sunflare_ent.origin = post_nuke_origin;
level.sunflare_ent.angles = post_nuke_angles;
}
}
}
init_destroyed_zone()
{
flag_wait("teleport_setup_complete");
if(level.teleport_zone_current != "start")
{
destroyed_fire_fx();
}
}
doNuke_fx_strikezone()
{
if(!level.allow_level_killstreak)
return false;
game["player_holding_level_killstrek"] = false;
disable_strikezone_rog();
thread maps\mp\_teleport::teleport_to_zone("destroyed");
return true;
}
pre_teleport()
{
level notify("nuke_start");
flag_set("nuke_event_active");
level.allow_level_killstreak = false;
level.disable_killcam = true;
maps\mp\gametypes\_damage::eraseFinalKillCam();
if(!levelFlag( "post_game_level_event_active" ))
{
maps\mp\gametypes\_hostmigration::waitLongDurationWithHostMigrationPause(level.nukeTimer-2);
}
fx_to_flash_time = 2;
slow_mo_time = .2;
flash_fade_in_time = .1;
level thread nuke_earthquake(.3, fx_to_flash_time);
thread nuke_fx_exploders(2);
level.nuke_fx_start_time = GetTime();
exploder(60);
level thread nuke_sounds();
maps\mp\gametypes\_hostmigration::waitLongDurationWithHostMigrationPause( fx_to_flash_time );
//remove all TI for infected
foreach ( player in level.players )
{
if ( isDefined( player.setSpawnPoint ) )
player maps\mp\perks\_perkfunctions::deleteTI( player.setSpawnPoint );
}
level thread nuke_slow_motion( .1, slow_mo_time + flash_fade_in_time, 0 );
maps\mp\gametypes\_hostmigration::waitLongDurationWithHostMigrationPause( slow_mo_time );
level thread nuke_earthquake(.5, 5);
level thread rumble_all_players( "hijack_plane_medium" );
level thread nuke_ground_tilt();
if(!levelFlag( "post_game_level_event_active" ) && IsDefined(level.nukeInfo.team))
level thread maps\mp\killstreaks\_nuke::nukeDeath();
VisionSetNaked("mp_strikezone_flash", flash_fade_in_time);
maps\mp\gametypes\_hostmigration::waitLongDurationWithHostMigrationPause( flash_fade_in_time );
wait .1;
exploder(70, undefined, (level.nuke_fx_start_time/1000));
flag_set( "teleport_to_destroyed" );
}
post_teleport()
{
level thread maps\mp\killstreaks\_nuke::nukeClearTimer();
level thread updateMLGCameras();
if ( level.gametype == "grnd" )
level thread maps\mp\gametypes\grnd::cycleZones();
flash_fade_out_time = 0.5;
explosion_vision_time = 2.5;
explosion_vision_fade_out_time = 3.5;
nuke_blur(3, .1);
flag_set( "start_fog_fade_out" );
VisionSetNaked("mp_strikezone_explosion", flash_fade_out_time);
waitframe();
level thread nuke_slow_motion( 0, flash_fade_out_time, 1 );
maps\mp\gametypes\_hostmigration::waitLongDurationWithHostMigrationPause( flash_fade_out_time );
nuke_blur(0, explosion_vision_time+2);
maps\mp\gametypes\_hostmigration::waitLongDurationWithHostMigrationPause( explosion_vision_time );
VisionSetNaked("mp_strikezone_after", explosion_vision_fade_out_time);
SetExpFog(431.294, 2011.37, 0.54, 0.54, 0.54, 1, 0.5, explosion_vision_fade_out_time, 0.92, 0.69, 0.44, 1, (-0.05, -0.89, 0.44), 0, 100, 0.625, 1, 140.897, 114.026);
wait explosion_vision_fade_out_time;
VisionSetNaked("", 0);
ClearFog(0);
level.disable_killcam = false;
flag_clear("nuke_event_active");
}
updateMLGCameras()
{
if ( level.gameEnded )
return;
foreach ( player in level.players )
{
if ( isAI( player ) )
continue;
//Setting MLG camera positions
player setmlgcameradefaults( 0, level.Camera5Pos, level.Camera5Ang );
player setmlgcameradefaults( 1, level.Camera6Pos, level.Camera6Ang );
player setmlgcameradefaults( 2, level.Camera7Pos, level.Camera7Ang );
player setmlgcameradefaults( 3, level.Camera8Pos, level.Camera8Ang );
}
}
pre_teleport_to_start()
{
VisionSetNaked("", 0);
}
nuke_activate_at_end_of_match()
{
level endon("nuke_start");
flag_wait("teleport_setup_complete");
level waittill ( "spawning_intermission" );
if(level.allow_level_killstreak)
level thread nuke_end_of_match();
}
nuke_end_of_match()
{
levelFlagSet( "post_game_level_event_active" );
visionSetNaked( "", 0.5 );
maps\mp\_teleport::teleport_to_zone("destroyed");
wait 5;
levelFlagClear( "post_game_level_event_active" );
}
nuke_fx_exploders(delay_time)
{
if(isDefined(delay_time) && delay_time>0)
wait delay_time;
exploder(2);
wait(2);
destroyed_fire_fx();
wait(2.5);
exploder(19);
wait(4.8);
exploder(23);
}
destroyed_fire_fx()
{
exploder_with_connect_watch(8, -2);
}
exploder_with_connect_watch(num, startTime)
{
exploder(num, undefined, startTime);
level thread exploder_connect_watch(num, startTime);
}
exploder_connect_watch(num, startTime)
{
while(1)
{
level waittill( "connected", player );
exploder(num, player, startTime);
}
}
set_vision_set_stage(stage, time)
{
if(!isDefined(time))
time = 1.0;
foreach(player in level.players)
{
player VisionSetStage(stage, time);
}
level.vision_set_stage = stage;
}
set_all_players_undying(enable)
{
if(!IsDefined(level.players_undying))
level.players_undying = false;
if(enable == level.players_undying)
return;
if(enable)
{
level.prev_modifyPlayerDamage = level.modifyPlayerDamage;
level.modifyPlayerDamage = ::undying;
}
else
{
level.modifyPlayerDamage = level.prev_modifyPlayerDamage;
}
level.players_undying = enable;
}
undying(victim, eAttacker, iDamage, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc)
{
if(IsDefined(victim))
{
return victim.health-1;
}
return 0;
}
nuke_slow_motion( transition_to_slow, players_are_slow, transition_to_normal )
{
SetSlowMotion( 1.0, 0.25, transition_to_slow );
wait( players_are_slow );
SetSlowMotion( 0.25, 1, transition_to_normal );
}
nuke_earthquake(scale, time)
{
quakes = getstructarray("nuke_earthquake", "targetname");
foreach(quake in quakes)
{
Earthquake(scale, time, quake.origin, quake.radius);
}
}
nuke_sounds()
{
move_dist = 40000;
move_dir = AnglesToForward((319.008, 265.869, 88.6746));
end_point = (-3892.33, 1244.78, -156.711);
start_point = end_point + move_dir*move_dist;
playSoundAtPos(start_point, "kem_launch");
move_time = 2;
sound_mover = spawn("script_model", start_point);
sound_mover SetModel("tag_origin");
sound_mover delayCall(0.05, ::PlaySoundOnMovingEnt, "kem_incoming");
//sound_mover PlaySoundOnMovingEnt("kem_incoming");
sound_mover MoveTo(end_point, move_time);
maps\mp\gametypes\_hostmigration::waitLongDurationWithHostMigrationPause( move_time );
if( !IsDefined( level.nuke_soundObject ) )
{
level.nuke_soundObject = Spawn( "script_origin", (0,0,1) );
level.nuke_soundObject hide();
}
level.nuke_soundObject PlaySound( "kem_explosion" );
}
nuke_ground_tilt()
{
start = SpawnStruct();
end = SpawnStruct();
kick_time = .2;
unkick_time = 1;
kick_angle = 20;
ground_ent = Spawn("script_model", (0,0,0));
ground_ent.angles = (0,0,0);
foreach(player in level.players)
{
player PlayerSetGroundReferenceEnt(ground_ent);
}
ground_ent Rotateto((kick_angle, 0, 0), kick_time, 0, kick_time);
wait kick_time;
ground_ent Rotateto((0, 0, 0), unkick_time, 0, unkick_time);
wait unkick_time;
foreach(player in level.players)
{
player PlayerSetGroundReferenceEnt(undefined);
}
ground_ent Delete();
}
nuke_blur(scale, blend_time)
{
foreach( player in level.players )
{
player SetBlurForPlayer(scale, blend_time);
}
}
rumble_all_players( rumble, loop )
{
if ( !IsDefined( loop ) )
loop = false;
foreach ( player in level.players )
{
if ( loop )
{
player PlayRumbleLoopOnEntity( rumble );
}
else
{
player PlayRumbleOnEntity( rumble );
}
}
if ( !loop )
return;
level waittill( "stop_rumble_loop" );
foreach ( player in level.players )
{
player StopRumble( rumble );
}
}
stop_rumble_all_players()
{
level notify("stop_rumble_loop");
}
generic_swing_ents()
{
swing_anims = [];
swing_anims["small"] = "mp_strikezone_chunk_sway_small";
swing_anims["large"] = "mp_strikezone_chunk_sway_large";
foreach(key,value in swing_anims)
{
PrecacheMpAnim(value);
}
swing_origins = GetEntArray("generic_swing", "targetname");
foreach(swing in swing_origins)
{
if(!IsDefined(swing.angles))
swing.angles = (0,0,0);
pivot = Spawn("script_model", swing.origin);
pivot.angles = swing.angles;
pivot SetModel("generic_prop_raven");
swing linkto(pivot, "j_prop_1");
anim_name = "small";
if(IsDefined(swing.script_noteworthy) && IsDefined(swing_anims[swing.script_noteworthy]))
{
anim_name = swing.script_noteworthy;
}
pivot ScriptModelPlayAnim(swing_anims[swing.script_noteworthy]);
}
}
fall_objects()
{
objects = GetEntArray("fall_object", "targetname");
array_thread(objects, ::fall_object_init);
}
fall_object_init()
{
self.end = self;
things = [];
if(IsDefined(self.target))
{
structs = getstructarray(self.target, "targetname");
set_default_script_noteworthy(structs, "angle_ref");
things = array_combine(things, structs);
ents = GetEntArray(self.target, "targetname");
things = array_combine(things, ents);
}
if(IsDefined(self.script_linkto))
{
structs = getstructarray(self.script_linkto, "script_linkname");
set_default_script_noteworthy(structs, "start");
things = array_combine(things, structs);
ents = GetEntArray(self.script_linkto, "script_linkname");
things = array_combine(things, ents);
}
foreach(thing in things)
{
if(!IsDefined(thing.script_noteworthy))
continue;
switch(thing.script_noteworthy)
{
case "angle_ref":
self.end = thing;
break;
case "start":
self.start = thing;
break;
case "link":
thing linkto(self);
break;
default:
break;
}
}
set_default_angles(things);
if(IsDefined(self.start) && IsDefined(self.end))
self thread fall_object_run();
}
set_default_script_noteworthy(things, noteworthy)
{
if(!IsDefined(things))
return;
if(!IsDefined(noteworthy))
noteworthy = "";
if(!isArray(things))
things = [things];
foreach(thing in things)
{
if(!IsDefined(thing.script_noteworthy))
thing.script_noteworthy = noteworthy;
}
}
set_default_angles(things, angles)
{
if(!IsDefined(things))
return;
if(!IsDefined(angles))
angles = (0,0,0);
if(!isArray(things))
things = [things];
foreach(thing in things)
{
if(!IsDefined(thing.angles))
thing.angles = angles;
}
}
fall_object_run()
{
fall_to_origin = self.origin;
fall_to_angles = self.angles;
trans = TransformMove(self.start.origin, self.start.angles, self.end.origin, self.end.angles, self.origin, self.angles);
self.origin = trans["origin"];
self.angles = trans["angles"];
flag_wait( "start_fog_fade_out" );
wait RandomFloatRange(0.8,1.0);
if(IsDefined(self.script_delay))
{
if(self.script_delay<0)
self.script_delay = RandomFloatRange(30, 120);
wait self.script_delay;
}
PlaySoundAtPos(self.origin, "cobra_helicopter_crash");
fall_speed = RandomFloatRange(300,320);
dist = Distance(fall_to_origin, self.origin);
time = dist/fall_speed;
self moveTo(fall_to_origin, time, time, 0);
if(fall_to_angles != self.angles)
self RotateTo(fall_to_angles, time, 0, 0);
wait time;
}
ronnie_talks()
{
ronnie_vo = [];
ronnie_vo["low"] = [];
ronnie_vo["high"] = [];
ronnie_vo["high"][0] = "mp_strikezone_hdg_01";
ronnie_vo["high"][1] = "mp_strikezone_hdg_02";
ronnie_vo["high"][2] = "mp_strikezone_hdg_03";
ronnie_vo["high"][3] = "mp_strikezone_hdg_05";
ronnie_vo["high"][4] = "mp_strikezone_hdg_06";
ronnie_vo["high"][4] = "mp_strikezone_hdg_07";
ronnie_vo["high"][4] = "mp_strikezone_hdg_09";
ronnie_vo["low"][0] = "mp_strikezone_hdg_04";
ronnie_vo["low"][1] = "mp_strikezone_hdg_08";
ronnie_vo["low"][2] = "mp_strikezone_hdg_10";
locs = GetEntArray("ronnie_talk_location", "targetname");
array_thread(locs, ::ronnie_knife_watcher);
while(1)
{
level waittill("ronnie_speak", trigger);
vo = random(ronnie_vo[trigger.script_noteworthy]);
playSoundAtPos( trigger.origin, vo);
}
}
ronnie_knife_watcher()
{
self endon("death");
while(1)
{
level waittill("hit_by_knife", knife, hitEnt);
if(IsDefined(knife))
{
if(knife IsTouching(self))
{
level notify("ronnie_speak", self);
}
}
}
}
STRIKEZONE_ROG_WEIGHT = 55;
strikezoneCustomCrateFunc()
{
if(!IsDefined(game["player_holding_level_killstrek"]))
game["player_holding_level_killstrek"] = false;
level.allow_level_killstreak = allowLevelKillstreaks();
if(!level.allow_level_killstreak || game["player_holding_level_killstrek"])
return;
maps\mp\killstreaks\_airdrop::addCrateType( "airdrop_assault", "nuke", STRIKEZONE_ROG_WEIGHT, maps\mp\killstreaks\_airdrop::killstreakCrateThink, maps\mp\killstreaks\_airdrop::get_friendly_crate_model(), maps\mp\killstreaks\_airdrop::get_enemy_crate_model(), &"KILLSTREAKS_HINTS_STRIKEZONE_ROG" );
level thread strikezone_rog_post_teleport_init();
}
strikezone_rog_post_teleport_init()
{
flag_wait("teleport_setup_complete");
if(level.teleport_allowed)
{
if( level.allow_level_killstreak )
level thread watch_for_strikezone_rog_crate();
}
else
{
level.allow_level_killstreak = false;
disable_strikezone_rog();
}
}
watch_for_strikezone_rog_crate()
{
while(1)
{
level waittill("createAirDropCrate", dropCrate);
if(IsDefined(dropCrate) && IsDefined(dropCrate.crateType) && dropCrate.crateType=="nuke")
{
//Only allow RoG killstreak once
disable_strikezone_rog();
captured = wait_for_capture(dropCrate);
if(!captured)
{
//reEnable RoG care packages if it expires with out anyone picking it up
enable_strikezone_rog();
}
else
{
//Once its picked up it needs to remain off.
game["player_holding_level_killstrek"] = true;
break;
}
}
}
}
//death and capture are sent on the same frame but death is processed first :(
wait_for_capture(dropCrate)
{
result = watch_for_air_drop_death(dropCrate);
return !IsDefined(result); //If !isdefined the captured notify was also sent.
}
watch_for_air_drop_death(dropCrate)
{
dropCrate endon("captured");
dropCrate waittill("death");
waittillframeend;
return true;
}
enable_strikezone_rog()
{
maps\mp\killstreaks\_airdrop::changeCrateWeight("airdrop_assault", "nuke", STRIKEZONE_ROG_WEIGHT);
}
disable_strikezone_rog()
{
maps\mp\killstreaks\_airdrop::changeCrateWeight("airdrop_assault", "nuke", 0);
}
strikezoneCustomKillstreakFunc()
{
AddDebugCommand("devgui_cmd \"MP/Killstreak/Level Event:5/Care Package/Strikezone RoG\" \"set scr_devgivecarepackage nuke; set scr_devgivecarepackagetype airdrop_assault\"\n");
AddDebugCommand("devgui_cmd \"MP/Killstreak/Level Event:5/Strikezone RoG\" \"set scr_givekillstreak nuke\"\n");
}
strikezoneCustomBotKillstreakFunc()
{
AddDebugCommand("devgui_cmd \"MP/Bots(Killstreak)/Level Events:5/Strikezone RoG\" \"set scr_testclients_givekillstreak nuke\"\n");
}