- 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
| Event | Duration | Seconds | Source |
|---|---|---|---|
| First Temple | 3:00 | 180s | libMLCP_gv_mMSkyTempleFirstTempleStartTime_C |
| Temple Firing Stage | 0:40 | 40s | libMLCP_gv_mMSkyTempleTempleStageDuration_C |
| Temple Phase Cooldown | 2:00 | 120s | libMLCP_gv_mMSkyTempleTempleCooldown_C |
| Temple Warning | 0:30 | 30s | libMLCP_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 () {