#using scripts\codescripts\struct; #using scripts\shared\clientfield_shared; #using scripts\shared\util_shared; #using scripts\mp\_shoutcaster; #precache( "client_fx", "ui/fx_koth_marker_blue" ); #precache( "client_fx", "ui/fx_koth_marker_orng" ); #precache( "client_fx", "ui/fx_koth_marker_neutral" ); #precache( "client_fx", "ui/fx_koth_marker_contested" ); #precache( "client_fx", "ui/fx_koth_marker_blue_window" ); #precache( "client_fx", "ui/fx_koth_marker_orng_window" ); #precache( "client_fx", "ui/fx_koth_marker_neutral_window" ); #precache( "client_fx", "ui/fx_koth_marker_contested_window" ); #precache( "client_fx", "ui/fx_koth_marker_white" ); #precache( "client_fx", "ui/fx_koth_marker_white_window" ); function main() { level.current_zone = []; level.current_state = []; for( i = 0; i < 4; i++ ) { level.current_zone[i] = 0; level.current_state[i] = 0; } level.hardPoints = []; level.visuals = []; level.hardPointFX = []; clientfield::register( "world", "hardpoint", 1, 5, "int",&hardpoint, !true, !true ); clientfield::register( "world", "hardpointteam", 1, 5, "int",&hardpoint_state, !true, !true ); level.effect_scriptbundles = []; level.effect_scriptbundles["zoneEdgeMarker"] = struct::get_script_bundle( "teamcolorfx", "teamcolorfx_koth_edge_marker" ); level.effect_scriptbundles["zoneEdgeMarkerWndw"] = struct::get_script_bundle( "teamcolorfx", "teamcolorfx_koth_edge_marker_window" ); level._effect["zoneEdgeMarker"] = []; level._effect["zoneEdgeMarker"][0] = "ui/fx_koth_marker_neutral"; level._effect["zoneEdgeMarker"][1] = "ui/fx_koth_marker_blue"; level._effect["zoneEdgeMarker"][2] = "ui/fx_koth_marker_orng"; level._effect["zoneEdgeMarker"][3] = "ui/fx_koth_marker_contested"; level._effect["zoneEdgeMarkerWndw"] = []; level._effect["zoneEdgeMarkerWndw"][0] = "ui/fx_koth_marker_neutral_window"; level._effect["zoneEdgeMarkerWndw"][1] = "ui/fx_koth_marker_blue_window"; level._effect["zoneEdgeMarkerWndw"][2] = "ui/fx_koth_marker_orng_window"; level._effect["zoneEdgeMarkerWndw"][3] = "ui/fx_koth_marker_contested_window"; } function get_shoutcaster_fx(local_client_num) { effects = []; effects["zoneEdgeMarker"][0] = level._effect["zoneEdgeMarker"][0]; effects["zoneEdgeMarker"][3] = level._effect["zoneEdgeMarker"][3]; effects["zoneEdgeMarkerWndw"][0] = level._effect["zoneEdgeMarkerWndw"][0]; effects["zoneEdgeMarkerWndw"][3] = level._effect["zoneEdgeMarkerWndw"][3]; if ( GetDvarInt("tu11_programaticallyColoredGameFX") ) { effects["zoneEdgeMarker"][1] = "ui/fx_koth_marker_white"; effects["zoneEdgeMarker"][2] = "ui/fx_koth_marker_white"; effects["zoneEdgeMarkerWndw"][1] = "ui/fx_koth_marker_white_window"; effects["zoneEdgeMarkerWndw"][2] = "ui/fx_koth_marker_white_window"; } else { caster_effects = []; caster_effects["zoneEdgeMarker"] = shoutcaster::get_color_fx( local_client_num, level.effect_scriptbundles["zoneEdgeMarker"] ); caster_effects["zoneEdgeMarkerWndw"] = shoutcaster::get_color_fx( local_client_num, level.effect_scriptbundles["zoneEdgeMarkerWndw"] ); effects["zoneEdgeMarker"][1] = caster_effects["zoneEdgeMarker"]["allies"]; effects["zoneEdgeMarker"][2] = caster_effects["zoneEdgeMarker"]["axis"]; effects["zoneEdgeMarkerWndw"][1] = caster_effects["zoneEdgeMarkerWndw"]["allies"]; effects["zoneEdgeMarkerWndw"][2] = caster_effects["zoneEdgeMarkerWndw"]["axis"]; } return effects; } function get_fx_state( local_client_num, state, is_shoutcaster ) { if ( is_shoutcaster ) return state; if ( state == 1 ) { if ( util::friend_not_foe_team( local_client_num, "allies" ) ) return 1; else return 2; } else if ( state == 2 ) { if ( util::friend_not_foe_team( local_client_num, "axis" ) ) return 1; else return 2; } return state; } function get_fx( fx_name, fx_state, effects ) { return effects[fx_name][fx_state]; } function setup_hardpoint_fx( local_client_num, zone_index, state ) { effects = []; if ( shoutcaster::is_shoutcaster_using_team_identity(local_client_num) ) { effects = get_shoutcaster_fx(local_client_num); } else { effects["zoneEdgeMarker"] = level._effect["zoneEdgeMarker"]; effects["zoneEdgeMarkerWndw"] = level._effect["zoneEdgeMarkerWndw"]; } if ( isdefined( level.hardPointFX[local_client_num] ) ) { foreach ( fx in level.hardPointFX[local_client_num] ) { StopFx( local_client_num, fx ); } } level.hardPointFX[local_client_num] = []; if ( zone_index ) { if ( isdefined( level.visuals[zone_index] ) ) { fx_state = get_fx_state( local_client_num, state, shoutcaster::is_shoutcaster(local_client_num) ); foreach ( visual in level.visuals[zone_index] ) { if ( !isdefined(visual.script_fxid ) ) continue; fxid = get_fx( visual.script_fxid, fx_state, effects ); if ( isdefined(visual.angles) ) forward = AnglesToForward( visual.angles ); else forward = ( 0,0,0 ); fxHandle = PlayFX( local_client_num, fxid, visual.origin, forward ); level.hardPointFX[local_client_num][level.hardPointFX[local_client_num].size] = fxHandle; if ( isdefined( fxHandle ) ) { if ( state == 1 ) { SetFxTeam( local_client_num, fxHandle, "allies" ); } else if ( state == 2 ) { SetFxTeam( local_client_num, fxHandle, "axis" ); } else { SetFxTeam( local_client_num, fxHandle, "free" ); } } } } } thread watch_for_team_change( local_client_num ); } function hardpoint(localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump) { if ( level.hardPoints.size == 0 ) { hardpoints = struct::get_array( "koth_zone_center", "targetname" ); foreach( point in hardpoints ) { level.hardPoints[point.script_index] = point; } foreach( point in level.hardPoints ) { level.visuals[point.script_index] = struct::get_array( point.target, "targetname" ); } } level.current_zone[localClientNum] = newVal; level.current_state[localClientNum] = 0; setup_hardpoint_fx( localClientNum, level.current_zone[localClientNum], level.current_state[localClientNum] ); } function hardpoint_state(localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump) { if ( newVal != level.current_state[localClientNum] ) { level.current_state[localClientNum] = newVal; setup_hardpoint_fx( localClientNum, level.current_zone[localClientNum], level.current_state[localClientNum] ); } } function watch_for_team_change( localClientNum ) { level notify( "end_team_change_watch" ); level endon( "end_team_change_watch" ); level waittill( "team_changed" ); wait(0.05); thread setup_hardpoint_fx( localClientNum, level.current_zone[localClientNum], level.current_state[localClientNum] ); }