peq-quests/thundercrest/encounters/simple_task.lua
hg 72b564c1ce Add thundercrest missions
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
2022-11-20 18:06:46 -05:00

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