1
0
mirror of https://github.com/Paintball/BO2-GSC-Releases.git synced 2025-06-07 21:38:02 -05:00
2021-04-05 15:58:36 -07:00

1445 lines
40 KiB
Plaintext

#include maps/mp/gametypes/_globallogic_spawn;
#include maps/mp/gametypes/_spectating;
#include maps/mp/_tacticalinsertion;
#include maps/mp/_challenges;
#include maps/mp/gametypes/_globallogic;
#include maps/mp/gametypes/_hud_util;
#include maps/mp/_utility;
#include common_scripts/utility;
init()
{
init_precache(); //used for mapvote
precachestring( &"PLATFORM_PRESS_TO_SKIP" );
precachestring( &"PLATFORM_PRESS_TO_RESPAWN" );
precacheshader( "white" );
level.killcam = getgametypesetting( "allowKillcam" );
level.finalkillcam = getgametypesetting( "allowFinalKillcam" );
initfinalkillcam();
}
//mapvote functions//
init_precache()
{
shaders_list_str = ( "white;line_horizontal;loadscreen_mp_takeoff;loadscreen_mp_pod;loadscreen_mp_frostbite;loadscreen_mp_dig;loadscreen_mp_paintball;loadscreen_mp_castaway;loadscreen_mp_bridge;loadscreen_mp_uplink;loadscreen_mp_studio;loadscreen_mp_vertigo;loadscreen_mp_magma;loadscreen_mp_concert;loadscreen_mp_skate;loadscreen_mp_hydro;loadscreen_mp_mirage;loadscreen_mp_downhill;loadscreen_mp_nuketown_2020;loadscreen_mp_socotra;loadscreen_mp_turbine;loadscreen_mp_village;loadscreen_mp_la;loadscreen_mp_dockside;loadscreen_mp_carrier;loadscreen_mp_drone;loadscreen_mp_express;loadscreen_mp_hijacked;loadscreen_mp_meltdown;loadscreen_mp_overflow;loadscreen_mp_nightclub;loadscreen_mp_raid;loadscreen_mp_slums" );
shaders_list = strtok( shaders_list_str, ";" );
foreach( shader in shaders_list )
{
precacheShader( shader );
}
}
start_mapvote()
{
level.numberOfBots = 0;
level.map_vote = [];
level.map1_votes = 0;
level.map2_votes = 0;
level.map3_votes = 0;
level.player_votes = 0;
level.map_list_str = getDvar( "mapList" );
if( level.map_list_str == "" )
level.map_list_str = "mp_la mp_dockside mp_carrier mp_drone mp_express mp_hijacked mp_meltdown mp_overflow mp_nightclub mp_raid mp_slums mp_village mp_turbine mp_socotra mp_nuketown_2020 mp_downhill mp_mirage mp_hydro mp_skate mp_concert mp_magma mp_vertigo mp_studio mp_uplink mp_bridge mp_castaway mp_paintball mp_dig mp_frostbite mp_pod mp_takeoff";
level.map_list = strtok( level.map_list_str, " " );
level.gametype_list_str = getDvar( "gametypeList" );
level.gametype_list = strtok( level.gametype_list_str, " " );
thread start_mapvote_countdown();
foreach( player in level.players )
{
if( isDefined( player.pers[ "isBot" ] )&& player.pers[ "isBot" ] )
level.numberOfBots += 1;
else
player thread player_voting_handler();
}
}
start_mapvote_countdown()
{
level.countdown = getDvarIntDefault( "mapVoteTime", 15 );
level.timerText = createServerFontString( "default" , 2 );
level.timerText setPoint( "CENTER", "CENTER", 0, 190 );
level.timerText setValue( level.countdown );
level.timerText.foreground = 1;
level endon( "mapvote_ended" );
wait 1;
while( 1 )
{
playbombsound();
level.countdown--;
level.timerText.fontscale = 3.3;
level.timerText setValue( level.countdown );
level.timerText changefontscaleovertime( 0.5 );
level.timerText.fontscale = 2;
wait 1;
if( level.player_votes == ( level.players.size - level.numberOfBots ))
{
setup_next_map();
}
if( level.countdown == 0 )
{
level notify( "voting_timedout" );
foreach( player in level.players )
{
if( !isDefined( level.map1_map ))
player.onscreenText setText( "^7Timer Ran Out: ^3No Votes - Choosing Random Map" );
else
player.onscreenText setText( "^3Timer Ran Out" );
player thread end_screen_handler();
level notify( "player_voted" );
}
setup_next_map();
}
}
}
player_voting_handler()
{
self endon( "disconnect" );
level endon( "voting_timedout" );
self.gamemode = random_gamemode();
self setup_map_index();
self.background = self createrectangle( "CENTER", "CENTER", 0, 0, 505, 255, (0.05, 0.05, 0.05), "white", 1, 85 );
self.textBackground = self createrectangle( "CENTER", "CENTER", 0, 150, 500, 40, (0, 0, 0), "line_horizontal", 1, 100 );
self.mapImage = self createrectangle( "CENTER", "CENTER", 0, 0, 500, 250, (1, 1, 1), "loadscreen_" + level.map_list[ self.mapIndex ], 1, 100 );
self.mapImage.foreground = 1;
self.onscreenText = self drawText( self text_handling(), "default", 1.5, "CENTER", 343, (1, 1, 1), 1, (0, 0, 0), 3, 1 );
self.onscreenText.foreground = 1;
wait 1;
while( 1 )
{
if( self attackbuttonpressed() )
{
self map_index_handler( 1 );
wait 0.15;
}
if( self adsbuttonpressed() )
{
self map_index_handler( 0 );
wait 0.15;
}
if( self jumpbuttonpressed() )
{
self thread vote_for_map( level.map_list[ self.mapIndex ], self.mapIndex, self.gamemode );
break;
}
wait 0.05;
}
}
vote_for_map( mapname, mapindex, gametype )
{
level.player_votes++;
if( !isDefined( level.map_vote[ mapname ][ gametype ] ))
{
level.map_vote[ mapname ][ gametype ][ "Votes" ] = 1;
level.map_vote[ mapname ][ gametype ][ "Mapname" ] = mapname;
level.map_vote[ mapname ][ gametype ][ "Gametype" ] = gametype;
}
else
{
level.map_vote[ mapname ][ gametype ][ "Votes" ]++;
}
if( !isDefined( level.map1_map ))
{
level.map1_votes = level.map_vote[ mapname ][ gametype ][ "Votes" ];
level.map1_map = level.map_vote[ mapname ][ gametype ][ "Mapname" ];
level.map1_gametype = level.map_vote[ mapname ][ gametype ][ "Gametype" ];
}
else if( !isDefined( level.map2_map ))
{
level.map2_votes = level.map_vote[ mapname ][ gametype ][ "Votes" ];
level.map2_map = level.map_vote[ mapname ][ gametype ][ "Mapname" ];
level.map2_gametype = level.map_vote[ mapname ][ gametype ][ "Gametype" ];
}
else if( !isDefined( level.map3_map ))
{
level.map3_votes = level.map_vote[ mapname ][ gametype ][ "Votes" ];
level.map3_map = level.map_vote[ mapname ][ gametype ][ "Mapname" ];
level.map3_gametype = level.map_vote[ mapname ][ gametype ][ "Gametype" ];
}
else if( isTop3Map( mapname, gametype ) == 0 )
{
if( level.map_vote[ mapname ][ gametype ][ "Votes" ] > level.map3_votes )
{
level.map3_votes = level.map_vote[ mapname ][ gametype ][ "Votes" ];
level.map3_map = level.map_vote[ mapname ][ gametype ][ "Mapname" ];
level.map3_gametype = level.map_vote[ mapname ][ gametype ][ "Gametype" ];
}
}
else if( isTop3Map( mapname, gametype ) == 1 )
{
level.map1_votes = level.map_vote[ mapname ][ gametype ][ "Votes" ];
level.map1_map = level.map_vote[ mapname ][ gametype ][ "Mapname" ];
level.map1_gametype = level.map_vote[ mapname ][ gametype ][ "Gametype" ];
}
else if( isTop3Map( mapname, gametype ) == 2 )
{
if( level.map_vote[ mapname ][ gametype ][ "Votes" ] > level.map1_votes )
{
level.map2_votes = level.map1_votes;
level.map2_map = level.map1_map;
level.map2_gametype = level.map1_gametype;
level.map1_votes = level.map_vote[ mapname ][ gametype ][ "Votes" ];
level.map1_map = level.map_vote[ mapname ][ gametype ][ "Mapname" ];
level.map1_gametype = level.map_vote[ mapname ][ gametype ][ "Gametype" ];
}
else
{
level.map2_votes = level.map_vote[ mapname ][ gametype ][ "Votes" ];
level.map2_map = level.map_vote[ mapname ][ gametype ][ "Mapname" ];
level.map2_gametype = level.map_vote[ mapname ][ gametype ][ "Gametype" ];
}
}
else if( isTop3Map( mapname, gametype ) == 3 )
{
if( level.map_vote[ mapname ][ gametype ][ "Votes" ] > level.map2_votes )
{
level.map3_votes = level.map2_votes;
level.map3_map = level.map2_map;
level.map3_gametype = level.map2_gametype;
level.map2_votes = level.map_vote[ mapname ][ gametype ][ "Votes" ];
level.map2_map = level.map_vote[ mapname ][ gametype ][ "Mapname" ];
level.map2_gametype = level.map_vote[ mapname ][ gametype ][ "Gametype" ];
}
else
{
level.map3_votes = level.map_vote[ mapname ][ gametype ][ "Votes" ];
level.map3_map = level.map_vote[ mapname ][ gametype ][ "Mapname" ];
level.map3_gametype = level.map_vote[ mapname ][ gametype ][ "Gametype" ];
}
}
self.onscreenText setText( "Voted for ^3" + get_map_name( mapname ) + " - " + get_gametype_name( gametype ));
self thread end_screen_handler();
level notify( "player_voted" );
}
isTop3Map( mapname, gametype )
{
if( level.map_vote[ mapname ][ gametype ][ "Mapname" ] == level.map1_map && level.map_vote[ mapname ][ gametype ][ "Gametype" ] == level.map1_gametype )
return 1;
else if( level.map_vote[ mapname ][ gametype ][ "Mapname" ] == level.map2_map && level.map_vote[ mapname ][ gametype ][ "Gametype" ] == level.map2_gametype )
return 2;
else if( level.map_vote[ mapname ][ gametype ][ "Mapname" ] == level.map3_map && level.map_vote[ mapname ][ gametype ][ "Gametype" ] == level.map3_gametype )
return 3;
else
return 0;
}
end_screen_handler()
{
self endon( "disconnect" );
level endon( "mapvote_ended" );
if( isDefined( self.end_voting ))
return;
self.end_voting = 1;
self.mapImage Destroy();
if( getDvar( "discordLink" ) != "" )
{
self.info_text = drawText( get_info_text(), "default", 1, ( 220 - get_info_text().size ), 315, (1, 1, 1), 1, (0, 0, 0), 3, 1 );
self.info_text.foreground = 1;
}
while( 1 )
{
level waittill_any( "player_voted", "voting_timedout" );
if( isDefined( level.next_map ))
{
break;
}
if( isDefined( level.map1_map ))
{
self.map1_image Destroy();
self.map1_image = self createrectangle( "CENTER", "CENTER", -170, -80, 145, 75, (1, 1, 1), "loadscreen_" + level.map1_map, 1, 100 );
self.map1_image.foreground = 1;
if( !isDefined( self.map1_text ))
{
self.map1_text = drawText( get_vote_count( level.map1_map, level.map1_votes, level.map1_gametype ), "default", 1.6, -40, 100, (1, 1, 1), 1, (0, 0, 0), 3, 1 );
}
self.map1_text setText( get_vote_count( level.map1_map, level.map1_votes, level.map1_gametype ));
self.map1_text.foreground = 1;
}
if( isDefined( level.map2_map ))
{
self.map2_image Destroy();
self.map2_image = self createrectangle( "CENTER", "CENTER", -170, -80, 145, 75, (1, 1, 1), "loadscreen_" + level.map2_map, 1, 100 );
self.map2_image.foreground = 1;
if( !isDefined( self.map1_text ))
{
self.map2_text = drawText( get_vote_count( level.map2_map, level.map2_votes, level.map2_gametype ), "default", 1.6, -40, 180, (1, 1, 1), 1, (0, 0, 0), 3, 1 );
}
self.map2_text setText( get_vote_count( level.map2_map, level.map2_votes, level.map2_gametype ));
self.map2_text.foreground = 1;
}
if( isDefined( level.map3_map ))
{
self.map3_image Destroy();
self.map3_image = self createrectangle( "CENTER", "CENTER", -170, -80, 145, 75, (1, 1, 1), "loadscreen_" + level.map3_map, 1, 100 );
self.map3_image.foreground = 1;
if( !isDefined( self.map3_text ))
{
self.map3_text = drawText( get_vote_count( level.map3_map, level.map3_votes, level.map3_gametype ), "default", 1.6, -40, 260, (1, 1, 1), 1, (0, 0, 0), 3, 1 );
}
self.map3_text setText( get_vote_count( level.map3_map, level.map3_votes, level.map3_gametype ));
self.map3_text.foreground = 1;
}
}
}
setup_map_index()
{
self.mapIndex = randomintrange( 0, level.map_list.size );
if( level.map_list[ self.mapIndex ] == getDvar( "mapname" ) && getDvarIntDefault( "stopSameMapVote", 0 ) == 1 )
{
return setup_map_index();
}
return;
}
map_index_handler( up )
{
self.gamemode = random_gamemode( self.gamemode );
if( level.map_list.size == 1 )
{
self.mapIndex = self.mapIndex;
self.onscreenText setText( self text_handling() );
return;
}
else if( up )
{
if( self.mapIndex == ( level.map_list.size - 1 ))
self.mapIndex = 0;
else
self.mapIndex++;
if( level.map_list[ self.mapIndex ] == getDvar( "mapname" ) && getDvarIntDefault( "stopSameMapVote", 0 ) == 1 )
{
self thread map_index_handler( 1 );
return;
}
}
else
{
if( self.mapIndex == 0 )
self.mapIndex = level.map_list.size - 1;
else
self.mapIndex--;
if( level.map_list[ self.mapIndex ] == getDvar( "mapname" ) && getDvarIntDefault( "stopSameMapVote", 0 ) == 1 )
{
self thread map_index_handler( 0 );
return;
}
}
self.mapImage Destroy();
self.mapImage = self createrectangle( "CENTER", "CENTER", 0, 0, 500, 250, (1, 1, 1), "loadscreen_" + level.map_list[ self.mapIndex ], 1, 100 );
self.mapImage.foreground = 1;
self.onscreenText setText( self text_handling() );
}
setup_next_map()
{
level.timerText Destroy();
wait 4;
foreach( player in level.players )
{
player.info_text Destroy();
player.map1_text Destroy();
player.map2_text Destroy();
player.map3_text Destroy();
player.map1_image Destroy();
player.map2_image Destroy();
player.map3_image Destroy();
}
if( level.map1_votes > level.map2_votes && level.map1_votes > level.map3_votes )
{
level.next_map = level.map1_map;
level.next_gametype = level.map1_gametype;
}
else if( level.map2_votes > level.map1_votes && level.map2_votes > level.map3_votes )
{
level.next_map = level.map2_map;
level.next_gametype = level.map2_gametype;
}
else if( level.map3_votes > level.map1_votes && level.map3_votes > level.map2_votes )
{
level.next_map = level.map3_map;
level.next_gametype = level.map3_gametype;
}
else if( level.map1_votes == level.map2_votes && level.map1_votes > level.map3_votes )
{
if( randomintrange( 0, 1 ) == 1 )
{
level.next_map = level.map1_map;
level.next_gametype = level.map1_gametype;
}
else
{
level.next_map = level.map2_map;
level.next_gametype = level.map2_gametype;
}
}
else if( level.map1_votes == level.map3_votes && level.map1_votes > level.map2_votes )
{
if( randomintrange( 0, 1 ) == 1 )
{
level.next_map = level.map1_map;
level.next_gametype = level.map1_gametype;
}
else
{
level.next_map = level.map3_map;
level.next_gametype = level.map3_gametype;
}
}
else if( level.map2_votes == level.map3_votes && level.map2_votes > level.map1_votes )
{
if( randomintrange( 0, 1 ) == 1 )
{
level.next_map = level.map2_map;
level.next_gametype = level.map2_gametype;
}
else
{
level.next_map = level.map3_map;
level.next_gametype = level.map3_gametype;
}
}
else if( level.map1_votes == level.map2_votes && level.map1_votes == level.map3_votes && level.map1_votes > 0 )
{
random_int = randomIntRange( 0, 2 );
if( random_int == 0 )
{
level.next_map = level.map1_map;
level.next_gametype = level.map1_gametype;
}
else if( random_int == 0 )
{
level.next_map = level.map2_map;
level.next_gametype = level.map2_gametype;
}
else
{
level.next_map = level.map3_map;
level.next_gametype = level.map3_gametype;
}
}
else
{
level.next_map = level.map_list[ randomintrange( 0, level.map_list.size )];
level.next_gametype = random_gamemode();
}
setDvar( "sv_maprotation", "exec " + level.next_gametype + ".cfg map " + level.next_map );
foreach( player in level.players )
{
player.mapImage Destroy();
player.mapImage = player createrectangle( "CENTER", "CENTER", 0, 0, 500, 250, (1, 1, 1), "loadscreen_" + level.next_map, 1, 100 );
player.mapImage.foreground = 1;
player.onscreenText setText( "Next Map: ^3" + get_map_name( level.next_map ) + " - " + get_gametype_name( level.next_gametype ));
}
wait 3;
foreach( player in level.players )
{
player.background Destroy();
player.mapImage Destroy();
player.map1_text Destroy();
player.map2_text Destroy();
player.map3_text Destroy();
player.map1_image Destroy();
player.map2_image Destroy();
player.map3_image Destroy();
player.onscreenText Destroy();
player.textBackground Destroy();
}
level notify( "mapvote_ended" );
}
text_handling()
{
if( !isDefined( self.end_voting ))
return "[{+speed_throw}] Press ^3[{+gostand}]^7 to Vote for ^3" + get_map_name( level.map_list[ self.mapIndex ] ) + " - " + get_gametype_name( self.gamemode ) + " [{+attack}]";
else if( !isDefined( level.next_map ))
return "Voted for ^3" + get_map_name( level.map_list[ self.mapIndex ] ) + " - " + get_gametype_name( self.gamemode );
}
random_gamemode( gamemode )
{
if( level.gametype_list.size > 0 )
{
i = randomintrange( 0, level.gametype_list.size );
return level.gametype_list[ i ];
}
else
return getDvar( "ui_gametype" );
}
playbombsound()
{
foreach( player in level.players )
player playsound("mpl_sab_ui_suitcasebomb_timer");
}
get_vote_count( map, votecount, gametype )
{
return "^3" + get_map_name( map ) + "\n" + get_gametype_name( gametype ) + "\n^7[ ^3" + votecount + " ^7/ ^3" + ( level.players.size - level.numberOfBots ) + " ^7]";
}
get_info_text()
{
return getDvar( "discordLink" );
}
get_gametype_name( gametype )
{
switch( gametype )
{
case "customgamemode":
return "Custom Gamemode";
case "conf":
return "Kill Confirmed";
case "ctf":
return "Capture The Flag";
case "dem":
return "Demolition";
case "dm":
return "Free-For-All";
case "dom":
return "Domination";
case "gun":
return "Gun Game";
case "hq":
return "Headquarters";
case "koth":
return "Hardpoint";
case "oic":
return "One In The Chamber";
case "oneflag":
return "One Flag CTF";
case "sas":
return "Sticks & Stones";
case "sd":
return "Search & Destroy";
case "shrp":
return "Sharpshooter";
case "tdm":
return "Team Deathmatch";
default:
return "Invalid";
}
}
get_map_name( mapname )
{
switch( mapname )
{
case "mp_la":
return "Aftermath";
case "mp_dockside":
return "Cargo";
case "mp_carrier":
return "Carrier";
case "mp_drone":
return "Drone";
case "mp_express":
return "Express";
case "mp_hijacked":
return "Hijacked";
case "mp_meltdown":
return "Meltdown";
case "mp_overflow":
return "Overflow";
case "mp_nightclub":
return "Plaza";
case "mp_raid":
return "Raid";
case "mp_slums":
return "Slums";
case "mp_village":
return "Standoff";
case "mp_turbine":
return "Turbine";
case "mp_socotra":
return "Yemen";
case "mp_nuketown_2020":
return "Nuketown";
case "mp_downhill":
return "Downhill";
case "mp_mirage":
return "Mirage";
case "mp_hydro":
return "Hydro";
case "mp_skate":
return "Grind";
case "mp_concert":
return "Encore";
case "mp_magma":
return "Magma";
case "mp_vertigo":
return "Vertigo";
case "mp_studio":
return "Studio";
case "mp_uplink":
return "Uplink";
case "mp_bridge":
return "Detour";
case "mp_castaway":
return "Cove";
case "mp_paintball":
return "Rush";
case "mp_dig":
return "Dig";
case "mp_frostbite":
return "Frost";
case "mp_pod":
return "Pod";
case "mp_takeoff":
return "Takeoff";
default:
return "Invalid";
}
}
// end mapvote functions//
initfinalkillcam()
{
level.finalkillcamsettings = [];
initfinalkillcamteam( "none" );
foreach ( team in level.teams )
{
initfinalkillcamteam( team );
}
level.finalkillcam_winner = undefined;
}
initfinalkillcamteam( team )
{
level.finalkillcamsettings[ team ] = spawnstruct();
clearfinalkillcamteam( team );
}
clearfinalkillcamteam( team )
{
level.finalkillcamsettings[ team ].spectatorclient = undefined;
level.finalkillcamsettings[ team ].weapon = undefined;
level.finalkillcamsettings[ team ].deathtime = undefined;
level.finalkillcamsettings[ team ].deathtimeoffset = undefined;
level.finalkillcamsettings[ team ].offsettime = undefined;
level.finalkillcamsettings[ team ].entityindex = undefined;
level.finalkillcamsettings[ team ].targetentityindex = undefined;
level.finalkillcamsettings[ team ].entitystarttime = undefined;
level.finalkillcamsettings[ team ].perks = undefined;
level.finalkillcamsettings[ team ].killstreaks = undefined;
level.finalkillcamsettings[ team ].attacker = undefined;
}
recordkillcamsettings( spectatorclient, targetentityindex, sweapon, deathtime, deathtimeoffset, offsettime, entityindex, entitystarttime, perks, killstreaks, attacker )
{
if ( level.teambased && isDefined( attacker.team ) && isDefined( level.teams[ attacker.team ] ) )
{
team = attacker.team;
level.finalkillcamsettings[ team ].spectatorclient = spectatorclient;
level.finalkillcamsettings[ team ].weapon = sweapon;
level.finalkillcamsettings[ team ].deathtime = deathtime;
level.finalkillcamsettings[ team ].deathtimeoffset = deathtimeoffset;
level.finalkillcamsettings[ team ].offsettime = offsettime;
level.finalkillcamsettings[ team ].entityindex = entityindex;
level.finalkillcamsettings[ team ].targetentityindex = targetentityindex;
level.finalkillcamsettings[ team ].entitystarttime = entitystarttime;
level.finalkillcamsettings[ team ].perks = perks;
level.finalkillcamsettings[ team ].killstreaks = killstreaks;
level.finalkillcamsettings[ team ].attacker = attacker;
}
level.finalkillcamsettings[ "none" ].spectatorclient = spectatorclient;
level.finalkillcamsettings[ "none" ].weapon = sweapon;
level.finalkillcamsettings[ "none" ].deathtime = deathtime;
level.finalkillcamsettings[ "none" ].deathtimeoffset = deathtimeoffset;
level.finalkillcamsettings[ "none" ].offsettime = offsettime;
level.finalkillcamsettings[ "none" ].entityindex = entityindex;
level.finalkillcamsettings[ "none" ].targetentityindex = targetentityindex;
level.finalkillcamsettings[ "none" ].entitystarttime = entitystarttime;
level.finalkillcamsettings[ "none" ].perks = perks;
level.finalkillcamsettings[ "none" ].killstreaks = killstreaks;
level.finalkillcamsettings[ "none" ].attacker = attacker;
}
erasefinalkillcam()
{
clearfinalkillcamteam( "none" );
foreach ( team in level.teams )
{
clearfinalkillcamteam( team );
}
level.finalkillcam_winner = undefined;
}
finalkillcamwaiter()
{
if ( !isDefined( level.finalkillcam_winner ) )
{
return 0;
}
level waittill( "final_killcam_done" );
return 1;
}
postroundfinalkillcam()
{
if ( is_true( level.sidebet ) )
{
return;
}
level notify( "play_final_killcam" );
maps/mp/gametypes/_globallogic::resetoutcomeforallplayers();
finalkillcamwaiter();
}
dofinalkillcam()
{
level waittill( "play_final_killcam" );
level.infinalkillcam = 1;
winner = "none";
if ( isDefined( level.finalkillcam_winner ) )
{
winner = level.finalkillcam_winner;
}
if ( !isDefined( level.finalkillcamsettings[ winner ].targetentityindex ) )
{
level.infinalkillcam = 0;
// this is where we do mapvote stuff?
if(waslastround()) {
foreach (player in level.players)
player FreezeControls(true);
wait .6;
visionsetnaked(getDvar("mapname"), 0);
foreach(player in level.players) {
player closemenu();
player closeingamemenu();
player.sessionstate = "spectator";
player.spectatorclient = -1;
}
start_mapvote();
level waittill( "mapvote_ended" );
wait 2.5;
foreach (player in level.players)
player SetBlur(0.1, 0);
visionsetnaked(getDvar("mapname"), 0);
}
level notify( "final_killcam_done" );
return;
}
if ( isDefined( level.finalkillcamsettings[ winner ].attacker ) )
{
maps/mp/_challenges::getfinalkill( level.finalkillcamsettings[ winner ].attacker );
}
visionsetnaked( getDvar( "mapname" ), 0 );
players = level.players;
for ( index=0; index < players.size; index++ )
{
player = players[ index ];
player closemenu();
player closeingamemenu();
player thread finalkillcam( winner );
}
wait 0.1;
while ( areanyplayerswatchingthekillcam() )
{
wait 0.05;
}
// this is where we do mapvote stuff?
// this is where we do mapvote stuff?
if(waslastround()) {
foreach (player in level.players)
player FreezeControls(true);
wait .6;
visionsetnaked(getDvar("mapname"), 0);
foreach(player in level.players) {
player closemenu();
player closeingamemenu();
player.sessionstate = "spectator";
player.spectatorclient = -1;
}
start_mapvote();
level waittill( "mapvote_ended" );
wait 2.5;
foreach ( player in level.players )
player SetBlur(0.1, 0);
visionsetnaked(getDvar("mapname"), 0);
}
level notify( "final_killcam_done" );
level.infinalkillcam = 0;
}
startlastkillcam()
{
}
areanyplayerswatchingthekillcam()
{
players = level.players;
for ( index = 0; index < players.size; index++ )
{
player = players[ index ];
if ( isDefined( player.killcam ) )
{
return 1;
}
}
return 0;
}
killcam( attackernum, targetnum, killcamentity, killcamentityindex, killcamentitystarttime, sweapon, deathtime, deathtimeoffset, offsettime, respawn, maxtime, perks, killstreaks, attacker )
{
self endon( "disconnect" );
self endon( "spawned" );
level endon( "game_ended" );
if ( attackernum < 0 )
{
return;
}
postdeathdelay = ( getTime() - deathtime ) / 1000;
predelay = postdeathdelay + deathtimeoffset;
camtime = calckillcamtime( sweapon, killcamentitystarttime, predelay, respawn, maxtime );
postdelay = calcpostdelay();
killcamlength = camtime + postdelay;
if ( isDefined( maxtime ) && killcamlength > maxtime )
{
if ( maxtime < 2 )
{
return;
}
if ( ( maxtime - camtime ) >= 1 )
{
postdelay = maxtime - camtime;
}
else
{
postdelay = 1;
camtime = maxtime - 1;
}
killcamlength = camtime + postdelay;
}
killcamoffset = camtime + predelay;
self notify( "begin_killcam" );
killcamstarttime = getTime() - ( killcamoffset * 1000 );
self.sessionstate = "spectator";
self.spectatorclient = attackernum;
self.killcamentity = -1;
if ( killcamentityindex >= 0 )
{
self thread setkillcamentity( killcamentityindex, killcamentitystarttime - killcamstarttime - 100 );
}
self.killcamtargetentity = targetnum;
self.archivetime = killcamoffset;
self.killcamlength = killcamlength;
self.psoffsettime = offsettime;
recordkillcamsettings( attackernum, targetnum, sweapon, deathtime, deathtimeoffset, offsettime, killcamentityindex, killcamentitystarttime, perks, killstreaks, attacker );
foreach ( team in level.teams )
{
self allowspectateteam( team, 1 );
}
self allowspectateteam( "freelook", 1 );
self allowspectateteam( "none", 1 );
self thread endedkillcamcleanup();
wait 0.05;
if ( self.archivetime <= predelay )
{
self.sessionstate = "dead";
self.spectatorclient = -1;
self.killcamentity = -1;
self.archivetime = 0;
self.psoffsettime = 0;
self notify( "end_killcam" );
return;
}
self thread checkforabruptkillcamend();
self.killcam = 1;
self addkillcamskiptext( respawn );
if ( !self issplitscreen() && level.perksenabled == 1 )
{
self addkillcamtimer( camtime );
self maps/mp/gametypes/_hud_util::showperks();
}
self thread spawnedkillcamcleanup();
self thread waitskipkillcambutton();
self thread waitteamchangeendkillcam();
self thread waitkillcamtime();
self thread maps/mp/_tacticalinsertion::cancel_button_think();
self waittill( "end_killcam" );
self endkillcam( 0 );
self.sessionstate = "dead";
self.spectatorclient = -1;
self.killcamentity = -1;
self.archivetime = 0;
self.psoffsettime = 0;
}
setkillcamentity( killcamentityindex, delayms )
{
self endon( "disconnect" );
self endon( "end_killcam" );
self endon( "spawned" );
if ( delayms > 0 )
{
wait ( delayms / 1000 );
}
self.killcamentity = killcamentityindex;
}
waitkillcamtime()
{
self endon( "disconnect" );
self endon( "end_killcam" );
wait ( self.killcamlength - 0.05 );
self notify( "end_killcam" );
}
waitfinalkillcamslowdown( deathtime, starttime )
{
self endon( "disconnect" );
self endon( "end_killcam" );
secondsuntildeath = ( deathtime - starttime ) / 1000;
deathtime = getTime() + ( secondsuntildeath * 1000 );
waitbeforedeath = 2;
maps/mp/_utility::setclientsysstate( "levelNotify", "fkcb" );
wait max( 0, secondsuntildeath - waitbeforedeath );
setslowmotion( 1, 0.25, waitbeforedeath );
wait ( waitbeforedeath + 0.5 );
setslowmotion( 0.25, 1, 1 );
wait 0.5;
maps/mp/_utility::setclientsysstate( "levelNotify", "fkce" );
}
waitskipkillcambutton()
{
self endon( "disconnect" );
self endon( "end_killcam" );
while ( self usebuttonpressed() )
{
wait 0.05;
}
while ( !self usebuttonpressed() )
{
wait 0.05;
}
self notify( "end_killcam" );
self clientnotify( "fkce" );
}
waitteamchangeendkillcam()
{
self endon( "disconnect" );
self endon( "end_killcam" );
self waittill( "changed_class" );
endkillcam( 0 );
}
waitskipkillcamsafespawnbutton()
{
self endon( "disconnect" );
self endon( "end_killcam" );
while ( self fragbuttonpressed() )
{
wait 0.05;
}
while ( !self fragbuttonpressed() )
{
wait 0.05;
}
self.wantsafespawn = 1;
self notify( "end_killcam" );
}
endkillcam( final )
{
if ( isDefined( self.kc_skiptext ) )
{
self.kc_skiptext.alpha = 0;
}
if ( isDefined( self.kc_timer ) )
{
self.kc_timer.alpha = 0;
}
self.killcam = undefined;
if ( !self issplitscreen() )
{
self hideallperks();
}
self thread maps/mp/gametypes/_spectating::setspectatepermissions();
}
checkforabruptkillcamend()
{
self endon( "disconnect" );
self endon( "end_killcam" );
while ( 1 )
{
if ( self.archivetime <= 0 )
{
break;
}
wait 0.05;
}
self notify( "end_killcam" );
}
spawnedkillcamcleanup()
{
self endon( "end_killcam" );
self endon( "disconnect" );
self waittill( "spawned" );
self endkillcam( 0 );
}
spectatorkillcamcleanup( attacker )
{
self endon( "end_killcam" );
self endon( "disconnect" );
attacker endon( "disconnect" );
attacker waittill( "begin_killcam", attackerkcstarttime );
waittime = max( 0, attackerkcstarttime - self.deathtime - 50 );
wait waittime;
self endkillcam( 0 );
}
endedkillcamcleanup()
{
self endon( "end_killcam" );
self endon( "disconnect" );
level waittill( "game_ended" );
self endkillcam( 0 );
}
endedfinalkillcamcleanup()
{
self endon( "end_killcam" );
self endon( "disconnect" );
level waittill( "game_ended" );
self endkillcam( 1 );
}
cancelkillcamusebutton()
{
return self usebuttonpressed();
}
cancelkillcamsafespawnbutton()
{
return self fragbuttonpressed();
}
cancelkillcamcallback()
{
self.cancelkillcam = 1;
}
cancelkillcamsafespawncallback()
{
self.cancelkillcam = 1;
self.wantsafespawn = 1;
}
cancelkillcamonuse()
{
self thread cancelkillcamonuse_specificbutton( ::cancelkillcamusebutton, ::cancelkillcamcallback );
}
cancelkillcamonuse_specificbutton( pressingbuttonfunc, finishedfunc )
{
self endon( "death_delay_finished" );
self endon( "disconnect" );
level endon( "game_ended" );
for ( ;; )
{
if ( !self [[ pressingbuttonfunc ]]() )
{
wait 0.05;
continue;
}
buttontime = 0;
while ( self [[ pressingbuttonfunc ]]() )
{
buttontime += 0.05;
wait 0.05;
}
if ( buttontime >= 0.5 )
{
continue;
}
buttontime = 0;
while ( !( self [[ pressingbuttonfunc ]]() ) && buttontime < 0.5 )
{
buttontime += 0.05;
wait 0.05;
}
if ( buttontime >= 0.5 )
{
continue;
}
else
{
self [[ finishedfunc ]]();
return;
}
wait 0.05;
}
}
finalkillcam( winner )
{
self endon( "disconnect" );
level endon( "game_ended" );
if ( waslastround() )
{
setmatchflag( "final_killcam", 1 );
setmatchflag( "round_end_killcam", 0 );
}
else
{
setmatchflag( "final_killcam", 0 );
setmatchflag( "round_end_killcam", 1 );
}
/*
/#
if ( getDvarInt( "scr_force_finalkillcam" ) == 1 )
{
setmatchflag( "final_killcam", 1 );
setmatchflag( "round_end_killcam", 0 );
#/
}
*/
if ( level.console )
{
self maps/mp/gametypes/_globallogic_spawn::setthirdperson( 0 );
}
killcamsettings = level.finalkillcamsettings[ winner ];
postdeathdelay = ( getTime() - killcamsettings.deathtime ) / 1000;
predelay = postdeathdelay + killcamsettings.deathtimeoffset;
camtime = calckillcamtime( killcamsettings.weapon, killcamsettings.entitystarttime, predelay, 0, undefined );
postdelay = calcpostdelay();
killcamoffset = camtime + predelay;
killcamlength = ( camtime + postdelay ) - 0.05;
killcamstarttime = getTime() - ( killcamoffset * 1000 );
self notify( "begin_killcam" );
self.sessionstate = "spectator";
self.spectatorclient = killcamsettings.spectatorclient;
self.killcamentity = -1;
if ( killcamsettings.entityindex >= 0 )
{
self thread setkillcamentity( killcamsettings.entityindex, killcamsettings.entitystarttime - killcamstarttime - 100 );
}
self.killcamtargetentity = killcamsettings.targetentityindex;
self.archivetime = killcamoffset;
self.killcamlength = killcamlength;
self.psoffsettime = killcamsettings.offsettime;
foreach ( team in level.teams )
{
self allowspectateteam( team, 1 );
}
self allowspectateteam( "freelook", 1 );
self allowspectateteam( "none", 1 );
self thread endedfinalkillcamcleanup();
wait 0.05;
if ( self.archivetime <= predelay )
{
self.sessionstate = "dead";
self.spectatorclient = -1;
self.killcamentity = -1;
self.archivetime = 0;
self.psoffsettime = 0;
self notify( "end_killcam" );
return;
}
self thread checkforabruptkillcamend();
self.killcam = 1;
if ( !self issplitscreen() )
{
self addkillcamtimer( camtime );
}
self thread waitkillcamtime();
self thread waitfinalkillcamslowdown( level.finalkillcamsettings[ winner ].deathtime, killcamstarttime );
self waittill( "end_killcam" );
self endkillcam( 1 );
setmatchflag( "final_killcam", 0 );
setmatchflag( "round_end_killcam", 0 );
self spawnendoffinalkillcam();
}
spawnendoffinalkillcam()
{
[[ level.spawnspectator ]]();
self freezecontrols( 1 );
}
iskillcamentityweapon( sweapon )
{
if ( sweapon == "planemortar_mp" )
{
return 1;
}
return 0;
}
iskillcamgrenadeweapon( sweapon )
{
if ( sweapon == "frag_grenade_mp" )
{
return 1;
}
else if ( sweapon == "frag_grenade_short_mp" )
{
return 1;
}
else if ( sweapon == "sticky_grenade_mp" )
{
return 1;
}
else if ( sweapon == "tabun_gas_mp" )
{
return 1;
}
return 0;
}
calckillcamtime( sweapon, entitystarttime, predelay, respawn, maxtime )
{
camtime = 0;
if ( getDvar( "scr_killcam_time" ) == "" )
{
if ( iskillcamentityweapon( sweapon ) )
{
camtime = ( ( getTime() - entitystarttime ) / 1000 ) - predelay - 0.1;
}
else if ( !respawn )
{
camtime = 5;
}
else if ( iskillcamgrenadeweapon( sweapon ) )
{
camtime = 4.25;
}
else
{
camtime = 2.5;
}
}
else
{
camtime = getDvarFloat( "scr_killcam_time" );
}
if ( isDefined( maxtime ) )
{
if ( camtime > maxtime )
{
camtime = maxtime;
}
if ( camtime < 0.05 )
{
camtime = 0.05;
}
}
return camtime;
}
calcpostdelay()
{
postdelay = 0;
if ( getDvar( "scr_killcam_posttime" ) == "" )
{
postdelay = 2;
}
else
{
postdelay = getDvarFloat( "scr_killcam_posttime" );
if ( postdelay < 0.05 )
{
postdelay = 0.05;
}
}
return postdelay;
}
addkillcamskiptext( respawn )
{
if ( !isDefined( self.kc_skiptext ) )
{
self.kc_skiptext = newclienthudelem( self );
self.kc_skiptext.archived = 0;
self.kc_skiptext.x = 0;
self.kc_skiptext.alignx = "center";
self.kc_skiptext.aligny = "middle";
self.kc_skiptext.horzalign = "center";
self.kc_skiptext.vertalign = "bottom";
self.kc_skiptext.sort = 1;
self.kc_skiptext.font = "objective";
}
if ( self issplitscreen() )
{
self.kc_skiptext.y = -100;
self.kc_skiptext.fontscale = 1.4;
}
else
{
self.kc_skiptext.y = -120;
self.kc_skiptext.fontscale = 2;
}
if ( respawn )
{
self.kc_skiptext settext( &"PLATFORM_PRESS_TO_RESPAWN" );
}
else
{
self.kc_skiptext settext( &"PLATFORM_PRESS_TO_SKIP" );
}
self.kc_skiptext.alpha = 1;
}
addkillcamtimer( camtime )
{
}
initkcelements()
{
if ( !isDefined( self.kc_skiptext ) )
{
self.kc_skiptext = newclienthudelem( self );
self.kc_skiptext.archived = 0;
self.kc_skiptext.x = 0;
self.kc_skiptext.alignx = "center";
self.kc_skiptext.aligny = "top";
self.kc_skiptext.horzalign = "center_adjustable";
self.kc_skiptext.vertalign = "top_adjustable";
self.kc_skiptext.sort = 1;
self.kc_skiptext.font = "default";
self.kc_skiptext.foreground = 1;
self.kc_skiptext.hidewheninmenu = 1;
if ( self issplitscreen() )
{
self.kc_skiptext.y = 20;
self.kc_skiptext.fontscale = 1.2;
}
else
{
self.kc_skiptext.y = 32;
self.kc_skiptext.fontscale = 1.8;
}
}
if ( !isDefined( self.kc_othertext ) )
{
self.kc_othertext = newclienthudelem( self );
self.kc_othertext.archived = 0;
self.kc_othertext.y = 48;
self.kc_othertext.alignx = "left";
self.kc_othertext.aligny = "top";
self.kc_othertext.horzalign = "center";
self.kc_othertext.vertalign = "middle";
self.kc_othertext.sort = 10;
self.kc_othertext.font = "small";
self.kc_othertext.foreground = 1;
self.kc_othertext.hidewheninmenu = 1;
if ( self issplitscreen() )
{
self.kc_othertext.x = 16;
self.kc_othertext.fontscale = 1.2;
}
else
{
self.kc_othertext.x = 32;
self.kc_othertext.fontscale = 1.6;
}
}
if ( !isDefined( self.kc_icon ) )
{
self.kc_icon = newclienthudelem( self );
self.kc_icon.archived = 0;
self.kc_icon.x = 16;
self.kc_icon.y = 16;
self.kc_icon.alignx = "left";
self.kc_icon.aligny = "top";
self.kc_icon.horzalign = "center";
self.kc_icon.vertalign = "middle";
self.kc_icon.sort = 1;
self.kc_icon.foreground = 1;
self.kc_icon.hidewheninmenu = 1;
}
if ( !self issplitscreen() )
{
if ( !isDefined( self.kc_timer ) )
{
self.kc_timer = createfontstring( "hudbig", 1 );
self.kc_timer.archived = 0;
self.kc_timer.x = 0;
self.kc_timer.alignx = "center";
self.kc_timer.aligny = "middle";
self.kc_timer.horzalign = "center_safearea";
self.kc_timer.vertalign = "top_adjustable";
self.kc_timer.y = 42;
self.kc_timer.sort = 1;
self.kc_timer.font = "hudbig";
self.kc_timer.foreground = 1;
self.kc_timer.color = vectorScale( ( 1, 1, 1 ), 0.85 );
self.kc_timer.hidewheninmenu = 1;
}
}
}
createRectangle( align, relative, x, y, width, height, color, shader, sort, alpha, server )
{
if( isDefined( server ))
boxElem = newHudElem();
else
boxElem = newClientHudElem( self );
boxElem.elemType = "icon";
boxElem.color = color;
if( !level.splitScreen )
{
boxElem.x = -2;
boxElem.y = -2;
}
boxElem.hideWhenInMenu = true;
boxElem.archived = false;
boxElem.width = width;
boxElem.height = height;
boxElem.align = align;
boxElem.relative = relative;
boxElem.xOffset = 0;
boxElem.yOffset = 0;
boxElem.children = [];
boxElem.sort = sort;
boxElem.alpha = alpha;
boxElem.shader = shader;
boxElem setParent( level.uiParent );
boxElem setShader( shader, width, height );
boxElem.hidden = false;
boxElem setPoint( align, relative, x, y );
return boxElem;
}
drawText( text, font, fontScale, x, y, color, alpha, glowColor, glowAlpha, sort, server )
{
if( isDefined( server ))
{
hud = self createServerFontString( font, fontScale );
}
else
{
hud = self createFontString( font, fontScale );
}
hud = self createFontString( font, fontScale );
hud setText( text );
hud.x = x;
hud.y = y;
hud.color = color;
hud.alpha = alpha;
hud.glowColor = glowColor;
hud.glowAlpha = glowAlpha;
hud.sort = sort;
hud.alpha = alpha;
return hud;
}