peq-quests/anguish/zone_status.lua

271 lines
8.3 KiB
Lua

--[[
-- Anguish Zone_Status
-- Control the Player Lockouts
--
-- Lockouts:
-- Add - Bit - Mob/event
-- 1 - 1 - keldovan
-- 2 - 2 - jelvan
-- 3 - 4 - ture
-- 4 - 8 - hanvar
-- 5 - 16 - amv
-- 6 - 32 - omm
-- 7 - 64 - lower 2.0 orb
-- 8 - 128- upper 2.0 orb
-- 9 - 256- aug named
-- Mob IDs:
--
-- Zone Trash:
--
--]]
local instance_id = 0;
local Anguish_Lockouts = {};
local KELDOVAN_EVENT = "Keldovan the Harrier"
local JELVAN_EVENT = "Rescuing Jelvan"
local TURE_EVENT = "Ture"
local HANVAR_EVENT = "Warden Hanvar"
local AMV_EVENT = "Arch Magus Vangl"
local OMM_EVENT = "Overlord Mata Muram"
local LOWER_GLOBE_EVENT = "Lower Globe of Discordant Energy"
local UPPER_GLOBE_EVENT = "Upper Globe of Discordant Energy"
local REPLAY_EVENT = "Generals"
function setup_lockouts(expedition)
Anguish_Lockouts = {
[317005] = {KELDOVAN_EVENT, eq.seconds("4d12h"), Spawn_keldovan},
[317004] = {JELVAN_EVENT, eq.seconds("4d12h"), Spawn_jelvan},
[317003] = {TURE_EVENT, eq.seconds("4d12h"), Spawn_ture},
[317002] = {HANVAR_EVENT, eq.seconds("4d12h"), Spawn_hanvar},
[317107] = {AMV_EVENT, eq.seconds("4d12h"), PH_amv},
[317109] = {OMM_EVENT, eq.seconds("4d12h"), Spawn_omm},
[1] = {LOWER_GLOBE_EVENT, eq.seconds("4d12h"), PH_lorb},
[2] = {UPPER_GLOBE_EVENT, eq.seconds("4d12h"), PH_uorb},
[3] = {REPLAY_EVENT, eq.seconds("2h"), PH_augs}
};
-- this associates events with npcs to prevent looting by characters that have
-- the event lockout from another expedition. this is to prevent exploiting
-- to gain additional loot by characters added after an event is completed
expedition:SetLootEventByNPCTypeID(317005, KELDOVAN_EVENT) -- keldovan's body
expedition:SetLootEventByNPCTypeID(317111, JELVAN_EVENT) -- jelvan's keepsake chest
expedition:SetLootEventByNPCTypeID(317003, TURE_EVENT) -- ture's body
expedition:SetLootEventByNPCTypeID(317002, HANVAR_EVENT) -- hanvar's body
expedition:SetLootEventByNPCTypeID(317112, AMV_EVENT) -- amv ornate chest
expedition:SetLootEventByNPCTypeID(317109, OMM_EVENT) -- omm's body
-- the lower and upper orb events use the same npc type id (chest). these use
-- the more specific SetLootEventBySpawnID api after spawning the chests
end
function event_spawn(e)
local expedition = eq.get_expedition()
if expedition.valid then
setup_lockouts(expedition);
for k,v in pairs(Anguish_Lockouts) do
if v[3] and not expedition:HasLockout(v[1]) then
v[3]() -- boss spawning function
end
end
end
end
function Spawn_keldovan()
eq.unique_spawn(317005,0,0, -301 ,702, -201, 128); -- NPC: Keldovan_the_Harrier
end
function Spawn_jelvan()
eq.unique_spawn(317004,0,0, -256 ,2100, -121, 0); -- NPC: Jelvan
end
function Spawn_ture()
eq.unique_spawn(317003,0,0, 610, 3381, -12, 260); -- NPC: Ture
end
function Spawn_hanvar()
eq.unique_spawn(317002,0,0, 424, 4389, 222, 128); -- NPC: Warden_Hanvar
end
function PH_amv()
end
function Spawn_omm()
--always spawn AMV if OMM is up. AMV only drops chest on the first kill
eq.unique_spawn(317107,0,0, 366, 4886, 278, 0); -- NPC: Arch_Magus_Vangl
eq.unique_spawn(317109,0,0, 507, 4969, 296.5, 254); -- NPC: Overlord_Mata_Muram
end
function PH_lorb()
end
function PH_uorb()
end
function PH_augs()
end
function Check_lorb(expedition, lockout_name)
local spawned_orb = false
if not expedition:HasLockout(LOWER_GLOBE_EVENT) then
--if keldovan (1) and jelvan(2) dead spawn orb
if expedition:HasLockout(KELDOVAN_EVENT) and expedition:HasLockout(JELVAN_EVENT) then
AddLockout(Anguish_Lockouts[1]);
if lockout_name == KELDOVAN_EVENT then
local chest = eq.spawn2(317087,0,0, -301 ,702, -201, 0); -- NPC: Orb_of_Discordant_Energy
expedition:SetLootEventBySpawnID(chest:GetID(), LOWER_GLOBE_EVENT)
elseif lockout_name == JELVAN_EVENT then
eq.get_entity_list():GetNPCByNPCTypeID(317111):AddItem(47100,1); -- NPC: a_minor_scarab
end
spawned_orb = true
end
end
if not spawned_orb then
-- eq.debug("Check_lorb: No Lower Orb");
end
end
function Check_uorb(expedition, lockout_name)
local spawned_orb = false
if not expedition:HasLockout(UPPER_GLOBE_EVENT) then
--if ture (4) and hanvar(8) dead spawn orb
if expedition:HasLockout(TURE_EVENT) and expedition:HasLockout(HANVAR_EVENT) then
AddLockout(Anguish_Lockouts[2]);
if lockout_name == TURE_EVENT then
local chest = eq.spawn2(317087,0,0, 610, 3381, -12, 0); -- NPC: Orb_of_Discordant_Energy
expedition:SetLootEventBySpawnID(chest:GetID(), UPPER_GLOBE_EVENT)
elseif lockout_name == HANVAR_EVENT then
local chest = eq.spawn2(317087,0,0, 478, 4390, 209, 0); -- NPC: Orb_of_Discordant_Energy
expedition:SetLootEventBySpawnID(chest:GetID(), UPPER_GLOBE_EVENT)
end
spawned_orb = true
end
end
if not spawned_orb then
-- eq.debug("Check_uorb: No Upper Orb");
end
end
function Check_amv_chest(expedition, lockout_duration)
--spawn ornate chest only if amv lockout is not already set
--do not set AMV lockout if it already exists
if expedition:HasLockout(AMV_EVENT) then
-- eq.debug("Check_amv_chest: No Chest");
else
expedition:AddLockout(AMV_EVENT, lockout_duration)
eq.unique_spawn(317112,0,0, 366, 4886, 278, 0); --Ornate_Chest
end
end
function Spawn_augs()
local rolled_mob;
local num_mob = 0;
local mob_list = {};
local num_to_spawn;
local mob_in_list = false;
--#a_lightning_warrior_commander (317076) is placeholder
list_named = {
[1] = { 317094, 'Grenlok_the_Converter', 4, 1638, -204, 256},
[2] = { 317105, 'Vilria_the_Keeper', 204, 703, -202, 384},
[3] = { 317106, 'Damlin_Lingering_Charge', 355, 3815, 141, 384},
[4] = { 317078, 'First_Lieutenant_Minas', 345, 4642, 209.4, 256},
[5] = { 317077, 'Administrator_Charial', 20.75, 3811.7, 143, 128}
};
local diceroll = math.random(1,100);
if diceroll <= 20 then
num_to_spawn = 2;
elseif diceroll <= 50 then
num_to_spawn = 3;
elseif diceroll <= 80 then
num_to_spawn = 4;
else
num_to_spawn = 5;
end
while num_mob < num_to_spawn do
rolled_mob = list_named[math.random(1,5)][1];
mob_in_list = false;
for k,v in pairs(mob_list) do
if v == rolled_mob then
mob_in_list = true;
end
end
if not mob_in_list then
num_mob = num_mob + 1;
mob_list[num_mob] = rolled_mob;
end
end
local grid;
for i = 1, 5 do
mob_in_list = false
for k,v in pairs(mob_list) do
if v == list_named[i][1] then
mob_in_list = true;
end
end
if i == 4 then
grid = 16
else
grid = 0
end
if mob_in_list then
eq.spawn2(list_named[i][1],grid,0,list_named[i][3],list_named[i][4],list_named[i][5],list_named[i][6]);
else
eq.spawn2(317076,grid,0,list_named[i][3],list_named[i][4],list_named[i][5],list_named[i][6]); -- NPC: #a_lightning_warrior_commander
end
end
end
function AddLockout(lockout)
local lockout_name = lockout[1];
local lockout_duration = lockout[2];
local expedition = eq.get_expedition()
if expedition.valid then
--you cant blanket assign a lockout to AMV
if lockout_name == AMV_EVENT then
Check_amv_chest(expedition, lockout_duration);
else
-- this should add the lockout to:
-- 1) the expedition internally, so anyone that gets added after and zones in will receive it
-- 2) all current members of the expedition, even if they're in another zone
-- 3) all clients currently inside the dz instance in case members were removed but haven't been teleported out yet
expedition:AddLockout(lockout_name, lockout_duration)
--wait til after lockouts set to spawn in case of crash, etc
if lockout_name == REPLAY_EVENT then
expedition:AddReplayLockout(eq.seconds("2h"))
Spawn_augs();
elseif lockout_name == KELDOVAN_EVENT or lockout_name == JELVAN_EVENT then
Check_lorb(expedition, lockout_name);
elseif lockout_name == TURE_EVENT or lockout_name == HANVAR_EVENT then
Check_uorb(expedition, lockout_name);
end
end
end
end
function event_signal(e)
if e.signal == 999999 then
eq.depop_all(317122);
eq.depop_all(317114);
eq.depop_all(317123);
eq.depop_all(317117);
eq.unique_spawn(317124,0,0, 506, 4822, 278, 512); -- NPC: Overlords Chest
if math.random(100) <= 10 then -- 10% chance to spawn 2nd orb
eq.unique_spawn(317087,0,0, 507, 4969, 296.5, 254); -- NPC: Orb_of_Discordant_Energy
end
elseif Anguish_Lockouts[e.signal] ~= nil then
AddLockout(Anguish_Lockouts[e.signal]);
end
end