diff --git a/.cdb.json b/.cdb.json index 41b45b9..ada3089 100644 --- a/.cdb.json +++ b/.cdb.json @@ -5,7 +5,7 @@ "license": "MIT", "media_license": "CC0-1.0", "tags": ["world_tools"], - "repo": "https://github.com/AntumMT/mod-cleaner", - "issue_tracker": "https://github.com/AntumMT/mod-cleaner/issues", + "repo": "https://codeberg.org/AntumLuanti/mod-cleaner", + "issue_tracker": "https://codeberg.org/AntumLuanti/mod-cleaner/issues", "forums": 18381 } diff --git a/.gitattributes b/.gitattributes index 8e94d42..62c4b62 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,2 +1,2 @@ -.* export-ignore -sounds_src/ export-ignore +.* export-ignore +*.py export-ignore diff --git a/.github/workflows/reference.yml b/.github/workflows/reference.yml index cd61ab9..29dec4c 100644 --- a/.github/workflows/reference.yml +++ b/.github/workflows/reference.yml @@ -1,31 +1,30 @@ -name: Build Reference +name: Build Reference on: push: - branches: - - master + tags: + - 'v[0-9]*' + workflow_dispatch: jobs: build: - name: Build + name: Build Reference runs-on: ubuntu-latest steps: - - name: Checkout - uses: actions/checkout@v2 - name: Setup Lua uses: leafo/gh-actions-lua@v8 with: luaVersion: 5.4 - name: Setup Lua Rocks uses: leafo/gh-actions-luarocks@v4 - - name: Setup LDoc dependencies + - name: Setup dependencies run: luarocks install --only-deps https://raw.githubusercontent.com/lunarmodules/LDoc/master/ldoc-scm-3.rockspec - name: Setup LDoc - run: git clone --single-branch --branch=custom https://github.com/AntumDeluge/ldoc.git .ldoc/ldoc && chmod +x .ldoc/ldoc/ldoc.lua - - name: Generate docs - run: chmod +x .ldoc/gendoc.sh && ./.ldoc/gendoc.sh + run: git clone --single-branch --branch=custom https://github.com/AntumDeluge/LDoc.git ldoc + - name: Checkout & Build Docs + run: git clone https://github.com/AntumMT/mod-cleaner.git cleaner && cd cleaner && chmod +x .ldoc/build_versioned_docs.sh && ./.ldoc/build_versioned_docs.sh - name: Deploy uses: peaceiris/actions-gh-pages@v3 with: github_token: ${{ secrets.GITHUB_TOKEN }} - publish_dir: docs/ + publish_dir: cleaner/docs/ diff --git a/.ldoc/build_versioned_docs.sh b/.ldoc/build_versioned_docs.sh new file mode 100755 index 0000000..728103f --- /dev/null +++ b/.ldoc/build_versioned_docs.sh @@ -0,0 +1,98 @@ +#!/usr/bin/env bash + +# place this file in mod ".ldoc" directory + + +d_config="$(dirname $(readlink -f $0))" + +cd "${d_config}/.." + +d_root="$(pwd)" +d_export="${d_export:-${d_root}/docs/reference}" + +cmd_ldoc="${d_root}/../ldoc/ldoc.lua" +if test -f "${cmd_ldoc}"; then + if test ! -x "${cmd_ldoc}"; then + chmod +x "${cmd_ldoc}" + fi +else + cmd_ldoc="ldoc" +fi + +# clean old files +rm -rf "${d_export}" + +# store current branch +main_branch="$(git branch --show-current)" + +html_out="\n\n\n\n\n\n\n" + +cd "${d_root}" +git checkout ${main_branch} + +echo -e "${html_out}" > "${d_export}/index.html" + +echo -e "\nDone!" diff --git a/.ldoc/config.ld b/.ldoc/config.ld index 72d7f90..10e46db 100644 --- a/.ldoc/config.ld +++ b/.ldoc/config.ld @@ -13,13 +13,12 @@ end project = "Cleaner" -title = "Cleaner mod for Minetest" +title = "Cleaner mod for Luanti" format = "markdown" not_luadoc=true boilerplate = false -style = true icon = "textures/cleaner_pencil.png" -favicon = "https://www.minetest.net/media/icon.svg" +favicon = "https://www.luanti.org/media/icon.svg" file = { "settings.lua", diff --git a/.ldoc/gendoc.sh b/.ldoc/gendoc.sh index 93a1389..75ef2c3 100755 --- a/.ldoc/gendoc.sh +++ b/.ldoc/gendoc.sh @@ -10,7 +10,6 @@ cd "${d_ldoc}/.." d_root="$(pwd)" d_export="${d_export:-${d_root}/docs/reference}" -d_data="${d_export}/data" cmd_ldoc="${d_ldoc}/ldoc/ldoc.lua" if test ! -x "${cmd_ldoc}"; then @@ -20,8 +19,11 @@ fi # clean old files rm -rf "${d_export}" +vinfo="v$(grep "^version = " "${d_root}/mod.conf" | head -1 | sed -e 's/version = //')" +d_data="${d_export}/${vinfo}/data" + # generate new doc files -"${cmd_ldoc}" --UNSAFE_NO_SANDBOX -c "${f_config}" -d "${d_export}" "${d_root}"; retval=$? +"${cmd_ldoc}" --UNSAFE_NO_SANDBOX --multimodule -c "${f_config}" -d "${d_export}/${vinfo}" "${d_root}"; retval=$? # check exit status if test ${retval} -ne 0; then @@ -29,6 +31,11 @@ if test ${retval} -ne 0; then exit ${retval} fi +# show version info +for html in $(find "${d_export}/${vinfo}" -type f -name "*.html"); do + sed -i -e "s|^

