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

644 lines
19 KiB
Plaintext

#include common_scripts\utility;
#include maps\mp\_utility;
assembly_line()
{
assembly_line_animate();
}
assembly_line_precache()
{
level._effect[ "tank_part_explode" ] = loadfx( "vfx/moments/mp_sovereign/vfx_halon_exp" );
level._effect["tank_part_extinguish"] = LoadFX( "vfx/ambient/steam/vfx_steam_escape" );
}
#using_animtree( "animated_props" );
assembly_line_animate()
{
//Tank Sound track
level.assembly_line_tank_notetracks = [];
level.assembly_line_tank_notetracks["scn_factory_assembly_tank00_ss"] = 4;
tank_anim = %mp_sovereign_assembly_line_front_piece;
anim_length = GetAnimLength( tank_anim );
for(i=1; i<=13; i++)
{
notetrack_prefix = "ps_";
sound_name = "scn_factory_assembly_tank" + ter_op(i<=9,"0","" ) + i + "_ss";
notetrack_times = GetNotetrackTimes( tank_anim, notetrack_prefix+sound_name);
level.assembly_line_tank_notetracks[sound_name] = notetrack_times[0] * anim_length;
}
//Arm sounds
for(i=1; i<=5; i++)
{
sound_name = "scn_factory_assembly_tank_arm0" + i + "_ss";
notetrack_name = "front_station_0" + i + "_start";
notetrack_times = GetNotetrackTimes( tank_anim, notetrack_name);
level.assembly_line_tank_notetracks[sound_name] = notetrack_times[0] * anim_length;
}
num_tanks = 2;
time_between_tanks = 55;
level.next_destructible_tank = RandomIntRange(4,6);
for ( i = 0; i < num_tanks; i++ )
{
collision_brush_bottom = GetEnt( "tank_chassis_collision" + ( i + 1 ), "targetname" );
collision_brush_top = GetEnt( "tank_chassis_collision_top" + ( i + 1 ), "targetname" );
collision_brush_center = GetEnt( "tank_chassis_collision_center" + ( i + 1 ), "targetname" );
if(!IsDefined(collision_brush_bottom) || !IsDefined(collision_brush_top) || !IsDefined(collision_brush_center))
continue;
//S&D bombs, flags, etc. will reset if dropped on top of one of these
collision_brush_bottom.invalid_gameobject_mover = true;
collision_brush_top.invalid_gameobject_mover = true;
collision_brush_center.invalid_gameobject_mover = true;
collision_brush_top.angles = (90,0,0); //Tank model top starts rotated 90
level thread assembly_line_piece( collision_brush_bottom, collision_brush_top, collision_brush_center );
wait( time_between_tanks );
}
}
assembly_line_piece( collision_brush_bottom, collision_brush_top, collision_brush_center )
{
assembly_line_start_pos = getstruct( "assembly_start_point", "targetname" );
assembly_piece = Spawn( "script_model", assembly_line_start_pos.origin );
assembly_piece.angles = assembly_line_start_pos.angles;
assembly_piece SetModel( "mp_sovereign_assembly_moving_front_piece" );
//Center Collision
collision_brush_center.origin = assembly_piece.origin;
collision_brush_center LinkTo( assembly_piece, "tag_origin" );
//Bottom Collision
assembly_line_start_pos_collision = getstruct( "assembly_start_point_collision", "targetname" );
assembly_piece_collision = Spawn( "script_model", assembly_line_start_pos_collision.origin );
assembly_piece_collision.angles = assembly_line_start_pos_collision.angles;
assembly_piece_collision SetModel( "generic_prop_raven" );
collision_brush_bottom.origin = assembly_line_start_pos_collision.origin;
collision_brush_bottom LinkTo( assembly_piece_collision, "tag_origin" );
//Top Collision
assembly_line_start_pos_collision_top = getstruct( "assembly_start_point_collision_top", "targetname" );
assembly_piece_collision_top = Spawn( "script_model", assembly_line_start_pos_collision_top.origin );
assembly_piece_collision_top.angles = assembly_line_start_pos_collision_top.angles;
assembly_piece_collision_top SetModel( "generic_prop_raven" );
collision_brush_top.origin = assembly_line_start_pos_collision_top.origin;
collision_brush_top LinkTo( assembly_piece_collision_top, "tag_origin" );
//Set up exploding barrel part
assembly_piece.parts = [];
if(IsDefined(assembly_line_start_pos.target))
{
parts = GetEntArray(assembly_line_start_pos.target, "targetname");
foreach(part in parts)
{
part_copy = spawn("script_model", part.origin);
part_copy.angles = part.angles;
part_copy SetModel(part.model);
if(IsDefined(part.target))
{
collision = GetEnt(part.target, "targetname");
if(IsDefined(collision))
{
//part_copy CloneBrushmodelToScriptmodel(collision);
}
}
part_copy LinkTo(assembly_piece, "tag_tank_chassis");
part_copy assembly_line_tank_part_visible(false);
part_copy.parent = assembly_piece;
assembly_piece.parts[assembly_piece.parts.size] = part_copy;
}
}
assembly_piece thread assembly_line_tank_damage_watch();
while ( 1 )
{
level.next_destructible_tank--;
if(level.next_destructible_tank<=0)
{
foreach(part in assembly_piece.parts)
{
part assembly_line_tank_part_visible(true);
}
level.next_destructible_tank = RandomIntRange(9,12);
}
assembly_piece assembly_line_notetracks();
assembly_piece ScriptModelPlayAnimDeltaMotion( "mp_sovereign_assembly_line_front_piece" );
assembly_piece_collision ScriptModelPlayAnimDeltaMotion( "mp_sovereign_assembly_line_front_piece_origin" );
assembly_piece_collision_top ScriptModelPlayAnimDeltaMotion( "mp_sovereign_assembly_line_front_piece_origin_top" );
fullAnimLength = GetAnimLength( %mp_sovereign_assembly_line_front_piece );
thread animate_arms( fullAnimLength );
wait( fullAnimLength );
assembly_piece ScriptModelClearAnim();
assembly_piece.origin = assembly_line_start_pos.origin;
assembly_piece.angles = assembly_line_start_pos.angles;
assembly_piece_collision ScriptModelClearAnim();
assembly_piece_collision.origin = assembly_line_start_pos_collision.origin;
assembly_piece_collision.angles = assembly_line_start_pos_collision.angles;
assembly_piece_collision_top ScriptModelClearAnim();
assembly_piece_collision_top.origin = assembly_line_start_pos_collision_top.origin;
assembly_piece_collision_top.angles = assembly_line_start_pos_collision_top.angles;
//Turn off parts/Reset Health
foreach(part in assembly_piece.parts)
{
part assembly_line_tank_part_visible(false);
}
}
}
assembly_line_notetracks()
{
foreach(notetrack, time in level.assembly_line_tank_notetracks)
{
self delayThread(time, ::assembly_line_notetrack_sound, notetrack);
}
}
assembly_line_notetrack_sound(sound_name)
{
self PlaySoundOnMovingEnt(sound_name);
}
assembly_line_tank_damage_watch()
{
while(1)
{
self waittill("part_destroyed", attacker);
foreach(part in self.parts)
{
part thread assembly_line_tank_part_explode(attacker);
part thread assembly_line_tank_part_visible(false);
}
wait 1;
level notify("activate_halon_system");
wait 4;
foreach(part in self.parts)
{
part thread assembly_line_tank_part_extinguish();
}
}
}
assembly_line_tank_part_visible(visible)
{
if(IsDefined(self.is_visable) && self.is_visable==visible)
return;
if(visible)
{
self SetModel(self.visable_model);
self SetContents(self.visable_contents);
self thread assembly_line_tank_part_damage_watch();
}
else
{
self.visable_model = self.model;
self SetModel("tag_origin");
self.visable_contents = self SetContents(0);
self assembly_line_tank_part_damage_watch_end();
}
self.is_visable=visible;
}
assembly_line_tank_part_damage_watch()
{
self endon("stop_tank_part_damage_watch");
self.health = 50;
self SetCanDamage(true);
self.last_attacker=undefined;
while(self.health>0)
{
self waittill("damage", damage, attacker, direction_vec, point, type, modelName, tagName, partName, dflags);
self.last_attacker = attacker;
}
self waittill("death");
self.parent notify("part_destroyed", self.last_attacker);
}
assembly_line_tank_part_explode(attacker)
{
self PlaySound("barrel_mtl_explode");
PlayFXOnTag(level._effect["tank_part_explode"], self, "tag_origin");
PlayFXOnTag(level._effect["tank_part_burn"], self, "tag_origin");
if(!IsDefined(attacker))
attacker = self;
RadiusDamage( self.origin, 400, 300, 50, attacker, "MOD_EXPLOSIVE" );
}
assembly_line_tank_part_extinguish()
{
StopFXOnTag(level._effect["tank_part_burn"], self, "tag_origin");
PlayFXOnTag(level._effect["tank_part_extinguish"], self, "tag_origin");
}
assembly_line_tank_part_damage_watch_end()
{
self notify("stop_tank_part_damage_watch");
self SetCanDamage(false);
}
animate_arms( fullAnimLength )
{
front_station_01_times = GetNotetrackTimes( %mp_sovereign_assembly_line_front_piece, "front_station_01_start" );
front_station_02_times = GetNotetrackTimes( %mp_sovereign_assembly_line_front_piece, "front_station_02_start" );
front_station_03_times = GetNotetrackTimes( %mp_sovereign_assembly_line_front_piece, "front_station_03_start" );
front_station_04_times = GetNotetrackTimes( %mp_sovereign_assembly_line_front_piece, "front_station_04_start" );
front_station_05_times = GetNotetrackTimes( %mp_sovereign_assembly_line_front_piece, "front_station_05_start" );
// timer func
delayThread( front_station_01_times[ 0 ] * fullAnimLength, ::animate_front_station_01 );
delayThread( front_station_02_times[ 0 ] * fullAnimLength, ::animate_front_station_02 );
delayThread( front_station_03_times[ 0 ] * fullAnimLength, ::animate_front_station_03 );
delayThread( front_station_04_times[ 0 ] * fullAnimLength, ::animate_front_station_04 );
delayThread( front_station_05_times[ 0 ] * fullAnimLength, ::animate_front_station_05 );
}
animate_front_station_and_return_to_idle( arm, arm_anim )
{
arm SetScriptablePartState("arm", "animate");
wait GetAnimLength(arm_anim);
arm SetScriptablePartState("arm", "idle");
}
animate_front_station_01_watcher( arm_anim )
{
wait ( GetAnimLength( arm_anim ) - 1.5 );
// Destroy all boxes / kill anyone located under the ground
damageLoc = ( 895.608, 1640, 92 );
damageRadius = 400;
damageRadiusHeight = 100;
kill_all( damageLoc, damageRadius, damageRadiusHeight );
}
kill_all( damageLoc, damageRadius, damageRadiusHeight )
{
damage_zone = spawn( "trigger_radius", damageLoc, 0, damageRadius, damageRadiusHeight );
// /#
// // Debug damage marker
// damageLocStart = damageLoc ;
// damageLocEnd = damageLoc + ( 0, 0, damageRadiusHeight );
// damageColor = (0.9, 0.7, 0.6);
// Cylinder( damageLocStart, damageLocEnd, damageRadius, damageColor, false, 300 );
// #/
kill_players( damage_zone );
kill_boxes( damage_zone );
damage_zone delete();
}
kill_players( zone )
{
foreach ( player in level.participants )
{
if ( player IsTouching( zone ) )
player DoDamage( 1000, player.origin, undefined, undefined, "MOD_CRUSH" );
}
}
kill_boxes( zone )
{
script_models = GetEntArray( "script_model", "classname" );
foreach ( mod in script_models )
{
if ( IsDefined( mod.boxtype ) && mod IsTouching( zone ) )
mod notify ("death");
}
}
animate_front_station_01()
{
arm1a = GetScriptableArray( "factory_assembly_line_front_station01_arm_a", "targetname" )[0];
arm1b = GetScriptableArray( "factory_assembly_line_front_station01_arm_b", "targetname" )[0];
level thread animate_front_station_and_return_to_idle( arm1a, %mp_sovereign_assembly_line_station01_arm_A );
level thread animate_front_station_and_return_to_idle( arm1b, %mp_sovereign_assembly_line_station01_arm_B );
level thread animate_front_station_01_watcher( %mp_sovereign_assembly_line_station01_arm_A );
}
animate_front_station_02()
{
arm2a = GetScriptableArray( "factory_assembly_line_front_station02_arm_a", "targetname" )[0];
arm2b = GetScriptableArray( "factory_assembly_line_front_station02_arm_b", "targetname" )[0];
arm2c = GetScriptableArray( "factory_assembly_line_front_station02_arm_c", "targetname" )[0];
arm2d = GetScriptableArray( "factory_assembly_line_front_station02_arm_d", "targetname" )[0];
level thread animate_front_station_and_return_to_idle( arm2a, %mp_sovereign_assembly_line_station02_arm_A );
level thread animate_front_station_and_return_to_idle( arm2b, %mp_sovereign_assembly_line_station02_arm_B );
level thread animate_front_station_and_return_to_idle( arm2c, %mp_sovereign_assembly_line_station02_arm_C );
level thread animate_front_station_and_return_to_idle( arm2d, %mp_sovereign_assembly_line_station02_arm_D );
}
animate_front_station_03()
{
arm3a = GetScriptableArray( "factory_assembly_line_front_station03_arm_a", "targetname" )[0];
arm3b = GetScriptableArray( "factory_assembly_line_front_station03_arm_b", "targetname" )[0];
arm3c = GetScriptableArray( "factory_assembly_line_front_station03_arm_c", "targetname" )[0];
arm3d = GetScriptableArray( "factory_assembly_line_front_station03_arm_d", "targetname" )[0];
level thread animate_front_station_and_return_to_idle( arm3a, %mp_sovereign_assembly_line_station03_arm_A );
level thread animate_front_station_and_return_to_idle( arm3b, %mp_sovereign_assembly_line_station03_arm_B );
level thread animate_front_station_and_return_to_idle( arm3c, %mp_sovereign_assembly_line_station03_arm_C );
level thread animate_front_station_and_return_to_idle( arm3d, %mp_sovereign_assembly_line_station03_arm_D );
}
animate_front_station_04()
{
arm4a = GetScriptableArray( "factory_assembly_line_front_station04_arm_a", "targetname" )[0];
arm4b = GetScriptableArray( "factory_assembly_line_front_station04_arm_b", "targetname" )[0];
arm4c = GetScriptableArray( "factory_assembly_line_front_station04_arm_c", "targetname" )[0];
level thread animate_front_station_and_return_to_idle( arm4a, %mp_sovereign_assembly_line_station04_arm_A );
level thread animate_front_station_and_return_to_idle( arm4b, %mp_sovereign_assembly_line_station04_arm_B );
level thread animate_front_station_and_return_to_idle( arm4c, %mp_sovereign_assembly_line_station04_arm_C );
}
animate_front_station_05()
{
arm5a = GetScriptableArray( "factory_assembly_line_front_station05_arm_a", "targetname" )[0];
arm5b = GetScriptableArray( "factory_assembly_line_front_station05_arm_b", "targetname" )[0];
arm5c = GetScriptableArray( "factory_assembly_line_front_station05_arm_c", "targetname" )[0];
level thread animate_front_station_and_return_to_idle( arm5a, %mp_sovereign_assembly_line_station05_arm_A );
level thread animate_front_station_and_return_to_idle( arm5b, %mp_sovereign_assembly_line_station05_arm_B );
level thread animate_front_station_and_return_to_idle( arm5c, %mp_sovereign_assembly_line_station05_arm_C );
}
halon_system()
{
level.halon_fade_in_time = 2;
level.halon_fade_out_time = 10;
level.vision_set_stage = 0;
level.halon_fog_on = false;
level thread halon_system_spawn_watch();
level thread halon_system_killstreak();
/#
level thread halon_system_test();
level thread halon_fog_only();
#/
while(1)
{
level waittill("activate_halon_system", killstreak_player);
level thread halon_system_run(killstreak_player);
}
}
halon_system_killstreak()
{
while(1)
{
level waittill("sovereign_gas_killstreak", player);
wait 2; //Time for killstreakweapon anim to play
start = getstruct("killstreak_explosive", "targetname");
if(!IsDefined(start))
return;
explosives = [];
explosives[explosives.size] = start;
start.explosive_dist = 0;
total_dist = 0;
prev = start;
while (IsDefined(prev.target) && IsDefined(getStruct(prev.target,"targetname")) )
{
next = getStruct(prev.target,"targetname");
total_dist += Distance2d(prev.origin, next.origin);
explosives[explosives.size] = next;
next.explosive_dist = total_dist;
prev = next;
}
explosive_time_total = 3;
foreach(explosive in explosives)
{
time = explosive_time_total * (explosive.explosive_dist/total_dist);
explosive delayThread(time, ::halon_system_killstreak_explode, player);
}
wait explosive_time_total-1;
if(!flag("walkway_collasped"))
level notify("activate_walkway",player);
level notify("activate_halon_system", player);
}
}
halon_system_killstreak_explode(attacker)
{
visuals = [];
if(IsDefined(self.target))
{
visuals = GetEntArray(self.target, "targetname");
}
PlaySoundAtPos(self.origin, "barrel_mtl_explode");
PlayFX(level._effect["tank_part_explode"], self.origin, AnglesToForward(self.angles), AnglesToUp(self.angles));
inflictor = visuals[0];
if(!IsDefined(inflictor))
inflictor = attacker;
inflictor RadiusDamage( self.origin, 400, 1200, 1000, attacker, "MOD_EXPLOSIVE", "sovereign_gas_mp" );
foreach(visual in visuals)
visual Delete();
}
halon_system_run(killstreak_player)
{
alarm_sound_ents = getEntArray("halon_alarm_sound", "targetname");
fan_sound_ents = getEntArray("halon_fan_sound", "targetname");
foreach(ent in alarm_sound_ents)
{
ent PlaySound("halon_fire_alarm");
}
wait 2;
thread exploder_with_connect_watch(1, 40);
foreach(player in level.players)
{
player PlayLocalSound("halon_gas_amb");
}
halon_system_fog_on();
wait 5;
foreach(ent in alarm_sound_ents)
{
ent StopLoopSound();
}
wait 35;
foreach(ent in fan_sound_ents)
{
ent PlaySound("halon_exhaust_fan");
}
halon_system_fog_off();
wait level.halon_fade_out_time;
}
exploder_with_connect_watch(num, max_time)
{
exploder(num);
s = SpawnStruct();
startTime = GetTime();
s thread exploder_connect_watch(num, startTime);
wait max_time;
s notify("end_exploder_connect_watch");
}
exploder_connect_watch(num, startTime)
{
self endon("end_exploder_connect_watch");
while(1)
{
level waittill( "connected", player );
exploder(num, player, startTime/1000);
}
}
halon_system_fog_on()
{
level.halon_fog_on = true;
level.vision_set_stage = 1;
foreach(player in level.players)
{
player VisionSetStage(level.vision_set_stage, level.halon_fade_in_time);
}
}
halon_system_fog_off()
{
level.halon_fog_on = false;
level.vision_set_stage = 0;
foreach(player in level.players)
{
player VisionSetStage(level.vision_set_stage, level.halon_fade_out_time);
}
}
halon_system_spawn_watch()
{
while(1)
{
level waittill( "player_spawned", player );
if(IsDefined(level.vision_set_stage))
player VisionSetStage(level.vision_set_stage, .1);
}
}
bot_clear_of_gas()
{
if ( !flag("walkway_collasped") )
{//walkway not already collapsed
if ( !IsDefined( level.halon_dangerzone ) )
{
level.halon_dangerzone = GetEnt( "halon_dangerzone", "targetname" );
}
if ( IsDefined( level.halon_dangerzone ) )
{
if ( self IsTouching( level.halon_dangerzone ) )
return false;
}
}
if ( !IsDefined( level.explosives_dangerzone ) )
{
level.explosives_dangerzone = GetEnt( "explosives_dangerzone", "targetname" );
}
if ( IsDefined( level.explosives_dangerzone ) )
{
if ( self IsTouching( level.explosives_dangerzone ) )
return false;
}
return true;
}
/#
halon_system_test()
{
dvar_name = "trigger_halon";
default_value = 0;
SetDevDvarIfUninitialized(dvar_name, default_value);
while(1)
{
value = GetDvarInt(dvar_name, default_value);
if(!value)
{
waitframe();
}
else
{
level notify("activate_halon_system");
SetDvar(dvar_name, default_value);
}
}
}
halon_fog_only()
{
dvar_name = "trigger_halon_fog_only";
default_value = 0;
SetDevDvarIfUninitialized(dvar_name, default_value);
while(1)
{
while(!GetDvarInt(dvar_name, default_value))
waitframe();
halon_system_fog_on();
while(GetDvarInt(dvar_name, default_value))
waitframe();
halon_system_fog_off();
}
}
#/