mirror of
https://github.com/ProjectEQ/projecteqquests
synced 2026-08-12 00:26:10 -04:00
Add 'Holy Hour' Add 'Lair Unguarded' Add 'Simple Task' Add 'Scions of Thundercrest' Add 'Splitting the Storm' Add 'Throes of Contagion' Add 'Behind Closed Doors' Add 'House of the Autumn Rose' Add 'Plunder the Hoard' Refactor 'Goblin Dojo' raid
82 lines
4.4 KiB
Lua
82 lines
4.4 KiB
Lua
-- decay times are total elapsed seconds that a Dark Lady has been held by a client in zone
|
|
-- (e.g. first dark lady decays 30-35s depending on tick after pickup, then decays again 1m30s later)
|
|
-- note: live adds time for multiple dark ladys so decay time accmulates like a counter
|
|
local decay_table = {
|
|
{ item_id = 81896, next_id = 81897, decay_time = 30 }, -- Dark Lady
|
|
{ item_id = 81897, next_id = 81898, decay_time = eq.seconds("2m") }, -- Drooping Dark Lady
|
|
{ item_id = 81898, next_id = 81899, decay_time = eq.seconds("5m") }, -- Sickly Dark Lady
|
|
{ item_id = 81899, next_id = 81900, decay_time = eq.seconds("10m") }, -- Wilted Dark Lady
|
|
{ item_id = 81900, next_id = 81901, decay_time = eq.seconds("20m") }, -- Withered Dark Lady -> Dead Dark Lady
|
|
}
|
|
|
|
local kill_count = 0
|
|
local dark_lady_time = 0 -- total seconds Dark Lady has been in zone on any client (more like a counter)
|
|
|
|
local function simple_task_spawn(e)
|
|
eq.set_timer("process", 5 * 1000)
|
|
end
|
|
|
|
-- 1) Dark Lady time is incremented if a client in zone has one during check
|
|
-- 2) Zoning out with the Dark Lady pauses decay and zoning back in resumes where it left off
|
|
-- 3) Decay time increments for each Dark Lady per check (decays faster with multiple)
|
|
-- e.g. if 1 client has 2 Dark Lady items, each 5s check increments dark lady time +10 instead of +5
|
|
-- 4) Live limits to one decay on a client per tick, so it will decay once every 5s up to current decay state
|
|
local function simple_task_timer(e)
|
|
local where = bit.bor(InventoryWhere.Personal, InventoryWhere.Cursor)
|
|
local increment = 0 -- total increment for all Dark Ladys found this loop
|
|
|
|
local client_list = eq.get_entity_list():GetClientList()
|
|
for client in client_list.entries do
|
|
local decayed = false -- one decay for client per loop
|
|
local inv = client:GetInventory()
|
|
for i, dark_lady in ipairs(decay_table) do
|
|
if inv:HasItem(dark_lady.item_id, 1, where) ~= -1 then
|
|
eq.debug(("[%s] %s has Dark Lady item: %d decays at: %d decay time: %d"):format(os.date('%H:%M:%S'), client:GetName(), dark_lady.item_id, dark_lady.decay_time, dark_lady_time))
|
|
|
|
-- we don't break early on decay because client may have multiple Dark Ladys that each increment time
|
|
if not decayed and dark_lady_time > dark_lady.decay_time then
|
|
eq.debug(("[%s] Decaying Dark Lady on client: %s"):format(os.date('%H:%M:%S'), client:GetName()))
|
|
if i ~= #decay_table then -- last decay to Dead Dark Lady does not send message
|
|
client:Message(MT.Yellow, "The Dark Lady withers. It is only a matter of time before is dies. You know you must hurry and find a way to plant it properly.")
|
|
end
|
|
client:RemoveItem(dark_lady.item_id)
|
|
client:SummonItem(dark_lady.next_id)
|
|
decayed = true
|
|
end
|
|
|
|
increment = increment + 5 -- add elapsed for each Dark Lady
|
|
end
|
|
end
|
|
end
|
|
|
|
dark_lady_time = dark_lady_time + increment
|
|
end
|
|
|
|
-- Master Courier spawns after a number of npcs have been killed near garden.
|
|
-- live requires either waiting for respawns or dragging npcs to the area
|
|
local function zone_death(e)
|
|
local min_x = 1760 -- only kills near garden area beyond (west of) this x position count
|
|
local req_kills = 41 -- number of kills in garden area to trigger Master Courier spawn
|
|
if kill_count < req_kills and e.killed:GetX() > min_x and not e.killed:IsPet() then
|
|
kill_count = kill_count + 1
|
|
eq.debug("total kill count near garden: " .. kill_count)
|
|
if kill_count == req_kills then
|
|
eq.zone_emote(MT.Yellow, "A loud, hissing voice shouts, 'What is going on here? Someone shall answer to the Lady of the Tempest for their actions here!'")
|
|
eq.unique_spawn(340005, 19, 0, 2438.0, -174.0, 175.0, 256.0) -- #Master_Courier
|
|
end
|
|
end
|
|
end
|
|
|
|
-- todo: add proper master courier grid to db and remove this (this mimics it a little)
|
|
local function master_courier_arrive(e)
|
|
if e.self:GetGrid() == 19 and e.wp == 3 then
|
|
e.self:AssignWaypoints(17) -- switch to grid 17 inside garden
|
|
end
|
|
end
|
|
|
|
function event_encounter_load(e)
|
|
eq.register_npc_event(Event.death_zone, 10, zone_death) -- zone_controller (hardcoded id)
|
|
eq.register_npc_event(Event.spawn, 340570, simple_task_spawn) -- #Simple_Task_Invis
|
|
eq.register_npc_event(Event.timer, 340570, simple_task_timer)
|
|
eq.register_npc_event(Event.waypoint_arrive, 340005, master_courier_arrive) -- #Master_Courier
|
|
end
|