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

451 lines
22 KiB
Plaintext

#using scripts\codescripts\struct;
#using scripts\shared\array_shared;
#using scripts\shared\callbacks_shared;
#using scripts\shared\clientfield_shared;
#using scripts\shared\flagsys_shared;
#using scripts\shared\scene_shared;
#using scripts\shared\spawner_shared;
#using scripts\shared\system_shared;
#using scripts\shared\util_shared;
#using scripts\shared\visionset_mgr_shared;
#using scripts\cp\gametypes\_save;
#namespace oed;
function autoexec __init__sytem__() { system::register("oed",&__init__,&__main__,undefined); }
//TODO - add in support for the animated portion of the hud/lui when it comes online
function __init__()
{
clientfield::register( "toplayer", "ev_toggle", 1, 1, "int" );
clientfield::register( "toplayer", "sitrep_toggle", 1, 1, "int" );
clientfield::register( "toplayer", "tmode_toggle", 1, 3, "int" );
clientfield::register( "toplayer", "active_dni_fx", 1, 1, "counter" );
clientfield::register( "toplayer", "hack_dni_fx", 1, 1, "counter" );
clientfield::register( "actor", "thermal_active", 1, 1, "int" );
clientfield::register( "actor", "sitrep_material", 1, 1, "int" );
clientfield::register( "actor", "force_tmode", 1, 1, "int" );
clientfield::register( "actor", "tagged", 1, 1, "int" );
clientfield::register( "vehicle", "thermal_active", 1, 1, "int" );
clientfield::register( "vehicle", "sitrep_material", 1, 1, "int" );
clientfield::register( "scriptmover", "thermal_active", 1, 1, "int" );
clientfield::register( "scriptmover", "sitrep_material", 1, 1, "int" );
clientfield::register( "item", "sitrep_material", 1, 1, "int" );
if ( !IsDefined( level.vsmgr_prio_visionset_tmode ) )
{
level.vsmgr_prio_visionset_tmode = 50;
}
visionset_mgr::register_info( "visionset", "tac_mode", 1, level.vsmgr_prio_visionset_tmode, 15, true, &visionset_mgr::ramp_in_out_thread_per_player, false );
callback::on_spawned( &on_player_spawned );
// Have all enemies show up on thermal
spawner::add_global_spawn_function( "axis", &enable_thermal_on_spawned );
spawner::add_global_spawn_function( "allies", &enable_thermal_on_spawned );
level.b_enhanced_vision_enabled = true;
level.b_tactical_mode_enabled = true;
level.b_player_scene_active = false;
level.enable_thermal = &enable_thermal;
level.disable_thermal = &disable_thermal;
}
function __main__()
{
keyline_weapons();
}
function keyline_weapons()
{
waittillframeend; // clientfields can't be set before a wait
if ( level.b_tactical_mode_enabled )
{
array::thread_all(
util::query_ents(
AssociativeArray( "classname", "weapon_" ), true,
[],
true,
true
), &enable_keyline );
}
}
function on_player_spawned()
{
// ev init
self.b_enhanced_vision_enabled = level.b_enhanced_vision_enabled;
self.ev_state = false;
self ev_activate_on_player( self.ev_state );
// tmode init
self.b_tactical_mode_enabled = level.b_tactical_mode_enabled;
self.tmode_state = false;
b_playsound = false;
if ( !( SessionModeIsCampaignZombiesGame() ) )
if ( ( isdefined( GetLocalProfileInt( "tacticalModeAutoOn" ) ) && GetLocalProfileInt( "tacticalModeAutoOn" ) ) )
{
self.tmode_state = true;
b_playsound = false;
}
self tmode_activate_on_player( self.tmode_state, b_playsound );
// sitrep
self clientfield::set_to_player( "sitrep_toggle", 1 );
self thread check_keys_for_ev_and_tmode();
self thread init_heroes();
}
//////////////////////////////////////////////////////////////////////////////////
// EV and TMODE
//////////////////////////////////////////////////////////////////////////////////
function check_keys_for_ev_and_tmode()
{
self endon( "death" );
self endon("killOEDMonitor");
while( 1 )
{
/# level flagsys::wait_till_clear( "menu_open" ); #/
// EV on up dpad
if ( level.b_enhanced_vision_enabled && self.b_enhanced_vision_enabled && self ActionSlotOneButtonPressed() )
{
if ( !scene::is_igc_active() )
{
self.ev_state = !( isdefined( self.ev_state ) && self.ev_state );
self ev_activate_on_player( self.ev_state );
// wait until the key is released
while( self ActionSlotOneButtonPressed() )
{
{wait(.05);};
}
}
}
// TMode on right dpad
if ( !( SessionModeIsCampaignZombiesGame() ) && level.b_tactical_mode_enabled && self.b_tactical_mode_enabled && self ActionSlotFourButtonPressed() )
{
if ( !scene::is_igc_active() )
{
self.tmode_state = !( isdefined( self.tmode_state ) && self.tmode_state );
self tmode_activate_on_player( self.tmode_state );
visionset_mgr::activate( "visionset", "tac_mode", self, 0.05, 0.0, 0.8 );
wait 0.05 + 0.0 + 0.8;
while ( self ActionSlotFourButtonPressed() )
{
{wait(.05);};
}
}
}
{wait(.05);};
}
}
//////////////////////////////////////////////////////////////////////
///ENHANCED VISION - THERMAL
//////////////////////////////////////////////////////////////////////
// Spawn function to automatically enable thermal on enemies
function enable_thermal_on_spawned()
{
if ( self.team == "axis" )
{
self enable_thermal();
}
else if( self.team == "allies" )//keep seperate for now in case we need extra logic here
{
self enable_thermal();
}
}
//TODO - will likely need to add in support for hud/lui changes
// Called externally to enable an entity to have a thermal shader when EV is activated
// self is the entity to have a thermal signature
// str_disable - a notify that can be used to deactivate the thermal signature
function enable_thermal( str_disable )
{
self endon( "death" );
self clientfield::set( "thermal_active", 1 );
self thread disable_thermal_on_death();
if( isdefined( str_disable ) )
{
level waittill( str_disable );
self disable_thermal();
}
}
// Remove the thermal signature on death
// self is the entity that has a thermal signature
function disable_thermal_on_death()
{
self endon( "disable_thermal" );
self waittill( "death" );
if( isdefined( self ) )
{
self disable_thermal();
}
}
// Remove the thermal signature from the entity
// self is the entity that has a thermal signature
function disable_thermal()
{
self clientfield::set( "thermal_active", 0 );
self notify( "disable_thermal" );
}
//Toggles the vars used to enable/disable player access to thermal mode, also called EV
//This should be used when toggling during the course of the level
//If you just want to disable thermal access by default at level start, just use level.b_enhanced_vision_enabled = false;
function toggle_thermal_mode_for_players( b_enabled = true )
{
level.b_enhanced_vision_enabled = b_enabled;
foreach( e_player in level.players )
{
e_player.b_enhanced_vision_enabled = b_enabled;
}
}
//
// TMODE and EV are disabled & turned off or enabled for the player from a level script here.
//
function enable_ev( b_enabled = true )
{
self.b_enhanced_vision_enabled = b_enabled;
if ( !b_enabled )
self ev_activate_on_player( b_enabled );
}
function enable_tac_mode( b_enabled = true )
{
self.b_tactical_mode_enabled = b_enabled;
if ( b_enabled )
{
if ( !( SessionModeIsCampaignZombiesGame() ) && ( isdefined( GetLocalProfileInt( "tacticalModeAutoOn" ) ) && GetLocalProfileInt( "tacticalModeAutoOn" ) ) )
{
self tmode_activate_on_player( true, false );
}
}
else
{
self tmode_activate_on_player( false, false );
}
}
//
// external call from other scripts to turn ev on and off on a player
//
function set_player_ev( b_enabled = true )
{
ev_activate_on_player( b_enabled );
}
function ev_activate_on_player( b_enabled = true )
{
self.ev_state = b_enabled;
// turn on ev - so turn off tmode
if ( self.ev_state )
{
if ( ( isdefined( self.tmode_state ) && self.tmode_state ) )
self.tmode_state_before_ev = true;
else
self.tmode_state_before_ev = false;
self tmode_activate_on_player( false, false, false );
}
//the tutorial moment in New World is listening for this
if ( self.ev_state )
self notify( "enhanced_vision_activated" );
else
self notify( "enhanced_vision_deactivated" );
self clientfield::set_to_player( "ev_toggle", self.ev_state );
// turn off ev - maybe turn tmode back on
if ( !self.ev_state )
{
if ( ( isdefined( self.tmode_state_before_ev ) && self.tmode_state_before_ev ) )
{
if ( !( SessionModeIsCampaignZombiesGame() ) && ( isdefined( GetLocalProfileInt( "tacticalModeAutoOn" ) ) && GetLocalProfileInt( "tacticalModeAutoOn" ) ) )
{
self tmode_activate_on_player( true, false, false );
}
}
}
}
function tmode_activate_on_player( b_enabled = true, b_playsound = true, b_turnoffev = true )
{
self.tmode_state = b_enabled;
if ( b_turnoffev && self.tmode_state )
self ev_activate_on_player( false );
if ( self.tmode_state )
self notify( "tactical_mode_activated" );
else
self notify( "tactical_mode_deactivated" );
self TmodeSetServerUser( self.tmode_state );
code = 0;
if( !isdefined( self.tmode_count ) )
self.tmode_count = 0;
self.tmode_count++;
self.tmode_count &= 1;
code = self.tmode_count;
if ( b_playsound )
code |= 0x2;
if ( self.tmode_state )
code |= 0x4;
self clientfield::set_to_player( "tmode_toggle", code );
self savegame::set_player_data("tmode", self.tmode_state );
}
function init_heroes()
{
a_e_heroes = GetEntArray();
foreach( e_hero in a_e_heroes )
{
if( ( isdefined( e_hero.is_hero ) && e_hero.is_hero ) )
{
e_hero thread enable_thermal();
}
}
}
///////////////////////////////////////////////////////////////////////////
/// TACTICAL MODE
///////////////////////////////////////////////////////////////////////////
//Toggles the vars used to enable/disable player access to tactical mode
//This should be used when toggling during the course of the level
//If you just want to disable tac mode access by default at level start, just use level.b_tactical_mode_enabled = false;
function toggle_tac_mode_for_players( b_enabled = true )
{
level.b_tactical_mode_enabled = b_enabled;
foreach( e_player in level.players )
{
e_player.b_tactical_mode_enabled = b_enabled;
}
}
//self = AI enemy actor that will draw in tmode for all players no matter what
function set_force_tmode( b_enabled = true )
{
self.b_force_tmode = b_enabled;
self clientfield::set( "force_tmode", b_enabled );
}
//////////////////////////////////////////////////////////////////////////
/// SITREP - KEYLINE
//////////////////////////////////////////////////////////////////////////
//Set b_interact to true if this is an interactive entity//TODO we may need support now for non-interactable, for now we assume this is an interact object
function enable_keyline( b_interact = false, str_disable )
{
self endon( "death" );
self clientfield::set( "sitrep_material", 1 );
self thread disable_on_death();
if( isdefined( str_disable ) )
{
level waittill( str_disable );
self disable_keyline();
}
}
function disable_on_death()
{
self waittill( "death" );
if( isdefined( self ) )
{
self disable_keyline();
}
}
function disable_keyline()
{
self clientfield::set( "sitrep_material", 0 );
}
function toggle_sitrep_for_players( b_active = true )
{
foreach( player in level.players )
{
player.sitrep_active = !( isdefined( player.sitrep_active ) && player.sitrep_active );
player clientfield::set_to_player( "sitrep_toggle", player.sitrep_active );
}
}
function init_sitrep_model()
{
if( !IsDefined(self.angles) )
{
self.angles = (0, 0 ,0 );
}
s_sitrep_bundle = level.scriptbundles[ "sitrep" ][ self.scriptbundlename ];
e_sitrep = util::spawn_model( s_sitrep_bundle.model, self.origin, self.angles );
if( isdefined( s_sitrep_bundle.sitrep_interact ) )
{
e_sitrep.script_sitrep_id = s_sitrep_bundle.sitrep_interact;
}
else
{
e_sitrep.script_sitrep_id = 0;
}
return e_sitrep;
}