1178 lines
32 KiB
Plaintext
1178 lines
32 KiB
Plaintext
#using scripts\codescripts\struct;
|
|
|
|
#using scripts\shared\array_shared;
|
|
#using scripts\shared\callbacks_shared;
|
|
#using scripts\shared\debug_shared;
|
|
#using scripts\shared\flag_shared;
|
|
#using scripts\shared\hud_util_shared;
|
|
#using scripts\shared\math_shared;
|
|
#using scripts\shared\spawner_shared;
|
|
#using scripts\shared\system_shared;
|
|
#using scripts\shared\trigger_shared;
|
|
#using scripts\shared\util_shared;
|
|
|
|
//REGISTER SHARED SYSTEMS - DO NOT REMOVE
|
|
#using scripts\shared\doors_shared;
|
|
#using scripts\shared\duplicaterender_mgr;
|
|
#using scripts\shared\exploder_shared;
|
|
#using scripts\shared\fx_shared;
|
|
#using scripts\shared\visionset_mgr_shared;
|
|
#using scripts\shared\player_shared;
|
|
#using scripts\shared\drown;
|
|
|
|
#using scripts\shared\vehicles\_raps;
|
|
|
|
|
|
|
|
#namespace load;
|
|
|
|
function autoexec __init__sytem__() { system::register("load",&__init__,undefined,undefined); }
|
|
|
|
function autoexec first_frame()
|
|
{
|
|
level.first_frame = true;
|
|
{wait(.05);};
|
|
level.first_frame = undefined;
|
|
}
|
|
|
|
function __init__()
|
|
{
|
|
/#
|
|
|
|
level thread t7_cleanup_output();
|
|
level thread level_notify_listener();
|
|
level thread client_notify_listener();
|
|
level thread load_checkpoint_on_notify();
|
|
level thread save_checkpoint_on_notify();
|
|
|
|
#/
|
|
|
|
if ( SessionModeIsCampaignGame() )
|
|
{
|
|
level.game_mode_suffix = "_cp";
|
|
}
|
|
else if ( SessionModeIsZombiesGame() )
|
|
{
|
|
level.game_mode_suffix = "_zm";
|
|
}
|
|
else
|
|
{
|
|
level.game_mode_suffix = "_mp";
|
|
}
|
|
|
|
level.script = Tolower( GetDvarString( "mapname" ) );
|
|
|
|
level.clientscripts = ( GetDvarString( "cg_usingClientScripts") != "" );
|
|
|
|
level.campaign = "american"; // TODO T7: some scripts are using this but this should probably go away
|
|
|
|
//TODO T7 remove level.clientscripts init in MP/ZM once they get a T7 pass
|
|
level.clientscripts = ( GetDvarString( "cg_usingClientScripts" ) != "" );
|
|
|
|
level flag::init( "all_players_connected" );
|
|
level flag::init( "all_players_spawned" );
|
|
level flag::init( "first_player_spawned" );
|
|
|
|
if(!isdefined(level.timeofday))level.timeofday="day"; // time of day, used for client side night specific FX
|
|
|
|
if ( GetDvarString( "scr_RequiredMapAspectratio" ) == "" )
|
|
{
|
|
SetDvar( "scr_RequiredMapAspectratio", "1" );
|
|
}
|
|
|
|
// AE 10-29-09: added this to turn off the water fog
|
|
SetDvar( "r_waterFogTest", 0 );
|
|
SetDvar( "tu6_player_shallowWaterHeight", "0.0" );
|
|
|
|
util::registerClientSys( "levelNotify" ); // register client system for ClientNotify
|
|
|
|
level thread all_players_spawned();
|
|
|
|
level thread keep_time();
|
|
level thread count_network_frames();
|
|
|
|
callback::on_spawned( &on_spawned );
|
|
|
|
self thread playerDamageRumble();
|
|
|
|
array::thread_all( GetEntArray( "water", "targetname" ), &water_think );
|
|
array::thread_all_ents( GetEntArray( "badplace", "targetname" ), &badplace_think );
|
|
|
|
weapon_ammo();
|
|
set_objective_text_colors();
|
|
link_ents();
|
|
|
|
init_push_out_threshold();
|
|
}
|
|
|
|
function init_push_out_threshold()
|
|
{
|
|
push_out_threshold = GetDvarFloat( "tu16_physicsPushOutThreshold", -1.0 );
|
|
if ( push_out_threshold != -1.0 )
|
|
SetDvar( "tu16_physicsPushOutThreshold", 20.0 ); // BO3 default value
|
|
}
|
|
|
|
function count_network_frames()
|
|
{
|
|
level.network_frame = 0;
|
|
|
|
while ( true )
|
|
{
|
|
util::wait_network_frame();
|
|
level.network_frame++;
|
|
}
|
|
}
|
|
|
|
function keep_time()
|
|
{
|
|
while ( true )
|
|
{
|
|
level.time = GetTime();
|
|
{wait(.05);};
|
|
}
|
|
}
|
|
|
|
/#
|
|
|
|
function add_cleanup_msg( msg )
|
|
{
|
|
if ( !isdefined( level.cleanup_msgs ) ) level.cleanup_msgs = []; else if ( !IsArray( level.cleanup_msgs ) ) level.cleanup_msgs = array( level.cleanup_msgs ); level.cleanup_msgs[level.cleanup_msgs.size]=msg;;
|
|
}
|
|
|
|
function t7_cleanup_output()
|
|
{
|
|
level.cleanup_msgs = array( "1", "2", "3" );
|
|
|
|
wait 1;
|
|
PrintLn( "----------------------------- T7 Cleanup Summary -----------------------------" );
|
|
foreach ( msg in level.cleanup_msgs )
|
|
{
|
|
PrintLn( "test" );
|
|
}
|
|
PrintLn( "-------------------------------------------------------------------------------" );
|
|
}
|
|
|
|
function level_notify_listener()
|
|
{
|
|
while ( true )
|
|
{
|
|
val = GetDvarString( "level_notify" );
|
|
|
|
if ( val != "" )
|
|
{
|
|
toks = StrTok( val, "," );
|
|
|
|
if ( toks.size == 3 )
|
|
{
|
|
level notify( toks[0], toks[1], toks[2] );
|
|
}
|
|
else if ( toks.size == 2 )
|
|
{
|
|
level notify( toks[0], toks[1] );
|
|
}
|
|
else
|
|
{
|
|
level notify( toks[0] );
|
|
}
|
|
|
|
SetDvar( "level_notify", "" );
|
|
}
|
|
|
|
wait 0.2;
|
|
}
|
|
}
|
|
|
|
function client_notify_listener()
|
|
{
|
|
while ( true )
|
|
{
|
|
val = GetDvarString( "client_notify" );
|
|
|
|
if ( val != "" )
|
|
{
|
|
util::clientNotify( val );
|
|
SetDvar( "client_notify", "" );
|
|
}
|
|
|
|
wait 0.2;
|
|
}
|
|
}
|
|
|
|
function load_checkpoint_on_notify()
|
|
{
|
|
while ( true )
|
|
{
|
|
level waittill( "save" );
|
|
CheckpointCreate();
|
|
CheckpointCommit();
|
|
}
|
|
}
|
|
|
|
function save_checkpoint_on_notify()
|
|
{
|
|
while ( true )
|
|
{
|
|
level waittill( "load" );
|
|
CheckpointRestore();
|
|
}
|
|
}
|
|
|
|
#/
|
|
|
|
function weapon_ammo()
|
|
{
|
|
ents = GetEntArray();
|
|
for( i = 0; i < ents.size; i ++ )
|
|
{
|
|
if( ( isdefined( ents[i].classname ) ) &&( GetSubStr( ents[i].classname, 0, 7 ) == "weapon_" ) )
|
|
{
|
|
weap = ents[i];
|
|
change_ammo = false;
|
|
clip = undefined;
|
|
extra = undefined;
|
|
|
|
if( isdefined( weap.script_ammo_clip ) )
|
|
{
|
|
clip = weap.script_ammo_clip;
|
|
change_ammo = true;
|
|
}
|
|
|
|
if( isdefined( weap.script_ammo_extra ) )
|
|
{
|
|
extra = weap.script_ammo_extra;
|
|
change_ammo = true;
|
|
}
|
|
|
|
if( change_ammo )
|
|
{
|
|
if( !isdefined( clip ) )
|
|
{
|
|
assertmsg( "weapon: " + weap.classname + " " + weap.origin + " sets script_ammo_extra but not script_ammo_clip" );
|
|
}
|
|
|
|
if( !isdefined( extra ) )
|
|
{
|
|
assertmsg( "weapon: " + weap.classname + " " + weap.origin + " sets script_ammo_clip but not script_ammo_extra" );
|
|
}
|
|
weap ItemWeaponSetAmmo( clip, extra );
|
|
weap ItemWeaponSetAmmo( clip, extra, 1 );
|
|
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
function badplace_think( badplace )
|
|
{
|
|
if( !isdefined( level.badPlaces ) )
|
|
{
|
|
level.badPlaces = 0;
|
|
}
|
|
|
|
level.badPlaces++;
|
|
|
|
badplace_box( "badplace" + level.badPlaces, -1, badplace.origin, badplace.radius, "all" );
|
|
}
|
|
|
|
function playerDamageRumble()
|
|
{
|
|
while( true )
|
|
{
|
|
self waittill( "damage", amount );
|
|
|
|
if( isdefined( self.specialDamage ) )
|
|
{
|
|
continue;
|
|
}
|
|
|
|
self PlayRumbleOnEntity( "damage_heavy" );
|
|
}
|
|
}
|
|
|
|
function map_is_early_in_the_game()
|
|
{
|
|
/#
|
|
if( isdefined( level.testmap ) )
|
|
{
|
|
return true;
|
|
}
|
|
#/
|
|
|
|
/#
|
|
if( !isdefined( level.early_level[level.script] ) )
|
|
{
|
|
level.early_level[level.script] = false;
|
|
}
|
|
#/
|
|
|
|
return ( isdefined( level.early_level[level.script] ) && level.early_level[level.script] );
|
|
}
|
|
|
|
function player_throwgrenade_timer()
|
|
{
|
|
self endon( "death" );
|
|
self endon( "disconnect" );
|
|
|
|
self.lastgrenadetime = 0;
|
|
|
|
while( 1 )
|
|
{
|
|
while( ! self IsThroWingGrenade() )
|
|
{
|
|
wait( .05 );
|
|
}
|
|
|
|
self.lastgrenadetime = GetTime();
|
|
|
|
while( self IsThroWingGrenade() )
|
|
{
|
|
wait( .05 );
|
|
}
|
|
}
|
|
}
|
|
|
|
// SUMEET_TODO - Next project clean up this function and make it modular
|
|
function player_special_death_hint()
|
|
{
|
|
self endon( "disconnect" );
|
|
|
|
self thread player_throwgrenade_timer(); // this thread used in coop also
|
|
|
|
if( isSplitScreen() || util::coopGame() )
|
|
{
|
|
return;
|
|
}
|
|
|
|
// added an inflicter check
|
|
self waittill( "death", attacker, cause, weapon, inflicter ); // TODO: fix the callback params here if this function is ever called again; see other script files
|
|
|
|
if( cause != "MOD_GAS" && cause != "MOD_GRENADE" && cause != "MOD_GRENADE_SPLASH" && cause != "MOD_SUICIDE" && cause != "MOD_EXPLOSIVE" && cause != "MOD_PROJECTILE" && cause != "MOD_PROJECTILE_SPLASH" )
|
|
{
|
|
return;
|
|
}
|
|
|
|
// On hardened/veteran difficulty, we only show hints on first couple of levels
|
|
if ( level.gameskill >= 2 )
|
|
{
|
|
if ( !map_is_early_in_the_game() )
|
|
return;
|
|
}
|
|
|
|
if( cause == "MOD_EXPLOSIVE" )
|
|
{
|
|
// script_vehicle death hint/ also if the script is just manually a model swap instead of script vehicle
|
|
if( isdefined( attacker ) && ( attacker.classname == "script_vehicle" || isdefined( attacker.create_fake_vehicle_damage ) ) )
|
|
{
|
|
level notify( "new_quote_string" );
|
|
|
|
// You were killed by an exploding vehicle. Vehicles on fire are likely to explode.
|
|
SetDvar( "ui_deadquote", "@SCRIPT_EXPLODING_VEHICLE_DEATH" );
|
|
self thread explosive_vehice_death_indicator_hudelement();
|
|
return;
|
|
}
|
|
|
|
|
|
|
|
// Destructible explosion death hints
|
|
if( isdefined( inflicter ) && isdefined( inflicter.destructibledef ) )
|
|
{
|
|
// Destructible Barrel
|
|
if( IsSubStr( inflicter.destructibledef, "barrel_explosive" ) )
|
|
{
|
|
level notify( "new_quote_string" );
|
|
|
|
// You were killed by an exploding barrel. Red barrels will explode when shot.
|
|
SetDvar( "ui_deadquote", "@SCRIPT_EXPLODING_BARREL_DEATH" );
|
|
// thread special_death_indicator_hudelement( "hud_burningbarrelicon", 64, 64 );
|
|
return;
|
|
}
|
|
|
|
// Destructible car
|
|
if( isdefined( inflicter.destructiblecar ) && inflicter.destructiblecar )
|
|
{
|
|
level notify( "new_quote_string" );
|
|
|
|
// You were killed by an exploding vehicle. Vehicles on fire are likely to explode.
|
|
SetDvar( "ui_deadquote", "@SCRIPT_EXPLODING_VEHICLE_DEATH" );
|
|
self thread explosive_vehice_death_indicator_hudelement();
|
|
return;
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
if( cause == "MOD_GRENADE" || cause == "MOD_GRENADE_SPLASH" )
|
|
{
|
|
if( !weapon.isTimedDetonation || !weapon.isGrenadeWeapon )
|
|
{
|
|
return;
|
|
}
|
|
|
|
level notify( "new_quote_string" );
|
|
|
|
if (weapon.name == "explosive_bolt" )
|
|
{
|
|
//You were killed by an explosive bolt.
|
|
SetDvar( "ui_deadquote", "@SCRIPT_EXPLOSIVE_BOLT_DEATH" );
|
|
thread explosive_arrow_death_indicator_hudelement();
|
|
}
|
|
else
|
|
{
|
|
//You were killed by a grenade. Watch out for the grenade danger indicator.
|
|
SetDvar( "ui_deadquote", "@SCRIPT_GRENADE_DEATH" );
|
|
thread grenade_death_indicator_hudelement();
|
|
}
|
|
|
|
return;
|
|
}
|
|
}
|
|
|
|
function grenade_death_text_hudelement( textLine1, textLine2 )
|
|
{
|
|
self.failingMission = true;
|
|
|
|
SetDvar( "ui_deadquote", "" );
|
|
|
|
wait( .5 );
|
|
|
|
fontElem = NewHudElem();
|
|
fontElem.elemType = "font";
|
|
fontElem.font = "default";
|
|
fontElem.fontscale = 1.5;
|
|
fontElem.x = 0;
|
|
fontElem.y = -60;
|
|
|
|
fontElem.alignX = "center";
|
|
fontElem.alignY = "middle";
|
|
fontElem.horzAlign = "center";
|
|
fontElem.vertAlign = "middle";
|
|
fontElem SetText( textLine1 );
|
|
fontElem.foreground = true;
|
|
fontElem.alpha = 0;
|
|
fontElem FadeOverTime( 1 );
|
|
fontElem.alpha = 1;
|
|
fontElem.hidewheninmenu = true;
|
|
|
|
if( isdefined( textLine2 ) )
|
|
{
|
|
fontElem = NewHudElem();
|
|
fontElem.elemType = "font";
|
|
fontElem.font = "default";
|
|
fontElem.fontscale = 1.5;
|
|
fontElem.x = 0;
|
|
fontElem.y = -60 + level.fontHeight * fontElem.fontscale;
|
|
|
|
fontElem.alignX = "center";
|
|
fontElem.alignY = "middle";
|
|
fontElem.horzAlign = "center";
|
|
fontElem.vertAlign = "middle";
|
|
fontElem SetText( textLine2 );
|
|
fontElem.foreground = true;
|
|
fontElem.alpha = 0;
|
|
fontElem FadeOverTime( 1 );
|
|
fontElem.alpha = 1;
|
|
fontElem.hidewheninmenu = true;
|
|
|
|
}
|
|
}
|
|
|
|
function grenade_death_indicator_hudelement()
|
|
{
|
|
self endon( "disconnect" );
|
|
wait( .5 );
|
|
overlayIcon = NewClientHudElem( self );
|
|
overlayIcon.x = 0;
|
|
overlayIcon.y = 68;
|
|
overlayIcon SetShader( "hud_grenadeicon_256", 50, 50 );
|
|
overlayIcon.alignX = "center";
|
|
overlayIcon.alignY = "middle";
|
|
overlayIcon.horzAlign = "center";
|
|
overlayIcon.vertAlign = "middle";
|
|
overlayIcon.foreground = true;
|
|
overlayIcon.alpha = 0;
|
|
overlayIcon FadeOverTime( 1 );
|
|
overlayIcon.alpha = 1;
|
|
overlayIcon.hidewheninmenu = true;
|
|
|
|
overlayPointer = NewClientHudElem( self );
|
|
overlayPointer.x = 0;
|
|
overlayPointer.y = 25;
|
|
overlayPointer SetShader( "hud_grenadepointer", 50, 25 );
|
|
overlayPointer.alignX = "center";
|
|
overlayPointer.alignY = "middle";
|
|
overlayPointer.horzAlign = "center";
|
|
overlayPointer.vertAlign = "middle";
|
|
overlayPointer.foreground = true;
|
|
overlayPointer.alpha = 0;
|
|
overlayPointer FadeOverTime( 1 );
|
|
overlayPointer.alpha = 1;
|
|
overlayPointer.hidewheninmenu = true;
|
|
|
|
self thread grenade_death_indicator_hudelement_cleanup( overlayIcon, overlayPointer );
|
|
}
|
|
|
|
|
|
function explosive_arrow_death_indicator_hudelement()
|
|
{
|
|
self endon( "disconnect" );
|
|
wait( .5 );
|
|
overlayIcon = NewClientHudElem( self );
|
|
overlayIcon.x = 0;
|
|
overlayIcon.y = 68;
|
|
overlayIcon SetShader( "hud_explosive_arrow_icon", 50, 50 );
|
|
overlayIcon.alignX = "center";
|
|
overlayIcon.alignY = "middle";
|
|
overlayIcon.horzAlign = "center";
|
|
overlayIcon.vertAlign = "middle";
|
|
overlayIcon.foreground = true;
|
|
overlayIcon.alpha = 0;
|
|
overlayIcon FadeOverTime( 1 );
|
|
overlayIcon.alpha = 1;
|
|
overlayIcon.hidewheninmenu = true;
|
|
|
|
overlayPointer = NewClientHudElem( self );
|
|
overlayPointer.x = 0;
|
|
overlayPointer.y = 25;
|
|
overlayPointer SetShader( "hud_grenadepointer", 50, 25 );
|
|
overlayPointer.alignX = "center";
|
|
overlayPointer.alignY = "middle";
|
|
overlayPointer.horzAlign = "center";
|
|
overlayPointer.vertAlign = "middle";
|
|
overlayPointer.foreground = true;
|
|
overlayPointer.alpha = 0;
|
|
overlayPointer FadeOverTime( 1 );
|
|
overlayPointer.alpha = 1;
|
|
overlayPointer.hidewheninmenu = true;
|
|
|
|
self thread grenade_death_indicator_hudelement_cleanup( overlayIcon, overlayPointer );
|
|
}
|
|
|
|
function explosive_dart_death_indicator_hudelement()
|
|
{
|
|
self endon( "disconnect" );
|
|
wait( .5 );
|
|
overlayIcon = NewClientHudElem( self );
|
|
overlayIcon.x = 0;
|
|
overlayIcon.y = 68;
|
|
overlayIcon SetShader( "hud_monsoon_titus_arrow", 50, 50 );
|
|
overlayIcon.alignX = "center";
|
|
overlayIcon.alignY = "middle";
|
|
overlayIcon.horzAlign = "center";
|
|
overlayIcon.vertAlign = "middle";
|
|
overlayIcon.foreground = true;
|
|
overlayIcon.alpha = 0;
|
|
overlayIcon FadeOverTime( 1 );
|
|
overlayIcon.alpha = 1;
|
|
overlayIcon.hidewheninmenu = true;
|
|
|
|
overlayPointer = NewClientHudElem( self );
|
|
overlayPointer.x = 0;
|
|
overlayPointer.y = 25;
|
|
overlayPointer SetShader( "hud_grenadepointer", 50, 25 );
|
|
overlayPointer.alignX = "center";
|
|
overlayPointer.alignY = "middle";
|
|
overlayPointer.horzAlign = "center";
|
|
overlayPointer.vertAlign = "middle";
|
|
overlayPointer.foreground = true;
|
|
overlayPointer.alpha = 0;
|
|
overlayPointer FadeOverTime( 1 );
|
|
overlayPointer.alpha = 1;
|
|
overlayPointer.hidewheninmenu = true;
|
|
|
|
self thread grenade_death_indicator_hudelement_cleanup( overlayIcon, overlayPointer );
|
|
}
|
|
|
|
function explosive_nitrogen_tank_death_indicator_hudelement()
|
|
{
|
|
self endon( "disconnect" );
|
|
wait( .5 );
|
|
overlayIcon = NewClientHudElem( self );
|
|
overlayIcon.x = 0;
|
|
overlayIcon.y = 68;
|
|
overlayIcon SetShader( "hud_monsoon_nitrogen_barrel", 50, 50 );
|
|
overlayIcon.alignX = "center";
|
|
overlayIcon.alignY = "middle";
|
|
overlayIcon.horzAlign = "center";
|
|
overlayIcon.vertAlign = "middle";
|
|
overlayIcon.foreground = true;
|
|
overlayIcon.alpha = 0;
|
|
overlayIcon FadeOverTime( 1 );
|
|
overlayIcon.alpha = 1;
|
|
overlayIcon.hidewheninmenu = true;
|
|
|
|
overlayPointer = NewClientHudElem( self );
|
|
overlayPointer.x = 0;
|
|
overlayPointer.y = 25;
|
|
overlayPointer SetShader( "hud_grenadepointer", 50, 25 );
|
|
overlayPointer.alignX = "center";
|
|
overlayPointer.alignY = "middle";
|
|
overlayPointer.horzAlign = "center";
|
|
overlayPointer.vertAlign = "middle";
|
|
overlayPointer.foreground = true;
|
|
overlayPointer.alpha = 0;
|
|
overlayPointer FadeOverTime( 1 );
|
|
overlayPointer.alpha = 1;
|
|
overlayPointer.hidewheninmenu = true;
|
|
|
|
self thread grenade_death_indicator_hudelement_cleanup( overlayIcon, overlayPointer );
|
|
}
|
|
|
|
function explosive_vehice_death_indicator_hudelement()
|
|
{
|
|
self endon( "disconnect" );
|
|
wait( .5 );
|
|
overlayIcon = NewClientHudElem( self );
|
|
overlayIcon.x = 0;
|
|
overlayIcon.y = -10;
|
|
overlayIcon SetShader( "hud_exploding_vehicles", 50, 50 );
|
|
overlayIcon.alignX = "center";
|
|
overlayIcon.alignY = "middle";
|
|
overlayIcon.horzAlign = "center";
|
|
overlayIcon.vertAlign = "middle";
|
|
overlayIcon.foreground = true;
|
|
overlayIcon.alpha = 0;
|
|
overlayIcon FadeOverTime( 1 );
|
|
overlayIcon.alpha = 1;
|
|
overlayIcon.hidewheninmenu = true;
|
|
|
|
overlayPointer = NewClientHudElem( self );
|
|
// overlayPointer.x = 0;
|
|
// overlayPointer.y = 25;
|
|
// overlayPointer SetShader( "hud_grenadepointer", 50, 25 );
|
|
// overlayPointer.alignX = "center";
|
|
// overlayPointer.alignY = "middle";
|
|
// overlayPointer.horzAlign = "center";
|
|
// overlayPointer.vertAlign = "middle";
|
|
// overlayPointer.foreground = true;
|
|
// overlayPointer.alpha = 0;
|
|
// overlayPointer FadeOverTime( 1 );
|
|
// overlayPointer.alpha = 1;
|
|
// overlayPointer.hidewheninmenu = true;
|
|
|
|
self thread grenade_death_indicator_hudelement_cleanup( overlayIcon, overlayPointer );
|
|
}
|
|
|
|
// CODE_MOD
|
|
function grenade_death_indicator_hudelement_cleanup( hudElemIcon, hudElemPointer )
|
|
{
|
|
self endon( "disconnect" );
|
|
self waittill( "spawned" );
|
|
|
|
hudElemIcon Destroy();
|
|
hudElemPointer Destroy();
|
|
}
|
|
|
|
function special_death_indicator_hudelement( shader, iWidth, iHeight, fDelay, x, y )
|
|
{
|
|
if( !isdefined( fDelay ) )
|
|
{
|
|
fDelay = 0.5;
|
|
}
|
|
|
|
wait( fDelay );
|
|
overlay = NewClientHudElem( self );
|
|
|
|
if( isdefined( x ) )
|
|
overlay.x = x;
|
|
else
|
|
overlay.x = 0;
|
|
|
|
if( isdefined( y ) )
|
|
overlay.y = y;
|
|
else
|
|
overlay.y = 40;
|
|
|
|
overlay SetShader( shader, iWidth, iHeight );
|
|
overlay.alignX = "center";
|
|
overlay.alignY = "middle";
|
|
overlay.horzAlign = "center";
|
|
overlay.vertAlign = "middle";
|
|
overlay.foreground = true;
|
|
overlay.alpha = 0;
|
|
overlay FadeOverTime( 1 );
|
|
overlay.alpha = 1;
|
|
overlay.hidewheninmenu = true;
|
|
|
|
self thread special_death_death_indicator_hudelement_cleanup( overlay );
|
|
}
|
|
|
|
function special_death_death_indicator_hudelement_cleanup( overlay )
|
|
{
|
|
self endon( "disconnect" );
|
|
self waittill( "spawned" );
|
|
|
|
overlay Destroy();
|
|
}
|
|
|
|
|
|
// SCRIPTER_MOD
|
|
// MikeD( 3/16/2007 ) TODO: Test this feature
|
|
function water_think()
|
|
{
|
|
assert( isdefined( self.target ) );
|
|
targeted = GetEnt( self.target, "targetname" );
|
|
assert( isdefined( targeted ) );
|
|
waterHeight = targeted.origin[2];
|
|
targeted = undefined;
|
|
|
|
level.depth_allow_prone = 8;
|
|
level.depth_allow_crouch = 33;
|
|
level.depth_allow_stand = 50;
|
|
|
|
|
|
while ( true )
|
|
{
|
|
{wait(.05);};
|
|
//restore all defaults
|
|
players = GetPlayers();
|
|
for( i = 0; i < players.size; i++ )
|
|
{
|
|
if( players[i].inWater )
|
|
{
|
|
players[i] AllowProne( true );
|
|
players[i] AllowCrouch( true );
|
|
players[i] AllowStand( true );
|
|
// thread waterThink_rampSpeed( level.default_run_speed );
|
|
}
|
|
}
|
|
|
|
//wait( until in water )
|
|
self waittill( "trigger", other );
|
|
|
|
if( !IsPlayer( other ) )
|
|
{
|
|
continue;
|
|
}
|
|
|
|
while( 1 )
|
|
{
|
|
players = GetPlayers();
|
|
|
|
players_in_water_count = 0;
|
|
for( i = 0; i < players.size; i++ )
|
|
{
|
|
if( players[i] IsTouching( self ) )
|
|
{
|
|
players_in_water_count++;
|
|
players[i].inWater = true;
|
|
playerOrg = players[i] GetOrigin();
|
|
d = ( playerOrg[2] - waterHeight );
|
|
if( d > 0 )
|
|
{
|
|
continue;
|
|
}
|
|
|
|
//slow the players movement based on how deep it is
|
|
newSpeed = Int( level.default_run_speed - abs( d * 5 ) );
|
|
if( newSpeed < 50 )
|
|
{
|
|
newSpeed = 50;
|
|
}
|
|
assert( newSpeed <= 190 );
|
|
// thread waterThink_rampSpeed( newSpeed );
|
|
|
|
//controll the allowed stances in this water height
|
|
if( abs( d ) > level.depth_allow_crouch )
|
|
{
|
|
players[i] AllowCrouch( false );
|
|
}
|
|
else
|
|
{
|
|
players[i] AllowCrouch( true );
|
|
}
|
|
|
|
if( abs( d ) > level.depth_allow_prone )
|
|
{
|
|
players[i] AllowProne( false );
|
|
}
|
|
else
|
|
{
|
|
players[i] AllowProne( true );
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if( players[i].inWater )
|
|
{
|
|
players[i].inWater = false;
|
|
}
|
|
}
|
|
}
|
|
|
|
if( players_in_water_count == 0 )
|
|
{
|
|
break;
|
|
}
|
|
|
|
wait( 0.5 );
|
|
}
|
|
|
|
{wait(.05);};
|
|
}
|
|
|
|
}
|
|
|
|
function indicate_start( start )
|
|
{
|
|
hudelem = NewHudElem();
|
|
hudelem.alignX = "left";
|
|
hudelem.alignY = "middle";
|
|
hudelem.x = 70;
|
|
hudelem.y = 400;
|
|
// hudelem.label = "Loading from start: " + start;
|
|
hudelem.label = start;
|
|
hudelem.alpha = 0;
|
|
hudelem.fontScale = 3;
|
|
wait( 1 );
|
|
hudelem FadeOverTime( 1 );
|
|
hudelem.alpha = 1;
|
|
wait( 5 );
|
|
hudelem FadeOverTime( 1 );
|
|
hudelem.alpha = 0;
|
|
wait( 1 );
|
|
hudelem Destroy();
|
|
}
|
|
|
|
function calculate_map_center()
|
|
{
|
|
// Do not compute and set the map center if the level script has already done so.
|
|
if ( !isdefined( level.mapCenter ) )
|
|
{
|
|
// grab all of the path nodes in the level and use them to determine the
|
|
// the center of the playable map
|
|
|
|
nodes = GetAllNodes();
|
|
|
|
if ( isdefined( nodes[ 0 ] ) )
|
|
{
|
|
level.nodesMins = nodes[ 0 ].origin;
|
|
level.nodesMaxs = nodes[ 0 ].origin;
|
|
}
|
|
else
|
|
{
|
|
level.nodesMins = ( 0, 0, 0 );
|
|
level.nodesMaxs = ( 0, 0, 0 );
|
|
}
|
|
|
|
for ( index = 0; index < nodes.size; index++ )
|
|
{
|
|
if ( nodes[ index ].type == "BAD NODE" )
|
|
{
|
|
/#
|
|
println( "Level has BAD NODE(s) - not included in map center calculations: ", nodes[ index ].origin );
|
|
#/
|
|
continue;
|
|
}
|
|
|
|
origin = nodes[ index ].origin;
|
|
|
|
level.nodesMins = math::expand_mins( level.nodesMins, origin );
|
|
level.nodesMaxs = math::expand_maxs( level.nodesMaxs, origin );
|
|
}
|
|
|
|
level.mapCenter = math::find_box_center( level.nodesMins, level.nodesMaxs );
|
|
|
|
/#
|
|
println( "map center: ", level.mapCenter );
|
|
#/
|
|
|
|
SetMapCenter( level.mapCenter );
|
|
}
|
|
}
|
|
|
|
|
|
function set_objective_text_colors()
|
|
{
|
|
// The darker the base color, the more-readable the text is against a stark-white backdrop.
|
|
// However; this sacrifices the "white-hot"ness of the text against darker backdrops.
|
|
|
|
MY_TEXTBRIGHTNESS_DEFAULT = "1.0 1.0 1.0";
|
|
MY_TEXTBRIGHTNESS_90 = "0.9 0.9 0.9";
|
|
MY_TEXTBRIGHTNESS_85 = "0.85 0.85 0.85";
|
|
|
|
if( level.script == "armada" )
|
|
{
|
|
SetSavedDvar( "con_typewriterColorBase", MY_TEXTBRIGHTNESS_90 );
|
|
return;
|
|
}
|
|
|
|
SetSavedDvar( "con_typewriterColorBase", MY_TEXTBRIGHTNESS_DEFAULT );
|
|
}
|
|
|
|
function lerp_trigger_dvar_value( trigger, dvar, value, time )
|
|
{
|
|
trigger.lerping_dvar[dvar] = true;
|
|
steps = time * 20;
|
|
curr_value = GetDvarFloat( dvar );
|
|
diff = ( curr_value - value ) / steps;
|
|
|
|
for( i = 0; i < steps; i++ )
|
|
{
|
|
curr_value = curr_value - diff;
|
|
SetSavedDvar( dvar, curr_value );
|
|
{wait(.05);};
|
|
}
|
|
|
|
SetSavedDvar( dvar, value );
|
|
trigger.lerping_dvar[dvar] = false;
|
|
}
|
|
|
|
function set_fog_progress( progress )
|
|
{
|
|
anti_progress = 1 - progress;
|
|
startdist = self.script_start_dist * anti_progress + self.script_start_dist * progress;
|
|
halfwayDist = self.script_halfway_dist * anti_progress + self.script_halfway_dist * progress;
|
|
color = self.script_color * anti_progress + self.script_color * progress;
|
|
|
|
SetVolFog( startdist, halfwaydist, self.script_halfway_height, self.script_base_height, color[0], color[1], color[2], 0.4 );
|
|
}
|
|
|
|
/#
|
|
function ascii_logo()
|
|
{
|
|
println( "Call Of Duty 7" );
|
|
}
|
|
#/
|
|
|
|
function all_players_spawned()
|
|
{
|
|
level flag::wait_till( "all_players_connected" );
|
|
waittillframeend; // We need to make sure the clients actually get setup before we can do things to them.
|
|
|
|
level.host = util::gethostplayer();
|
|
|
|
while ( true )
|
|
{
|
|
if ( GetNumConnectedPlayers() == 0 )
|
|
{
|
|
// GetNumConnectedPlayers returns 0 when loading movie is playing
|
|
// But the players spawn before the movie is done. So wait here
|
|
// until movie is done.
|
|
{wait(.05);};
|
|
continue;
|
|
}
|
|
|
|
players = GetPlayers();
|
|
|
|
count = 0;
|
|
for( i = 0; i < players.size; i++ )
|
|
{
|
|
if( players[i].sessionstate == "playing" )
|
|
{
|
|
count++;
|
|
}
|
|
}
|
|
|
|
{wait(.05);};
|
|
|
|
if ( count > 0 )
|
|
{
|
|
level flag::set( "first_player_spawned" );
|
|
}
|
|
|
|
if ( count == players.size )
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
|
|
level flag::set( "all_players_spawned" );
|
|
}
|
|
|
|
function shock_onpain()
|
|
{
|
|
self endon( "death" );
|
|
self endon( "disconnect" );
|
|
self endon("killOnPainMonitor");
|
|
|
|
|
|
if( GetDvarString( "blurpain" ) == "" )
|
|
{
|
|
SetDvar( "blurpain", "on" );
|
|
}
|
|
|
|
while( 1 )
|
|
{
|
|
oldhealth = self.health;
|
|
self waittill( "damage", damage, attacker, direction_vec, point, mod );
|
|
|
|
if( isdefined( level.shock_onpain ) && !level.shock_onpain )
|
|
{
|
|
continue;
|
|
}
|
|
|
|
if( isdefined( self.shock_onpain ) && !self.shock_onpain )
|
|
{
|
|
continue;
|
|
}
|
|
|
|
if( self.health < 1 )
|
|
{
|
|
continue;
|
|
}
|
|
|
|
if( mod == "MOD_PROJECTILE" )
|
|
{
|
|
continue;
|
|
}
|
|
else if( mod == "MOD_GRENADE_SPLASH" || mod == "MOD_GRENADE" || mod == "MOD_EXPLOSIVE" || mod == "MOD_PROJECTILE_SPLASH" )
|
|
{
|
|
self shock_onexplosion( damage );
|
|
}
|
|
else
|
|
{
|
|
if( GetDvarString( "blurpain" ) == "on" )
|
|
{
|
|
self ShellShock( "pain", 0.5 );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
function shock_onexplosion( damage )
|
|
{
|
|
time = 0;
|
|
|
|
multiplier = self.maxhealth / 100;
|
|
scaled_damage = damage * multiplier;
|
|
|
|
if( scaled_damage >= 90 )
|
|
{
|
|
time = 4;
|
|
}
|
|
else if( scaled_damage >= 50 )
|
|
{
|
|
time = 3;
|
|
}
|
|
else if( scaled_damage >= 25 )
|
|
{
|
|
time = 2;
|
|
}
|
|
else if( scaled_damage > 10 )
|
|
{
|
|
time = 1;
|
|
}
|
|
|
|
if( time )
|
|
{
|
|
//self ShellShock( "explosion", time ); // commented out for now to get around "explosion" not precached error -RMA
|
|
}
|
|
}
|
|
|
|
function shock_ondeath()
|
|
{
|
|
self waittill( "death" );
|
|
|
|
if( isdefined( level.shock_ondeath ) && !level.shock_ondeath )
|
|
{
|
|
return;
|
|
}
|
|
|
|
if( isdefined( self.shock_ondeath ) && !self.shock_ondeath )
|
|
{
|
|
return;
|
|
}
|
|
|
|
if( isdefined( self.specialDeath ) )
|
|
{
|
|
return;
|
|
}
|
|
|
|
if( GetDvarString( "r_texturebits" ) == "16" )
|
|
{
|
|
return;
|
|
}
|
|
//self shellshock( "default", 3 );
|
|
}
|
|
|
|
function on_spawned()
|
|
{
|
|
if( !isdefined( self.player_inited ) || !self.player_inited )
|
|
{
|
|
if( SessionModeIsCampaignGame() )
|
|
{
|
|
self thread shock_ondeath();
|
|
self thread shock_onpain();
|
|
}
|
|
|
|
//self thread cheat::player_init();
|
|
|
|
//self damagefeedback::player_init();
|
|
|
|
|
|
{wait(.05);};
|
|
|
|
if ( isdefined( self ) )
|
|
{
|
|
self.player_inited = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Automatically link entities based on linkto/linkname KVPs
|
|
function link_ents()
|
|
{
|
|
foreach ( ent in GetEntArray() )
|
|
{
|
|
if ( isdefined( ent.linkto ) )
|
|
{
|
|
e_link = GetEnt( ent.linkto, "linkname" );
|
|
|
|
if ( isdefined( e_link ) )
|
|
{
|
|
ent EnableLinkTo();
|
|
ent LinkTo( e_link );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
// ART REVIEW - Set up the level to run for art/geo review (no event scripting) - should be called from load::main //
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
function art_review()
|
|
{
|
|
str_dvar = GetDvarString( "art_review" );
|
|
|
|
switch( str_dvar )
|
|
{
|
|
case "":
|
|
SetDvar( "art_review", "0" );
|
|
break;
|
|
|
|
case "1":
|
|
case "2":
|
|
hud = hud::createServerFontString( "objective", 1.2 );
|
|
hud hud::setPoint( "CENTER", "CENTER", 0, -200 );
|
|
hud.sort = 1001;
|
|
hud.color = ( 1, 0, 0 );
|
|
hud SetText( "ART REVIEW" );
|
|
hud.foreground = false;
|
|
hud.hidewheninmenu = false;
|
|
|
|
if ( SessionModeIsZombiesGame() )
|
|
{
|
|
SetDvar( "zombie_cheat", "2" );
|
|
if( str_dvar == "1" )
|
|
{
|
|
SetDvar( "zombie_devgui", "power_on" );
|
|
}
|
|
}
|
|
else
|
|
{
|
|
foreach ( trig in trigger::get_all() )
|
|
{
|
|
trig TriggerEnable( false );
|
|
}
|
|
}
|
|
|
|
level waittill( "forever" );
|
|
break;
|
|
}
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
// !ART REVIEW //
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|