[cC]leaner

$|

Cleaner (${vinfo})

|" "${html}" +done + # copy textures to data directory echo -e "\ncopying textures ..." mkdir -p "${d_data}" diff --git a/.ldoc/ldoc.css b/.ldoc/ldoc.css deleted file mode 100644 index dc1d328..0000000 --- a/.ldoc/ldoc.css +++ /dev/null @@ -1,305 +0,0 @@ -/* BEGIN RESET - -Copyright (c) 2010, Yahoo! Inc. All rights reserved. -Code licensed under the BSD License: -http://developer.yahoo.com/yui/license.html -version: 2.8.2r1 -*/ -html { - color: #000; - background: #FFF; -} -body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,code,form,fieldset,legend,input,button,textarea,p,blockquote,th,td { - margin: 0; - padding: 0; -} -table { - border-collapse: collapse; - border-spacing: 0; -} -fieldset,img { - border: 0; -} -address,caption,cite,code,dfn,em,strong,th,var,optgroup { - font-style: inherit; - font-weight: inherit; -} -del,ins { - text-decoration: none; -} -li { - margin-left: 20px; -} -caption,th { - text-align: left; -} -h1,h2,h3,h4,h5,h6 { - font-size: 100%; - font-weight: bold; -} -q:before,q:after { - content: ''; -} -abbr,acronym { - border: 0; - font-variant: normal; -} -sup { - vertical-align: baseline; -} -sub { - vertical-align: baseline; -} -legend { - color: #000; -} -input,button,textarea,select,optgroup,option { - font-family: inherit; - font-size: inherit; - font-style: inherit; - font-weight: inherit; -} -input,button,textarea,select {*font-size:100%; -} -/* END RESET */ - -body { - margin-left: 1em; - margin-right: 1em; - font-family: arial, helvetica, geneva, sans-serif; - background-color: #ffffff; margin: 0px; -} - -code, tt { font-family: monospace; font-size: 1.1em; } -span.parameter { font-family:monospace; } -span.parameter:after { content:":"; } -span.types:before { content:"("; } -span.types:after { content:")"; } -.type { font-weight: bold; font-style:italic } - -body, p, td, th { font-size: .95em; line-height: 1.2em;} - -p, ul { margin: 10px 0 0 0px;} - -strong { font-weight: bold;} - -em { font-style: italic;} - -h1 { - font-size: 1.5em; - margin: 20px 0 20px 0; -} -h2, h3, h4 { margin: 15px 0 10px 0; } -h2 { font-size: 1.25em; } -h3 { font-size: 1.15em; } -h4 { font-size: 1.06em; } - -a:link { font-weight: bold; color: #004080; text-decoration: none; } -a:visited { font-weight: bold; color: #006699; text-decoration: none; } -a:link:hover { text-decoration: underline; } - -hr { - color:#cccccc; - background: #00007f; - height: 1px; -} - -blockquote { margin-left: 3em; } - -ul { list-style-type: disc; } - -p.name { - font-family: "Andale Mono", monospace; - padding-top: 1em; -} - -pre { - background-color: rgb(245, 245, 245); - border: 1px solid #C0C0C0; /* silver */ - padding: 10px; - margin: 10px 0 10px 0; - overflow: auto; - font-family: "Andale Mono", monospace; -} - -pre.example { - font-size: .85em; -} - -table.index { border: 1px #00007f; } -table.index td { text-align: left; vertical-align: top; } - -#container { - margin-left: 1em; - margin-right: 1em; - background-color: #f0f0f0; -} - -#product { - text-align: center; - border-bottom: 1px solid #cccccc; - background-color: #ffffff; -} - -#product big { - font-size: 2em; -} - -#main { - background-color: #f0f0f0; - border-left: 2px solid #cccccc; -} - -#navigation { - float: left; - width: 14em; - vertical-align: top; - background-color: #f0f0f0; - overflow: visible; - position: fixed; -} - -#navigation h2 { - background-color:#e7e7e7; - font-size:1.1em; - color:#000000; - text-align: left; - padding:0.2em; - border-top:1px solid #dddddd; - border-bottom:1px solid #dddddd; -} - -#navigation ul -{ - font-size:1em; - list-style-type: none; - margin: 1px 1px 10px 1px; -} - -#navigation li { - text-indent: -1em; - display: block; - margin: 3px 0px 0px 22px; -} - -#navigation li li a { - margin: 0px 3px 0px -1em; -} - -#content { - margin-left: 14em; - padding: 1em; - width: 700px; - border-left: 2px solid #cccccc; - border-right: 2px solid #cccccc; - background-color: #ffffff; - min-height: 425px; -} - -#about { - clear: both; - padding: 5px; - border-top: 2px solid #cccccc; - background-color: #ffffff; -} - -@media print { - body { - font: 12pt "Times New Roman", "TimeNR", Times, serif; - } - a { font-weight: bold; color: #004080; text-decoration: underline; } - - #main { - background-color: #ffffff; - border-left: 0px; - } - - #container { - margin-left: 2%; - margin-right: 2%; - background-color: #ffffff; - } - - #content { - padding: 1em; - background-color: #ffffff; - } - - #navigation { - display: none; - } - pre.example { - font-family: "Andale Mono", monospace; - font-size: 10pt; - page-break-inside: avoid; - } -} - -table.module_list { - border-width: 1px; - border-style: solid; - border-color: #cccccc; - border-collapse: collapse; -} -table.module_list td { - border-width: 1px; - padding: 3px; - border-style: solid; - border-color: #cccccc; -} -table.module_list td.name { background-color: #f0f0f0; min-width: 200px; } -table.module_list td.summary { width: 100%; } - - -table.function_list { - border-width: 1px; - border-style: solid; - border-color: #cccccc; - border-collapse: collapse; -} -table.function_list td { - border-width: 1px; - padding: 3px; - border-style: solid; - border-color: #cccccc; -} -table.function_list td.name { background-color: #f0f0f0; min-width: 200px; } -table.function_list td.summary { width: 100%; } - -ul.nowrap { - overflow:auto; - white-space:nowrap; -} - -dl.table dt, dl.function dt {border-top: 1px solid #ccc; padding-top: 1em;} -dl.table dd, dl.function dd {padding-bottom: 1em; margin: 10px 0 0 20px;} -dl.table h3, dl.function h3 {font-size: .95em;} - -/* stop sublists from having initial vertical space */ -ul ul { margin-top: 0px; } -ol ul { margin-top: 0px; } -ol ol { margin-top: 0px; } -ul ol { margin-top: 0px; } - -/* make the target distinct; helps when we're navigating to a function */ -a:target + * { - background-color: #FF9; -} - - -/* styles for prettification of source */ -pre .comment { color: #558817; } -pre .constant { color: #a8660d; } -pre .escape { color: #844631; } -pre .keyword { color: #aa5050; font-weight: bold; } -pre .library { color: #0e7c6b; } -pre .marker { color: #512b1e; background: #fedc56; font-weight: bold; } -pre .string { color: #8080ff; } -pre .number { color: #f8660d; } -pre .operator { color: #2239a8; font-weight: bold; } -pre .preprocessor, pre .prepro { color: #a33243; } -pre .global { color: #800080; } -pre .user-keyword { color: #800080; } -pre .prompt { color: #558817; } -pre .url { color: #272fc2; text-decoration: underline; } - diff --git a/README.md b/README.md index 5a76f26..70253ef 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ -## Cleaner mod for Minetest +## Cleaner mod for Luanti ### Description: -A [Minetest][] mod that can be used to remove/replace unknown entities, nodes, & items. Originally forked from [PilzAdam's ***clean*** mod][f.pilzadam]. +A [Luanti (Minetest)][Luanti] mod that can be used to remove/replace unknown entities, nodes, & items. Originally forked from [PilzAdam's ***clean*** mod][f.pilzadam]. ![screenshot](screenshot.png) @@ -10,13 +10,10 @@ A [Minetest][] mod that can be used to remove/replace unknown entities, nodes, & - Code: [MIT](LICENSE.txt) - Textures: CC0 -- Sounds: - - cleaner_pencil_write: [CC0](https://freesound.org/people/NachtmahrTV/sounds/571800/) - - cleaner_pencil_erase: [CC0](https://freesound.org/people/damsur/sounds/443241/) ### Requirements: -- Minetest minimum version: 5.0 +- Luanti minimum version: 5.0 - Depends: none ### Usage: @@ -76,14 +73,14 @@ cleaner.unsafe ### Links: -- [![ContentDB](https://content.minetest.net/packages/AntumDeluge/cleaner/shields/title/)][ContentDB] -- [Forum](https://forum.minetest.net/viewtopic.php?t=18381) +- [![ContentDB](https://content.luanti.org/packages/AntumDeluge/cleaner/shields/title/)][ContentDB] +- [Forum](https://forum.luanti.org/viewtopic.php?t=18381) - [Git repo](https://github.com/AntumMT/mod-cleaner) -- [Reference](https://antummt.github.io/mod-cleaner/reference) +- [Reference](https://antummt.github.io/mod-cleaner/reference/latest/) - [Changelog](changelog.txt) - [TODO](TODO.txt) -[Minetest]: http://www.minetest.net/ -[f.pilzadam]: https://forum.minetest.net/viewtopic.php?t=2777 -[ContentDB]: https://content.minetest.net/packages/AntumDeluge/cleaner/ +[Luanti]: https://luanti.org/ +[f.pilzadam]: https://forum.luanti.org/viewtopic.php?t=2777 +[ContentDB]: https://content.luanti.org/packages/AntumDeluge/cleaner/ diff --git a/TODO.txt b/TODO.txt index d49535a..b800544 100644 --- a/TODO.txt +++ b/TODO.txt @@ -9,3 +9,6 @@ TODO: - add "xrotate" & "zrorate" modes for pencil - don't require "server" priv for "find_unknown_nodes" & "find_neaby_nodes" commands - add chat command to find nodes with specified attributes +- may be better to update player inventories on login than add aliases for items +- use aliases for unknown nodes instead of LBM +- only use LBM when a node to replace is still registered diff --git a/changelog.txt b/changelog.txt index 27ba6f7..0214081 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,4 +1,16 @@ +2025-01-18 +---------- +- fix undeclared global +- added nil check after reading world data file + + +v1.2.1 +---- +- use sounds mod for sounds +- added nil check after reading world data file + + v1.2 ---- - added API @@ -14,14 +26,14 @@ v1.2 - replace_items - replace_nodes - find_unknown_nodes - - find_neaby_nodes + - find_nearby_nodes - remove_ores (unsafe) - - ctool (manages pencil tool settings) + - ctool (manages wielded cleaner tool settings) v1.1 ---- - uses "register_lbm" with "run_at_every_load" instead of "register_abm" to save resources - - suggested by bell07 ( https://forum.minetest.net/viewtopic.php?p=325519#p325519 ) + - suggested by bell07 ( https://forum.luanti.org/viewtopic.php?p=325519#p325519 ) v1.0 ---- diff --git a/chat.lua b/chat.lua index 4a22126..3f7cf43 100644 --- a/chat.lua +++ b/chat.lua @@ -135,9 +135,10 @@ local function format_params(cmd) local def = get_cmd_def(cmd) local param_count + -- FIXME: unused? local all_params = {} if def.params then - for k, v in ipairs(def.params) do + for _, p in ipairs(def.params) do table.insert(all_params, p) end end diff --git a/misc_functions.lua b/misc_functions.lua index 899b981..27c8654 100644 --- a/misc_functions.lua +++ b/misc_functions.lua @@ -28,8 +28,13 @@ local function get_world_data() local wdata = {} local buffer = io.open(world_file, "r") if buffer then - wdata = core.parse_json(buffer:read("*a")) + local err + wdata, err = core.parse_json(buffer:read("*a"), nil, true) buffer:close() + if wdata == nil then + cleaner.log("warning", "reading world data file failed: " .. world_file) + wdata = {} + end end local rem_types = {"entities", "nodes", "ores",} @@ -151,6 +156,7 @@ local tool = { end, } +local use_sounds = core.global_exists("sounds") local sound_handle tool.on_use = function(stack, user, pointed_thing) @@ -175,17 +181,23 @@ tool.on_use = function(stack, user, pointed_thing) if mode == "erase" then core.remove_node(npos) - sound_handle = core.sound_play("cleaner_pencil_erase", {object=user}) + if use_sounds then + local sound_handle = sounds.pencil_erase({object=user}) + end return stack elseif core.registered_nodes[new_node_name] then if mode == "swap" then core.swap_node(npos, {name=new_node_name}) - sound_handle = core.sound_play("cleaner_pencil_write", {object=user}) + if use_sounds then + local sound_handle = sounds.pencil_write({object=user}) + end elseif mode == "write" then local node_above = core.get_node_or_nil(pointed_thing.above) if not node_above or node_above.name == "air" then core.set_node(pointed_thing.above, {name=new_node_name}) - sound_handle = core.sound_play("cleaner_pencil_write", {object=user}) + if use_sounds then + local sound_handle = sounds.pencil_write({object=user}) + end else core.chat_send_player(pname, S("Can't place node there.")) end diff --git a/mod.conf b/mod.conf index 150080d..03b84d4 100644 --- a/mod.conf +++ b/mod.conf @@ -1,6 +1,7 @@ name = cleaner description = A mod that can be used to remove/replace unknown entities, nodes, & items. -version = 1.2 +version = 2025-01-18 license = MIT author = PilzAdam, Jordan Irwin (AntumDeluge) min_minetest_version = 5.0 +optional_depends = sounds diff --git a/set_version.py b/set_version.py new file mode 100755 index 0000000..8c40217 --- /dev/null +++ b/set_version.py @@ -0,0 +1,70 @@ +#!/usr/bin/env python + +import sys, os, codecs + + +f_script = os.path.realpath(__file__) +d_root = os.path.dirname(f_script) + +os.chdir(d_root) + +args = sys.argv[1:] +if len(args) < 1: + print("ERROR: must supply version as parameter") + sys.exit(1) + +new_version = args[0] + +to_update = { + "mod.conf": "version =", + "changelog.txt": "next", + os.path.normpath(".ldoc/config.ld"): "local version =", +} + +for f in to_update: + f_path = os.path.join(d_root, f) + if not os.path.isfile(f_path): + print("WARNING: {} not found, skipping ...".format(f)) + continue + + print("\nsetting version to {} in {}".format(new_version, f_path)) + + buffer = codecs.open(f_path, "r", "utf-8") + if not buffer: + print("WARNING: could not open {} for reading, skipping ...".format(f)) + continue + + read_in = buffer.read() + buffer.close() + + read_in = read_in.replace("\r\n", "\n").replace("\r", "\n") + replacement = to_update[f] + new_lines = [] + + version_set = False + for li in read_in.split("\n"): + if not version_set: + if "=" in replacement and li.startswith(replacement): + key = li.split(" = ")[0] + li = "{} = {}".format(key, new_version) + version_set = True + elif li == replacement: + li = "v{}".format(new_version) + version_set = True + + new_lines.append(li) + + write_out = "\n".join(new_lines) + if write_out == read_in: + print("no changes for {}, skipping ...".format(f)) + continue + + buffer = codecs.open(f_path, "w", "utf-8") + if not buffer: + print("WARNING: could not open {} for writing, skipping ...".format(f)) + continue + + buffer.write("\n".join(new_lines)) + buffer.close() + + print("done") diff --git a/sounds/cleaner_pencil_erase.ogg b/sounds/cleaner_pencil_erase.ogg deleted file mode 100644 index 1fe5245..0000000 Binary files a/sounds/cleaner_pencil_erase.ogg and /dev/null differ diff --git a/sounds/cleaner_pencil_write.ogg b/sounds/cleaner_pencil_write.ogg deleted file mode 100644 index 3afa8aa..0000000 Binary files a/sounds/cleaner_pencil_write.ogg and /dev/null differ diff --git a/sounds_src/cleaner_pencil_erase.flac b/sounds_src/cleaner_pencil_erase.flac deleted file mode 100644 index 29e6d13..0000000 Binary files a/sounds_src/cleaner_pencil_erase.flac and /dev/null differ diff --git a/sounds_src/cleaner_pencil_write.flac b/sounds_src/cleaner_pencil_write.flac deleted file mode 100644 index e047fa6..0000000 Binary files a/sounds_src/cleaner_pencil_write.flac and /dev/null differ