boiii-scripts/shared/abilities/gadgets/_gadget_vision_pulse.gsc
2023-04-13 17:30:38 +02:00

278 lines
16 KiB
Plaintext

#using scripts\codescripts\struct;
#using scripts\shared\callbacks_shared;
#using scripts\shared\clientfield_shared;
#using scripts\shared\flagsys_shared;
#using scripts\shared\visionset_mgr_shared;
#using scripts\shared\spawner_shared;
#using scripts\shared\system_shared;
#using scripts\shared\util_shared;
#using scripts\shared\abilities\_ability_player;
#using scripts\shared\abilities\_ability_util;
#using scripts\shared\abilities\gadgets\_gadget_camo;
function autoexec __init__sytem__() { system::register("gadget_vision_pulse",&__init__,undefined,undefined); }
function __init__()
{
ability_player::register_gadget_activation_callbacks( 6, &gadget_vision_pulse_on, &gadget_vision_pulse_off );
ability_player::register_gadget_possession_callbacks( 6, &gadget_vision_pulse_on_give, &gadget_vision_pulse_on_take );
ability_player::register_gadget_flicker_callbacks( 6, &gadget_vision_pulse_on_flicker );
ability_player::register_gadget_is_inuse_callbacks( 6, &gadget_vision_pulse_is_inuse );
ability_player::register_gadget_is_flickering_callbacks( 6, &gadget_vision_pulse_is_flickering );
callback::on_connect( &gadget_vision_pulse_on_connect );
callback::on_spawned( &gadget_vision_pulse_on_spawn );
clientfield::register( "toplayer", "vision_pulse_active" , 1, 1, "int" );
if ( !IsDefined( level.vsmgr_prio_visionset_visionpulse ) )
{
level.vsmgr_prio_visionset_visionpulse = 61;
}
visionset_mgr::register_info( "visionset", "vision_pulse", 1, level.vsmgr_prio_visionset_visionpulse, 12, true, &visionset_mgr::ramp_in_out_thread_per_player_death_shutdown, false );
}
function gadget_vision_pulse_is_inuse( slot )
{
// returns true when the gadget is on
return self flagsys::get( "gadget_vision_pulse_on" );
}
function gadget_vision_pulse_is_flickering( slot )
{
// returns true when the gadget is flickering
return self GadgetFlickering( slot );
}
function gadget_vision_pulse_on_flicker( slot, weapon )
{
// excuted when the gadget flickers
self thread gadget_vision_pulse_flicker( slot, weapon );
}
function gadget_vision_pulse_on_give( slot, weapon )
{
// executed when gadget is added to the players inventory
}
function gadget_vision_pulse_on_take( slot, weapon )
{
// executed when gadget is removed from the players inventory
}
//self is the player
function gadget_vision_pulse_on_connect()
{
// setup up stuff on player connect
}
function gadget_vision_pulse_on_spawn()
{
self.visionPulseActivateTime = 0;
self.visionPulseArray = [];
self.visionPulseOrigin = undefined;
self.visionPulseOriginArray = [];
if( isDefined( self._pulse_ent ) )
{
self._pulse_ent delete();
}
}
function gadget_vision_pulse_ramp_hold_func()
{
self util::waittill_any_timeout( ( 4000 / 1000 + 1 ), "ramp_out_visionset" );
}
function gadget_vision_pulse_watch_death()
{
self notify ( "vision_pulse_watch_death" );
self endon ( "vision_pulse_watch_death" );
self endon ( "disconnect" );
self waittill ( "death" );
visionset_mgr::deactivate( "visionset", "vision_pulse", self );
if( isDefined( self._pulse_ent ) )
{
self._pulse_ent delete();
}
}
function gadget_vision_pulse_watch_emp()
{
self notify ( "vision_pulse_watch_emp" );
self endon ( "vision_pulse_watch_emp" );
self endon ( "disconnect" );
while( 1 )
{
if( self IsEMPJammed() )
{
visionset_mgr::deactivate( "visionset", "vision_pulse", self );
self notify ( "emp_vp_jammed" );
break;
}
{wait(.05);};
}
if( isDefined( self._pulse_ent ) )
{
self._pulse_ent delete();
}
}
function gadget_vision_pulse_on( slot, weapon )
{
if ( IsDefined( self._pulse_ent ) )
{
return;
}
// excecutes when the gadget is turned on
self flagsys::set( "gadget_vision_pulse_on" );
self thread gadget_vision_pulse_start( slot, weapon );
visionset_mgr::activate( "visionset", "vision_pulse", self, ( .25 ), &gadget_vision_pulse_ramp_hold_func, ( .75 ) );
self thread gadget_vision_pulse_watch_death();
self thread gadget_vision_pulse_watch_emp();
self clientfield::set_to_player( "vision_pulse_active", 1 );
}
function gadget_vision_pulse_off( slot, weapon )
{
// excecutes when the gadget is turned off`
self flagsys::clear( "gadget_vision_pulse_on" );
self clientfield::set_to_player( "vision_pulse_active", 0 );
}
function gadget_vision_pulse_start( slot, weapon )
{
self endon ( "disconnect" );
self endon ( "death" );
self endon ( "emp_vp_jammed" );
wait 0.1;
if ( IsDefined( self._pulse_ent ) )
{
return;
}
self._pulse_ent = spawn( "script_model", self.origin );
self._pulse_ent SetModel( "tag_origin" );
self GadgetSetEntity( slot, self._pulse_ent );
self GadgetSetActivateTime( slot, GetTime() );
self set_gadget_vision_pulse_status( "Activated" );
//self PlaySound ( "gdt_vision_pulse" );
self.visionPulseActivateTime = getTime();
enemyArray = level.players;
gadget = GetWeapon( "gadget_vision_pulse" );
visionPulseArray = ArraySort( enemyArray, self._pulse_ent.origin, true, undefined, gadget.gadget_pulse_max_range );
self.visionPulseOrigin = self._pulse_ent.origin;
self.visionPulseArray = [];
self.visionPulseOriginArray = [];
spottedEnemy = false;
self.visionPulseSpottedEnemy = [];
self.visionPulseSpottedEnemyTime = getTime();
for ( i = 0; i < visionPulseArray.size; i++ )
{
if ( visionPulseArray[i] _gadget_camo::camo_is_inuse() == false )
{
self.visionPulseArray[self.visionPulseArray.size] = visionPulseArray[i];
self.visionPulseOriginArray[self.visionPulseOriginArray.size] = visionPulseArray[i].origin;
if ( IsAlive( visionPulseArray[i] ) && visionPulseArray[i].team != self.team )
{
spottedEnemy = true;
self.visionPulseSpottedEnemy[self.visionPulseSpottedEnemy.size] = visionPulseArray[i];
}
}
}
self wait_until_is_done( slot, self._gadgets_player[slot].gadget_pulse_duration );
if ( spottedEnemy && isdefined( level.playGadgetSuccess ) )
{
self [[ level.playGadgetSuccess ]]( weapon );
}
else
{
self playsoundtoplayer( "gdt_vision_pulse_no_hits", self );
self notify( "ramp_out_visionset" );
}
self set_gadget_vision_pulse_status( "Done" );
self._pulse_ent delete();
}
function wait_until_is_done( slot, timePulse )
{
startTime = GetTime();
while ( 1 )
{
wait 0.25;
currentTime = GetTime();
if ( currentTime > startTime + timePulse )
{
return;
}
}
}
function gadget_vision_pulse_flicker( slot, weapon )
{
self endon( "disconnect" );
time = GetTime();
if ( !self gadget_vision_pulse_is_inuse( slot ) )
{
return;
}
eventTime = self._gadgets_player[slot].gadget_flickertime;
self set_gadget_vision_pulse_status( "^1" + "Flickering.", eventTime );
while( 1 )
{
if ( !self GadgetFlickering( slot ) )
{
set_gadget_vision_pulse_status( "^2" + "Normal" );
return;
}
wait( 0.25 );
}
}
function set_gadget_vision_pulse_status( status, time )
{
timeStr = "";
if ( IsDefined( time ) )
{
timeStr = "^3" + ", time: " + time;
}
if ( GetDvarInt( "scr_cpower_debug_prints" ) > 0 )
self IPrintlnBold( "Vision Pulse:" + status + timeStr );
}