forgottenserver/data/scripts/xml/actions.lua
Ramon Bernardo 2aab26709d
Fix reload XML files from lua (#4844)
* Fix reload XML files from lua

* Fix error message
2024-11-24 23:02:59 +01:00

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()