Sky Temple

Wiki
  • Temples activate in a fixed sequence. Depending on the round, 1 or 2 are active at once.
  • A controlled Temple fires at enemy Structures while held. After 40 shots, the final 5 fire automatically for the team holding it.
  • Temple shots hit the closest eligible enemy Structure. Fort-side outer Structures go first, then Keep-side inner ones; the Core only becomes a target after the rest are gone.
  • Once all active Temples are spent, the next Temple phase starts after a 2-minute cooldown, with a 30-second warning.

Objective Timers

EventDurationSecondsSource
First Temple3:00180slibMLCP_gv_mMSkyTempleFirstTempleStartTime_C
Temple Firing Stage0:4040slibMLCP_gv_mMSkyTempleTempleStageDuration_C
Temple Phase Cooldown2:00120slibMLCP_gv_mMSkyTempleTempleCooldown_C
Temple Warning0:3030slibMLCP_gv_mMSkyTempleTempleBlessWarningTimeLong_C

Temple Capture

Stand within a Temple's capture point to take control. An uncontested Temple fires at enemy Structures; if it's contested or abandoned, it stops firing. After 40 normal shots, the last 5 fire automatically in rapid succession for the team holding it.


    TriggerEnable(libMLCP_gt_MMSkyTempleAttacks, true);
    TriggerEnable(libMLCP_gt_MMSkyTempleTempleDefenderDies, true);
    auto3FC03D01_ae = libMLCP_gv_mMSkyTempleCount;
    lv_itTempleIndex = 1;
    for ( ; ( (auto3FC03D01_ai >= 0 && lv_itTempleIndex <= auto3FC03D01_ae) || (auto3FC03D01_ai < 0 && lv_itTempleIndex >= auto3FC03D01_ae) ) ; lv_itTempleIndex += auto3FC03D01_ai ) {
        libNtve_gf_CreateUnitsWithDefaultFacing(1, "InvisibleBeacon", c_unitCreateIgnorePlacement, UnitGetOwner(libMLCP_gv_mMSkyTemples[lv_itTempleIndex].lv_temple), PointWithOffset(UnitGetPosition(libMLCP_gv_mMSkyTemples[lv_itTempleIndex].lv_temple), 0.0, -7.5), null);
        libMLCP_gv_mMSkyTemples[lv_itTempleIndex].lv_beacon = UnitLastCreated();
        libMLCP_gv_mMSkyTemples[lv_itTempleIndex].lv_bannerSconce = UnitGroupUnit(UnitGroup("LootBannerSconce", c_playerAny, RegionCircle(UnitGetPosition(libMLCP_gv_mMSkyTemples[lv_itTempleIndex].lv_beacon), 10.0), UnitFilter(0, 0, 0, 0), 1), 1);
        libGame_gf_CapturePointCreate(UnitLastCreated(), libMLCP_gv_mMSkyTempleTempleCaptureRadius_C, libMLCP_gv_mMSkyTempleTempleCaptureTime_C, libMLCP_gv_mMSkyTempleTempleCaptureOverTime_C, libGame_ge_CapturePointDecay_Neutral, libGame_ge_CapturePointDecay_Neutral, true);
        libMLCP_gv_mMSkyTemples[lv_itTempleIndex].lv_beaconIndex = libGame_gf_LastCreatedCapturePoint();
        libNtve_gf_SendActorMessageToUnit(UnitLastCreated(), "SetScale 1.300000");
        libGame_gf_CapturePointDisable(libMLCP_gv_mMSkyTemples[lv_itTempleIndex].lv_beaconIndex);
        auto990D4B89_g = PlayerGroupAll();
        lv_itPlayer = -1;
        while (true) {
            	lv_itPlayer = PlayerGroupNextPlayer(auto990D4B89_g, lv_itPlayer);
            	if (lv_itPlayer<0) { break; }

Cannon Target Selection

Temple shots hit the closest eligible enemy Structure. Fort-side outer Structures are targeted first, then Keep-side inner ones. The Core is only targeted after everything else is destroyed.


        lv_itBuilding = UnitGroupUnitFromEnd(auto1493EB6F_g, auto1493EB6F_u);
        if (lv_itBuilding == null) { break; }
        if ((DistanceBetweenPoints(UnitGetPosition(lv_itBuilding), UnitGetPosition(lv_townHall)) > 10.0)) {
            UnitGroupAdd(lv_townOuterLoop, lv_itBuilding);
        }
        else {
            UnitGroupAdd(lv_townInnerLoop, lv_itBuilding);
        }
    }
    if ((libNtve_gf_UnitGroupIsDead(lv_townOuterLoop) == false)) {
        return UnitGroupClosestToPoint(lv_townOuterLoop, UnitGetPosition(libMLCP_gv_mMSkyTemples[lp_templeIndex].lv_temple));
    }

    if ((libNtve_gf_UnitGroupIsDead(lv_townInnerLoop) == false)) {
        return UnitGroupClosestToPoint(lv_townInnerLoop, UnitGetPosition(libMLCP_gv_mMSkyTemples[lp_templeIndex].lv_temple));
    }

    return null;
}

unitgroup libMLCP_gf_MMSkyTempleFinalShotNextTarget (int lp_templeIndex) {

Timer Source

libmlcp_h.galaxy — constants

const fixed libMLCP_gv_mMSkyTempleFirstTempleStartTime_C = 180.0;
const fixed libMLCP_gv_mMSkyTempleTempleBlessWarningTimeLong_C = 30.0;
const fixed libMLCP_gv_mMSkyTempleTempleCooldown_C = 120.0;
const fixed libMLCP_gv_mMSkyTempleTempleStageDuration_C = 40.0;

libmlcp.galaxy — timer start

    // Actions
    if (!runActions) {
        return true;
    }

    TimerStart(libMLCP_gv_mMSkyTempleObjectivePreviewTimer, libMLCP_gv_mMSkyTempleObjectivePreviewDelay_C, false, c_timeGame);
    Wait((libMLCP_gv_mMSkyTempleFirstTempleStartTime_C - libMLCP_gv_mMSkyTempleTempleBlessWarningTime), c_timeGame);
    if ((TriggerIsEnabled(TriggerGetCurrent()) == false)) {
        return true;
    }

    libMLCP_gf_MMSkyTemplePrepareTemples();
    return true;

// ...

        }

        Wait(1.0, c_timeGame);
    }
    TimerStart(libMLCP_gv_mMSkyTempleObjectivePreviewTimer, libMLCP_gv_mMSkyTempleObjectivePreviewDelay_C, false, c_timeGame);
    libMLCP_gf_MMSkyTempleTransmissionTempleDeactivatedQ(PlayerGroupAll());
    Wait((libMLCP_gv_mMSkyTempleTempleCooldown_C - libMLCP_gv_mMSkyTempleTempleBlessWarningTime), c_timeGame);
    libMLCP_gf_MMSkyTemplePrepareTemples();
    return true;
}

//--------------------------------------------------------------------------------------------------
void libMLCP_gt_MMSkyTempleBlessWarningTimerExpires_Init () {

Source Files