#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 ); } }