landsandboat/scripts/globals/assault.lua
2026-02-20 18:42:33 -07:00

200 lines
6.3 KiB
Lua

-----------------------------------
-- Assault Utilities
-- desc: Common functionality for Assaults
-----------------------------------
require('scripts/globals/besieged')
require('scripts/globals/npc_util')
-----------------------------------
xi = xi or {}
xi.assault = xi.assault or {}
xi.assault.assaultOrders =
{
xi.ki.LEUJAOAM_ASSAULT_ORDERS,
xi.ki.MAMOOL_JA_ASSAULT_ORDERS,
xi.ki.LEBROS_ASSAULT_ORDERS,
xi.ki.PERIQIA_ASSAULT_ORDERS,
xi.ki.ILRUSI_ASSAULT_ORDERS,
xi.ki.NYZUL_ISLE_ASSAULT_ORDERS,
}
xi.assault.getAssaultArea = function(player)
return math.floor((player:getCurrentAssault() - 1) / 10)
end
xi.assault.hasOrders = function(player)
for _, assaultOrders in pairs(xi.assault.assaultOrders) do
if player:hasKeyItem(assaultOrders) then
return true
end
end
return false
end
xi.assault.onAssaultUpdate = function(player, csid, option, npc)
local ID = zones[player:getZoneID()]
local cap = bit.band(option, 0x03)
if cap == 0 then
cap = 0
elseif cap == 1 then
cap = 70
elseif cap == 2 then
cap = 60
else
cap = 50
end
player:setLocalVar('AssaultCap', cap)
if
player:getGMLevel() == 0 and
player:getPartySize() < xi.settings.main.ASSAULT_MINIMUM
then
player:messageSpecial(ID.text.MEMBER_TOO_FAR - 1, xi.settings.main.ASSAULT_MINIMUM)
player:instanceEntry(npc, 1)
return
elseif player:checkSoloPartyAlliance() == 2 then
player:messageText(player, ID.text.MEMBER_NO_REQS + 1, false)
player:instanceEntry(npc, 1)
return
end
end
xi.assault.onInstanceCreatedCallback = function(player, instance)
if instance then
instance:setLevelCap(player:getLocalVar('AssaultCap'))
player:setLocalVar('AssaultCap', 0)
player:setCharVar('Assault_Armband', 1)
player:delKeyItem(xi.ki.ASSAULT_ARMBAND)
else
local npc = player:getEventTarget()
player:messageText(player, zones[player:getZoneID()].text.CANNOT_ENTER, false)
player:instanceEntry(npc, 3)
end
end
xi.assault.afterInstanceRegister = function(player, fireFlies)
local instance = player:getInstance()
local assaultID = player:getCurrentAssault()
local levelCap = instance:getLevelCap()
local ID = zones[player:getZoneID()]
player:setCharVar('assaultEntered', assaultID)
player:messageSpecial(ID.text.ASSAULT_START_OFFSET + assaultID, assaultID)
player:messageSpecial(ID.text.TIME_TO_COMPLETE, instance:getTimeLimit())
player:addTempItem(fireFlies)
if levelCap ~= 0 then
player:addStatusEffect(xi.effect.LEVEL_RESTRICTION, { power = levelCap, origin = player })
end
for _, entity in pairs(ID.mob[assaultID].MOBS_START) do
SpawnMob(entity, instance)
end
end
xi.assault.onInstanceFailure = function(instance)
local chars = instance:getChars()
local mobs = instance:getMobs()
for _, entity in pairs(mobs) do
local mobID = entity:getID()
DespawnMob(mobID, instance)
end
for _, entity in pairs(chars) do
entity:messageSpecial(zones[instance:getZone():getID()].text.MISSION_FAILED, 10, 10)
entity:startEvent(102)
end
end
xi.assault.onInstanceComplete = function(instance, posX, posZ)
local chars = instance:getChars()
local ID = zones[instance:getZone():getID()]
GetNPCByID(ID.npc.RUNE_OF_RELEASE, instance):setStatus(xi.status.NORMAL)
GetNPCByID(ID.npc.ANCIENT_LOCKBOX, instance):setStatus(xi.status.NORMAL)
for _, entity in pairs(chars) do
entity:messageSpecial(ID.text.RUNE_UNLOCKED_POS, posX, posZ)
end
end
xi.assault.instanceOnEventFinish = function(player, csid, zone)
if csid == 102 then
local instance = player:getInstance()
local chars = instance:getChars()
for _, entity in pairs(chars) do
entity:setPos(0, 0, 0, 0, zone)
end
end
end
xi.assault.runeReleaseFinish = function(player, csid, option, npc)
if csid == 100 and option == 1 then
local instance = player:getInstance()
local chars = instance:getChars()
local zone = player:getZoneID()
local ID = zones[zone]
local playerpoints = math.max((#chars - 3) * 0.1, 0)
local points = 0
local assaultID = player:getCurrentAssault()
local mobs = instance:getMobs()
local pointsArea = xi.assault.getAssaultArea(player)
for _, entity in pairs(mobs) do
local mobID = entity:getID()
DespawnMob(mobID, instance)
end
for _, entity in pairs(chars) do
if entity:getLocalVar('AssaultPointsAwarded') == 0 then
entity:setLocalVar('AssaultPointsAwarded', 1)
local pointModifier = xi.assault.missionInfo[assaultID].minimumPoints
points = pointModifier - (pointModifier * playerpoints)
if entity:getCharVar('Assault_Armband') == 1 then
points = points * 1.1
end
if entity:hasCompletedAssault(assaultID) then
points = math.floor(points)
entity:setVar('AssaultPromotion', entity:getCharVar('AssaultPromotion') + 1)
entity:addAssaultPoint(pointsArea, points)
entity:messageSpecial(ID.text.ASSAULT_POINTS_OBTAINED, points)
else
points = math.floor(points * 1.5)
entity:setVar('AssaultPromotion', entity:getCharVar('AssaultPromotion') + 5)
entity:addAssaultPoint(pointsArea, points)
entity:messageSpecial(ID.text.ASSAULT_POINTS_OBTAINED, points)
end
entity:setVar('AssaultComplete', 1)
entity:startEvent(102)
end
end
end
end
xi.assault.adjustMobLevel = function(mob)
local instance = mob:getInstance()
local levelCap = instance:getLevelCap()
local reducedLevel = 0
local entity = GetMobByID(mob:getID(), instance)
if levelCap ~= 0 then
if levelCap == 70 then
reducedLevel = 5
elseif levelCap == 60 then
reducedLevel = 15
elseif levelCap == 50 then
reducedLevel = 25
end
if entity then
entity:setMobLevel(entity:getMainLvl() - reducedLevel)
end
end
end