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

323 lines
17 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\_shoutcaster;
#precache( "client_fx", "ui/fx_uplink_goal_marker" );
#precache( "client_fx", "ui/fx_uplink_goal_marker_flash" );
#precache( "client_fx", "ui/fx_uplink_goal_marker_white" );
#precache( "client_fx", "ui/fx_uplink_goal_marker_white_flash" );
function main()
{
clientfield::register( "allplayers", "ballcarrier", 1, 1, "int", &player_ballcarrier_changed, !true, true );
clientfield::register( "allplayers", "passoption", 1, 1, "int", &player_passoption_changed, !true, !true );
clientfield::register( "world", "ball_away" , 1, 1, "int", &world_ball_away_changed, !true, true );
clientfield::register( "world", "ball_score_allies" , 1, 1, "int", &world_ball_score_allies, !true, true );
clientfield::register( "world", "ball_score_axis" , 1, 1, "int", &world_ball_score_axis, !true, true );
callback::on_localclient_connect( &on_localclient_connect );
callback::on_spawned( &on_player_spawned );
if ( !GetDvarInt("tu11_programaticallyColoredGameFX") )
{
level.effect_scriptbundles = [];
level.effect_scriptbundles["goal"] = struct::get_script_bundle( "teamcolorfx", "teamcolorfx_uplink_goal" );
level.effect_scriptbundles["goal_score"] = struct::get_script_bundle( "teamcolorfx", "teamcolorfx_uplink_goal_score" );
}
}
function on_localclient_connect( localClientNum )
{
objective_ids = [];
while ( !isdefined( objective_ids["allies"] ) )
{
objective_ids["allies"] = ServerObjective_GetObjective( localClientNum, "ball_goal_allies" );
objective_ids["axis"] = ServerObjective_GetObjective( localClientNum, "ball_goal_axis" );
wait(0.05);
}
foreach( key, objective in objective_ids )
{
level.goals[key] = SpawnStruct();
level.goals[key].objectiveId = objective;
setup_goal( localClientNum, level.goals[key] );
}
setup_fx( localClientNum );
}
function on_player_spawned( localClientNum )
{
players = GetPlayers( localclientnum );
foreach( player in players )
{
if( player util::IsEnemyPlayer( self ) )
{
player duplicate_render::update_dr_flag( localClientNum, "ballcarrier", 0 );
}
}
}
function setup_goal( localClientNum, goal )
{
goal.origin = ServerObjective_GetObjectiveOrigin( localClientNum, goal.objectiveId );
goal_entity = ServerObjective_GetObjectiveEntity( localClientNum, goal.objectiveId );
if ( isdefined(goal_entity) )
{
goal.origin = goal_entity.origin;
}
goal.team = ServerObjective_GetObjectiveTeam( localClientNum, goal.objectiveId );
}
function setup_goal_fx( localClientNum, goal, effects )
{
if ( isdefined( goal.base_fx ) )
{
StopFx( localClientNum, goal.base_fx );
}
goal.base_fx = PlayFx(localClientNum, effects[goal.team], goal.origin );
SetFxTeam( localClientNum, goal.base_fx, goal.team );
}
function setup_fx( localClientNum )
{
effects = [];
if ( shoutcaster::is_shoutcaster_using_team_identity(localClientNum) )
{
if ( GetDvarInt("tu11_programaticallyColoredGameFX") )
{
effects["allies"] = "ui/fx_uplink_goal_marker_white";
effects["axis"] = "ui/fx_uplink_goal_marker_white";
}
else
{
effects = shoutcaster::get_color_fx( localClientNum, level.effect_scriptbundles["goal"] );
}
}
else
{
effects["allies"] = "ui/fx_uplink_goal_marker";
effects["axis"] = "ui/fx_uplink_goal_marker";
}
foreach( goal in level.goals)
{
thread setup_goal_fx(localClientNum, goal, effects );
thread resetOnDemoJump( localClientNum, goal, effects );
}
thread watch_for_team_change( localClientNum );
}
function play_score_fx( localClientNum, goal)
{
effects = [];
if ( shoutcaster::is_shoutcaster_using_team_identity(localClientNum) )
{
if ( GetDvarInt("tu11_programaticallyColoredGameFX") )
{
effects["allies"] = "ui/fx_uplink_goal_marker_white_flash";
effects["axis"] = "ui/fx_uplink_goal_marker_white_flash";
}
else
{
effects = shoutcaster::get_color_fx( localClientNum, level.effect_scriptbundles["goal_score"] );
}
}
else
{
effects["allies"] = "ui/fx_uplink_goal_marker_flash";
effects["axis"] = "ui/fx_uplink_goal_marker_flash";
}
fx_handle = PlayFx(localClientNum, effects[goal.team], goal.origin );
SetFxTeam( localClientNum, fx_handle, goal.team );
}
function play_goal_score_fx( localClientNum, team, oldVal, newVal, bInitialSnap, bWasTimeJump )
{
if( ( newVal != oldVal ) && !bInitialSnap && !bWasTimeJump )
{
play_score_fx( localClientNum, level.goals[team] );
}
}
function world_ball_score_allies( localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump )
{
play_goal_score_fx( localClientNum, "allies", oldVal, newVal, bInitialSnap, bWasTimeJump );
}
function world_ball_score_axis( localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump )
{
play_goal_score_fx( localClientNum, "axis", oldVal, newVal, bInitialSnap, bWasTimeJump );
}
function player_ballcarrier_changed( localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump )
{
localplayer = getlocalplayer( localClientNum );
if( localplayer == self )
{
if( newVal )
{
self._hasBall = true;
}
else
{
self._hasBall = false;
SetUIModelValue( CreateUIModel( GetUIModelForController( localClientNum ), "ballGametype.passOption" ), 0 );
}
}
if( ( localplayer != self ) && self isFriendly( localClientNum ) )
{
self set_player_ball_carrier_dr( localClientNum, newVal );
}
else
{
self set_player_ball_carrier_dr( localClientNum, false );
}
// if ( newVal == 1 )
// {
// self set_hud(localClientNum);
// }
// else
// {
// self clear_hud( localClientNum );
// }
if ( isdefined( level.ball_carrier ) && level.ball_carrier != self )
return;
level notify( "watch_for_death" );
if ( newVal == 1 )
{
// we need to track when the player dies because if they watch killcam we will not get flag updates
self thread watch_for_death( localClientNum );
}
}
function set_hud( localClientNum )
{
level.ball_carrier = self;
if ( shoutcaster::is_shoutcaster( localClientNum ) )
{
friendly = self shoutcaster::is_friendly( localclientnum );
}
else
{
friendly = self isFriendly( localClientNum );
}
if( isdefined( self.name ) )
SetUIModelValue( CreateUIModel( GetUIModelForController( localClientNum ), "ballGametype.ballStatusText" ), self.name );
else
SetUIModelValue( CreateUIModel( GetUIModelForController( localClientNum ), "ballGametype.ballStatusText" ), "" );
if( isdefined( friendly ) )
{
SetUIModelValue( CreateUIModel( GetUIModelForController( localClientNum ), "ballGametype.ballHeldByFriendly" ), friendly );
SetUIModelValue( CreateUIModel( GetUIModelForController( localClientNum ), "ballGametype.ballHeldByEnemy" ), !friendly );
}
else
{
SetUIModelValue( CreateUIModel( GetUIModelForController( localClientNum ), "ballGametype.ballHeldByFriendly" ), 0 );
SetUIModelValue( CreateUIModel( GetUIModelForController( localClientNum ), "ballGametype.ballHeldByEnemy" ), 0 );
}
}
function clear_hud( localClientNum )
{
level.ball_carrier = undefined;
SetUIModelValue( CreateUIModel( GetUIModelForController( localClientNum ), "ballGametype.ballHeldByEnemy" ), 0 );
SetUIModelValue( CreateUIModel( GetUIModelForController( localClientNum ), "ballGametype.ballHeldByFriendly" ), 0 );
SetUIModelValue( CreateUIModel( GetUIModelForController( localClientNum ), "ballGametype.ballStatusText" ), &"MPUI_BALL_AWAY" );
}
function watch_for_death( localClientNum )
{
level endon( "watch_for_death" );
self waittill( "entityshutdown" );
//self clear_hud(localClientNum);
}
function player_passoption_changed( localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump )
{
localplayer = getlocalplayer( localClientNum );
if( ( localplayer != self ) && self isFriendly( localClientNum ) )
{
if( ( isdefined( localplayer._hasBall ) && localplayer._hasBall ) )
{
SetUIModelValue( CreateUIModel( GetUIModelForController( localClientNum ), "ballGametype.passOption" ), newVal );
}
}
}
function world_ball_away_changed( localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump )
{
SetUIModelValue( CreateUIModel( GetUIModelForController( localClientNum ), "ballGametype.ballAway" ), newVal );
//if( newVal == 0 || bInitialSnap )
//{
//SetUIModelValue( CreateUIModel( GetUIModelForController( localClientNum ), "ballGametype.ballHeldByEnemy" ), 0 );
//SetUIModelValue( CreateUIModel( GetUIModelForController( localClientNum ), "ballGametype.ballHeldByFriendly" ), 0 );
//SetUIModelValue( CreateUIModel( GetUIModelForController( localClientNum ), "ballGametype.ballStatusText" ), &"MPUI_BALL_HOME" );
//}
}
function set_player_ball_carrier_dr( localClientNum, on_off )
{
self duplicate_render::update_dr_flag( localClientNum, "ballcarrier", on_off );
}
function set_player_pass_option_dr( localClientNum, on_off )
{
self duplicate_render::update_dr_flag( localClientNum, "passoption", on_off );
}
function resetOnDemoJump( localClientNum, goal, effects )
{
for (;;)
{
level waittill( "demo_jump" + localClientNum );
setup_goal_fx( localClientNum, goal, effects );
}
}
function watch_for_team_change( localClientNum )
{
level notify( "end_team_change_watch" );
level endon( "end_team_change_watch" );
level waittill( "team_changed" );
thread setup_fx( localClientNum );
}