2023-04-13 17:30:38 +02:00

293 lines
16 KiB
Plaintext

#using scripts\codescripts\struct;
#using scripts\shared\callbacks_shared;
#using scripts\shared\clientfield_shared;
#using scripts\shared\duplicaterender_mgr;
#using scripts\shared\util_shared;
#using scripts\mp\_callbacks;
function main()
{
clientfield::register( "allplayers", "hideTeamPlayer", 27000, 2, "int", &hideShowPlayerFromTeam, false, false );
clientfield::register( "allplayers", "pingHighlight", 27000, 1, "int", &highlightPlayer, false, false );
callback::on_localplayer_spawned( &onLocalplayerSpawned );
level.retrievableChangedFunc = &hideProp;
level.enemyEquipChangedFunc = &highlightProp;
thread teamChangedReNotify();
}
function onLocalplayerSpawned( localClientNum )
{
level notify( "localPlayerSpectatingEnd" + localClientNum );
if ( IsSpectating( localClientNum, false ) )
{
level thread localPlayerSpectating( localClientNum );
}
level thread setupPropPlayerNames( localClientNum );
}
function localPlayerSpectating( localClientNum )
{
level notify( "localPlayerSpectating" + localClientNum );
level endon( "localPlayerSpectatingEnd" + localClientNum );
lastPlayerSpectated = PlayerBeingSpectated( localClientNum );
while ( true )
{
player = PlayerBeingSpectated( localClientNum );
if ( player != lastPlayerSpectated )
{
level notify( "localPlayerSpectating" + localClientNum );
}
wait 0.1;
}
}
function teamChangedReNotify()
{
while ( true )
{
level waittill( "team_changed", localClientNum );
level notify( "team_changed" + localClientNum );
}
}
function entityIsPlayerALinkedParent( player )
{
parent = self GetLinkedEnt();
while ( isdefined( parent ) )
{
if ( parent == player )
return true;
else
parent = parent GetLinkedEnt();
}
return false;
}
function getPlayersProp( localClientNum, player )
{
if ( isdefined( player.prop ) )
return player.prop;
ents = GetEntArray( localClientNum );
foreach ( ent in ents )
{
if ( !ent IsPlayer() && isdefined( ent.owner ) && ent.owner == player && ent entityIsPlayerALinkedParent( player ) )
{
return ent;
}
}
}
function setupPropPlayerNames( localClientNum )
{
level notify( "setupPropPlayerNames" + localClientNum );
level endon( "setupPropPlayerNames" + localClientNum );
while ( true )
{
localPlayer = GetLocalPlayer( localClientNum );
spectating = IsSpectating( localClientNum, false );
players = GetPlayers( localClientNum );
foreach ( player in players )
{
if ( ( player != localPlayer || spectating ) && player IsHidden() && isdefined( player.team ) && ( player.team == localPlayer.team ) )
{
player.prop = getPlayersProp( localClientNum, player );
if ( isdefined( player.prop ) )
{
if ( !( isdefined( player.nameRendering ) && player.nameRendering ) )
{
player.prop SetDrawOwnerName( true, spectating );
player.nameRendering = true;
}
}
}
else if ( ( isdefined( player.nameRendering ) && player.nameRendering ) )
{
player.prop = getPlayersProp( localClientNum, player );
if ( isdefined( player.prop ) )
player.prop SetDrawOwnerName( false, spectating );
player.nameRendering = false;
}
}
wait 1;
}
}
function highlightProp( localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump )
{
if ( newVal == 0 )
{
self notify( "highlightPropTeamChange" );
self duplicate_render::update_dr_flag( localClientNum, "prop_ally", false );
self duplicate_render::update_dr_flag( localClientNum, "prop_clone", false );
}
else
{
self thread highlightPropTeamChange( localClientNum, newVal );
}
}
function highlightPropTeamChange( localClientNum, highlightType )
{
self endon( "entityshutdown" );
level endon( "disconnect" );
self notify( "highlightPropTeamChange" );
self endon( "highlightPropTeamChange" );
while ( 1 )
{
localPlayer = GetLocalPlayer( localClientNum );
spectating = IsSpectating( localClientNum, false ) && !GetInKillcam( localClientNum );
isHighlighted = ( ( !isdefined( self.owner ) || ( self.owner != localPlayer ) || spectating ) && isdefined( self.team ) && isdefined( localPlayer.team ) && self.team == localPlayer.team );
if ( highlightType == 1 )
{
self duplicate_render::update_dr_flag( localClientNum, "prop_ally", isHighlighted );
self duplicate_render::update_dr_flag( localClientNum, "prop_clone", false );
}
else
{
self duplicate_render::update_dr_flag( localClientNum, "prop_clone", isHighlighted );
self duplicate_render::update_dr_flag( localClientNum, "prop_ally", false );
}
self duplicate_render::update_dr_filters( localClientNum );
level util::waittill_any( "team_changed" + localClientNum, "localPlayerSpectating" + localClientNum );
}
}
function highlightPlayer( localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump )
{
if ( newVal == 0 )
{
self notify( "highlightPropTeamChange" );
self duplicate_render::update_dr_flag( localClientNum, "prop_clone", false );
}
else
{
self thread highlightPlayerTeamChange( localClientNum, newVal );
}
}
function highlightPlayerTeamChange( localClientNum, highlightType )
{
self endon( "entityshutdown" );
self notify( "highlightPlayerTeamChange" );
self endon( "highlightPlayerTeamChange" );
while ( 1 )
{
localPlayer = GetLocalPlayer( localClientNum );
isHighlighted = ( self != localPlayer && isdefined( self.team ) && isdefined( localPlayer.team ) && self.team == localPlayer.team );
self duplicate_render::update_dr_flag( localClientNum, "prop_clone", isHighlighted );
level util::waittill_any( "team_changed" + localClientNum, "localPlayerSpectating" + localClientNum );
}
}
function hideProp( localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump )
{
localPlayer = GetLocalPlayer( localClientNum );
isHighlighted = ( newVal && isdefined( self.owner ) && self.owner == localPlayer );
if ( isHighlighted )
{
self duplicate_render::update_dr_flag( localClientNum, "prop_look_through", true );
self duplicate_render::set_dr_flag( "hide_model", true );
self duplicate_render::set_dr_flag( "active_camo_reveal", false );
self duplicate_render::set_dr_flag( "active_camo_on", true );
self duplicate_render::update_dr_filters( localClientNum );
}
else
{
self duplicate_render::update_dr_flag( localClientNum, "prop_look_through", false );
self duplicate_render::set_dr_flag( "hide_model", false );
self duplicate_render::set_dr_flag( "active_camo_reveal", false );
self duplicate_render::set_dr_flag( "active_camo_on", false );
self duplicate_render::update_dr_filters( localClientNum );
}
}
function hideShowPlayerFromTeam( localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump )
{
if ( newVal == 0 )
{
self notify( "hideShowFromTeam" );
if ( !self IsPlayerProp( localClientNum ) )
self Show();
}
else
{
self hideShowFromTeamChange( localClientNum, newVal );
}
}
function IsPlayerProp( localClientNum )
{
if ( isdefined( self.prop ) )
return true;
if ( self IsPlayer() )
{
self.prop = getPlayersProp( localClientNum, self );
return ( isdefined( self.prop ) );
}
return false;
}
function hideShowFromTeamChange( localClientNum, teamInt )
{
self endon( "entityshutdown" );
self notify( "hideShowFromTeam" );
self endon( "hideShowFromTeam" );
assert( teamInt == 1 || teamInt == 2 );
team = "allies";
if ( teamInt == 2 )
team = "axis";
while ( 1 )
{
localPlayer = GetLocalPlayer( localClientNum );
isHidden = ( isdefined( localPlayer.team ) && team == localPlayer.team && !IsSpectating( localClientNum ) );
if ( isHidden )
{
self Hide();
}
else
{
if ( !self IsPlayerProp( localClientNum ) )
self Show();
}
level waittill( "team_changed" + localClientNum );
}
}