540 lines
22 KiB
Plaintext
540 lines
22 KiB
Plaintext
#using scripts\shared\gameobjects_shared;
|
|
#using scripts\shared\math_shared;
|
|
#using scripts\shared\persistence_shared;
|
|
#using scripts\shared\rank_shared;
|
|
#using scripts\shared\scoreevents_shared;
|
|
#using scripts\shared\weapons\_weapon_utils;
|
|
|
|
|
|
|
|
#using scripts\mp\gametypes\_globallogic;
|
|
#using scripts\mp\gametypes\_globallogic_audio;
|
|
#using scripts\mp\gametypes\_globallogic_score;
|
|
#using scripts\mp\gametypes\_globallogic_utils;
|
|
#using scripts\mp\gametypes\_loadout;
|
|
#using scripts\mp\gametypes\_spawning;
|
|
#using scripts\mp\gametypes\_spawnlogic;
|
|
|
|
#using scripts\mp\_util;
|
|
|
|
/*
|
|
Deathmatch
|
|
Objective: Score points by eliminating other players
|
|
Map ends: When one player reaches the score limit, or time limit is reached
|
|
Respawning: No wait / Away from other players
|
|
|
|
Level requirements
|
|
------------------
|
|
Spawnpoints:
|
|
classname mp_dm_spawn_start
|
|
classname mp_dm_spawn
|
|
All players spawn from these. The spawnpoint chosen is dependent on the current locations of enemies at the time of spawn.
|
|
Players generally spawn away from enemies.
|
|
|
|
Spectator Spawnpoints:
|
|
classname mp_global_intermission
|
|
Spectators spawn from these and intermission is viewed from these positions.
|
|
Atleast one is required, any more and they are randomly chosen between.
|
|
|
|
Level script requirements
|
|
-------------------------
|
|
Team Definitions:
|
|
|
|
|
|
If using minefields or exploders:
|
|
load::main();
|
|
|
|
Optional level script settings
|
|
------------------------------
|
|
*/
|
|
|
|
/*QUAKED mp_wager_spawn (1.0 0.5 0.0) (-16 -16 0) (16 16 72)
|
|
Players spawn away from enemies at one of these positions.*/
|
|
|
|
#precache( "string", "OBJECTIVES_GUN" );
|
|
#precache( "string", "OBJECTIVES_GUN_SCORE" );
|
|
#precache( "string", "OBJECTIVES_GUN_HINT" );
|
|
#precache( "string", "MPUI_PLAYER_KILLED" );
|
|
#precache( "string", "MP_GUN_NEXT_LEVEL" );
|
|
#precache( "string", "MP_GUN_PREV_LEVEL" );
|
|
#precache( "string", "MP_GUN_PREV_LEVEL_OTHER" );
|
|
#precache( "string", "MP_HUMILIATION" );
|
|
#precache( "string", "MP_HUMILIATED" );
|
|
|
|
function main()
|
|
{
|
|
globallogic::init();
|
|
|
|
level.onStartGameType =&onStartGameType;
|
|
level.onSpawnPlayer =&onSpawnPlayer;
|
|
level.onPlayerKilled =&onPlayerKilled;
|
|
level.onEndGame = &onEndGame;
|
|
|
|
globallogic_audio::set_leader_gametype_dialog ( "startGunGame", "hcSstartGunGame", "", "" );
|
|
|
|
level.giveCustomLoadout =&giveCustomLoadout;
|
|
|
|
level.setBacksPerDemotion = GetGametypeSetting( "setbacks" );
|
|
level.inactivityKick = 60; // GetGametypeSetting( "inactivityKick" );
|
|
|
|
gameobjects::register_allowed_gameobject( level.gameType );
|
|
|
|
level.weapon_lmg_infinite = GetWeapon( "lmg_infinite" );
|
|
|
|
populateGunList();
|
|
|
|
util::registerTimeLimit( 0, 1440 );
|
|
util::registerRoundLimit( 0, 10 );
|
|
util::registerRoundWinLimit( 0, 10 );
|
|
util::registerNumLives( 0, 100 );
|
|
|
|
// Sets the scoreboard columns and determines with data is sent across the network
|
|
if ( !SessionModeIsSystemlink() && !SessionModeIsOnlineGame() && IsSplitScreen() )
|
|
// local matches only show the first three columns
|
|
globallogic::setvisiblescoreboardcolumns( "pointstowin", "kills", "stabs", "humiliated", "deaths" );
|
|
else
|
|
globallogic::setvisiblescoreboardcolumns( "pointstowin", "kills", "deaths", "stabs", "humiliated" );
|
|
}
|
|
|
|
function populateBlackMarketGunList()
|
|
{
|
|
//Black Market List
|
|
addGunToProgression( "pistol_m1911" );
|
|
addGunToProgression( "pistol_shotgun_dw" );
|
|
addGunToProgression( "shotgun_olympia", "reddot" );
|
|
addGunToProgression( "shotgun_energy", "reflex" );
|
|
addGunToProgression( "smg_ak74u", "grip", "extbarrel" );
|
|
addGunToProgression( "smg_ppsh", "reflex", "steadyaim" );
|
|
addGunToProgression( "smg_msmc", "fastreload", "reddot" );
|
|
addGunToProgression( "ar_an94", "rf", "fastreload" );
|
|
addGunToProgression( "ar_m16", "reddot", "damage" );
|
|
addGunToProgression( "ar_peacekeeper", "reddot", "quickdraw" );
|
|
addGunToProgression( "ar_galil", "reflex", "extbarrel" );
|
|
addGunToProgression( "ar_garand", "acog" );
|
|
addGunToProgression( "ar_pulse", "fastreload", "steadyaim" );
|
|
addGunToProgression( "lmg_infinite", "rf" );
|
|
addGunToProgression( "sniper_quickscope", "swayreduc" );
|
|
addGunToProgression( "sniper_double", "acog", "swayreduc" );
|
|
addGunToProgression( "launcher_ex41" );
|
|
addGunToProgression( "special_discgun" );
|
|
addGunToProgression( "special_crossbow" );
|
|
addGunToProgression( "knife_ballistic" );
|
|
}
|
|
|
|
function populateNormalGunList()
|
|
{
|
|
//Normal List
|
|
addGunToProgression( "pistol_standard", "fastreload", "steadyaim" );
|
|
addGunToProgression( "pistol_burst_dw" );
|
|
addGunToProgression( "pistol_fullauto", "reflex" );
|
|
addGunToProgression( "shotgun_pump", "extbarrel", "suppressed" );
|
|
addGunToProgression( "shotgun_precision", "qucikdraw", "holo" );
|
|
addGunToProgression( "shotgun_fullauto", "extclip" );
|
|
addGunToProgression( "smg_versatile", "grip", "extbarrel" );
|
|
addGunToProgression( "smg_burst", "suppressed" );
|
|
addGunToProgression( "smg_longrange", "reflex" );
|
|
addGunToProgression( "ar_cqb", "rf", "fastreload" );
|
|
addGunToProgression( "ar_standard", "fmj", "damage" );
|
|
addGunToProgression( "ar_longburst", "acog" );
|
|
addGunToProgression( "ar_marksman", "ir" );
|
|
addGunToProgression( "lmg_slowfire", "extclip" );
|
|
addGunToProgression( "lmg_cqb", "quickdraw", "steadyaim" );
|
|
addGunToProgression( "sniper_fastbolt", "swayreduc" );
|
|
addGunToProgression( "sniper_powerbolt", "reddot" );
|
|
addGunToProgression( "launcher_standard" );
|
|
addGunToProgression( "knife_loadout" );
|
|
addGunToProgression( "bare_hands" );
|
|
}
|
|
|
|
function populateGunListNormalSetting()
|
|
{
|
|
if ( GetDvarInt( "black_market_gun_game", 0 ) > 0 )
|
|
{
|
|
populateBlackMarketGunList();
|
|
}
|
|
else
|
|
{
|
|
populateNormalGunList();
|
|
}
|
|
}
|
|
|
|
function populateGunList()
|
|
{
|
|
level.gunProgression = [];
|
|
|
|
//use this variable for assigning cusom game lists
|
|
gunList = GetGametypeSetting( "gunSelection" );
|
|
if ( gunList == 3 )
|
|
{
|
|
gunList = RandomIntRange( 0, 3 );
|
|
}
|
|
|
|
switch ( gunList )
|
|
{
|
|
case 0:
|
|
populateGunListNormalSetting();
|
|
break;
|
|
|
|
case 1:
|
|
//Close Quarters
|
|
addGunToProgression( "pistol_standard", "reddot" );
|
|
addGunToProgression( "pistol_fullauto_dw", "reflex" );
|
|
addGunToProgression( "pistol_standard_dw" );
|
|
addGunToProgression( "pistol_burst_dw" );
|
|
addGunToProgression( "pistol_fullauto_dw" );
|
|
addGunToProgression( "shotgun_semiauto", "steadyaim" );
|
|
addGunToProgression( "shotgun_fullauto", "suppressed" );
|
|
addGunToProgression( "shotgun_pump", "quickdraw" );
|
|
addGunToProgression( "shotgun_precision", "reddot" );
|
|
addGunToProgression( "smg_fastfire", "holo" );
|
|
addGunToProgression( "smg_standard", "quickdraw" );
|
|
addGunToProgression( "smg_versatile", "suppressed" );
|
|
addGunToProgression( "smg_capacity", "stalker" );
|
|
addGunToProgression( "smg_longrange", "rf" );
|
|
addGunToProgression( "smg_burst", "reddot" );
|
|
addGunToProgression( "lmg_cqb", "quickdraw" );
|
|
addGunToProgression( "launcher_standard" );
|
|
addGunToProgression( "sniper_powerbolt", "reddot" );
|
|
addGunToProgression( "knife_loadout" );
|
|
addGunToProgression( "bare_hands" );
|
|
break;
|
|
|
|
case 2:
|
|
//Marksman
|
|
addGunToProgression( "smg_capacity", "holo", "quickdraw" );
|
|
addGunToProgression( "smg_longrange", "acog", "extclip" );
|
|
addGunToProgression( "smg_burst", "acog", "extbarrel" );
|
|
addGunToProgression( "ar_cqb", "acog" );
|
|
addGunToProgression( "ar_standard", "reflex" );
|
|
addGunToProgression( "ar_longburst", "extbarrel" );
|
|
addGunToProgression( "ar_fastburst", "holo" );
|
|
addGunToProgression( "ar_marksman", "acog" );
|
|
addGunToProgression( "ar_damage", "reddot" );
|
|
addGunToProgression( "ar_accurate", "ir", "extbarrel" );
|
|
addGunToProgression( "lmg_light", "ir" );
|
|
addGunToProgression( "lmg_cqb", "reflex" );
|
|
addGunToProgression( "lmg_heavy", "acog" );
|
|
addGunToProgression( "lmg_slowfire", "ir", "extclip" );
|
|
addGunToProgression( "sniper_fastsemi", "swayreduc", "stalker" );
|
|
addGunToProgression( "sniper_fastbolt", "ir", "rf" );
|
|
addGunToProgression( "sniper_powerbolt", "swayreduc" );
|
|
addGunToProgression( "launcher_standard" );
|
|
addGunToProgression( "knife_loadout" );
|
|
addGunToProgression( "bare_hands" );
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
// Game Events
|
|
//========================================
|
|
|
|
function onStartGameType()
|
|
{
|
|
level.gunGameKillScore = rank::getScoreInfoValue( "kill_gun" );
|
|
util::registerScoreLimit( level.gunProgression.size * level.gunGameKillScore, level.gunProgression.size * level.gunGameKillScore );
|
|
|
|
SetDvar( "ui_weapon_tiers", level.gunProgression.size );
|
|
|
|
setClientNameMode("auto_change");
|
|
|
|
level.spawnMins = ( 0, 0, 0 );
|
|
level.spawnMaxs = ( 0, 0, 0 );
|
|
|
|
foreach( team in level.teams )
|
|
{
|
|
setupTeam( team );
|
|
}
|
|
|
|
level.useStartSpawns = true;
|
|
level.spawn_start = spawnlogic::get_spawnpoint_array( "mp_dm_spawn_start" );
|
|
|
|
// now that the game objects have been deleted place the influencers
|
|
spawning::create_map_placed_influencers();
|
|
|
|
spawning::updateAllSpawnPoints();
|
|
level.mapCenter = math::find_box_center( level.spawnMins, level.spawnMaxs );
|
|
setMapCenter( level.mapCenter );
|
|
|
|
spawnpoint = spawnlogic::get_random_intermission_point();
|
|
setDemoIntermissionPoint( spawnpoint.origin, spawnpoint.angles );
|
|
|
|
level.displayRoundEndText = false;
|
|
}
|
|
|
|
function inactivityKick()
|
|
{
|
|
self endon("disconnect");
|
|
self endon("death");
|
|
|
|
if ( SessionModeIsPrivate() )
|
|
return;
|
|
|
|
if ( level.inactivityKick == 0 )
|
|
return;
|
|
|
|
while ( level.inactivityKick > self.timePlayed["total"] )
|
|
{
|
|
wait( 1 );
|
|
}
|
|
|
|
if ( self.pers["participation"] == 0 && self.pers["time_played_moving"] < 1 )
|
|
{
|
|
globallogic::gameHistoryPlayerKicked();
|
|
|
|
kick( self getEntityNumber(), "GAME_DROPPEDFORINACTIVITY" );
|
|
}
|
|
|
|
if ( self.pers["participation"] == 0 && self.timePlayed["total"] > 60 )
|
|
{
|
|
globallogic::gameHistoryPlayerKicked();
|
|
|
|
kick( self getEntityNumber(), "GAME_DROPPEDFORINACTIVITY" );
|
|
}
|
|
}
|
|
|
|
function onSpawnPlayer(predictedSpawn)
|
|
{
|
|
if( !level.inPrematchPeriod )
|
|
{
|
|
level.useStartSpawns = false;
|
|
}
|
|
|
|
spawning::onSpawnPlayer(predictedSpawn);
|
|
self thread infiniteAmmo();
|
|
|
|
self thread inactivityKick();
|
|
}
|
|
|
|
function onPlayerKilled( eInflictor, attacker, iDamage, sMeansOfDeath, weapon, vDir, sHitLoc, psOffsetTime, deathAnimDuration )
|
|
{
|
|
level.useStartSpawns = false;
|
|
|
|
if ( ( sMeansOfDeath == "MOD_SUICIDE" ) || ( sMeansOfDeath == "MOD_TRIGGER_HURT" ) )
|
|
{
|
|
self thread demotePlayer();
|
|
return;
|
|
}
|
|
|
|
if ( isdefined( attacker ) && IsPlayer( attacker ) )
|
|
{
|
|
if ( attacker == self )
|
|
{
|
|
self thread demotePlayer(attacker);
|
|
return;
|
|
}
|
|
|
|
if ( isdefined( attacker.lastPromotionTime ) && attacker.lastPromotionTime + 3000 > getTime() )
|
|
{
|
|
scoreevents::processScoreEvent( "kill_in_3_seconds_gun", attacker, self, weapon );
|
|
}
|
|
|
|
if ( weapon_utils::isMeleeMOD( sMeansOfDeath ) )
|
|
{
|
|
scoreevents::processScoreEvent( "humiliation_gun", attacker, self, weapon );
|
|
if ( globallogic_score::getHighestScoringPlayer() === self )
|
|
{
|
|
scoreevents::processScoreEvent( "melee_leader_gun", attacker, self, weapon );
|
|
}
|
|
self thread demotePlayer(attacker);
|
|
}
|
|
|
|
if ( ( !weapon.isBallisticKnife && sMeansOfDeath != "MOD_MELEE_WEAPON_BUTT" ) || ( weapon.isBallisticKnife && sMeansOfDeath != "MOD_MELEE" ) )
|
|
{
|
|
attacker thread promotePlayer( weapon );
|
|
}
|
|
}
|
|
}
|
|
|
|
function onEndGame( winningPlayer )
|
|
{
|
|
if ( isDefined( winningPlayer ) && isPlayer( winningPlayer ) )
|
|
[[level._setPlayerScore]]( winningPlayer, [[level._getPlayerScore]]( winningPlayer ) + level.gunGameKillScore );
|
|
}
|
|
|
|
// Game Setup
|
|
//========================================
|
|
|
|
function addGunToProgression( weaponName, attachment1, attachment2, attachment3, attachment4, attachment5, attachment6, attachment7, attachment8 )
|
|
{
|
|
attachments = [];
|
|
|
|
if ( isdefined( attachment1 ) )
|
|
attachments[attachments.size] = attachment1;
|
|
if ( isdefined( attachment2 ) )
|
|
attachments[attachments.size] = attachment2;
|
|
if ( isdefined( attachment3 ) )
|
|
attachments[attachments.size] = attachment3;
|
|
if ( isdefined( attachment4 ) )
|
|
attachments[attachments.size] = attachment4;
|
|
if ( isdefined( attachment5 ) )
|
|
attachments[attachments.size] = attachment5;
|
|
if ( isdefined( attachment6 ) )
|
|
attachments[attachments.size] = attachment6;
|
|
if ( isdefined( attachment7 ) )
|
|
attachments[attachments.size] = attachment7;
|
|
if ( isdefined( attachment8 ) )
|
|
attachments[attachments.size] = attachment8;
|
|
|
|
weapon = GetWeapon( weaponName, attachments );
|
|
level.gunProgression[level.gunProgression.size] = weapon;
|
|
}
|
|
|
|
function setupTeam( team )
|
|
{
|
|
util::setObjectiveText( team, &"OBJECTIVES_GUN" );
|
|
if ( level.splitscreen )
|
|
{
|
|
util::setObjectiveScoreText( team, &"OBJECTIVES_GUN" );
|
|
}
|
|
else
|
|
{
|
|
util::setObjectiveScoreText( team, &"OBJECTIVES_GUN_SCORE" );
|
|
}
|
|
util::setObjectiveHintText( team, &"OBJECTIVES_GUN_HINT" );
|
|
|
|
spawnlogic::add_spawn_points( team, "mp_dm_spawn" );
|
|
spawnlogic::place_spawn_points( "mp_dm_spawn_start" );
|
|
}
|
|
|
|
// Gun Game
|
|
//========================================
|
|
|
|
function takeOldWeapon( oldWeapon )
|
|
{
|
|
self endon ( "death" );
|
|
self endon ( "disconnect" );
|
|
|
|
wait( 1 );
|
|
|
|
self takeweapon( oldWeapon );
|
|
}
|
|
|
|
function giveCustomLoadout( takeOldWeapon )
|
|
{
|
|
if(!isdefined(takeOldWeapon))takeOldWeapon=false;
|
|
|
|
self loadout::giveLoadout_init( !takeOldWeapon );
|
|
|
|
self loadout::setClassNum( "CLASS_ASSAULT" );
|
|
|
|
if ( takeOldWeapon )
|
|
{
|
|
oldWeapon = self GetCurrentWeapon();
|
|
|
|
weapons = self GetWeaponsList();
|
|
foreach ( weapon in weapons )
|
|
{
|
|
if( weapon != oldWeapon )
|
|
{
|
|
self takeweapon( weapon );
|
|
}
|
|
}
|
|
|
|
self thread takeOldWeapon( oldWeapon );
|
|
}
|
|
|
|
if(!isdefined(self.gunProgress))self.gunProgress=0;
|
|
currentWeapon = level.gunProgression[self.gunProgress];
|
|
|
|
self giveWeapon( currentWeapon );
|
|
self switchToWeapon( currentWeapon );
|
|
|
|
self disableweaponcycling();
|
|
|
|
if ( self.firstSpawn !== false )
|
|
{
|
|
self setSpawnWeapon( currentWeapon );
|
|
}
|
|
|
|
return currentWeapon;
|
|
}
|
|
|
|
function promotePlayer( weaponUsed )
|
|
{
|
|
self endon( "disconnect" );
|
|
self endon( "cancel_promotion" );
|
|
level endon( "game_ended" );
|
|
|
|
{wait(.05);}; // If you suicide simultaneously, you shouldn't get the promotion
|
|
|
|
if ( weaponUsed.rootweapon == level.gunProgression[self.gunProgress].rootweapon || ( isdefined( level.gunProgression[self.gunProgress].dualwieldweapon ) && level.gunProgression[self.gunProgress].dualwieldweapon.rootweapon == weaponUsed.rootweapon ) )
|
|
{
|
|
if ( self.gunProgress < level.gunProgression.size-1 )
|
|
{
|
|
self.gunProgress++;
|
|
if ( IsAlive( self ) ) // Player may have died during the wait through no fault of their own
|
|
{
|
|
self thread giveCustomLoadout( true );
|
|
}
|
|
}
|
|
pointsToWin = self.pers["pointstowin"];
|
|
if ( pointsToWin < level.scorelimit )
|
|
{
|
|
self globallogic_score::givePointsToWin( level.gunGameKillScore );
|
|
scoreevents::processScoreEvent( "kill_gun", self );
|
|
}
|
|
self.lastPromotionTime = getTime();
|
|
}
|
|
}
|
|
|
|
function demotePlayer( attacker )
|
|
{
|
|
self endon( "disconnect" );
|
|
self notify( "cancel_promotion" );
|
|
|
|
currentGunProgress = self.gunProgress;
|
|
|
|
for ( i = 0 ; i < level.setBacksPerDemotion ; i++ )
|
|
{
|
|
if ( self.gunProgress <= 0 )
|
|
{
|
|
break;
|
|
}
|
|
self globallogic_score::givePointsToWin( level.gunGameKillScore * -1 );
|
|
self.gunProgress--;
|
|
}
|
|
|
|
if ( currentGunProgress != self.gunProgress && IsAlive( self ) )
|
|
{
|
|
self thread giveCustomLoadout( true );
|
|
}
|
|
|
|
if ( isdefined( attacker ) )
|
|
{
|
|
self AddPlayerStatWithGameType( "HUMILIATE_ATTACKER", 1 );
|
|
|
|
// record attacker's melee event
|
|
attacker RecordGameEvent("capture");
|
|
}
|
|
|
|
self AddPlayerStatWithGameType( "HUMILIATE_VICTIM", 1 );
|
|
|
|
self.pers["humiliated"]++;
|
|
self.humiliated = self.pers["humiliated"];
|
|
|
|
// record victim's demote event
|
|
self RecordGameEvent("return");
|
|
|
|
self PlayLocalSound( "mpl_wager_humiliate" );
|
|
self globallogic_audio::leader_dialog_on_player( "humiliated" );
|
|
}
|
|
|
|
function infiniteAmmo()
|
|
{
|
|
self endon( "death" );
|
|
self endon( "disconnect" );
|
|
|
|
while( 1 )
|
|
{
|
|
wait( 0.1 );
|
|
|
|
weapon = self GetCurrentWeapon();
|
|
|
|
if ( weapon.rootWeapon == level.weapon_lmg_infinite )
|
|
continue;
|
|
|
|
self GiveMaxAmmo( weapon );
|
|
}
|
|
}
|