/*
 *  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", {});