/* * Author: Needles * https://steamcommunity.com/profiles/76561198026257137/ */ printl("*** WAVE2"); IncludeScript("needles/missions/mvm_hoovydam_b10_rev_adv_insurgent/mission.nut"); ::Wave <- {}; local Wave2Handler = class extends ::Handler.BaseHandler { function OnEvent_WaveStart(params) { ::Debug.Print("*** WAVE - Wave 2 start"); // Move the core boss to where it needs to be if (::Mission.handler_coreBoss.self != null && ::Mission.handler_coreBoss.self.IsValid()) { ::Mission.handler_coreBoss.self.SetAbsOrigin(Vector(-544, 1536, 64)); ::Mission.handler_coreBoss.ShowAnnotation(); ::Highlight.AddHighlight(::Mission.handler_coreBoss.self, null); NavMesh.RegisterAvoidanceObstacle(::Mission.handler_coreBoss.self); } } } ::Handler.RegisterHandler("wave", @() Wave2Handler()); ::Handler.RemoveHandler(Entities.FindByClassname(null, "tf_gamerules"), "wave"); ::Handler.AddHandler(Entities.FindByClassname(null, "tf_gamerules"), "wave", null, -1.0); function Wave::InitializeWave() { ::Debug.Print("*** WAVE - Wave 2 intialized"); // Close the door to the generator room EntFire("door_any_trackdoor_1", "Close", "", -1.0); EntFire("door_any_trackdoor_1_prop", "SetAnimation", "close", -1.0); // Stop the door from being opened EntFire("shutter_trigger", "Disable", "", -1.0); // Block off the other entrance PrecacheModel("models/props_hydro/main_entrance_door.mdl"); SpawnEntityFromTable("prop_dynamic", { origin = Vector(-928, 624, 432), angles = QAngle(0.0, 180.0, 0.0), model = "models/props_hydro/main_entrance_door.mdl", solid = Constants.ESolidType.SOLID_VPHYSICS, disableshadows = true, }); SpawnEntityFromTable("prop_dynamic", { origin = Vector(416, 1152, 256), angles = QAngle(0.0, 180.0, 0.0), model = "models/props_hydro/main_entrance_door.mdl", solid = Constants.ESolidType.SOLID_VPHYSICS, disableshadows = true, }); // Create fences to block sightlines PrecacheModel("models/props_gameplay/security_fence256.mdl"); SpawnEntityFromTable("prop_dynamic", { origin = Vector(-2092, 560, 448), angles = QAngle(0.0, 135.0, 0.0), model = "models/props_gameplay/security_fence256.mdl", solid = Constants.ESolidType.SOLID_VPHYSICS, disableshadows = true, }); PrecacheModel("models/props_gameplay/security_fence128.mdl"); SpawnEntityFromTable("prop_dynamic", { origin = Vector(-2136, 672, 416), angles = QAngle(0.0, 105.0, 0.0), model = "models/props_gameplay/security_fence128.mdl", solid = Constants.ESolidType.SOLID_VPHYSICS, disableshadows = true, }); } // GATE // Enable gate 1 EntFire("gate1_capturepoint_a", "SetOwner", "2", 1.1); EntFire("gate1_door_trigger", "Enable", "", 1.1); EntFire("gate1_door_alarm", "Enable", "", 1.1); // Disable gate 2 EntFire("gate2_capturepoint_b", "SetOwner", "3", 1.1); EntFire("gate2_door_trigger", "Disable", "", 1.1); EntFire("gate2_door_alarm", "Disable", "", 1.1); // Open both doors EntFire("gate1_spawn_door1a", "Open", "", 1.2); EntFire("gate1_spawn_door1b", "Open", "", 1.2); // RED spawns ::SpawnContext.ClearSpawnPoints(); ::Mission.redSpawnListSetup <- [ ::SpawnContext.AddSpawnPoint(Vector(-3408, -1792, 560), QAngle(0, 90, 0), [::Filter.TFTeamFilter(Constants.ETFTeam.TF_TEAM_RED)]), ::SpawnContext.AddSpawnPoint(Vector(-3344, -1792, 560), QAngle(0, 90, 0), [::Filter.TFTeamFilter(Constants.ETFTeam.TF_TEAM_RED)]), ::SpawnContext.AddSpawnPoint(Vector(-3280, -1792, 560), QAngle(0, 90, 0), [::Filter.TFTeamFilter(Constants.ETFTeam.TF_TEAM_RED)]), ::SpawnContext.AddSpawnPoint(Vector(-3408, -1872, 560), QAngle(0, 90, 0), [::Filter.TFTeamFilter(Constants.ETFTeam.TF_TEAM_RED)]), ::SpawnContext.AddSpawnPoint(Vector(-3344, -1872, 560), QAngle(0, 90, 0), [::Filter.TFTeamFilter(Constants.ETFTeam.TF_TEAM_RED)]), ::SpawnContext.AddSpawnPoint(Vector(-3280, -1872, 560), QAngle(0, 90, 0), [::Filter.TFTeamFilter(Constants.ETFTeam.TF_TEAM_RED)]), ]; ::Mission.redSpawnListWave <- [ ::SpawnContext.AddSpawnPoint(Vector(-3056, -976, 496), QAngle(0, 90, 0), [::Filter.TFTeamFilter(Constants.ETFTeam.TF_TEAM_RED)], false), ::SpawnContext.AddSpawnPoint(Vector(-2992, -976, 496), QAngle(0, 90, 0), [::Filter.TFTeamFilter(Constants.ETFTeam.TF_TEAM_RED)], false), ::SpawnContext.AddSpawnPoint(Vector(-2928, -976, 496), QAngle(0, 90, 0), [::Filter.TFTeamFilter(Constants.ETFTeam.TF_TEAM_RED)], false), ::SpawnContext.AddSpawnPoint(Vector(-3056, -1056, 496), QAngle(0, 90, 0), [::Filter.TFTeamFilter(Constants.ETFTeam.TF_TEAM_RED)], false), ::SpawnContext.AddSpawnPoint(Vector(-2992, -1056, 496), QAngle(0, 90, 0), [::Filter.TFTeamFilter(Constants.ETFTeam.TF_TEAM_RED)], false), ::SpawnContext.AddSpawnPoint(Vector(-2928, -1056, 496), QAngle(0, 90, 0), [::Filter.TFTeamFilter(Constants.ETFTeam.TF_TEAM_RED)], false), ]; // SPAWN GROUPS + ROBOT SPAWN POINTS ::SpawnGroup.ClearSpawnGroups(); ::SpawnGroup.AddSpawnGroup("spawn_group_w2_soldier_spammer", 2, 2, 30.0, 2.0); ::SpawnGroup.AddSpawnGroup("spawn_group_w2_pyro_dragonfury", 3, 3, 15.0, 0.0); ::SpawnGroup.AddSpawnGroup("spawn_group_w2_demo", 3, 4, 15.0, 20.0); ::SpawnGroup.AddSpawnGroup("spawn_group_w2_pyro_uber", 2, 2, 20.0, 0.0); ::SpawnGroup.AddSpawnGroup("spawn_group_w2_sniper", 2, 2, 35.0, 30.0); ::SpawnGroup.AddSpawnGroup("spawn_group_heavy_crit", 2, 2, 35.0, 10.0); ::SpawnPoint.ClearSpawnPoints(); ::SpawnPoint.BuildSpawnPoint(Vector(-2816, -958, 224), QAngle(0, 0, 0), ::SpawnGroup.GetSpawnGroupByTag("spawn_group_w2_pyro_dragonfury"), ::SpawnPoint.GetClassIconPath("pyro_dragonfury")); ::SpawnPoint.BuildSpawnPoint(Vector(-1408, 976, 256), QAngle(0, 0, 0), ::SpawnGroup.GetSpawnGroupByTag("spawn_group_w2_demo"), ::SpawnPoint.GetClassIconPath("demo")); ::SpawnPoint.BuildSpawnPoint(Vector(240, 1152, 256), QAngle(0, 0, 0), ::SpawnGroup.GetSpawnGroupByTag("spawn_group_w2_pyro_uber"), ::SpawnPoint.GetClassIconPath("pyro")); ::SpawnPoint.BuildSpawnPoint(Vector(240, 1536, 256), QAngle(0, 0, 0), ::SpawnGroup.GetSpawnGroupByTag("spawn_group_w2_sniper"), ::SpawnPoint.GetClassIconPath("sniper")); PrecacheSound("mvm/mvm_tele_deliver.wav"); ::Mission.handler_gatebotSpawnPoint <- ::SpawnPoint.BuildSpawnPoint(Vector(-672, 1536, 64), QAngle(0, 0, 0), ::SpawnGroup.GetSpawnGroupByTag("spawn_group_w2_soldier_spammer"), ::SpawnPoint.GetClassIconPath("soldier_spammer"), "mvm/mvm_tele_deliver.wav"); ::Mission.handler_gatebotSpawnPoint.event_onSpawn.AddListener( function(params) { foreach (player in params.playerList) { if (player.HasBotTag("bot_gatebot")) ::Players.HighlightPlayer(player); } } ); // GOODBYE NAV ::Mission.navPurge.Purge(); // PATROL NODES ::Patrol.ClearPatrolNodes(); // Dragon fury ::Patrol.BuildPatrolNode("patrol_w2_0_a", "patrol_w2_0_b", 0.0, Vector(-3328, 512, 96), {mins = Vector(-3520, 320, 32), maxs = Vector(-3136, 704, 160)}); ::Patrol.BuildPatrolNode("patrol_w2_0_b", "patrol_w2_0_a", 0.0, Vector(-2816, -958, 224), {mins = Vector(-3040, -1216, 192), maxs = Vector(-2560, -736, 352)}); // Demo ::Patrol.BuildPatrolNode("patrol_w2_1_a", "patrol_w2_1_b", 5.0, Vector(64, 1536, 288), {mins = Vector(0, 864, 244), maxs = Vector(416, 2176, 416)}); ::Patrol.BuildPatrolNode("patrol_w2_1_b", "patrol_w2_1_c", 3.0, Vector(-2304, 1632, 288), {mins = Vector(-2560, 1408, 192), maxs = Vector(-2112, 1856, 448)}); ::Patrol.BuildPatrolNode("patrol_w2_1_c", "patrol_w2_1_d", 5.0, Vector(64, 1536, 288), {mins = Vector(0, 864, 244), maxs = Vector(416, 2176, 416)}); ::Patrol.BuildPatrolNode("patrol_w2_1_d", "patrol_w2_1_a", 3.0, Vector(-1408, 976, 256), {mins = Vector(-1664, 608, 256), maxs = Vector(-1184, 1280, 384)}); // Heavy /* ::Patrol.BuildPatrolNode("patrol_w2_2_a", "patrol_w2_2_b", 10.0, Vector(-768, 1792, 288), {mins = Vector(-1024, 1600, 256), maxs = Vector(-512, 2176, 384)}); ::Patrol.BuildPatrolNode("patrol_w2_2_b", "patrol_w2_2_a", 10.0, Vector(-512, 1280, 288), {mins = Vector(-768, 832, 256), maxs = Vector(-256, 1408, 384)}); */ /* ::Patrol.BuildPatrolNode("patrol_w2_2_a", "patrol_w2_2_b", 4.0, Vector(-2208, 2208, 320), {mins = Vector(-2368, 2048, 256), maxs = Vector(-2048, 2336, 384)}); ::Patrol.BuildPatrolNode("patrol_w2_2_b", "patrol_w2_2_a", 4.0, Vector(192, 1776, 288), {mins = Vector(0, 1664, 256), maxs = Vector(384, 2048, 384)}); */ // Pyro ::Patrol.BuildPatrolNode("patrol_w2_2_a", "patrol_w2_2_b", 2.0, Vector(-1408, 976, 256), {mins = Vector(-1664, 608, 256), maxs = Vector(-1184, 1280, 384)}); ::Patrol.BuildPatrolNode("patrol_w2_2_b", "patrol_w2_2_a", 2.0, Vector(-2400, 1216, 224), {mins = Vector(-2624, 1024, 192), maxs = Vector(-2208, 1408, 288)}); // Sniper ::Patrol.BuildPatrolNode("patrol_w2_3_a", null, 4.0, Vector(240, 1536, 256), {mins = Vector(0, 0, 0), maxs = Vector(0, 0, 0)}); // Gatebot ::Patrol.BuildPatrolNode("patrol_w2_gatebot_a", null, 0.0, Vector(-3008, -960, 512), {mins = Vector(0, 0, 0), maxs = Vector(0, 0, 0)}); // PATROL PATHS // Dragon fury ::Brush.BuildNavPrefer(Constants.ETFTeam.TF_TEAM_BLUE, "patrol_w2_0_a", [ ], [ {mins = Vector(-3168, 224, 64), maxs = Vector(-2656, 768, 320)}, ] ); ::Brush.BuildNavPrefer(Constants.ETFTeam.TF_TEAM_BLUE, "patrol_w2_0_b", [ ], [ {mins = Vector(-3840, -1696, 64), maxs = Vector(-3168, -288, 320)}, ] ); ::Brush.BuildNavPrefer(Constants.ETFTeam.TF_TEAM_BLUE, "patrol_w2_0_a patrol_w2_0_b", [ ], [ {mins = Vector(-3296, -288, 64), maxs = Vector(-2848, 224, 640)}, {mins = Vector(-3296, 224, 64), maxs = Vector(-2720, 384, 640)}, ] ); // Pyro and demo ::Brush.BuildNavPrefer(Constants.ETFTeam.TF_TEAM_BLUE, "patrol_w2_1_a patrol_w2_1_b patrol_w2_1_c patrol_w2_1_d patrol_w2_2_a patrol_w2_2_b ", [ ], [ {mins = Vector(-2112, 640, 64), maxs = Vector(-1504, 2048, 528)}, {mins = Vector(-1440, 1152, 64), maxs = Vector(-1248, 1312, 448)}, {mins = Vector(-320, 1280, 32), maxs = Vector(0, 1696, 320)}, {mins = Vector(-1920, 1024, 32), maxs = Vector(0, 2048, 128)}, ] ); // Heavy /* ::Brush.BuildNavPrefer(Constants.ETFTeam.TF_TEAM_BLUE, "patrol_w2_2_a patrol_w2_2_b", [ ], [ {mins = Vector(-2688, 1728, 0), maxs = Vector(-1472, 2304, 576)}, ] ); */ // Gatebots ::Brush.BuildNavPrefer(Constants.ETFTeam.TF_TEAM_BLUE, "patrol_w2_gatebot_a", [ //{mins = Vector(-768, 1312, 32), maxs = Vector(-288, 1440, 224)}, ], [ {mins = Vector(-2784, -1568, 192), maxs = Vector(-2592, -1088, 544)}, {mins = Vector(-480, 1664, 224), maxs = Vector(0, 2144, 352)}, {mins = Vector(-480, 896, 224), maxs = Vector(0, 1376, 352)}, {mins = Vector(-2560, 640, 0), maxs = Vector(-2176, 1536, 384)}, {mins = Vector(-608, 1472, 32), maxs = Vector(-480, 1600, 224)}, {mins = Vector(-2624, -128, 256), maxs = Vector(-2432, 128, 448)}, ] ); // CORE BOSS ::Mission.handler_coreBoss <- ::CoreBoss.BuildCoreBoss(::Const.INVALID_VECTOR, QAngle(0.0, 0.0, 0.0), Constants.ETFTeam.TF_TEAM_BLUE, 20000); ::Mission.buildingPurge.AddException(::Mission.handler_coreBoss.handler_sapTarget.self); NavMesh.RegisterAvoidanceObstacle(::Mission.handler_coreBoss.self); ::SpawnContext.AddSpawnResponse([::Filter.BotFilter(true), ::Filter.TagFilter("core_boss")], function(player) { ::Mission.handler_coreBoss.SetSyncedPlayer(player); } ); ::Mission.handler_coreBoss.event_onDestroy.AddListener( function(params) { EntFire("cap_destroy_relay", "Trigger", "", -1.0); } ); // MAP SETUP // upgrade station PrecacheModel("models/props_mvm/mvm_upgrade_center.mdl"); local ent_upgradeCenterProp = SpawnEntityFromTable("prop_dynamic", { origin = Vector(-3456, -1600, 544), angles = QAngle(0.0, -90.0, 0.0), model = "models/props_mvm/mvm_upgrade_center.mdl", disableshadows = true, }); PrecacheModel("models/props_mvm/mvm_upgrade_tools.mdl"); local ent_upgradeToolsProp = SpawnEntityFromTable("prop_dynamic", { origin = Vector(-3456, -1600, 544), angles = QAngle(0.0, -90.0, 0.0), model = "models/props_mvm/mvm_upgrade_tools.mdl", disableshadows = true, }); local ent_upgrade = SpawnEntityFromTable("func_upgradestation", {}); ent_upgrade.SetSize(Vector(-3616, -1728, 544), Vector(-3296, -1600, 704)); ent_upgrade.SetSolid(Constants.ESolidType.SOLID_BBOX); // FINISH if (::Mission.doTransitionWave == false) { ::Wave.InitializeWave(); ::Mission.FinalizeSetup(); } RegisterScriptGameEventListener("round_start"); SendGlobalGameEvent("round_start", {});