boiii-scripts/mp/mp_city.csc
2023-04-13 17:30:38 +02:00

294 lines
14 KiB
Plaintext

#using scripts\codescripts\struct;
#using scripts\shared\util_shared;
#using scripts\shared\clientfield_shared;
#using scripts\shared\scene_shared;
#using scripts\mp\_load;
#using scripts\mp\_util;
#using scripts\mp\mp_city_fx;
#using scripts\mp\mp_city_sound;
#using scripts\mp\vehicles\_quadtank;
#using scripts\mp\vehicles\_siegebot;
#using scripts\mp\vehicles\_siegebot_theia;
#precache( "client_fx", "ui/fx_dom_cap_indicator_neutral_r120" );
#precache( "client_fx", "ui/fx_dom_cap_indicator_team_r120" );
#precache( "client_fx", "ui/fx_dom_marker_neutral_r120" );
#precache( "client_fx", "ui/fx_dom_marker_team_r120" );
function main()
{
clientfield::register( "scriptmover", "ring_state", 15000, 2, "int", &ring_state_changed, !true, !true);
push_out_threshold = GetDvarFloat( "tu16_physicsPushOutThreshold", -1.0 );
if ( push_out_threshold != -1.0 )
SetDvar( "tu16_physicsPushOutThreshold", 10.0 );
mp_city_fx::main();
mp_city_sound::main();
load::main();
level.domFlagBaseFxOverride = &dom_flag_base_fx_override;
level.domFlagCapFxOverride = &dom_flag_cap_fx_override;
util::waitforclient( 0 ); // This needs to be called after all systems have been registered.
level.endGameXCamName = "ui_cam_endgame_mp_city";
level scene::play( "p7_fxanim_gp_light_emergency_military_01_bundle" );
}
function dom_flag_base_fx_override( flag, team )
{
switch ( flag.name )
{
case "a":
if ( team == "neutral" )
{
return "ui/fx_dom_marker_neutral_r120";
}
else
{
return "ui/fx_dom_marker_team_r120";
}
break;
case "b":
break;
case "c":
if ( team == "neutral" )
{
return "ui/fx_dom_marker_neutral_r120";
}
else
{
return "ui/fx_dom_marker_team_r120";
}
break;
};
}
function dom_flag_cap_fx_override( flag, team )
{
switch ( flag.name )
{
case "a":
if ( team == "neutral" )
{
return "ui/fx_dom_cap_indicator_neutral_r120";
}
else
{
return "ui/fx_dom_cap_indicator_team_r120";
}
break;
case "b":
break;
case "c":
if ( team == "neutral" )
{
return "ui/fx_dom_cap_indicator_neutral_r120";
}
else
{
return "ui/fx_dom_cap_indicator_team_r120";
}
break;
};
}
function ring_state_changed( localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump )
{
self notify ( "state_switched" );
if( !isDefined( self.emissiveLevel ) )
{
self.emissiveLevel = 0;
}
switch( newVal )
{
case 0:
self ring_state_ramp( localClientNum );
break;
case 1:
self ring_state_on( localClientNum );
break;
case 2:
self ring_state_flicker( localClientNum );
break;
case 3:
self thread ring_state_base( localClientNum );
break;
}
}
function ramp_shader( localClientNum, time, lowIntensity, highIntensity, ramp_type, goalIntensity )
{
self endon ( "state_switched" );
self endon ( "entityshutdown" );
starttime = GetServerTime( localClientNum );
currTime = starttime;
ramp_shader_single( localClientNum, time, goalIntensity, 0 );
while( true )
{
amount = ( currTime - starttime ) % time;
percent = float( amount ) / time;
up = int( ( currTime - starttime ) / time ) % 2;
if( up )
{
percent = 1 - percent;
}
if( ramp_type == 1 )
{
percent *= percent;
}
self.emissiveLevel = LerpFloat( lowIntensity, highIntensity, percent );
self MapShaderConstant( localClientNum, 0, "scriptVector2", 0, Pow( self.emissiveLevel, 4 ), 0, 0 );
{wait(.016);};
currTime = GetServerTime( localClientNum );
}
}
function ramp_shader_random( localClientNum, time, lowIntensity, highIntensity, ramp_type, goalIntensity, total_time )
{
self endon ( "state_switched" );
self endon ( "entityshutdown" );
starttime = GetServerTime( localClientNum );
currTime = starttime;
ramp_shader_single( localClientNum, time, goalIntensity, 0 );
direction = 0;
startIntensity = lowintensity;
finalIntensity = highIntensity;
while( true )
{
percent_total = ( currTime - starttime ) / total_time;
percent_total *= percent_total;
percent_total = 1 - percent_total;
if( percent_total < 0 )
{
percent_total = 0;
}
amount = ( currTime - starttime ) % time;
percent = float( amount ) / time;
up = int( ( currTime - starttime ) / time ) % 2;
if( direction != up )
{
startIntensity = finalIntensity;
finalIntensity = RandomFloatRange( 0, 1 * percent_total );
}
if( ramp_type == 1 )
{
percent *= percent;
}
self.emissiveLevel = LerpFloat( startIntensity, finalIntensity, percent );
self MapShaderConstant( localClientNum, 0, "scriptVector2", 0, Pow( self.emissiveLevel, 4 ), 0, 0 );
{wait(.016);};
currTime = GetServerTime( localClientNum );
}
}
function ramp_shader_single( localClientNum, time, goalIntensity, ramp_type )
{
self endon ( "entityshutdown" );
starttime = GetServerTime( localClientNum );
currTime = starttime;
startIntensity = self.emissiveLevel;
while( self.emissiveLevel != goalIntensity )
{
percent = float( currTime - starttime ) / time;
if( percent > 1 )
{
percent = 1;
}
if( ramp_type == 1 )
{
percent *= percent;
}
self.emissiveLevel = LerpFloat( startIntensity, goalIntensity, percent );
self MapShaderConstant( localClientNum, 0, "scriptVector2", 0, Pow( self.emissiveLevel, 4 ), 0, 0 );
{wait(.016);};
currTime = GetServerTime( localClientNum );
}
{wait(.016);};
self notify( "ramp_shader_single_finished" );
}
function ring_state_base( localClientNum )
{
self endon ( "entityshutdown" );
self thread ramp_shader_single( localClientNum, 90, self.emissiveLevel / 2, 1 );
self waittill( "ramp_shader_single_finished" );
self thread ramp_shader_single( localClientNum, 4000, 0, 1 );
self waittill( "ramp_shader_single_finished" );
self thread ramp_shader( localClientNum, 2000, .15, .25, 1, .15 );
}
function ring_state_ramp( localClientNum )
{
self thread ramp_shader_single( localClientNum, 2000, 1, 0 );
}
function ring_state_on( localClientNum )
{
self thread ramp_shader( localClientNum, 2000, .25, .5, 0, .25 );
}
function ring_state_flicker( localClientNum )
{
self thread ramp_shader_random( localClientNum, 90, 0, 1, 1, 0, 4200 );
}