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

409 lines
14 KiB
Plaintext

#using scripts\codescripts\struct;
#using scripts\shared\array_shared;
#using scripts\shared\exploder_shared;
#using scripts\shared\gameobjects_shared;
#using scripts\shared\math_shared;
#using scripts\shared\util_shared;
#using scripts\shared\weapons\_tacticalinsertion;
#using scripts\shared\weapons\_weaponobjects;
#using scripts\mp\gametypes\ctf;
#using scripts\mp\_util;
#using scripts\mp\killstreaks\_rcbomb;
#using scripts\mp\killstreaks\_supplydrop;
// THESE ARE NOT LOCALIZED, once a set of words has been chosen make sure they are localized
#namespace mp_stronghold_doors;
function init()
{
doors = GetEntArray( "mp_stronghold_security_door_lower", "targetname" );
if ( !isdefined( doors ) || doors.size == 0 )
{
return;
}
uppers = GetEntArray( "mp_stronghold_security_door_upper", "targetname" );
killtriggers = GetEntArray( "mp_stronghold_killbrush", "targetname" );
assert( uppers.size == doors.size );
assert( killtriggers.size == killtriggers.size );
foreach( door in doors )
{
upper = get_closest( door.origin, uppers );
killtrigger = get_closest( door.origin, killtriggers );
level thread setup_doors( door, upper, killtrigger );
}
level thread door_use_trigger();
}
function setup_doors( door, upper, trigger )
{
door.upper = upper;
door.kill_trigger = trigger;
assert( isdefined( door.kill_trigger ) );
door.kill_trigger EnableLinkTo();
door.kill_trigger linkto( door );
door.opened = true;
door.origin_opened = door.origin;
door.force_open_time = 0;
door.origin_closed_half = ( door.origin[0], door.origin[1], door.origin[2] - ( 180 / 2 ));
door.origin_closed = ( door.origin[0], door.origin[1], door.origin[2] - 180 );
door thread door_think();
}
function door_use_trigger()
{
use_triggers = GetEntArray( "mp_stronghold_usetrigger", "targetname" );
foreach( use_trigger in use_triggers )
{
use_trigger thread watchTriggerUsage();
use_trigger thread watchTriggerEnableDisable();
}
}
function watchTriggerUsage()
{
for(;;)
{
self waittill( "trigger", e_player );
level notify( "mp_stronghold_trigger_use" );
}
}
function watchTriggerEnableDisable()
{
hintString = "";
for(;;)
{
returnVar = level util::waittill_any_return( "mp_stronghold_trigger_enable", "mp_stronghold_trigger_disable", "mp_stronghold_trigger_cooldown" );
switch(returnVar )
{
case "mp_stronghold_trigger_enable":
hintString = "ENABLE";
break;
case "mp_stronghold_trigger_disable":
hintString = "DISABLE";
break;
case "mp_stronghold_trigger_cooldown":
hintString = "COOLDOWN";
break;
}
self SetHintString( hintString );
}
}
function door_think()
{
//self door_close();
for ( ;; )
{
exploder::exploder( "fx_switch_red" );
exploder::kill_exploder( "fx_switch_green" );
wait( 20 );
exploder::exploder( "fx_switch_green" );
exploder::kill_exploder( "fx_switch_red" );
if ( self door_should_open() )
{
level notify( "mp_stronghold_trigger_disable" );
}
else
{
level notify( "mp_stronghold_trigger_enable" );
}
level waittill( "mp_stronghold_trigger_use" );
level notify( "mp_stronghold_trigger_cooldown" );
if ( self door_should_open() )
{
self thread door_open();
self security_door_drop_think( false );
}
else
{
self thread door_close();
self security_door_drop_think( true );
}
}
}
function door_should_open()
{
return ( !self.opened );
}
function door_open()
{
if ( self.opened )
{
return;
}
dist = Distance( self.origin_closed, self.origin );
frac = dist / 180;
halfTime = 9 / 2;
// SOUND DEPT HOOK
//self playsound ( DOOR_OPEN_SOUND );
self MoveTo( self.origin_closed_half, halfTime );
self.upper MoveTo( self.origin_opened, halfTime );
self waittill( "movedone" );
self MoveTo( self.origin_opened, halfTime );
self.opened = true;
}
function door_close()
{
if ( !self.opened )
{
return;
}
dist = Distance( self.origin_closed, self.origin );
frac = dist / 180;
halfTime = 9 / 2;
// SOUND DEPT HOOK
//self playsound ( DOOR_CLOSE_SOUND );
self MoveTo( self.origin_closed_half, halfTime );
self waittill( "movedone" );
self MoveTo( self.origin_closed, halfTime );
self.upper MoveTo( self.origin_closed_half, halfTime );
self.opened = false;
}
function security_door_drop_think( killPlayers )
{
self endon( "movedone" );
self.disableFinalKillcam = true;
door = self;
corpse_delay = 0;
for ( ;; )
{
wait( 0.2 );
entities = GetDamageableEntArray( self.origin, 200 );
foreach( entity in entities )
{
if ( !entity IsTouching( self.kill_trigger ) )
{
continue;
}
if ( !IsAlive( entity ) )
{
continue;
}
if ( IsDefined( entity.targetname ) )
{
if ( entity.targetname == "talon" )
{
entity notify( "death" );
continue;
}
else if ( entity.targetname == "riotshield_mp" )
{
entity DoDamage( 1, self.origin + ( 0, 0, 1 ), self, self, 0, "MOD_CRUSH" );
continue;
}
}
if ( IsDefined( entity.helitype ) && entity.helitype == "qrdrone" )
{
watcher = entity.owner weaponobjects::getWeaponObjectWatcher( "qrdrone" );
watcher thread weaponobjects::waitAndDetonate( entity, 0.0, undefined );
continue;
}
if ( entity.classname == "grenade" )
{
if( !IsDefined( entity.name ) )
{
continue;
}
if( !IsDefined( entity.owner ) )
{
continue;
}
if ( entity.name == "proximity_grenade_mp" )
{
watcher = entity.owner weaponobjects::getWatcherForWeapon( entity.name );
watcher thread weaponobjects::waitAndDetonate( entity, 0.0, undefined, "script_mover_mp" );
continue;
}
if( !entity.isEquipment )
{
continue;
}
watcher = entity.owner weaponobjects::getWatcherForWeapon( entity.name );
if( !IsDefined( watcher ) )
{
continue;
}
watcher thread weaponobjects::waitAndDetonate( entity, 0.0, undefined, "script_mover_mp" );
continue;
}
if ( entity.classname == "auto_turret" )
{
if ( !IsDefined( entity.damagedToDeath ) || !entity.damagedToDeath )
{
entity util::DoMaxDamage( self.origin + ( 0, 0, 1 ), self, self, 0, "MOD_CRUSH" );
}
continue;
}
if( killPlayers == false && IsPlayer( entity ) )
{
continue;
}
entity DoDamage( entity.health * 2, self.origin + ( 0, 0, 1 ), self, self, 0, "MOD_CRUSH" );
if( IsPlayer( entity ) )
{
corpse_delay = GetTime() + 1000;
}
}
self destroy_supply_crates();
if ( GetTime() > corpse_delay )
{
self destroy_corpses();
}
if ( level.gameType == "ctf" )
{
foreach( flag in level.flags )
{
if ( flag.visuals[0] IsTouching( self.kill_trigger ) )
{
flag ctf::returnFlag();
}
}
}
else if ( level.gameType == "sd" && !level.multiBomb )
{
if ( level.sdBomb.visuals[0] IsTouching( self.kill_trigger ) )
{
level.sdBomb gameobjects::return_home();
}
}
}
}
function destroy_supply_crates()
{
crates = GetEntArray( "care_package", "script_noteworthy" );
foreach( crate in crates )
{
if ( DistanceSquared( crate.origin, self.origin ) < 200 * 200 )
{
if( crate IsTouching( self ) )
{
PlayFX( level._supply_drop_explosion_fx, crate.origin );
PlaySoundAtPosition( "wpn_grenade_explode", crate.origin );
wait ( 0.1 );
crate supplydrop::crateDelete();
}
}
}
}
function destroy_corpses()
{
corpses = GetCorpseArray();
for ( i = 0; i < corpses.size; i++ )
{
if ( DistanceSquared( corpses[i].origin, self.origin ) < 200 * 200 )
{
corpses[i] delete();
}
}
}
function get_closest( org, array )
{
dist = 9999999;
distsq = dist*dist;
if( array.size < 1 )
{
return;
}
index = undefined;
for( i = 0;i < array.size;i++ )
{
newdistsq = distancesquared( array[ i ].origin, org );
if( newdistsq >= distsq )
{
continue;
}
distsq = newdistsq;
index = i;
}
return array[index];
}