boiii-scripts/mp/killstreaks/_remotemissile.csc
2023-04-13 17:30:38 +02:00

141 lines
14 KiB
Plaintext

#using scripts\codescripts\struct;
#using scripts\shared\clientfield_shared;
#using scripts\shared\system_shared;
#using scripts\shared\util_shared;
#using scripts\mp\_util;
#namespace remotemissile;
function autoexec __init__sytem__() { system::register("remotemissile",&__init__,undefined,undefined); }
function __init__()
{
clientfield::register( "missile", "remote_missile_bomblet_fired", 1, 1, "int",&bomblets_deployed, !true, !true );
clientfield::register( "missile", "remote_missile_fired", 1, 2, "int",&missile_fired, !true, !true );
}
function missile_fired( localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump )
{
if( newVal == ( 1 ) )
{
player = getlocalplayer( localClientNum );
owner = self GetOwner( localClientNum );
clientObjID = util::getNextObjID( localClientNum );
objective_add( localClientNum, clientObjID, "invisible", self.origin, self.team, owner );
Objective_OnEntity( localClientNum, clientObjID, self, true, false, true );
self.hellfireObjId = clientObjID;
self thread destruction_watcher( localClientNum, clientObjID );
objective_state( localClientNum, clientObjID, "active" );
if( player hasPerk( localClientNum, "specialty_showenemyequipment" ) || self.team == player.team )
{
objective_SetIcon( localClientNum, clientObjID, "remotemissile_target" );
objective_SetIconSize( localClientNum, clientObjID, 50 );
}
self thread hud_update( localClientNum );
}
else if ( newVal == ( 2 ) )
{
if( isdefined( self.hellfireObjId ) )
{
self notify( "hellfire_detonated" );
objective_delete( localClientNum, self.hellfireObjId );
util::releaseObjID( localClientNum, self.hellfireObjId );
}
}
else
self notify( "cleanup_objectives" );
ammo_ui_data_model = GetUIModel( GetUIModelForController( localClientNum ), "vehicle.ammo" );
if ( isdefined( ammo_ui_data_model ) )
SetUIModelValue( ammo_ui_data_model, 1 );
}
function bomblets_deployed( localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump )
{
if ( bNewEnt && oldVal == newVal )
{
return;
}
if( newVal == ( 1 ) )
{
player = getlocalplayer( localClientNum );
owner = self GetOwner( localClientNum );
clientObjID = util::getNextObjID( localClientNum );
objective_add( localClientNum, clientObjID, "invisible", self.origin, self.team, owner );
Objective_OnEntity( localClientNum, clientObjID, self, true, false, true );
self thread destruction_watcher( localClientNum, clientObjID );
objective_state( localClientNum, clientObjID, "active" );
if( player hasPerk( localClientNum, "specialty_showenemyequipment" ) || player.team == self.team )
objective_SetIcon( localClientNum, clientObjID, "remotemissile_target" );
}
else
self notify( "cleanup_objectives" );
ammo_ui_data_model = GetUIModel( GetUIModelForController( localClientNum ), "vehicle.ammo" );
if ( isdefined( ammo_ui_data_model ) )
SetUIModelValue( ammo_ui_data_model, 0 );
}
function destruction_watcher( localClientNum, clientObjID )
{
self util::waittill_any( "death", "entityshutdown", "cleanup_objectives" );
wait( 0.1 );
if( isdefined( clientObjID ) )
{
objective_delete( localClientNum, clientObjID );
util::releaseObjID( localClientNum, clientObjID );
}
}
function hud_update( localClientNum )
{
self endon( "entityshutdown" );
self notify( "remote_missile_singeton");
self endon( "remote_missile_singeton");
missile = self;
altitude_ui_data_model = GetUIModel( GetUIModelForController( localClientNum ), "vehicle.altitude" );
speed_ui_data_model = GetUIModel( GetUIModelForController( localClientNum ), "vehicle.speed" );
if( !isdefined( altitude_ui_data_model ) || !isdefined( speed_ui_data_model ) )
return;
prev_z = missile.origin[2];
fps = 20.0;
delay = 1.0 / fps;
while( 1 )
{
cur_z = missile.origin[2];
SetUIModelValue( altitude_ui_data_model, cur_z );
dist = ( prev_z - cur_z ) * fps;
val = dist / 17.6;
SetUIModelValue( speed_ui_data_model, val );
prev_z = cur_z;
wait ( delay );
}
}