boiii-scripts/shared/weapons/_weaponobjects.csc
2023-04-13 17:30:38 +02:00

362 lines
18 KiB
Plaintext

#using scripts\codescripts\struct;
#using scripts\shared\array_shared;
#using scripts\shared\audio_shared;
#using scripts\shared\callbacks_shared;
#using scripts\shared\clientfield_shared;
#using scripts\shared\duplicaterender_mgr;
#using scripts\shared\filter_shared;
#using scripts\shared\util_shared;
#using scripts\shared\system_shared;
#precache( "client_fx", "weapon/fx_equip_light_os" );
#namespace weaponobjects;
function init_shared()
{
callback::on_localplayer_spawned( &on_localplayer_spawned );
clientfield::register( "toplayer", "proximity_alarm", 1, 2, "int", &proximity_alarm_changed, !true, true );
clientfield::register( "missile", "retrievable", 1, 1, "int", &retrievable_changed, !true, true );
clientfield::register( "scriptmover", "retrievable", 1, 1, "int", &retrievable_changed, !true, !true );
clientfield::register( "missile", "enemyequip", 1, 2, "int", &enemyequip_changed, !true, true );
clientfield::register( "scriptmover", "enemyequip", 1, 2, "int", &enemyequip_changed, !true, !true );
clientfield::register( "missile", "teamequip", 1, 1, "int", &teamequip_changed, !true, true );
level._effect[ "powerLight" ] = "weapon/fx_equip_light_os";
if(!isdefined(level.retrievable))level.retrievable=[];
if(!isdefined(level.enemyequip))level.enemyequip=[];
}
function on_localplayer_spawned( local_client_num )
{
if( self != GetLocalPlayer( local_client_num ) )
return;
self thread watch_perks_changed(local_client_num);
self thread watch_killstreak_tap_activation( local_client_num );
}
function watch_killstreak_tap_activation( local_client_num )
{
self notify( "watch_killstreak_tap_activation" );
self endon( "watch_killstreak_tap_activation" );
self endon( "death" );
self endon( "disconnect" );
self endon( "entityshutdown" );
while ( IsDefined( self ) )
{
self waittill( "notetrack", note );
if ( note == "activate_datapad" )
{
uimodel = CreateUIModel( GetUIModelForController( local_client_num ), "hudItems.killstreakActivated" );
SetUIModelValue( uimodel, 1 );
}
if ( note == "deactivate_datapad" )
{
uimodel = CreateUIModel( GetUIModelForController( local_client_num ), "hudItems.killstreakActivated" );
SetUIModelValue( uimodel, 0 );
}
}
}
function proximity_alarm_changed( local_client_num, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump )
{
update_sound( local_client_num, bNewEnt, newVal, oldVal );
}
function update_sound( local_client_num, bNewEnt, newVal, oldVal )
{
if ( newVal == 2 )
{
if ( !IsDefined( self._proximity_alarm_snd_ent ) )
{
self._proximity_alarm_snd_ent = Spawn( local_client_num, self.origin, "script_origin" );
self thread sndProxAlert_EntCleanup(local_client_num, self._proximity_alarm_snd_ent);
}
playsound( local_client_num, "uin_c4_proximity_alarm_start", (0,0,0) );
self._proximity_alarm_snd_ent PlayLoopSound( "uin_c4_proximity_alarm_loop", .1 );
}
else if ( newVal == 1 )
{
//playsound( local_client_num, "uin_c4_proximity_alarm_deploy", (0,0,0) );
}
else if( newVal == 0 && isdefined( oldVal ) && oldVal != newVal )
{
playsound( local_client_num, "uin_c4_proximity_alarm_stop", (0,0,0) );
if ( IsDefined( self._proximity_alarm_snd_ent ) )
{
self._proximity_alarm_snd_ent StopAllLoopSounds( 0.5 );
}
}
}
function teamequip_changed( local_client_num, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump )
{
self updateTeamEquipment( local_client_num, newVal );
}
function updateTeamEquipment( local_client_num, newVal )
{
self checkTeamEquipment( local_client_num );
}
function retrievable_changed( local_client_num, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump )
{
if ( isdefined( level.retrievableChangedFunc ) )
{
self [[ level.retrievableChangedFunc ]]( local_client_num, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump );
}
else
{
self util::add_remove_list( level.retrievable, newVal );
self updateRetrievable( local_client_num, newVal );
}
}
function updateRetrievable( local_client_num, newVal )
{
if ( IsDefined(self.owner) && self.owner == getlocalplayer( local_client_num ) )
{
self duplicate_render::set_item_retrievable( local_client_num, newVal );
}
else
{
if ( IsDefined(self.currentdrfilter))
self duplicate_render::set_item_retrievable( local_client_num, false );
}
}
function enemyequip_changed( local_client_num, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump )
{
if ( isdefined( level.enemyEquipChangedFunc ) )
{
self [[ level.enemyEquipChangedFunc ]]( local_client_num, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump );
}
else
{
newVal = ( newVal != 0 );
self util::add_remove_list( level.enemyequip, newVal );
self updateEnemyEquipment( local_client_num, newVal );
}
}
function updateEnemyEquipment( local_client_num, newVal )
{
watcher = GetLocalPlayer( local_client_num );
friend = self util::friend_not_foe( local_client_num, true );
if ( !friend && IsDefined( watcher ) && watcher HasPerk( local_client_num, "specialty_showenemyequipment" ) )
{
self duplicate_render::set_item_friendly_equipment( local_client_num, false );
self duplicate_render::set_item_enemy_equipment( local_client_num, newVal );
}
else if( friend && isDefined( watcher ) && watcher duplicate_render::show_friendly_outlines(local_client_num) )
{
self duplicate_render::set_item_enemy_equipment( local_client_num, false );
self duplicate_render::set_item_friendly_equipment( local_client_num, newVal );
}
else
{
self duplicate_render::set_item_enemy_equipment( local_client_num, false );
self duplicate_render::set_item_friendly_equipment( local_client_num, false );
}
}
function equipmentDR( local_client_num )
{
}
function watch_perks_changed(local_client_num)
{
self notify( "watch_perks_changed" );
self endon( "watch_perks_changed" );
self endon( "death" );
self endon( "disconnect" );
self endon( "entityshutdown" );
while(IsDefined(self))
{
{wait(.016);};
util::clean_deleted(level.retrievable);
util::clean_deleted(level.enemyequip);
array::thread_all( level.retrievable, &updateRetrievable, local_client_num, 1 );
array::thread_all( level.enemyequip, &updateEnemyEquipment, local_client_num, 1 );
self waittill("perks_changed");
}
}
function checkTeamEquipment( localClientNum )
{
if ( !isdefined( self.owner ) )
{
return;
}
if ( !isdefined( self.equipmentOldTeam ) )
{
self.equipmentOldTeam = self.team;
}
if ( !isdefined( self.equipmentOldOwnerTeam ) )
{
self.equipmentOldOwnerTeam = self.owner.team;
}
watcher = GetLocalPlayer( localClientNum );
if ( !isdefined( self.equipmentOldWatcherTeam ) )
{
self.equipmentOldWatcherTeam = watcher.team;
}
if ( self.equipmentOldTeam != self.team || self.equipmentOldOwnerTeam != self.owner.team || self.equipmentOldWatcherTeam != watcher.team)
{
self.equipmentOldTeam = self.team;
self.equipmentOldOwnerTeam = self.owner.team;
self.equipmentOldWatcherTeam = watcher.team;
self notify( "team_changed" );
}
}
//******************************************************************
// *
// *
//******************************************************************
function equipmentTeamObject( localClientNum )
{
if ( ( isdefined( level.disable_equipment_team_object ) && level.disable_equipment_team_object ) )
{
return;
}
self endon( "entityshutdown" );
self util::waittill_dobj(localClientNum);
wait( 0.05 );
fx_handle = self thread playFlareFX( localClientNum );
self thread equipmentWatchTeamFX( localClientNum, fx_handle );
self thread equipmentWatchPlayerTeamChanged( localClientNum, fx_handle );
self thread equipmentDR();
}
//******************************************************************
// *
// *
//******************************************************************
function playFlareFX( localClientNum ) // self is the equipment entity
{
self endon( "entityshutdown" );
level endon( "player_switch" );
if ( !isdefined( self.equipmentTagFX ) )
{
self.equipmentTagFX = "tag_origin";
}
if ( !isdefined( self.equipmentFriendFX ) )
{
self.equipmentTagFX = level._effect[ "powerLightGreen" ];
}
if ( !isdefined( self.equipmentEnemyFX ) )
{
self.equipmentTagFX = level._effect[ "powerLight" ];
}
if ( self util::friend_not_foe( localClientNum, true ) )
{
fx_handle = PlayFXOnTag( localClientNum, self.equipmentFriendFX, self, self.equipmentTagFX );
}
else
{
fx_handle = PlayFXOnTag( localClientNum, self.equipmentEnemyFX, self, self.equipmentTagFX );
}
return fx_handle;
}
//******************************************************************
// equipmentWatchTeamFX *
// handles notifies that may cause the FX to change *
//******************************************************************
function equipmentWatchTeamFX( localClientNum, fxHandle ) // self is the equipment entity
{
msg = self util::waittill_any_return( "entityshutdown", "team_changed", "player_switch" );
if ( isdefined( fxHandle ) )
{
stopFx( localClientNum, fxHandle );
}
waittillframeend;
if ( msg != "entityshutdown" && isdefined( self ) )
{
self thread equipmentTeamObject( localClientNum );
}
}
//*****************************************************************
// equipmentWatchPlayerTeamChanged *
// handles the player changing teams and notifies the equipment *
//*****************************************************************
function equipmentWatchPlayerTeamChanged( localClientNum, fxHandle ) // self is the equipment entity
{
self endon( "entityshutdown" );
self notify( "team_changed_watcher" );
self endon( "team_changed_watcher" );
watcherPlayer = GetLocalPlayer( localClientNum );
while ( 1 )
{
level waittill( "team_changed", clientNum );
player = GetLocalPlayer( clientNum );
if ( watcherPlayer == player )
{
self notify( "team_changed" );
}
}
}
function sndProxAlert_EntCleanup( localClientNum, ent )
{
level util::waittill_any( "sndDEDe", "demo_jump", "player_switch", "killcam_begin", "killcam_end" );
if ( isdefined(ent) )
{
ent StopAllLoopSounds( 0.5 );
ent delete();
}
}