landsandboat/modules/custom/lua/custom_HNM_system.lua

177 lines
6.2 KiB
Lua

-----------------------------------
-- Common Requires
-----------------------------------
require('modules/module_utils')
require('scripts/globals/npc_util')
-----------------------------------
-- ID Requires
-----------------------------------
local dragonsAeryID = zones[xi.zone.DRAGONS_AERY]
local valleySorrowsID = zones[xi.zone.VALLEY_OF_SORROWS]
local behemothDomID = zones[xi.zone.BEHEMOTHS_DOMINION]
-----------------------------------
-- Module definition
-----------------------------------
-- This module attempts to mix both era and retail styles for Land Kings.
-- It allows NQ Kings to retain their era timed rotation while allowing HQ Kings to be poped from their QMs. For Uncle Teo.
-- It comes along a ToD perpetuation/retainment system, for server crashes, since this NMs were usually contested by endgame LSs.
local hnmSystem = Module:new('custom_HNM_System')
-----------------------------------
-- Module enable/disable
-----------------------------------
-- Do not use along era_HNM_System module. Choose one or the other.
hnmSystem:setEnabled(false)
-----------------------------------
-- Dragon's Aery: Fafnir, Nidhogg
-----------------------------------
hnmSystem:addOverride('xi.zones.Dragons_Aery.Zone.onInitialize', function(zone)
super(zone)
local hnmPopTime = GetServerVariable('[HNM]Fafnir') -- Time the NM will spawn at.
local currentTime = GetSystemTime()
-- First-time setup.
if hnmPopTime == 0 then
hnmPopTime = currentTime + math.randomInt(1, 48) * 1800
SetServerVariable('[HNM]Fafnir', hnmPopTime) -- Save pop time.
end
xi.mob.updateNMSpawnPoint(dragonsAeryID.mob.FAFNIR)
-- Spawn mob or set spawn time.
if hnmPopTime <= currentTime then
SpawnMob(dragonsAeryID.mob.FAFNIR)
else
GetMobByID(dragonsAeryID.mob.FAFNIR):setRespawnTime(hnmPopTime - currentTime)
end
end)
hnmSystem:addOverride('xi.zones.Dragons_Aery.mobs.Fafnir.onMobDespawn', function(mob)
super(mob)
-- Server Variable work.
local randomPopTime = 75600 + math.randomInt(0, 6) * 1800
SetServerVariable('[HNM]Fafnir', GetSystemTime() + randomPopTime) -- Save next pop time.
-- Set spawn time and position.
GetMobByID(dragonsAeryID.mob.FAFNIR):setRespawnTime(randomPopTime)
xi.mob.updateNMSpawnPoint(dragonsAeryID.mob.FAFNIR)
end)
hnmSystem:addOverride('xi.zones.Dragons_Aery.npcs.qm0.onTrade', function(player, npc, trade)
if
not GetMobByID(dragonsAeryID.mob.FAFNIR):isSpawned() and
not GetMobByID(dragonsAeryID.mob.NIDHOGG):isSpawned() and
npcUtil.tradeHasExactly(trade, xi.item.CUP_OF_SWEET_TEA) and
npcUtil.popFromQM(player, npc, dragonsAeryID.mob.NIDHOGG)
then
player:confirmTrade()
end
end)
-----------------------------------
-- Valley of Sorrows: Adamantoise, Aspidochelone
-----------------------------------
hnmSystem:addOverride('xi.zones.Valley_of_Sorrows.Zone.onInitialize', function(zone)
super(zone)
local hnmPopTime = GetServerVariable('[HNM]Adamantoise') -- Time the NM will spawn at.
local currentTime = GetSystemTime()
-- First-time setup.
if hnmPopTime == 0 then
hnmPopTime = currentTime + math.randomInt(1, 48) * 1800
SetServerVariable('[HNM]Adamantoise', hnmPopTime) -- Save pop time.
end
xi.mob.updateNMSpawnPoint(valleySorrowsID.mob.ADAMANTOISE)
-- Spawn mob or set spawn time.
if hnmPopTime <= currentTime then
SpawnMob(valleySorrowsID.mob.ADAMANTOISE)
else
GetMobByID(valleySorrowsID.mob.ADAMANTOISE):setRespawnTime(hnmPopTime - currentTime)
end
end)
hnmSystem:addOverride('xi.zones.Valley_of_Sorrows.mobs.Adamantoise.onMobDespawn', function(mob)
super(mob)
-- Server Variable work.
local randomPopTime = 75600 + math.randomInt(0, 6) * 1800
SetServerVariable('[HNM]Adamantoise', GetSystemTime() + randomPopTime) -- Save next pop time.
-- Set spawn time and position.
GetMobByID(valleySorrowsID.mob.ADAMANTOISE):setRespawnTime(randomPopTime)
xi.mob.updateNMSpawnPoint(valleySorrowsID.mob.ADAMANTOISE)
end)
hnmSystem:addOverride('xi.zones.Valley_of_Sorrows.npcs.qm1.onTrade', function(player, npc, trade)
if
not GetMobByID(valleySorrowsID.mob.ADAMANTOISE):isSpawned() and
not GetMobByID(valleySorrowsID.mob.ASPIDOCHELONE):isSpawned() and
npcUtil.tradeHasExactly(trade, xi.item.CLUMP_OF_RED_PONDWEED) and
npcUtil.popFromQM(player, npc, valleySorrowsID.mob.ASPIDOCHELONE)
then
player:confirmTrade()
end
end)
-----------------------------------
-- Behemoth's Dominion: Behemoth, King Behemoth
-----------------------------------
hnmSystem:addOverride('xi.zones.Behemoths_Dominion.Zone.onInitialize', function(zone)
super(zone)
local hnmPopTime = GetServerVariable('[HNM]Behemoth') -- Time the NM will spawn at.
local currentTime = GetSystemTime()
-- First-time setup.
if hnmPopTime == 0 then
hnmPopTime = currentTime + math.randomInt(1, 48) * 1800
SetServerVariable('[HNM]Behemoth', hnmPopTime) -- Save pop time.
end
xi.mob.updateNMSpawnPoint(behemothDomID.mob.BEHEMOTH)
-- Spawn mob or set spawn time.
if hnmPopTime <= currentTime then
SpawnMob(behemothDomID.mob.BEHEMOTH)
else
GetMobByID(behemothDomID.mob.BEHEMOTH):setRespawnTime(hnmPopTime - currentTime)
end
end)
hnmSystem:addOverride('xi.zones.Behemoths_Dominion.mobs.Behemoth.onMobDespawn', function(mob)
super(mob)
-- Server Variable work.
local randomPopTime = 75600 + math.randomInt(0, 6) * 1800
SetServerVariable('[HNM]Behemoth', GetSystemTime() + randomPopTime) -- Save next pop time.
-- Set spawn time and position.
GetMobByID(behemothDomID.mob.BEHEMOTH):setRespawnTime(randomPopTime)
xi.mob.updateNMSpawnPoint(behemothDomID.mob.BEHEMOTH)
end)
hnmSystem:addOverride('xi.zones.Behemoths_Dominion.npcs.qm2.onTrade', function(player, npc, trade)
if
not GetMobByID(behemothDomID.mob.BEHEMOTH):isSpawned() and
not GetMobByID(behemothDomID.mob.KING_BEHEMOTH):isSpawned() and
npcUtil.tradeHasExactly(trade, xi.item.SAVORY_SHANK) and
npcUtil.popFromQM(player, npc, behemothDomID.mob.KING_BEHEMOTH)
then
player:confirmTrade()
end
end)
return hnmSystem