boiii-scripts/mp/mp_cryogen.gsc
2023-04-13 17:30:38 +02:00

225 lines
13 KiB
Plaintext

#using scripts\codescripts\struct;
#using scripts\shared\util_shared;
#using scripts\shared\array_shared;
#using scripts\shared\scene_shared;
#using scripts\shared\compass;
#using scripts\mp\gametypes\_spawnlogic;
#using scripts\mp\_load;
#using scripts\mp\_util;
#using scripts\mp\mp_cryogen_fx;
#using scripts\mp\mp_cryogen_sound;
#precache( "model", "collision_clip_wall_512x512x10" );
#precache( "model", "p7_crate_lab_plastic_locking_open" );
#precache( "model", "collision_clip_32x32x32" );
#precache( "model", "collision_clip_wall_128x128x10" );
#precache( "model", "collision_clip_ramp_64x24" );
#precache( "model", "p7_tank_nitrogen_metal" );
#precache( "model", "collision_clip_wall_64x64x10" );
function main()
{
precache();
spawnlogic::move_spawn_point( "mp_dm_spawn_start", ( 1197.14 , -979.058 , 37.625 ), ( 834.823 , -803.36 , 37.625 ), (0, 191, 0) );
mp_cryogen_fx::main();
mp_cryogen_sound::main();
load::main();
compass::setupMiniMap( "compass_map_mp_cryogen" );
SetDvar( "compassmaxrange", "2100" ); // Set up the default range of the compass
//Spawning clip over wall to prevent player from getting into umbra issue
spawncollision("collision_clip_wall_512x512x10","collider",( -1031.5, -451.5, -89 ), ( 0 , 270 , 0 ));
//Spawning clip over wall to prevent player from getting into umbra issue
spawncollision("collision_clip_32x32x32","collider",( 537, -453, 56 ), ( 0 , 0 , 0 ));
spawncollision("collision_clip_32x32x32","collider",( 569, -453, 56 ), ( 0 , 0 , 0 ));
//Spawning clip on overwatch platform to prevent crouching into umbra issues
// spawncollision("collision_clip_ramp_64x24","collider",( -1731 , -1121 , 101.5 ), ( 0 , 270 , 0));
// spawncollision("collision_clip_ramp_64x24","collider",( -1795 , -1121 , 101.5 ), ( 0 , 90 , 0 ));
spawncollision("collision_clip_ramp_64x24","collider",( -1763 , -1093.5 , 93.5 ), ( 0 , 0 , 0));
spawncollision("collision_clip_ramp_64x24","collider",( -1763 , -1148 , 93.5 ), ( 0 , 180 , 0 ));
// Spawn crate in corner to prevent umbra issue
block1 = spawn("script_model",( 551, -453, 40 ));
block1.angles = ( 0 , 0 , 0);
block1 SetModel("p7_crate_lab_plastic_locking_open");
// Spawn tanks on overwatch platform
grate1 = spawn("script_model",( -1751.33 , -1096.74 , 102 ));
grate1.angles = ( 270 , 358.909 , 25 );
grate1 SetModel("p7_tank_nitrogen_metal");
grate1 SetScale ( .7 );
grate2 = spawn("script_model",( -1723.16 , -1105.32 , 102 ));
grate2.angles = ( 270 , 0 , 26);
grate2 SetModel("p7_tank_nitrogen_metal");
grate2 SetScale ( .7 );
grate3 = spawn("script_model",( -1787.44 , -1135.93 , 100.3 ));
grate3.angles = ( 270 , 355.638 , 162 );
grate3 SetModel("p7_tank_nitrogen_metal");
grate3 SetScale ( .7 );
//Spawning clip over wall to prevent breaching into 839 building
spawncollision("collision_clip_wall_64x64x10","collider",( 1770.5 , -336.5 , 64 ), ( 0 , 0 , 0 ));
//Spawning clip over wall to prevent breaching into helipad wall
spawncollision("collision_clip_wall_64x64x10","collider",( -2560.5 , 452.5 , 81.5 ), ( 0 , 270 , 0 ));
//Spawning clip over wall to prevent breaching into column start spawn wall
spawncollision("collision_clip_wall_64x64x10","collider",( 2334.5 , -187.5 , 35 ), ( 0 , 270 , 0 ));
// Stockpile hub points
level.cleanDepositPoints = Array ( ( -115.486 , -454.185 , 0.125 ),
( 956.442 , -1586.68 , 0.125 ),
( 1214.72 , -76.1687 , 40.125 ),
( 167.401 , -1543.29 , -127.875 ) );
level thread scene_sequence( "p7_fxanim_mp_cry_vista_tower_01_bundle" );
level spawnKillTrigger();
}
function precache()
{
// DO ALL PRECACHING HERE
}
function scene_sequence(str_scene)
{
min_ring_time = 25;
max_ring_time = 35;
min_ring_tower_time = 0.5;
max_ring_tower_time = 3.0;
while(1)
{
wait( RandomFloatRange( min_ring_time, max_ring_time) );
level thread ring_sequence( str_scene, "ring_01_towers", min_ring_tower_time, max_ring_tower_time);
wait( RandomFloatRange( min_ring_time, max_ring_time) );
level thread ring_sequence( str_scene, "ring_02_towers", min_ring_tower_time, max_ring_tower_time);
wait( RandomFloatRange( min_ring_time, max_ring_time) );
level thread ring_sequence( str_scene, "ring_03_towers", min_ring_tower_time, max_ring_tower_time);
}
}
function ring_sequence(str_scene, str_ring, min_time, max_time)
{
level thread init_scene( str_scene, str_ring, min_time, max_time );
wait( 10 );
level thread run_scene( str_scene, str_ring, min_time, max_time );
}
function run_scene( str_scene, str_targetname, min_time, max_time )
{
b_found = false;
str_mode = ToLower( GetDvarString( "scene_menu_mode", "default" ) );
a_scenes = filter_targetname( struct::get_array( str_scene, "scriptbundlename" ), false, str_targetname) ;
foreach ( s_instance in a_scenes )
{
if ( isdefined( s_instance ) )
{
if ( !IsInArray( a_scenes, s_instance ) )
{
b_found = true;
s_instance thread play_with_wait( undefined, str_mode, min_time, max_time );
}
}
}
if ( isdefined(level.active_scenes[ str_scene ]) )
{
a_scenes = filter_targetname( level.active_scenes[ str_scene ], false, str_targetname) ;
if ( isdefined( a_scenes ) )
{
foreach ( s_instance in a_scenes )
{
b_found = true;
s_instance thread play_with_wait( str_scene, str_mode, min_time, max_time );
}
}
}
}
function init_scene( str_scene, str_targetname, min_time, max_time )
{
str_mode = ToLower( GetDvarString( "scene_menu_mode", "default" ) );
b_found = false;
a_scenes = filter_targetname( struct::get_array( str_scene, "scriptbundlename" ), false, str_targetname) ;
foreach ( s_instance in a_scenes )
{
if ( isdefined( s_instance ) )
{
b_found = true;
s_instance thread init_with_wait( undefined, min_time, max_time );
}
}
if ( !b_found )
{
level.scene_test_struct thread init_with_wait( str_scene, min_time, max_time );
}
}
function filter_targetname( &array, b_keep_keys, str_targetname )
{
return array::filter( array, b_keep_keys, &_filter_targetname, str_targetname );
}
function _filter_targetname( val, arg )
{
return ( val.targetname === arg );
}
function play_with_wait( str_scene, str_mode, min_time, max_time )
{
if( min_time >= 0.0 && max_time > 0.0 )
{
wait( RandomFloatRange( min_time, max_time) );
}
self thread scene::play( str_scene, undefined, undefined, true, undefined, str_mode );
}
function init_with_wait( str_scene, min_time, max_time )
{
if( min_time >= 0.0 && max_time > 0.0 )
{
wait( RandomFloatRange( min_time, max_time) );
}
self thread scene::init( str_scene, undefined, undefined, true );
}
function spawnKillTrigger()
{
trigger = spawn( "trigger_radius", ( 1695 , -344 , -2 ), 0, 80, 40 );
trigger thread watchKillTrigger();
trigger = spawn( "trigger_radius", ( -2571.5 , 527.5 , 53 ), 0, 80, 100 );
trigger thread watchKillTrigger();
trigger = spawn( "trigger_radius", ( 2286.5 , -108 , -2 ), 0, 80, 100 );
trigger thread watchKillTrigger();
}
function watchKillTrigger()
{
level endon( "game_ended" );
trigger = self;
while(1)
{
trigger waittill( "trigger", player );
player DoDamage(1000, trigger.origin + (0, 0, 0), trigger, trigger, "none", "MOD_SUICIDE", 0 );
}
}