mirror of
https://github.com/ProjectEQ/projecteqquests
synced 2026-08-12 00:26:10 -04:00
191 lines
7.8 KiB
Lua
191 lines
7.8 KiB
Lua
local event_started = false
|
|
local use_raidleader_emote = false
|
|
local use_taskmaster_emote = false
|
|
local goblins_arrived = 0
|
|
local goblin_count = 0
|
|
local warnings = 0
|
|
local spawn_locs = {
|
|
{ 720.0, 1469.0, 5.0, 511.0 },
|
|
{ 759.0, 972.0, 6.0, 511.0 },
|
|
{ 508.0, 913.0, 5.0, 511.0 },
|
|
{ 365.0, 896.0, -55.0, 511.0 },
|
|
}
|
|
|
|
local function reset_event()
|
|
eq.depop(237785) -- #Taskmaster_Suttalp
|
|
eq.depop(237786) -- #Raid_Leader_Sig_Chol
|
|
|
|
-- teleport all clients out of zone on event fail
|
|
local client_list = eq.get_entity_list():GetClientList()
|
|
for client in client_list.entries do
|
|
if client.valid then
|
|
client:MovePC(30, -5461.0, -848.0, 190.0, 0) -- everfrost
|
|
end
|
|
end
|
|
|
|
eq.depop_all(237784) -- #a_Frostfoot_henchman
|
|
eq.spawn2(237721, 0, 0, 649.0, 1223.0, 4.125, 0.0) -- #a_Frostfoot_scout
|
|
|
|
event_started = false
|
|
use_raidleader_emote = false
|
|
use_taskmaster_emote = false
|
|
goblins_arrived = 0
|
|
goblin_count = 0
|
|
next_emote = 0
|
|
warnings = 0
|
|
end
|
|
|
|
function scout_spawn(e)
|
|
e.self:SetSpecialAbility(SpecialAbility.immune_melee, 1)
|
|
e.self:SetSpecialAbility(SpecialAbility.immune_magic, 1)
|
|
e.self:SetSpecialAbility(SpecialAbility.immune_aggro, 1)
|
|
e.self:SetSpecialAbility(SpecialAbility.immune_aggro_on, 1)
|
|
e.self:SetRunning(true)
|
|
|
|
-- on live this triggers with an aggro emote at max 75 range (doorway)
|
|
local x = e.self:GetX()
|
|
local y = e.self:GetY()
|
|
eq.set_proximity(x - 75, x + 75, y - 75, y + 75)
|
|
end
|
|
|
|
function scout_enter(e)
|
|
if not event_started then
|
|
e.self:MoveTo(270, 945, -50, 0, true) -- Raid Leader's room (could use a grid for live accuracy)
|
|
event_started = true
|
|
end
|
|
end
|
|
|
|
function scout_waypoint_arrive(e)
|
|
-- todo: leader quest emotes are incorrectly hardcoded in database for some reason and occur on spawn
|
|
eq.zone_emote(MT.SayEcho, "A goblin in the distance shouts, 'NOW! Ambush them!'")
|
|
eq.spawn2(237786, 0, 0, 326.0, 1009.0, -53.625, 84) -- Raid Leader Sig Chol
|
|
eq.spawn2(237785, 0, 0, 713.0, 970.0, 6.25, 142) -- Taskmaster Suitalp
|
|
eq.depop()
|
|
end
|
|
|
|
local function spawn_goblin(from_raidleader)
|
|
-- an add is spawned by each leader every 10s which paths to scout room
|
|
local goblin_index = math.random(#spawn_locs)
|
|
|
|
-- leader emote conditions are related to spawning the goblin at x = 365
|
|
if goblin_index == #spawn_locs then
|
|
if from_raidleader then
|
|
use_raidleader_emote = true
|
|
else
|
|
use_taskmaster_emote = true
|
|
end
|
|
end
|
|
|
|
-- todo: sometimes rarely spawns a_Frostfoot_spellbreaker instead (not in db)
|
|
local loc = spawn_locs[goblin_index]
|
|
local goblin = eq.spawn2(237784, 0, 0, loc[1], loc[2], loc[3], loc[4]) -- #a_Frostfoot_henchman
|
|
goblin:CastToNPC():ModifyNPCStat("aggro", "350")
|
|
goblin:CastToNPC():ModifyNPCStat("assist", "350") -- assist aggro range on these is massive if los
|
|
goblin:CastToNPC():MoveTo(693.75, 1164.125, 5.625, 191.5, true) -- scout room
|
|
|
|
goblin_count = goblin_count + 1
|
|
|
|
-- at 30 spawned goblins the event is reset and clients are all teleported outside zone
|
|
if goblin_count == 7 and warnings == 0 then
|
|
eq.zone_emote(MT.Yellow, "It must be an ambush! An army of ice goblins are pouring forth, rushing in from every direction. Judging by the cacophony of shrill voices echoing in the distance there are many more on the way. Their leaders must be nearby...")
|
|
warnings = warnings + 1
|
|
elseif goblin_count == 13 and warnings == 1 then
|
|
eq.zone_emote(MT.Yellow, "The goblins continue to mercilessly assail you. Periodically you can make out the voices of the leaders barking orders. Perhaps eliminating the commanders would bring a cease to the onslaught.")
|
|
warnings = warnings + 1
|
|
elseif goblin_count == 19 and warnings == 2 then
|
|
eq.zone_emote(MT.Yellow, "The goblins are relentless. When one falls, three more appear to take its place. If their attacks persist much longer you will be forced out of the icy caverns.")
|
|
warnings = warnings + 1
|
|
elseif goblin_count == 25 and warnings == 3 then
|
|
eq.zone_emote(MT.Yellow, "Everywhere you turn is another Frostfoot goblin. Reflections of them flash in distorted patterns on the icy walls. Within moments they will overwhelm you and force you out of their lair.")
|
|
warnings = warnings + 1
|
|
elseif goblin_count == 30 and warnings == 4 then
|
|
eq.zone_emote(MT.Yellow, "You are overwhelmed by the Frostfoot horde.")
|
|
reset_event()
|
|
end
|
|
end
|
|
|
|
function goblin_waypoint_arrive(e)
|
|
eq.set_timer("depop", 25000) -- depop if at waypoint for 25s (combat resets this)
|
|
end
|
|
|
|
function goblin_combat(e)
|
|
if e.joined then
|
|
eq.stop_timer("depop")
|
|
else
|
|
-- they move back to destination immediately on feign death and restart depop timer at wp
|
|
-- hack: make sure goblin moves to destination and wp arrive triggers again
|
|
e.self:CastToNPC():SetGrid(-2)
|
|
e.self:CastToNPC():ResumeWandering() -- disable AI_walking_timer
|
|
e.self:CastToNPC():StopWandering() -- remove from temp grid so move works
|
|
e.self:CastToNPC():MoveTo(693.75, 1164.125, 5.625, 191.5, true)
|
|
end
|
|
end
|
|
|
|
function goblin_death(e)
|
|
goblin_count = math.max(0, goblin_count - 1)
|
|
end
|
|
|
|
function goblin_timer(e)
|
|
if e.timer == "depop" then
|
|
-- the first two goblins to arrive at dest depopped after 50s instead of 25s
|
|
if goblins_arrived < 2 then
|
|
goblins_arrived = goblins_arrived + 1
|
|
else
|
|
eq.depop()
|
|
goblin_count = math.max(0, goblin_count - 1)
|
|
end
|
|
end
|
|
end
|
|
|
|
function leader_spawn(e)
|
|
eq.set_timer("spawn_add", 10000) -- each leader spawns an add every 10s
|
|
eq.set_timer("emote", 5000)
|
|
end
|
|
|
|
function raidleader_death(e)
|
|
if not eq.get_entity_list():IsMobSpawnedByNpcTypeID(237785) then -- #Taskmaster_Suttalp
|
|
eq.depop_all(237784) -- #a_Frostfoot_henchman
|
|
end
|
|
end
|
|
|
|
function taskmaster_death(e)
|
|
if not eq.get_entity_list():IsMobSpawnedByNpcTypeID(237786) then -- #Raid_Leader_Sig_Chol
|
|
eq.depop_all(237784) -- #a_Frostfoot_henchman
|
|
end
|
|
end
|
|
|
|
function leader_timer(e)
|
|
local is_raidleader = (e.self:GetNPCTypeID() == 237786) -- #Raid_Leader_Sig_Chol
|
|
|
|
if e.timer == "spawn_add" then
|
|
spawn_goblin(is_raidleader)
|
|
elseif e.timer == "emote" then
|
|
-- emotes are a little convoluted to try to match live behavior (which isn't fully understood)
|
|
if is_raidleader and use_raidleader_emote then
|
|
eq.zone_emote(MT.Yellow, "Raid Leader Sig Chol shouts, 'To arms! Fend off the intruders and halt their attempts to proceed any further!'")
|
|
use_raidleader_emote = false
|
|
elseif use_taskmaster_emote then
|
|
eq.zone_emote(MT.Yellow, "Taskmaster Suttalp shouts, 'Don't just stand there! Attack the invaders! Overwhelm them!'")
|
|
use_taskmaster_emote = false
|
|
end
|
|
end
|
|
end
|
|
|
|
function event_encounter_load(e)
|
|
eq.register_npc_event("goblins", Event.spawn, 237721, scout_spawn) -- #a_Frostfoot_scout
|
|
eq.register_npc_event("goblins", Event.enter, 237721, scout_enter) -- #a_Frostfoot_scout
|
|
eq.register_npc_event("goblins", Event.waypoint_arrive, 237721, scout_waypoint_arrive) -- #a_Frostfoot_scout
|
|
|
|
eq.register_npc_event("goblins", Event.timer, 237784, goblin_timer) -- #a_Frostfoot_henchman
|
|
eq.register_npc_event("goblins", Event.death_complete, 237784, goblin_death) -- #a_Frostfoot_henchman
|
|
eq.register_npc_event("goblins", Event.combat, 237784, goblin_combat) -- #a_Frostfoot_henchman
|
|
eq.register_npc_event("goblins", Event.waypoint_arrive, 237784, goblin_waypoint_arrive) -- #a_Frostfoot_henchman
|
|
|
|
eq.register_npc_event("goblins", Event.spawn, 237786, leader_spawn) -- #Raid_Leader_Sig_Chol
|
|
eq.register_npc_event("goblins", Event.timer, 237786, leader_timer) -- #Raid_Leader_Sig_Chol
|
|
eq.register_npc_event("goblins", Event.death_complete, 237786, raidleader_death) -- #Raid_Leader_Sig_Chol
|
|
|
|
eq.register_npc_event("goblins", Event.spawn, 237785, leader_spawn) -- #Taskmaster_Suttalp
|
|
eq.register_npc_event("goblins", Event.timer, 237785, leader_timer) -- #Taskmaster_Suttalp
|
|
eq.register_npc_event("goblins", Event.death_complete, 237785, taskmaster_death) -- #Taskmaster_Suttalp
|
|
end
|