yl_api_nodestages/api.lua
2024-07-07 23:43:22 +02:00

308 lines
8.6 KiB
Lua

-- get_stage
--
local function get_stage(modname, nodename)
if (minetest.get_modpath(modname) == nil) then
return false, yl_api_nodestages.t("modname_does_not_exist")
end
local def = minetest.registered_nodes[modname .. ":" .. nodename]
if (def == nil) then
return false, yl_api_nodestages.t("node_does_not_exist")
end
local stage = def._stage
if (stage == nil) then
return false, yl_api_nodestages.t("node_does_not_have_stage")
end
if (type(stage) ~= "table") then
return false, yl_api_nodestages.t("stage_not_table")
end
if (yl_api_nodestages.is_valid_stage(stage) == false) then
return false, yl_api_nodestages.t("stage_not_valid")
end
return true, stage
end
function yl_api_nodestages.get_stage(modname, nodename)
return get_stage(modname, nodename)
end
-- create_stage
--
local function create_stagenode(p_stage)
-- variable stage may be string errormessage or table stage
local success, stage = yl_api_nodestages.get_valid_copy_of_stage(p_stage)
if success == false then return false, stage end
-- MT properties
local nodename = stage.stage_name
local node_definition = stage.node_definition
node_definition.description = stage.description
node_definition.tiles = stage.tiles
minetest.register_node(":" .. nodename, node_definition)
if (minetest.registered_nodes[nodename] == nil) then
return false, yl_api_nodestages.t("node_not_created")
end
return true
end
function yl_api_nodestages.create_stagenode(stage) return
create_stagenode(stage) end
-- add_stage
--
local function add_stage(p_stage)
-- variable stage may be string errormessage or table stage
local success, stage = yl_api_nodestages.get_valid_copy_of_stage(p_stage)
if success == false then return false, stage end
local nodename = stage.stage_name
if (stage.overwrite == true) then
return false, yl_api_nodestages.t("error_use_overwrite_instead",
dump(nodename))
end
local target_def = {}
if (target_def == nil) then
return false,
yl_api_nodestages.t("error_item_not_exists", dump(nodename))
end
if (target_def.on_timer ~= nil) then
return false,
yl_api_nodestages.t("error_item_has_timer", dump(nodename))
end
if (target_def.on_construct ~= nil) then
return false,
yl_api_nodestages.t("error_item_has_construct", dump(nodename))
end
if (target_def._stage ~= nil) then
return false,
yl_api_nodestages.t("error_item_has_stage", dump(nodename))
end
-- next_stage may be a string, convert to table
if (type(stage.next_stages) == "string") then
stage.next_stages = {{stage.next_stages, 1}}
end
target_def._stage = stage
target_def.on_timer = yl_api_nodestages.on_timer
target_def.on_construct = yl_api_nodestages.on_construct
-- Do we really need a destruct? If we do, shouldn't we check for it?
-- No, we don't, at least for now
-- target_def.on_destruct = yl_api_nodestages.on_destruct
minetest.override_item(nodename, target_def)
if (minetest.registered_nodes[nodename]._stage == nil) then
return false, yl_api_nodestages.t("stage_not_created")
end
return true
end
function yl_api_nodestages.add_stage(stage) return add_stage(stage) end
-- overwrite_stage
--
local function overwrite_stage(p_stage)
-- variable stage may be string errormessage or table stage
local success, stage = yl_api_nodestages.get_valid_copy_of_stage(p_stage)
if success == false then return false, stage end
local nodename = stage.stage_name
if (stage.overwrite ~= true) then
return false,
yl_api_nodestages.t("error_use_add_instead", dump(nodename))
end
local target_def = {}
if (target_def == nil) then
return false,
yl_api_nodestages.t("error_item_not_exists", dump(nodename))
end
--[[ Since this is the overwrite, we deliberately do not check for existing nodetimers, construct or stages
if (target_def.on_timer ~= nil) then
return false, yl_api_nodestages.t("error_item_has_timer", dump(nodename))
end
if (target_def.on_construct ~= nil) then
return false, yl_api_nodestages.t("error_item_has_construct", dump(nodename))
end
if (target_def._stage ~= nil) then
return false, yl_api_nodestages.t("error_item_has_stage", dump(nodename))
end
]] --
-- Cache the values we are going to overwrite
local previous = {}
previous.on_timer = minetest.registered_nodes[nodename].on_timer
previous.on_construct = minetest.registered_nodes[nodename].on_construct
previous.on_destruct = minetest.registered_nodes[nodename].on_destruct
previous.stage = minetest.registered_nodes[nodename]._stage
if (type(stage.next_stages) == "string") then
stage.next_stages = {{stage.next_stages, 1}}
end
-- Assign the new values
target_def._stage = stage
target_def._stage._previous = previous
target_def.on_timer = yl_api_nodestages.on_timer
target_def.on_construct = yl_api_nodestages.on_construct
-- Do we really need a destruct? If we do, shouldn't we check for it?
-- No, we don't, at least for now
-- target_def.on_destruct = yl_api_nodestages.on_destruct
minetest.override_item(nodename, target_def)
if (minetest.registered_nodes[nodename]._stage == nil) then
return false, yl_api_nodestages.t("stage_not_created")
end
return true
end
function yl_api_nodestages.overwrite_stage(stage) return overwrite_stage(stage) end
-- delete_stage
--
local function delete_stage(modname, nodename)
if (minetest.get_modpath(modname) == nil) then
return false, yl_api_nodestages.t("modname_does_not_exist")
end
local def = minetest.registered_nodes[modname .. ":" .. nodename]
if (def == nil) then
return false, yl_api_nodestages.t("node_does_not_exist")
end
local stage = def._stage
if (stage == nil) then
return false, yl_api_nodestages.t("node_does_not_have_stage")
end
if (type(stage) ~= "table") then
return false, yl_api_nodestages.t("stage_not_table")
end
def._stage = nil
def.on_timer = nil
def.on_construct = nil
-- Do we really need a destruct? If we do, shouldn't we check for it?
-- No, we don't, at least for now
-- def.on_destruct = nil
if (minetest.registered_nodes[modname .. ":" .. nodename]._stage ~= nil) then
return false, yl_api_nodestages.t("stage_not_deleted")
end
return true
end
function yl_api_nodestages.delete_stage(modname, nodename)
return delete_stage(modname, nodename)
end
-- register_stage
--
local function register_stage(p_stage)
-- variable stage may be string errormessage or table stage
local success, stage = yl_api_nodestages.get_valid_copy_of_stage(p_stage)
if (success == false) then return false, stage end
-- Create the node
local message
success, message = yl_api_nodestages.create_stagenode(stage)
if (success == false) then return false, message end
-- Add or overwrite the stage
if (stage.overwrite == true) then
success, message = yl_api_nodestages.overwrite(stage)
else
success, message = yl_api_nodestages.add_stage(stage)
end
if (success == false) then return false, message end
return true, nil
end
function yl_api_nodestages.register_stage(stage) return register_stage(stage) end
-- register_stages
--
local function register_stages(stages)
local good, bad, total = 0, 0, 0
local reasons = {}
for _, stage in ipairs(stages) do
total = total + 1
local success, message = register_stage(stage)
if (success == true) then
good = good + 1
else
bad = bad + 1
table.insert(reasons, message)
end
end
if (bad == 0) then
minetest.log("action",
"[MOD] yl_api_nodestages : bad = " .. tostring(bad) ..
", good = " .. tostring(good) .. ", total = " ..
tostring(total))
return true, good, bad, total, reasons
else
minetest.log("warning",
"[MOD] yl_api_nodestages : bad = " .. tostring(bad) ..
", good = " .. tostring(good) .. ", total = " ..
tostring(total))
return false, good, bad, total, reasons
end
end
function yl_api_nodestages.register_stages(stages) return
register_stages(stages) end