71 lines
3.0 KiB
Lua
71 lines
3.0 KiB
Lua
require "QMIA_State"
|
|
require "IAArrange"
|
|
require "TimedActions/IAArrangeAction"
|
|
|
|
-- Use Item Arrange's actual drop/arrange implementation and duration. Keeping this
|
|
-- class in shared makes its complete() available to Build 42 multiplayer servers.
|
|
QMIArrangeAction = IAArrangeAction:derive("QMIArrangeAction")
|
|
|
|
function QMIArrangeAction:new(character, item, srcContainer, destContainer)
|
|
local obj = QMIA.containerTarget(destContainer)
|
|
local o = IAArrangeAction.new(self, character, item, srcContainer, obj and obj:getSquare())
|
|
o.destContainer = destContainer
|
|
o.stopOnWalk = true
|
|
o.stopOnRun = true
|
|
o.stopOnAim = true
|
|
return o
|
|
end
|
|
|
|
-- A full surface / missing load must not cancel the remaining Quartermaster haul.
|
|
-- Revalidate at start and complete instead; skipped items stay in their carrier.
|
|
function QMIArrangeAction:isValid() return true end
|
|
|
|
function QMIArrangeAction:canArrange()
|
|
local item, src, square, player = self.item, self.srcContainer, self.dropSquare, self.character
|
|
if not item or not src or not square or not player then return false end
|
|
local obj, ci = QMIA.containerTarget(self.destContainer)
|
|
if not obj or obj:getObjectIndex() < 0 or obj:getSquare() ~= square
|
|
or not QMIA.isMarked(obj, ci) then return false end
|
|
-- Only unload carried items. A skipped Quartermaster load is never teleported.
|
|
if not src:isInCharacterInventory(player) or not src:contains(item)
|
|
or item:getContainer() ~= src or not src:isRemoveItemAllowed(item) then return false end
|
|
if item:isEquipped() or item:isFavorite() or item:getIsCraftingConsumed() then return false end
|
|
if not QMIA.canAccess(square, player) then return false end
|
|
local here = player:getSquare()
|
|
if not here or here:getZ() ~= square:getZ()
|
|
or math.abs(here:getX() - square:getX()) > 1
|
|
or math.abs(here:getY() - square:getY()) > 1
|
|
or here:isSomethingTo(square) then return false end
|
|
return IA.CheckSpace(square, item) == true
|
|
end
|
|
|
|
function QMIArrangeAction:waitToStart()
|
|
if not self:canArrange() then return false end
|
|
self.character:faceLocation(self.dropSquare:getX(), self.dropSquare:getY())
|
|
local waitingForTransaction = IAArrangeAction.waitToStart(self)
|
|
return self.character:shouldBeTurning() or waitingForTransaction
|
|
end
|
|
|
|
function QMIArrangeAction:start()
|
|
self.qmiaSkip = not self:canArrange()
|
|
if self.qmiaSkip then
|
|
self.action:setTime(0)
|
|
return
|
|
end
|
|
self.character:faceLocation(self.dropSquare:getX(), self.dropSquare:getY())
|
|
IAArrangeAction.start(self)
|
|
end
|
|
|
|
function QMIArrangeAction:update()
|
|
if self.qmiaSkip then return end
|
|
self.character:faceLocation(self.dropSquare:getX(), self.dropSquare:getY())
|
|
IAArrangeAction.update(self)
|
|
end
|
|
|
|
function QMIArrangeAction:complete()
|
|
-- The server rechecks ownership, distance and available space immediately
|
|
-- before using Item Arrange's own removal/drop/arrange implementation.
|
|
if self.qmiaSkip or not self:canArrange() then return true end
|
|
return IAArrangeAction.complete(self)
|
|
end
|