From b1f6ea57ef42b4e5e798c4be607f7231f9a71c66 Mon Sep 17 00:00:00 2001 From: your-flight <> Date: Wed, 20 Apr 2022 16:00:41 +0200 Subject: [PATCH] Initial commit --- README.md | 21 +++++++++++++++ chatcommand_admin.lua | 19 ++++++++++++++ chatcommand_player.lua | 19 ++++++++++++++ chatcommands.lua | 2 ++ config.lua | 8 ++++++ dev/whatdowedo.txt | 4 +++ globalsteps.lua | 13 +++++++++ init.lua | 35 +++++++++++++++++++++++++ internal.lua | 53 +++++++++++++++++++++++++++++++++++++ mod.conf | 7 +++++ priv_example.lua | 58 +++++++++++++++++++++++++++++++++++++++++ privs.lua | 1 + screenshot.png | Bin 0 -> 19493 bytes settingtypes.txt | 6 +++++ setup.lua | 16 ++++++++++++ 15 files changed, 262 insertions(+) create mode 100644 README.md create mode 100644 chatcommand_admin.lua create mode 100644 chatcommand_player.lua create mode 100644 chatcommands.lua create mode 100644 config.lua create mode 100644 dev/whatdowedo.txt create mode 100644 globalsteps.lua create mode 100644 init.lua create mode 100644 internal.lua create mode 100644 mod.conf create mode 100644 priv_example.lua create mode 100644 privs.lua create mode 100644 screenshot.png create mode 100644 settingtypes.txt create mode 100644 setup.lua diff --git a/README.md b/README.md new file mode 100644 index 0000000..282e624 --- /dev/null +++ b/README.md @@ -0,0 +1,21 @@ + +# yl_template + +## Purpose + +This mod is not meant to bring functionality by itself, but to serve as a template you can base your mod on. + +## Download + +Get it from https://gitea.your-land.de/your-land/yl_template + +## Installation + +Being a template, you shouldn't install the mod itself. Your mod could look like this: + + + +## Usage +## Uninstall +## License + diff --git a/chatcommand_admin.lua b/chatcommand_admin.lua new file mode 100644 index 0000000..fbc90e3 --- /dev/null +++ b/chatcommand_admin.lua @@ -0,0 +1,19 @@ +local chatcommand_cmd = "admin_example" +local chatcommand_definition = { + params = " ", -- Short parameter description + description = "Example description", -- Full description + privs = {[yl_template.admin_priv] = true}, -- Require the "privs" privilege to run + func = function(name, param) + local success = true + if success then + return true, "Sucess message" + else + return false, "Fail message" + end + end + -- Called when command is run. Returns boolean success and text output. + -- Special case: The help message is shown to the player if `func` + -- returns false without a text output. +} + +minetest.register_chatcommand(chatcommand_cmd, chatcommand_definition) diff --git a/chatcommand_player.lua b/chatcommand_player.lua new file mode 100644 index 0000000..90a426a --- /dev/null +++ b/chatcommand_player.lua @@ -0,0 +1,19 @@ +local chatcommand_cmd = "player_example" +local chatcommand_definition = { + params = " ", -- Short parameter description + description = "Example description", -- Full description + privs = {privs = true}, -- Require the "privs" privilege to run + func = function(name, param) + local success = true + if success then + return true, "Sucess message" + else + return false, "Fail message" + end + end + -- Called when command is run. Returns boolean success and text output. + -- Special case: The help message is shown to the player if `func` + -- returns false without a text output. +} + +minetest.register_chatcommand(chatcommand_cmd, chatcommand_definition) diff --git a/chatcommands.lua b/chatcommands.lua new file mode 100644 index 0000000..89cd404 --- /dev/null +++ b/chatcommands.lua @@ -0,0 +1,2 @@ +dofile(yl_template.modpath .. "chatcommand_admin.lua") +dofile(yl_template.modpath .. "chatcommand_player.lua") \ No newline at end of file diff --git a/config.lua b/config.lua new file mode 100644 index 0000000..a8a6bf2 --- /dev/null +++ b/config.lua @@ -0,0 +1,8 @@ + +-- Setting a configuration, switch the order in which the settings shall take precedence. First valid one taken. + +yl_template.external_value = "mod_default" or minetest.settings:get("yl_template.external_value") or "default" + +yl_template.save_path = "yl_template" or minetest.settings:get("yl_template.save_path") or "default" + +yl_template.admin_priv = "admin_priv" or minetest.settings:get("yl_template.admin_priv") or "server" \ No newline at end of file diff --git a/dev/whatdowedo.txt b/dev/whatdowedo.txt new file mode 100644 index 0000000..5ca6f6f --- /dev/null +++ b/dev/whatdowedo.txt @@ -0,0 +1,4 @@ +This file holds a couple of editors notes regarding the mod. + +Todo's can be noted here, known issues, the path to ressources or general annotations. + diff --git a/globalsteps.lua b/globalsteps.lua new file mode 100644 index 0000000..8d22fe3 --- /dev/null +++ b/globalsteps.lua @@ -0,0 +1,13 @@ +local timer = 0 + +local gs = function(dtime) + timer = timer + dtime + if timer <= yl_template.config.interval then + return + end + timer = 0 + + -- do stuff +end + +minetest.register_globalstep(gs) diff --git a/init.lua b/init.lua new file mode 100644 index 0000000..7c30bbd --- /dev/null +++ b/init.lua @@ -0,0 +1,35 @@ +-- Version 0.0.1 +-- Author AliasAlreadyTaken +-- License MIT + +-- Changelog + +local mod_start_time = core.get_us_time() +core.log("action", "[MOD] yl_template loading") + +yl_template = {} +yl_template.error = {} +yl_template.modstorage = core.get_mod_storage() +yl_template.modpath = core.get_modpath("yl_template") .. DIR_DELIM +yl_template.worldpath = core.get_worldpath() .. DIR_DELIM + +yl_template.information = {} +yl_template.information.version = "0.0.1" +yl_template.information.author = "AliasAlreadyTaken" +yl_template.information.license = "MIT" +yl_template.information.name = "yl_template" +yl_template.information.source = "https://gitea.your-land.de/your-land/yl_template" +yl_template.information.additional = "Additional information" + +dofile(yl_template.modpath .. "config.lua") +dofile(yl_template.modpath .. "setup.lua") +dofile(yl_template.modpath .. "privs.lua") +dofile(yl_template.modpath .. "internal.lua") +dofile(yl_template.modpath .. "api.lua") +dofile(yl_template.modpath .. "distinct_feature.lua") +dofile(yl_template.modpath .. "overwrite_feature.lua") +dofile(yl_template.modpath .. "globalsteps.lua") +dofile(yl_template.modpath .. "chatcommands.lua") + +local mod_end_time = (core.get_us_time() - mod_start_time) / 1000000 +core.log("action", "[MOD] yl_template loaded in [" .. mod_end_time .. "s]") diff --git a/internal.lua b/internal.lua new file mode 100644 index 0000000..54856da --- /dev/null +++ b/internal.lua @@ -0,0 +1,53 @@ + +-- The functions and variables in this file are only for use in the mod itself. Those that do real work should be local and wrapped in public functions + +local debug = true + +local function say(text) + if yl_template.debug then + core.log("action", "[MOD] yl_template : " .. text) + end +end + +local function save_path(file) + return yl_template.worldpath .. file .. ".json" +end + +local function save_json(filename, content) + if type(filename) ~= "string" or type(content) ~= "table" then + return false + end + local savepath = save_path(filename) + local savecontent = minetest.write_json(content) + return minetest.safe_file_write(savepath, savecontent) +end + + +local function load_json(filename) -- returns the saved dialog + local savepath = save_path(filename) + + local file, err = io.open(savepath, "r") + if err then + return {} + end + io.input(file) + local savecontent = io.read() + local content = minetest.parse_json(savecontent) + io.close(file) + + if type(content) ~= "table" then + content = {} + end + + return content +end + +-- Public functions wrap the private ones, so they can be exchanged easily + +function yl_template.load(filename, ...) + return load_json(filename, ...) +end + +function yl_template.save(filename, content, ...) + return save_json(filename, content, ...) +end \ No newline at end of file diff --git a/mod.conf b/mod.conf new file mode 100644 index 0000000..58188ed --- /dev/null +++ b/mod.conf @@ -0,0 +1,7 @@ +name = yl_template +description = A template with best practices +depends = default +optional_depends = moreblocks +author = AliasAlreadyTaken +release = 202106161537 +title = Template \ No newline at end of file diff --git a/priv_example.lua b/priv_example.lua new file mode 100644 index 0000000..75392cc --- /dev/null +++ b/priv_example.lua @@ -0,0 +1,58 @@ +local priv_name = "example" +local priv_definition = { + description = "Can do example task", + -- Privilege description + + give_to_singleplayer = false, + -- Whether to grant the privilege to singleplayer. + + give_to_admin = true, + -- Whether to grant the privilege to the server admin. + -- Uses value of 'give_to_singleplayer' by default. + + on_grant = function(name, granter_name) + -- logging + if not granter_name then + granter_name = "MOD" + end + if not name then + name = "ERROR" + end + if not priv_name then + priv_name = "ERROR" + end + core.log( + "action", + "[MOD] yl_template: User " .. granter_name .. " granted user " .. name .. " priv " .. priv_name + ) + end, + -- Called when given to player 'name' by 'granter_name'. + -- 'granter_name' will be nil if the priv was granted by a mod. + + on_revoke = function(name, revoker_name) + -- logging + if not revoker_name then + revoker_name = "MOD" + end + if not name then + name = "ERROR" + end + if not priv_name then + priv_name = "ERROR" + end + core.log( + "action", + "[MOD] yl_template: User " .. revoker_name .. " revoked user " .. name .. " priv " .. priv_name + ) + end + -- Called when taken from player 'name' by 'revoker_name'. + -- 'revoker_name' will be nil if the priv was revoked by a mod. + + -- Note that the above two callbacks will be called twice if a player is + -- responsible, once with the player name, and then with a nil player + -- name. + -- Return true in the above callbacks to stop register_on_priv_grant or + -- revoke being called. +} + +minetest.register_privilege(priv_name, priv_definition) diff --git a/privs.lua b/privs.lua new file mode 100644 index 0000000..8d26d4e --- /dev/null +++ b/privs.lua @@ -0,0 +1 @@ +dofile(yl_template.modpath .. "priv_example.lua") \ No newline at end of file diff --git a/screenshot.png b/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..fedca9a30794cedde440d30f9587a0cdfea0f0ac GIT binary patch literal 19493 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 literal 0 HcmV?d00001 diff --git a/settingtypes.txt b/settingtypes.txt new file mode 100644 index 0000000..61368ba --- /dev/null +++ b/settingtypes.txt @@ -0,0 +1,6 @@ +[category] + +# First line: Name the settings +# Second line: Say what it does, how to use it, what it changes +# Third line: Is it optional? What's the default value? Does it expect a certain set of values? +yl_template.external_value (Description of the setting) string "default_value" diff --git a/setup.lua b/setup.lua new file mode 100644 index 0000000..494602d --- /dev/null +++ b/setup.lua @@ -0,0 +1,16 @@ +local function run_once() + local dl = minetest.get_dir_list(yl_template.worldpath, true) + local create = true + + for _, v in ipairs(dl) do + if v == yl_template.save_path then + create = false + end + end + + if create then + minetest.mkdir(yl_template.worldpath .. DIR_DELIM .. yl_template.save_path) + end +end + +run_once()