mirror of
https://github.com/otland/forgottenserver
synced 2026-08-15 16:32:07 -04:00
118 lines
3.6 KiB
Lua
118 lines
3.6 KiB
Lua
-- If you don't intend to use actions.xml, you can delete this file.
|
|
local function getIds(singleIdKey, fromIdKey, toIdKey)
|
|
return function(node)
|
|
local itemid = node:attribute(singleIdKey)
|
|
if itemid then
|
|
local ids = {}
|
|
for _, itemid in ipairs(itemid:split(";")) do ids[#ids + 1] = tonumber(itemid) end
|
|
return ids
|
|
end
|
|
|
|
local fromid = tonumber(node:attribute(fromIdKey))
|
|
if not fromid then return {} end
|
|
|
|
local toid = tonumber(node:attribute(toIdKey))
|
|
if not toid then
|
|
io.write("[Error] Missing attribute " .. toIdKey .. ", check data/actions/actions.xml.\n")
|
|
return {}
|
|
end
|
|
|
|
local ids = {}
|
|
for id = fromid, toid do ids[#ids + 1] = id end
|
|
return ids
|
|
end
|
|
end
|
|
|
|
local getItemIds = getIds("itemid", "fromid", "toid")
|
|
local getActionIds = getIds("actionid", "fromaid", "toaid")
|
|
local getUniqueIds = getIds("uniqueid", "fromuid", "touid")
|
|
|
|
local function configureActionEvent(node)
|
|
local action = Action()
|
|
|
|
local itemIds = getItemIds(node)
|
|
if #itemIds == 0 then
|
|
local uniqueIds = getUniqueIds(node)
|
|
|
|
if #uniqueIds == 0 then
|
|
local actionIds = getActionIds(node)
|
|
|
|
if #actionIds == 0 then
|
|
io.write("[Error] Missing attribute itemid or uniqueid or actionid, check 'data/actions/actions.xml'.\n")
|
|
return nil
|
|
end
|
|
|
|
action:aid(unpack(actionIds))
|
|
else
|
|
action:uid(unpack(uniqueIds))
|
|
end
|
|
else
|
|
action:id(unpack(itemIds))
|
|
end
|
|
|
|
local allowFarUse = tobool(node:attribute("allowfaruse"))
|
|
if allowFarUse ~= nil then action:allowFarUse(allowFarUse) end
|
|
|
|
local blockWalls = tobool(node:attribute("blockwalls"))
|
|
if blockWalls ~= nil then action:blockWalls(blockWalls) end
|
|
|
|
local checkFloor = tobool(node:attribute("checkfloor"))
|
|
if checkFloor ~= nil then action:checkFloor(checkFloor) end
|
|
|
|
local function_ = node:attribute("function")
|
|
local script = node:attribute("script")
|
|
if not function_ and not script then
|
|
io.write("[Warning] function or script attribute missing for action '" .. name .. "'.\n")
|
|
return nil
|
|
end
|
|
|
|
if function_ then
|
|
if function_ ~= "market" then
|
|
io.write("[Error] Invalid function attribute, check 'data/actions/actions.xml'.\n")
|
|
return nil
|
|
end
|
|
|
|
function action.onUse(player, item, fromPosition, target, toPosition, isHotkey) return player:sendEnterMarket() end
|
|
end
|
|
|
|
if script then
|
|
local scriptFile = "data/actions/scripts/" .. script
|
|
dofile(scriptFile)
|
|
if not onUse then
|
|
io.write("[Error] Can not load action script, check '" .. scriptFile .. "' for a missing onUse callback\n")
|
|
return nil
|
|
end
|
|
|
|
action:onUse(onUse)
|
|
|
|
-- let it be garbage collected
|
|
onUse = nil
|
|
end
|
|
|
|
return action
|
|
end
|
|
|
|
local function loadXMLActions()
|
|
local doc = XMLDocument("data/actions/actions.xml")
|
|
if not doc then
|
|
io.write("[Warning - Scripts::XML::loadXMLActions] Could not load actions.xml.\n")
|
|
return
|
|
end
|
|
|
|
local actions = doc:child("actions")
|
|
|
|
io.write(">> Loading legacy XML actions from data/actions/actions.xml...\n")
|
|
|
|
local loaded, start = 0, os.mtime()
|
|
for node in actions:children() do
|
|
local action = configureActionEvent(node)
|
|
if action then
|
|
action:register()
|
|
loaded = loaded + 1
|
|
end
|
|
end
|
|
|
|
io.write(">> Loaded " .. loaded .. " actions in " .. os.mtime() - start .. "ms.\n")
|
|
end
|
|
|
|
loadXMLActions()
|