#using scripts\shared\array_shared; #using scripts\shared\gameobjects_shared; #using scripts\shared\hud_message_shared; #using scripts\shared\hud_util_shared; #using scripts\shared\math_shared; #using scripts\shared\persistence_shared; #using scripts\shared\rank_shared; #using scripts\shared\scoreevents_shared; #using scripts\shared\util_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\_loadout; #using scripts\mp\gametypes\_spawning; #using scripts\mp\gametypes\_spawnlogic; #using scripts\mp\gametypes\_wager; #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_wager_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: game["allies"] = "marines"; game["axis"] = "nva"; Because Deathmatch doesn't have teams with regard to gameplay or scoring, this effectively sets the available weapons. If using minefields or exploders: load::main(); Optional level script settings ------------------------------ Soldier Type and Variation: game["soldiertypeset"] = "seals"; This sets what character models are used for each nationality on a particular map. Valid settings: soldiertypeset seals */ //#define SAS_PRIMARY_WEAPON "crossbow" // brian barnes - crossbow weapon deleted, hoping just swapping this to a supported weapon will work #precache( "string", "OBJECTIVES_SAS" ); #precache( "string", "OBJECTIVES_SAS_SCORE" ); #precache( "string", "OBJECTIVES_SAS_HINT" ); #precache( "string", "MP_HUMILIATION" ); #precache( "string", "MP_HUMILIATED" ); #precache( "string", "MP_BANKRUPTED" ); #precache( "string", "MP_BANKRUPTED_OTHER" ); function main() { globallogic::init(); level.weapon_SAS_PRIMARY_WEAPON = GetWeapon( "special_crossbow" ); level.weapon_SAS_SECONDARY_WEAPON = GetWeapon( "knife_ballistic" ); level.weapon_SAS_PRIMARY_GRENADE_WEAPON = GetWeapon( "hatchet" ); util::registerTimeLimit( 0, 1440 ); util::registerScoreLimit( 0, 5000 ); util::registerRoundLimit( 0, 10 ); util::registerRoundWinLimit( 0, 10 ); util::registerNumLives( 0, 100 ); level.onStartGameType =&onStartGameType; level.onPlayerDamage =&onPlayerDamage; level.onPlayerKilled =&onPlayerKilled; level.onPlayerScore = &onPlayerScore; // level.onWagerAwards =&onWagerAwards; level.pointsPerPrimaryKill = GetGametypeSetting( "pointsPerPrimaryKill" ); level.pointsPerSecondaryKill = GetGametypeSetting( "pointsPerSecondaryKill" ); level.pointsPerPrimaryGrenadeKill = GetGametypeSetting( "pointsPerPrimaryGrenadeKill" ); level.pointsPerMeleeKill = GetGametypeSetting( "pointsPerMeleeKill" ); level.setBacks = GetGametypeSetting( "setbacks" ); switch ( GetGametypeSetting( "gunSelection" ) ) { case 0: level.setBackWeapon = undefined; break; case 1: level.setBackWeapon = level.weapon_SAS_PRIMARY_GRENADE_WEAPON; break; case 2: level.setBackWeapon = level.weapon_SAS_PRIMARY_WEAPON; break; case 3: level.setBackWeapon = level.weapon_SAS_SECONDARY_WEAPON; break; default: assert( true, "Invalid setting for gunSelection" ); break; } game["dialog"]["gametype"] = "sns_start"; game["dialog"]["wm_humiliation"] = "mpl_wager_bankrupt"; game["dialog"]["wm_humiliated"] = "sns_hum"; gameobjects::register_allowed_gameobject( level.gameType ); level.giveCustomLoadout =&giveCustomLoadout; sas_perks = []; if ( !isdefined( sas_perks ) ) sas_perks = []; else if ( !IsArray( sas_perks ) ) sas_perks = array( sas_perks ); sas_perks[sas_perks.size]="specialty_fastweaponswitch";; if ( !isdefined( sas_perks ) ) sas_perks = []; else if ( !IsArray( sas_perks ) ) sas_perks = array( sas_perks ); sas_perks[sas_perks.size]="specialty_jetcharger";; if ( !isdefined( sas_perks ) ) sas_perks = []; else if ( !IsArray( sas_perks ) ) sas_perks = array( sas_perks ); sas_perks[sas_perks.size]="specialty_tracker";; level.sas_perks = sas_perks; sas_gadgets = []; if ( !isdefined( sas_gadgets ) ) sas_gadgets = []; else if ( !IsArray( sas_gadgets ) ) sas_gadgets = array( sas_gadgets ); sas_gadgets[sas_gadgets.size]="gadget_camo";; if ( !isdefined( sas_gadgets ) ) sas_gadgets = []; else if ( !IsArray( sas_gadgets ) ) sas_gadgets = array( sas_gadgets ); sas_gadgets[sas_gadgets.size]="gadget_clone";; level.weapon_SAS_DEFAULT_GADGET = array::random( sas_gadgets ); globallogic::setvisiblescoreboardcolumns( "pointstowin", "kills", "deaths", "tomahawks", "humiliated" ); } function giveCustomLoadout() { self notify( "sas_spectator_hud" ); defaultWeapon = level.weapon_SAS_PRIMARY_WEAPON; loadout::setClassNum( self.curClass ); self wager::setup_blank_random_player( true, true, defaultWeapon ); self givePerks(); self GiveWeapon( defaultWeapon ); self SetWeaponAmmoClip( defaultWeapon, 6 ); self SetWeaponAmmoStock( defaultWeapon, 6 ); self.primaryLoadoutWeapon = defaultWeapon; secondaryWeapon = level.weapon_SAS_SECONDARY_WEAPON; self GiveWeapon( secondaryWeapon ); self SetWeaponAmmoStock( secondaryWeapon, 2 ); self.secondaryLoadoutWeapon = defaultWeapon; offhandPrimary = level.weapon_SAS_PRIMARY_GRENADE_WEAPON; self SetOffhandPrimaryClass( offhandPrimary ); self GiveWeapon( offhandPrimary ); self SetWeaponAmmoClip( offhandPrimary, 1 ); self SetWeaponAmmoStock( offhandPrimary, 1 ); self.grenadeTypePrimary = offhandPrimary; self.grenadeTypePrimaryCount = 1; secondaryOffhand = GetWeapon( "null_offhand_secondary" ); secondaryOffhandCount = 0; self GiveWeapon( secondaryOffhand ); self SetWeaponAmmoClip( secondaryOffhand, secondaryOffhandCount ); self SwitchToOffhand( secondaryOffhand ); self.grenadeTypeSecondary = secondaryOffhand; self.grenadeTypeSecondaryCount = secondaryOffhandCount; self GiveWeapon( level.weaponBaseMelee ); self giveDefaultGadget(); self SwitchToWeapon( defaultWeapon ); self SetSpawnWeapon( defaultWeapon ); self.killsWithSecondary = 0; self.killsWithPrimary = 0; self.killsWithBothAwarded = false; return defaultWeapon; } function giveDefaultGadget() { specialOffhand = self.sas_matchGadget; resetCharge = false; if ( !isdefined( specialOffhand ) ) { specialOffhand = GetWeapon( level.weapon_SAS_DEFAULT_GADGET ); resetCharge = true; } specialOffhandCount = specialOffhand.startammo; self GiveWeapon( specialOffhand ); self SetWeaponAmmoClip( specialOffhand, specialOffhandCount ); self SwitchToOffhand( specialOffhand ); self.grenadeTypeSpecial = specialOffhand; self.grenadeTypeSpecialCount = specialOffhandCount; if ( ( isdefined( resetCharge ) && resetCharge ) ) { slot = self GadgetGetSlot( specialOffhand ); self GadgetPowerSet( slot, 0 ); } self.sas_matchGadget = specialOffhand; } function givePerks() { foreach ( perkName in level.sas_perks ) { self SetPerk( perkName ); } } function onPlayerDamage( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, weapon, vPoint, vDir, sHitLoc, psOffsetTime ) { if ( ( weapon == level.weapon_SAS_PRIMARY_WEAPON ) && ( sMeansOfDeath == "MOD_IMPACT" ) ) { if ( isdefined( eAttacker ) && IsPlayer( eAttacker ) ) { if ( !isdefined( eAttacker.pers["sticks"] ) ) eAttacker.pers["sticks"] = 1; else eAttacker.pers["sticks"]++; eAttacker.sticks = eAttacker.pers["sticks"]; } } return iDamage; } function onPlayerScore( event, player, victim ) { score = player.pers["pointstowin"]; if ( !level.rankedMatch ) { player thread rank::updateRankScoreHUD( score - player.pers["score"] ); } player.pers["score"] = score; player.score = player.pers["score"]; recordPlayerStats( player, "score" , player.pers["score"] ); } function onPlayerKilled( eInflictor, attacker, iDamage, sMeansOfDeath, weapon, vDir, sHitLoc, psOffsetTime, deathAnimDuration ) { if ( isdefined( attacker ) && IsPlayer( attacker ) && attacker != self ) { if ( weapon_utils::isMeleeMOD( sMeansOfDeath ) ) { //should probably make this a custom setting attacker globallogic_score::givePointsToWin( level.pointsPerMeleeKill ); onPlayerScore( undefined, attacker, undefined ); } else if ( weapon == level.weapon_SAS_PRIMARY_WEAPON ) { attacker.killsWithPrimary++; if ( attacker.killsWithBothAwarded == false && attacker.killsWithSecondary > 0 ) { attacker.killsWithBothAwarded = true; } attacker globallogic_score::givePointsToWin( level.pointsPerPrimaryKill ); onPlayerScore( undefined, attacker, undefined ); } else if ( weapon == level.weapon_SAS_PRIMARY_GRENADE_WEAPON ) { attacker globallogic_score::givePointsToWin( level.pointsPerPrimaryGrenadeKill ); onPlayerScore( undefined, attacker, undefined ); } else { if ( weapon == level.weapon_SAS_SECONDARY_WEAPON ) // make sure this is not a kill by destructible { attacker.killsWithSecondary++; if ( attacker.killsWithBothAwarded == false && attacker.killsWithPrimary > 0 ) { attacker.killsWithBothAwarded = true; } } attacker globallogic_score::givePointsToWin( level.pointsPerSecondaryKill ); onPlayerScore( undefined, attacker, undefined ); } if ( isdefined( level.setBackWeapon ) && ( weapon == level.setBackWeapon ) ) { self.pers["humiliated"]++; self.humiliated = self.pers["humiliated"]; if ( level.setBacks == 0 ) { self globallogic_score::setPointsToWin( 0 ); onPlayerScore( undefined, self, undefined ); } else { self globallogic_score::givePointsToWin( level.setBacks * -1 ); onPlayerScore( undefined, self, undefined ); } attacker PlayLocalSound( "mpl_fracture_sting_moved" ); attacker AddPlayerStatWithGameType( "HUMILIATE_ATTACKER", 1 ); self thread playerHumiliation(); } } else { self.pers["humiliated"]++; self.humiliated = self.pers["humiliated"]; if ( level.setBacks == 0 ) { self globallogic_score::setPointsToWin( 0 ); onPlayerScore( undefined, self, undefined ); } else { self globallogic_score::givePointsToWin( level.setBacks * -1 ); onPlayerScore( undefined, self, undefined ); } self thread playerHumiliation(); } } function playerHumiliation() { self endon( "disconnect" ); self endon( "death" ); self AddPlayerStatWithGameType( "HUMILIATE_VICTIM", 1 ); self waittill( "spawned_player" ); self PlayLocalSound( "mpl_assassination_sting" ); humHud = self hud::createFontString( "default", 2.5 ); humHud hud::setPoint( "CENTER", undefined, 0, -100 ); humHud.label = &"MP_HUMILIATED"; humHud.x = 0; humHud.archived = true; humHud.alpha = 1; humHud.glowAlpha = 0; humHud.hidewheninmenu = false; self thread playerHumiliationCleanup( humHud ); wait 0.1; humHud FadeOverTime( 0.2 ); humHud.color = ( 1, 0, 0 ); humHud ChangeFontScaleOverTime( 0.2 ); humHud.fontScale = 3; wait 0.5; humHud FadeOverTime( 0.5 ); humHud.color = ( 1, 1, 1 ); humHud ChangeFontScaleOverTime( 0.5 ); humHud.fontScale = 2.5; wait 1.0; self notify( "humHudDestroyed" ); humHud Destroy(); } function playerHumiliationCleanup( humHud ) { self endon( "humHudDestroyed" ); self util::waittill_any( "disconnect", "death" ); if ( isdefined( humHud ) ) humHud Destroy(); } function setupTeam( team ) { util::setObjectiveText( team, &"OBJECTIVES_SAS" ); if ( level.splitscreen ) { util::setObjectiveScoreText( team, &"OBJECTIVES_SAS" ); } else { util::setObjectiveScoreText( team, &"OBJECTIVES_SAS_SCORE" ); } util::setObjectiveHintText( team, &"OBJECTIVES_SAS_HINT" ); spawnlogic::add_spawn_points( team, "mp_dm_spawn" ); spawnlogic::place_spawn_points( "mp_dm_spawn_start" ); level.spawn_start = spawnlogic::get_spawnpoint_array( "mp_dm_spawn_start" ); } function onStartGameType() { // SetDvar( "scr_xpscalemp", 0 ); SetDvar( "tu29_gametypeOverridesGadget", true ); setClientNameMode("auto_change"); // now that the game objects have been deleted place the influencers spawning::create_map_placed_influencers(); level.spawnMins = ( 0, 0, 0 ); level.spawnMaxs = ( 0, 0, 0 ); foreach( team in level.teams ) { setupTeam( team ); } 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 ); // use the new spawn logic from the start level.useStartSpawns = false; level.displayRoundEndText = false; if ( isdefined( game["roundsplayed"] ) && game["roundsplayed"] > 0 ) { game["dialog"]["gametype"] = undefined; game["dialog"]["offense_obj"] = undefined; game["dialog"]["defense_obj"] = undefined; } } function onWagerAwards() { tomahawks = self globallogic_score::getPersStat( "tomahawks" ); if ( !isdefined( tomahawks ) ) tomahawks = 0; self persistence::set_after_action_report_stat( "wagerAwards", tomahawks, 0 ); sticks = self globallogic_score::getPersStat( "sticks" ); if ( !isdefined( sticks ) ) sticks = 0; self persistence::set_after_action_report_stat( "wagerAwards", sticks, 1 ); bestKillstreak = self globallogic_score::getPersStat( "best_kill_streak" ); if ( !isdefined( bestKillstreak ) ) bestKillstreak = 0; self persistence::set_after_action_report_stat( "wagerAwards", bestKillstreak, 2 ); }