238 lines
12 KiB
Lua
238 lines
12 KiB
Lua
-----------------------------------
|
|
-- Unity Concord NPC Global
|
|
-----------------------------------
|
|
xi = xi or {}
|
|
xi.unity = xi.unity or {}
|
|
|
|
-- Table Format: Needs 10 RoE Objectives, All for One not set, All for One set, Unity Joined, Zone Directory Name
|
|
local zoneEventIds =
|
|
{
|
|
[xi.zone.SOUTHERN_SAN_DORIA] = { 3528, 3525, 3526, 3529 },
|
|
[xi.zone.BASTOK_MARKETS ] = { 597, 594, 595, 598 },
|
|
[xi.zone.WINDURST_WOODS ] = { 878, 875, 876, 879 },
|
|
[xi.zone.WESTERN_ADOULIN ] = { 5148, 5145, 5146, 5149 },
|
|
}
|
|
|
|
-- Table Format: X, Y, Z, Rot, Zone ID
|
|
local unityOptions =
|
|
{
|
|
[1] =
|
|
{ -- Unity Warp
|
|
[ 0] = { 176.000, -20.002, -240.000, 7, xi.zone.EAST_RONFAURE },
|
|
[ 1] = { -450.000, 38.750, -149.000, 95, xi.zone.SOUTH_GUSTABERG },
|
|
[ 2] = { 358.750, -12.375, 10.000, 127, xi.zone.EAST_SARUTABARUTA },
|
|
[ 3] = { 2.180, 0.000, 0.420, 114, xi.zone.LA_THEINE_PLATEAU },
|
|
[ 4] = { -112.100, 12.428, 271.180, 166, xi.zone.KONSCHTAT_HIGHLANDS },
|
|
[ 5] = { 360.000, -0.133, -45.000, 83, xi.zone.TAHRONGI_CANYON },
|
|
[ 6] = { 63.000, 1.149, -75.000, 179, xi.zone.VALKURM_DUNES },
|
|
[ 7] = { -325.560, -40.923, 286.500, 40, xi.zone.BUBURIMU_PENINSULA },
|
|
[ 8] = { 187.500, -21.374, -20.200, 131, xi.zone.QUFIM_ISLAND },
|
|
[ 9] = { 641.500, -20.000, 881.500, 85, xi.zone.BIBIKI_BAY },
|
|
[10] = { 34.500, -5.861, -740.820, 253, xi.zone.CARPENTERS_LANDING },
|
|
[11] = { -478.620, 16.301, -379.840, 0, xi.zone.YUHTUNGA_JUNGLE },
|
|
[12] = { 408.000, -0.375, -73.520, 99, xi.zone.LUFAISE_MEADOWS },
|
|
[13] = { 60.000, 0.549, -10.000, 192, xi.zone.JUGNER_FOREST },
|
|
[14] = { -499.000, 25.000, -597.500, 192, xi.zone.PASHHOW_MARSHLANDS },
|
|
[15] = { -159.220, -24.000, -560.320, 144, xi.zone.MERIPHATAUD_MOUNTAINS },
|
|
[16] = { 454.810, -11.415, -25.850, 91, xi.zone.EASTERN_ALTEPA_DESERT },
|
|
[17] = { 253.850, 3.228, 103.290, 81, xi.zone.YHOATOR_JUNGLE },
|
|
[18] = { 508.600, 2.450, -577.550, 143, xi.zone.THE_SANCTUARY_OF_ZITAH },
|
|
[19] = { -245.460, -32.247, 245.440, 31, xi.zone.MISAREAUX_COAST },
|
|
[20] = { -60.000, 5.209, 110.000, 192, xi.zone.LABYRINTH_OF_ONZOZO },
|
|
[21] = { -378.000, -4.000, -220.000, 0, xi.zone.BOSTAUNIEUX_OUBLIETTE },
|
|
[22] = { 439.530, 8.212, -151.750, 148, xi.zone.BATALLIA_DOWNS },
|
|
[23] = { -770.980, -35.768, -491.900, 222, xi.zone.ROLANBERRY_FIELDS },
|
|
[24] = { 303.910, 37.775, 305.350, 160, xi.zone.SAUROMUGUE_CHAMPAIGN },
|
|
[25] = { 120.570, -3.645, -179.600, 255, xi.zone.BEAUCEDINE_GLACIER },
|
|
[26] = { 576.200, 0.000, -264.850, 110, xi.zone.XARCABARD },
|
|
[27] = { 0.000, -8.000, -145.000, 192, xi.zone.ROMAEVE },
|
|
[28] = { 91.340, -1.167, -23.440, 127, xi.zone.WESTERN_ALTEPA_DESERT },
|
|
[29] = { -311.000, -5.085, 167.000, 111, xi.zone.ATTOHWA_CHASM },
|
|
[30] = { -300.000, 18.000, 322.500, 63, xi.zone.GARLAIGE_CITADEL },
|
|
[31] = { 80.000, 0.000, 259.000, 127, xi.zone.IFRITS_CAULDRON },
|
|
[32] = { -60.000, -19.329, 17.000, 15, xi.zone.THE_BOYAHDA_TREE },
|
|
[33] = { 27.450, -13.531, 264.000, 7, xi.zone.KUFTAL_TUNNEL },
|
|
[34] = { 18.500, 19.969, -105.500, 99, xi.zone.SEA_SERPENT_GROTTO },
|
|
[35] = { -60.000, -8.000, 82.000, 63, xi.zone.TEMPLE_OF_UGGALEPIH },
|
|
[36] = { 860.000, -8.094, -372.000, 63, xi.zone.QUICKSAND_CAVES },
|
|
[37] = { 100.000, -12.000, -163.000, 63, xi.zone.WAJAOM_WOODLANDS },
|
|
[38] = { 408.000, -0.375, -73.520, 99, xi.zone.LUFAISE_MEADOWS },
|
|
[39] = { 68.230, -6.185, 148.040, 0, xi.zone.CAPE_TERIGGAN },
|
|
[40] = nil, -- no option
|
|
[41] = { -418.320, -16.758, -103.470, 176, xi.zone.ULEGUERAND_RANGE },
|
|
[42] = { 23.750, 26.593, -259.740, 212, xi.zone.DEN_OF_RANCOR },
|
|
[43] = { -177.000, -23.979, -171.000, 232, xi.zone.FEIYIN },
|
|
[44] = nil, -- no option
|
|
[45] = { -100.000, -8.500, 20.000, 63, xi.zone.ALZADAAL_UNDERSEA_RUINS },
|
|
[46] = { -245.460, -32.247, 245.440, 31, xi.zone.MISAREAUX_COAST },
|
|
[47] = { -613.000, -21.301, 230.000, 224, xi.zone.MOUNT_ZHAYOLM },
|
|
[48] = { -60.000, -10.000, -119.000, 192, xi.zone.GUSTAV_TUNNEL },
|
|
[49] = { -183.100, -19.854, 57.900, 127, xi.zone.BEHEMOTHS_DOMINION },
|
|
[50] = { -60.000, -19.329, 17.000, 15, xi.zone.THE_BOYAHDA_TREE },
|
|
[51] = { -141.500, -5.511, 19.800, 31, xi.zone.VALLEY_OF_SORROWS },
|
|
[52] = { 100.000, -12.000, -163.000, 63, xi.zone.WAJAOM_WOODLANDS },
|
|
[53] = { -613.000, -21.301, 230.000, 224, xi.zone.MOUNT_ZHAYOLM },
|
|
[54] = { 660.000, -4.000, 239.500, 79, xi.zone.CAEDARVA_MIRE },
|
|
[55] = { 9.500, 21.123, 87.500, 0, xi.zone.AYDEEWA_SUBTERRANE },
|
|
},
|
|
|
|
[4] = -- Items (Item ID, askQuantity (0 = true), limitSize (99 = limit by accolades), cost)
|
|
{
|
|
[ 0] = { xi.item.REFRACTIVE_CRYSTAL, 0, 99, 15000 },
|
|
[ 1] = { xi.item.SPECIAL_GOBBIEDIAL_KEY, 0, 99, 15000 },
|
|
[ 2] = { xi.item.SCROLL_OF_INSTANT_WARP, 1, 1, 10 },
|
|
[ 3] = { xi.item.SCROLL_OF_INSTANT_RERAISE, 1, 1, 10 },
|
|
[ 4] = { xi.item.SCROLL_OF_INSTANT_PROTECT, 1, 1, 10 },
|
|
[ 5] = { xi.item.SCROLL_OF_INSTANT_SHELL, 1, 1, 10 },
|
|
[ 6] = { xi.item.MOIST_ROLANBERRY, 0, 99, 10 },
|
|
[ 7] = { xi.item.CLUMP_OF_RAVAGED_MOKO_GRASS, 0, 99, 10 },
|
|
[ 8] = { xi.item.CAVORTING_WORM, 0, 99, 10 },
|
|
[ 9] = { xi.item.LEVIGATED_ROCK, 0, 99, 10 },
|
|
[10] = { xi.item.LITTLE_LUGWORM, 0, 99, 10 },
|
|
[11] = { xi.item.TRAINING_MANUAL, 0, 99, 10 },
|
|
[12] = { xi.item.PINCH_OF_PRIZE_POWDER, 0, 99, 10 },
|
|
},
|
|
}
|
|
|
|
local function changeUnityLeader(player, leader)
|
|
player:setCharVar('unity_changed', 1)
|
|
player:setCurrency('current_accolades', 0)
|
|
player:setCurrency('prev_accolades', 0)
|
|
player:setUnityLeader(leader)
|
|
end
|
|
|
|
local function getChangeUnityCost(player, selection)
|
|
local currentRank = player:getUnityRank()
|
|
local newRank = player:getUnityRank(selection)
|
|
local changeCost = 500 * (11 - newRank) - 400 * (11 - currentRank)
|
|
|
|
if changeCost < 100 then
|
|
changeCost = 100
|
|
end
|
|
|
|
return changeCost
|
|
end
|
|
|
|
xi.unity.onTrade = function(player, npc, trade, eventid)
|
|
end
|
|
|
|
xi.unity.onTrigger = function(player, npc)
|
|
local zoneId = player:getZoneID()
|
|
local hasAllForOne = player:hasEminenceRecord(5)
|
|
local allForOneCompleted = player:getEminenceCompleted(5)
|
|
local accolades = player:getCurrency('unity_accolades')
|
|
local remainingLimit = xi.settings.main.WEEKLY_EXCHANGE_LIMIT - player:getCharVar('weekly_accolades_spent')
|
|
|
|
-- Check player total records completed
|
|
if player:getNumEminenceCompleted() < 10 then
|
|
player:startEvent(zoneEventIds[zoneId][1])
|
|
|
|
-- Check for 'All for One'
|
|
elseif
|
|
not hasAllForOne and
|
|
not allForOneCompleted
|
|
then
|
|
player:startEvent(zoneEventIds[zoneId][2])
|
|
|
|
-- First time selecting Unity
|
|
elseif not allForOneCompleted then
|
|
player:startEvent(zoneEventIds[zoneId][3])
|
|
else
|
|
player:startEvent(zoneEventIds[zoneId][4], 0, player:getUnityLeader(), accolades, remainingLimit, 0, 0, 0, 0)
|
|
end
|
|
end
|
|
|
|
xi.unity.onEventUpdate = function(player, csid, option, npc)
|
|
local zoneId = player:getZoneID()
|
|
local ID = zones[zoneId]
|
|
local accolades = player:getCurrency('unity_accolades')
|
|
local weeklyAccoladesSpent = player:getCharVar('weekly_accolades_spent')
|
|
local remainingLimit = xi.settings.main.WEEKLY_EXCHANGE_LIMIT - player:getCharVar('weekly_accolades_spent')
|
|
local category = bit.band(option, 0xF)
|
|
local selection = bit.band(bit.rshift(option, 5), 0xFF)
|
|
|
|
if csid == zoneEventIds[zoneId][4] then
|
|
if option == 10 then
|
|
player:updateEvent(0, 0, 0, remainingLimit, 0, 0, 0, 0)
|
|
|
|
-- Item Selected, enter amount/confirm
|
|
elseif category == 3 then
|
|
player:updateEvent(unityOptions[4][selection][2], unityOptions[4][selection][3], 0, 0, 0, 0, 0, player:getUnityLeader())
|
|
|
|
-- Attempt to grant the Item selected
|
|
elseif category == 4 then
|
|
local qty = bit.rshift(option, 13)
|
|
local itemId = unityOptions[category][selection][1]
|
|
local cost = unityOptions[category][selection][4] * qty
|
|
|
|
-- Fail-safe.
|
|
if
|
|
accolades < cost or
|
|
remainingLimit < cost
|
|
then
|
|
player:updateEvent(utils.MAX_UINT32)
|
|
|
|
return
|
|
end
|
|
|
|
-- Grant item and update limits.
|
|
if npcUtil.giveItem(player, { { itemId, qty } }) then
|
|
accolades = accolades - cost
|
|
player:delCurrency('unity_accolades', cost)
|
|
if xi.settings.main.ENABLE_EXCHANGE_LIMIT == 1 then
|
|
remainingLimit = remainingLimit - cost
|
|
player:setCharVar('weekly_accolades_spent', weeklyAccoladesSpent + cost)
|
|
end
|
|
|
|
player:updateEvent(itemId, qty, accolades, remainingLimit, 0, 0, 0, player:getUnityLeader())
|
|
else
|
|
player:updateEvent(utils.MAX_UINT32)
|
|
end
|
|
|
|
-- Change Unity
|
|
elseif category == 5 then
|
|
if player:getCharVar('unity_changed') == 1 then
|
|
player:updateEvent(utils.MAX_UINT32)
|
|
player:messageSpecial(ID.text.HAVE_ALREADY_CHANGED_UNITY, option)
|
|
else
|
|
local changeUnityCost = getChangeUnityCost(player, selection)
|
|
player:updateEvent(changeUnityCost, changeUnityCost)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
xi.unity.onEventFinish = function(player, csid, option, npc)
|
|
local zoneId = player:getZoneID()
|
|
local ID = zones[zoneId]
|
|
local category = bit.band(option, 0x1F)
|
|
local selection = bit.rshift(option, 5) -- This may need tuning for other menu options
|
|
|
|
-- First time joining Unity (Requirements met for num Objectives and All for One set)
|
|
if
|
|
csid == zoneEventIds[zoneId][3] and
|
|
option >= 1 and
|
|
option <= 11
|
|
then
|
|
changeUnityLeader(player, option)
|
|
xi.roe.onRecordTrigger(player, 5)
|
|
player:messageSpecial(ID.text.YOU_HAVE_JOINED_UNITY, option - 1)
|
|
|
|
-- Player is a member of a Unity
|
|
elseif csid == zoneEventIds[zoneId][4] then
|
|
|
|
-- Unity Warp
|
|
if category == 1 and unityOptions[category][selection] ~= nil then
|
|
player:delCurrency('unity_accolades', 100)
|
|
player:setPos(unpack(unityOptions[category][selection]))
|
|
|
|
-- Change Unity
|
|
elseif category == 6 then
|
|
local newUnityLeader = bit.band(selection, 0xF)
|
|
|
|
player:delCurrency('unity_accolades', getChangeUnityCost(player, newUnityLeader))
|
|
changeUnityLeader(player, newUnityLeader)
|
|
player:messageSpecial(ID.text.YOU_HAVE_JOINED_UNITY, newUnityLeader - 1)
|
|
end
|
|
end
|
|
end
|