/* * Author: Needles * https://steamcommunity.com/profiles/76561198026257137/ */ printl("*** WAVE1"); IncludeScript("needles/missions/mvm_hoovydam_b10_rev_adv_insurgent/mission.nut"); ::Wave <- {}; local Wave1Handler = class extends ::Handler.BaseHandler { function OnEvent_WaveStart(params) { ::Debug.Print("*** WAVE - Wave 1 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(144, -336, 320)); ::Mission.handler_coreBoss.ShowAnnotation(); ::Highlight.AddHighlight(::Mission.handler_coreBoss.self, null); } } } ::Handler.RegisterHandler("wave", @() Wave1Handler()); ::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 1 intialized"); } // GATE EntFire("gate2_capturepoint_b", "SetOwner", "2", 1.1); EntFire("gate2_door_trigger", "Enable", "", 1.1); EntFire("gate2_door_alarm", "Enable", "", 1.1); EntFire("gate1_capturepoint_a", "SetOwner", "3", 1.1); EntFire("gate1_door_trigger", "Disable", "", 1.1); EntFire("gate1_door_alarm", "Disable", "", 1.1); // WAVEBAR // @TODO - Create custom wavebar system // RED spawns ::SpawnContext.ClearSpawnPoints(); ::Mission.redSpawnListSetup <- [ ::SpawnContext.AddSpawnPoint(Vector(-576, 2560, 356), QAngle(0, 180, 0), [::Filter.TFTeamFilter(Constants.ETFTeam.TF_TEAM_RED)]), ::SpawnContext.AddSpawnPoint(Vector(-576, 2624, 356), QAngle(0, 180, 0), [::Filter.TFTeamFilter(Constants.ETFTeam.TF_TEAM_RED)]), ::SpawnContext.AddSpawnPoint(Vector(-576, 2688, 356), QAngle(0, 180, 0), [::Filter.TFTeamFilter(Constants.ETFTeam.TF_TEAM_RED)]), ::SpawnContext.AddSpawnPoint(Vector(-640, 2560, 356), QAngle(0, 180, 0), [::Filter.TFTeamFilter(Constants.ETFTeam.TF_TEAM_RED)]), ::SpawnContext.AddSpawnPoint(Vector(-640, 2624, 356), QAngle(0, 180, 0), [::Filter.TFTeamFilter(Constants.ETFTeam.TF_TEAM_RED)]), ::SpawnContext.AddSpawnPoint(Vector(-640, 2688, 356), QAngle(0, 180, 0), [::Filter.TFTeamFilter(Constants.ETFTeam.TF_TEAM_RED)]), ]; ::Mission.redSpawnListWave <- [ ::SpawnContext.AddSpawnPoint(Vector(-1472, 2176, 308), QAngle(0, -90, 0), [::Filter.TFTeamFilter(Constants.ETFTeam.TF_TEAM_RED)], false), ::SpawnContext.AddSpawnPoint(Vector(-1408, 2176, 308), QAngle(0, -90, 0), [::Filter.TFTeamFilter(Constants.ETFTeam.TF_TEAM_RED)], false), ::SpawnContext.AddSpawnPoint(Vector(-1344, 2176, 308), QAngle(0, -90, 0), [::Filter.TFTeamFilter(Constants.ETFTeam.TF_TEAM_RED)], false), ::SpawnContext.AddSpawnPoint(Vector(-1280, 2176, 308), QAngle(0, -90, 0), [::Filter.TFTeamFilter(Constants.ETFTeam.TF_TEAM_RED)], false), ::SpawnContext.AddSpawnPoint(Vector(-1216, 2176, 308), QAngle(0, -90, 0), [::Filter.TFTeamFilter(Constants.ETFTeam.TF_TEAM_RED)], false), ::SpawnContext.AddSpawnPoint(Vector(-1152, 2176, 308), QAngle(0, -90, 0), [::Filter.TFTeamFilter(Constants.ETFTeam.TF_TEAM_RED)], false), ]; // SPAWN GROUPS + ROBOT SPAWN POINTS ::SpawnGroup.ClearSpawnGroups(); ::SpawnGroup.AddSpawnGroup("spawn_group_scout_0", 4, 6, 10.0, 0.0); ::SpawnGroup.AddSpawnGroup("spawn_group_huntsman_0", 3, 6, 15.0, 15.0); ::SpawnGroup.AddSpawnGroup("spawn_group_soldier_uber_0", 2, 2, 20.0, 20.0); ::SpawnGroup.AddSpawnGroup("spawn_group_heavy_uber_0", 2, 2, 20.0, 20.0); ::SpawnGroup.AddSpawnGroup("spawn_group_soldier_crit_0", 1, 1, 35.0, 10.0); ::SpawnGroup.AddSpawnGroup("spawn_group_heavy_crit", 1, 1, 35.0, 10.0); ::SpawnPoint.ClearSpawnPoints(); ::SpawnPoint.BuildSpawnPoint(Vector(-2320, 1632, 64), QAngle(0, 0, 0), ::SpawnGroup.GetSpawnGroupByTag("spawn_group_scout_0"), ::SpawnPoint.GetClassIconPath("scout")); ::SpawnPoint.BuildSpawnPoint(Vector(864, 736, 384), QAngle(0, 0, 0), ::SpawnGroup.GetSpawnGroupByTag("spawn_group_huntsman_0"), ::SpawnPoint.GetClassIconPath("sniper_bow")); ::SpawnPoint.BuildSpawnPoint(Vector(800, -640, 448), QAngle(0, 0, 0), ::SpawnGroup.GetSpawnGroupByTag("spawn_group_soldier_uber_0"), ::SpawnPoint.GetClassIconPath("demo")); ::SpawnPoint.BuildSpawnPoint(Vector(704, -640, 448), QAngle(0, 0, 0), ::SpawnGroup.GetSpawnGroupByTag("spawn_group_heavy_uber_0"), ::SpawnPoint.GetClassIconPath("heavy")); PrecacheSound("mvm/mvm_tele_deliver.wav"); ::Mission.handler_gatebotSpawnPoint <- ::SpawnPoint.BuildSpawnPoint(Vector(128, 128, 320), QAngle(0, 0, 0), ::SpawnGroup.GetSpawnGroupByTag("spawn_group_soldier_crit_0"), ::SpawnPoint.GetClassIconPath("soldier_crit"), "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(); ::Patrol.BuildPatrolNode("patrol_0_a", null, 0.0, Vector(288, 736, 480), {mins = Vector(128, 576, 448), maxs = Vector(384, 896, 512)}); ::Patrol.BuildPatrolNode("patrol_0_b", null, 0.0, Vector(-64, 736, 480), {mins = Vector(-256, 576, 448), maxs = Vector(128, 896, 512)}); ::Patrol.BuildPatrolNode("patrol_0_c", null, 0.0, Vector(-448, 736, 480), {mins = Vector(-640, 576, 448), maxs = Vector(-256, 896, 512)}); ::Patrol.BuildPatrolNode("patrol_0_d", null, 0.0, Vector(-832, 736, 480), {mins = Vector(-896, 576, 448), maxs = Vector(-640, 896, 512)}); ::Patrol.BuildPatrolNode("patrol_1_a", null, 5.0, Vector(-1408, 2240, 272), {mins = Vector(0, 0, 0), maxs = Vector(0, 0, 0)}); ::Patrol.BuildPatrolNode("patrol_2_a", "patrol_2_b", 5.0, Vector(672, 288, 480), {mins = Vector(544, 32, 384), maxs = Vector(800, 416, 576)}); ::Patrol.BuildPatrolNode("patrol_2_b", "patrol_2_a", 5.0, Vector(704, -384, 480), {mins = Vector(576, -512, 384), maxs = Vector(832, -256, 576)}); ::Patrol.BuildPatrolNode("patrol_3_a", "patrol_3_b", 0.0, Vector(-1520, 768, 288), {mins = Vector(-1632, 640, 256), maxs = Vector(-1184, 864, 352)}); ::Patrol.BuildPatrolNode("patrol_3_b", "patrol_3_a", 0.0, Vector(-832, 736, 480), {mins = Vector(-896, 576, 448), maxs = Vector(-640, 896, 512)}); ::Patrol.BuildPatrolNode("patrol_4_a", "patrol_4_b", 5.0, Vector(-512, 1280, 288), {mins = Vector(-768, 832, 256), maxs = Vector(-256, 1408, 384)}); ::Patrol.BuildPatrolNode("patrol_4_b", "patrol_4_a", 5.0, Vector(-768, 1792, 288), {mins = Vector(-1024, 1600, 256), maxs = Vector(-512, 2176, 384)}); ::Patrol.BuildPatrolNode("patrol_5_a", "patrol_5_b", 2.0, Vector(448, -416, 352), {mins = Vector(320, -544, 320), maxs = Vector(576, -288, 448)}); ::Patrol.BuildPatrolNode("patrol_5_b", "patrol_5_c", 2.0, Vector(448, 224, 352), {mins = Vector(320, 96, 320), maxs = Vector(576, 352, 448)}); ::Patrol.BuildPatrolNode("patrol_5_c", "patrol_5_d", 5.0, Vector(-1408, 224, 288), {mins = Vector(-1600, 32, 256), maxs = Vector(-1216, 416, 384)}); ::Patrol.BuildPatrolNode("patrol_5_d", "patrol_5_a", 2.0, Vector(-64, -416, 352), {mins = Vector(-192, -544, 320), maxs = Vector(64, -288, 448)}); // NAV ROUTES // // @TODO - Need a better way to do this... Create individual nav areas in important places, name those places, then assign tags to create paths // Generic sucky nav avoider ::Brush.BuildNavPrefer(Constants.ETFTeam.TF_TEAM_BLUE, "patrol_3_a patrol_3_b patrol_3_c patrol_3_d", [ ], [ {mins = Vector(576, 544, 320), maxs = Vector(800, 704, 416)}, ] ); // Huntsman battlements path ::Brush.BuildNavPrefer(Constants.ETFTeam.TF_TEAM_BLUE, "patrol_0_a patrol_0_b patrol_0_c patrol_0_d", [ {mins = Vector(432, -896, 448), maxs = Vector(912, -656, 512)}, {mins = Vector(608, -656, 448), maxs = Vector(928, 64, 512)}, {mins = Vector(544, 64, 448), maxs = Vector(544, 64, 448)}, {mins = Vector(544, 384, 320), maxs = Vector(928, 640, 512)}, {mins = Vector(-896, 640, 320), maxs = Vector(928, 896, 512)}, ], [ ] ); // Annoying heavy path a ::Brush.BuildNavPrefer(Constants.ETFTeam.TF_TEAM_BLUE, "patrol_3_a", [ ], [ {mins = Vector(-1664, -320, 128), maxs = Vector(-1120, 352, 512)}, ] ); // Annoying heavy path b ::Brush.BuildNavPrefer(Constants.ETFTeam.TF_TEAM_BLUE, "patrol_3_b", [ ], [ {mins = Vector(-1184, 640, 256), maxs = Vector(-832, 896, 576)}, ] ); // Canal path ::Brush.BuildNavPrefer(Constants.ETFTeam.TF_TEAM_BLUE, "patrol_4_a patrol_4_b", [ ], [ {mins = Vector(-2688, 1728, 0), maxs = Vector(-1472, 2304, 576)}, ] ); // Main gatebot path ::Brush.BuildNavPrefer(Constants.ETFTeam.TF_TEAM_BLUE, "patrol_1_a", [ {mins = Vector(-736, 32, 320), maxs = Vector(-256, 384, 384)}, {mins = Vector(-736, -160, 320), maxs = Vector(-384, 32, 384)}, {mins = Vector(-992, -512, 256), maxs = Vector(-384, -160, 384)}, {mins = Vector(-1184, -512, 256), maxs = Vector(-992, 0, 320)}, {mins = Vector(-1632, -512, 256), maxs = Vector(-1184, 864, 320)}, {mins = Vector(-1632, 864, 256), maxs = Vector(-1184, 1152, 320)}, {mins = Vector(-1184, 864, 256), maxs = Vector(0, 1280, 320)}, {mins = Vector(0, 864, 256), maxs = Vector(384, 2368, 320)}, {mins = Vector(-1600, 1664, 256), maxs = Vector(0, 2368, 320)}, ], [ {mins = Vector(-1440, 1152, 64), maxs = Vector(-1248, 1312, 448)}, {mins = Vector(-1152, 0, 320), maxs = Vector(-768, 384, 512)}, ] ); // CORE BOSS ::Mission.handler_coreBoss <- ::CoreBoss.BuildCoreBoss(::Const.INVALID_VECTOR, QAngle(0.0, 0.0, 0.0), Constants.ETFTeam.TF_TEAM_BLUE, 15000); ::Mission.buildingPurge.AddException(::Mission.handler_coreBoss.handler_sapTarget.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(-736, 2367, 304), 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(-736, 2367, 304), 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(-864, 2368, 304), Vector(-592, 2496, 416)); ent_upgrade.SetSolid(Constants.ESolidType.SOLID_BBOX); // Spawn a big arrow to tell red where to go PrecacheModel("models/props_hydro/cap_point_arrow_small.mdl"); local ent_arrowProp = SpawnEntityFromTable("prop_dynamic", { origin = Vector(-1664, 656, 648), angles = QAngle(0.0, 90.0, -135.0), model = "models/props_hydro/cap_point_arrow_small.mdl", disableshadows = true, }); // FINISH if (::Mission.doTransitionWave == false) { ::Wave.InitializeWave(); ::Mission.FinalizeSetup(); } RegisterScriptGameEventListener("round_start"); SendGlobalGameEvent("round_start", {});