API Nodestages

An API for nodestages, which convert into other nodes

API / Library

Download (1.0 MB)
For Luanti 5.0 and above

How do I install this?

yl_api_nodestages #

Purpose #

This mod is a library which brings various nodestage-related functions.

Download #

Get it from https://gitea.your-land.de/your-land/yl_api_nodestages

Installation #

  1. Copy the "yl_api_nodestages" folder to your mod directory.
  2. Enable the mod in your world.mt file.

Configuration #

yl_api_nodestages.debug = false

Set to true to enable debug mode

yl_api_nodestages.run_lbm = true

Set to true to enable the timer restart lbm, set to false to disable it

Usage #

This mod can be used in singleplayer and multiplayer. It comes with no direct content but exposes functions you can use in your mod.

Data structure #

One stage consists of at least the stage_name, next_stages and duration.

local stage = {
    {
        stage_name = "modname:nodename", -- required, string, nodename to attach this stage to, must not exist previously
        next_stages = "modname:same_or_other_nodename", -- required, string or table (see below), if missing last stage is assumed
        --    OR 
        next_stages = { -- required if not last stage, table format
            {
                "modname:same_or_other_nodename", -- required, string, target nodename must exist
                50,  -- optional, number, chance for the node to switch to this target, defaults to 1
                { can_set = mymod.optional_can_set_function, more_functions = ... }, -- optional, table, callback table of known keys and function values
                { param1 = 90, param2 = 107, ... } -- optional, table, metadata table of known keys and whatever values they want
            },
            { "modname:same_or_other_nodename"}, -- as above, but without any optional fields
            { "other_modname:their_nodename"} -- as above, but targets a node from different mod
        },
        duration = 120, -- required, number, fixed duration of stage in seconds, if missing last stage is assumed
        tiles = {"modname_nodename_texturename.png", ... }, -- required, table, table of tiles
        description = "Node description", -- required, string, node description
        -- Optional "Node definition" aka "Used by minetest.register_node"
        node_definition = {
            drawtype = "normal",
            ...
        },
        overwrite = false, -- optional, boolean, false breaks during registration if the node has on_timer or on_construct. true overwrites regardless
        restart = true, -- optional, boolean, true restarts the nodetimer via lbm, false does not
        _previous = {}, -- DO NOT USE, this holds the history to be accessed by delete_stage only
        _version = 1, -- DO NOT USE, this holds the version of the datastructure, will increase when datastructure changes
    }
}

A list of {stage} sit in a table stages:

local stages = {
    {stage},
    {stage},
    ...
}

Modmakers #

Use the following public functions related to nodestages.

yl_api_nodestages.get_stage(modname, nodename)

Gets a table with the values of the stage attached to the given modname:nodename. Returns true, {stage} or false, errormessage if an error occurred.

yl_api_nodestages.create_stagenode(stage)

Creates the node without attaching the stage. Returns true if the node was successfully created. Returns false, "errormessage" if not.

yl_api_nodestages.add_stage(stage)

Attaches a stage to an existing node. Returns true if the stage was successfully attached. Only successful if the stage does not yet exist. Returns false, "errormessage" if not.

yl_api_nodestages.overwrite_stage(stage)

Attaches a stage to an existing node. Returns true if the stage was successfully attached, regardless whether the stage already exist. Returns false, "errormessage" if not.

yl_api_nodestages.rollback_stage(modname, nodename)

Rolls a stage of an existing node back to the stage before the last overwrite. Returns true if the stage was successfully rolled back. Returns false, "errormessage" if not.

yl_api_nodestages.delete_stage(modname, nodename)

Deletes the stage (including cached previous stages) from an existing node. Returns true if the stage was successfully removed. Returns false, "errormessage" if not.

yl_api_nodestages.register_stage(stage)

Registers a single stage, calls create_stage and add_stage. Returns true if the stage was successfully registered. Returns false, "errormessage" if not.

yl_api_nodestages.register_stages(stages)

Registers all given stages, calls create_stage and add_stage. Returns true, good, bad, total, {} if all stages were registered successfully. Returns false, good, bad, total, {reasons} if at least one stage was not successfully registered.

yl_api_nodestages.validate_all_stages()

Validates all stages currently attached to any node. Returns true, good, bad, total, {} if all stages were validated successfully. Returns false, good, bad, total, {reasons} if at least one stage was not successfully validated.

Limitations #

  • No randomized duration except by registering the same stage as a next_stage again
  • Core nodes cannot have stages, examples are air and ignore
  • Unclear: About 1 Million active stages may cause Server::ActiveObjectMgr::addActiveObjectRaw(): no free id available

Alternatives #

  • Implement nodetimers, ABMs or LBMs

Supported versions #

If you use yl_api_nodestages, but something is wrong, please file a bug. PRs also welcome.

There is no reason to believe it doesn't work anywhere, but you never know.

Allied projects #

Uninstall #

Remove it from your mod folder or deactivate it in your world.mt

Mods that depend on it will cease to work, if the mod is removed without proper replacement.

License #

See LICENSE.md

  • Code MIT Developername
  • Screenshot CC0 Styxcolor

Thank you #

Reviews

Review

Do you recommend this mod?

  • No reviews, yet.

Used By