Jordan Irwin 2021-08-03 01:00:05 -07:00
parent 09b94a0279
commit 6904b8382a
15 changed files with 246 additions and 55 deletions

View File

@ -11,7 +11,7 @@ The game includes the mods from the default [minetest_game](https://github.com/m
* admin/
* [alternode][] ([MIT][lic.alternode]) -- version: [1.3][ver.alternode] *2021-05-18*
* [cleaner][] ([MIT][lic.cleaner]) -- version: [182726e Git][ver.cleaner] *2021-07-29*
* [cleaner][] ([MIT][lic.cleaner]) -- version: [1.2][ver.cleaner] *2021-08-02*
* [no_fall_damage][] ([MIT][lic.no_fall_damage]) -- version [1.0.0][ver.no_fall_damage] *2020-12-19*
* [spectator_mode][] ([WTFPL][lic.spectator_mode]) -- version: [3648371 Git][ver.spectator_mode] *2020-07-15*
* [whitelist][] ([MIT][lic.whitelist]) -- version: [1.1][ver.whitelist] *2021-06-09*
@ -580,7 +580,7 @@ The game includes the mods from the default [minetest_game](https://github.com/m
[ver.castle_weapons]: https://github.com/minetest-mods/castle_weapons/tree/d3cf095
[ver.chatlog]: https://github.com/AntumMT/mod-chatlog/tree/v1.1
[ver.christmas]: https://github.com/TheZenKitteh/minetest-christmas/tree/d3bd872
[ver.cleaner]: https://github.com/AntumMT/mod-cleaner/tree/182726e
[ver.cleaner]: https://github.com/AntumMT/mod-cleaner/releases/tag/v1.2
[ver.cmer]: https://github.com/AntumMT/mod-cmer/tree/2843875
[ver.cmer_chicken]: http://github.com/AntumMT/mod-cmer/tree/085706f
[ver.cmer_ghost]: https://github.com/AntumMT/mod-cmer/tree/2f70906

View File

@ -4,6 +4,8 @@
A [Minetest][] mod that can be used to remove/replace unknown entities, nodes, & items. Originally forked from [PilzAdam's ***clean*** mod][f.pilzadam].
![screenshot](screenshot.png)
### Licensing:
- Code: [MIT](LICENSE.txt)
@ -77,7 +79,7 @@ cleaner.unsafe
- [![ContentDB](https://content.minetest.net/packages/AntumDeluge/cleaner/shields/title/)][ContentDB]
- [Forum](https://forum.minetest.net/viewtopic.php?t=18381)
- [Git repo](https://github.com/AntumMT/mod-cleaner)
- [API](https://antummt.github.io/mod-cleaner/docs/reference)
- [Reference](https://antummt.github.io/mod-cleaner/reference)
- [Changelog](changelog.txt)
- [TODO](TODO.txt)

View File

@ -5,8 +5,7 @@ TODO:
- creative
- storage (chests, etc.)
- add LBM when removing an item if it is a node
- update localization files
- add "radius" option for pencil or "xlen", "ylen", & "zlen" options
- add "xrotate" & "zrorate" modes for pencil
- fix pencil "write" mode when pointing to side of node (node gets placed below)
- add config file usage to HTML docs
- don't require "server" priv for "find_unknown_nodes" & "find_neaby_nodes" commands
- add chat command to find nodes with specified attributes

View File

@ -141,9 +141,9 @@ function cleaner.register_node_replacement(src, tgt)
end
--- Unsafe methods.
--- Unsafe Methods.
--
-- Enabled with `cleaner.unsafe` setting.
-- Enabled with [cleaner.unsafe](settings.html#cleaner.unsafe) setting.
--
-- @section unsafe
@ -153,7 +153,7 @@ if cleaner.unsafe then
--- Retrieves list of ores to be removed.
--
-- @treturn table Ores to be replaced.
-- @treturn table Ores to be removed.
function cleaner.get_remove_ores()
return remove_ores
end

View File

@ -2,20 +2,21 @@
v1.2
----
- added API
- added chat commands:
- remove_entities
- remove_nodes
- replace_items
- replace_nodes
- find_unknown_nodes
- replace_ores (unsafe)
- added support for unregistering ores (unsafe)
- added setting for enabling "unsafe" methods & commands
- all types are loaded from <world_path>/cleaner.json file
- added localization support
- added Spanish localization
- added pencil tool for erasing, adding, & swapping nodes
- added "cleaner" chat command for managing pencil tool settings
- added chat commands:
- remove_entities
- remove_nodes
- replace_items
- replace_nodes
- find_unknown_nodes
- find_nearby_nodes
- remove_ores (unsafe)
- ctool (manages wielded cleaner tool settings)
v1.1
----

View File

@ -32,6 +32,9 @@ local param_def = {
old_item = {name=S("old_item"), desc=S("Technical name of item to be replaced.")},
new_item = {name=S("new_item"), desc=S("Technical name of item to be used in place.")},
ore = {name=S("ore"), desc=S("Ore technical name.")},
action = {name=S("action"),
desc=S('Action to execute. Can be one of "@1", "@2", or "@3".', "status", "setmode", "setnode")},
value = {name=S("value"), desc=S('Mode or node to be set for tool (not required for "@1" action).', "status")},
}
local cmd_repo = {
@ -54,6 +57,10 @@ local cmd_repo = {
cmd = "find_unknown_nodes",
oparams = {radius=100},
},
near_node = {
cmd = "find_nearby_nodes",
oparams = {radius=5},
},
item = {
cmd = "replace_items",
params = {"old_item", "new_item"},
@ -62,6 +69,10 @@ local cmd_repo = {
cmd = "remove_ores",
params = {"ore"},
},
tool = {
cmd = "ctool",
params = {"action", "value"},
},
param = {
missing = S("Missing parameter."),
excess = S("Too many parameters."),
@ -181,11 +192,32 @@ local function format_help(cmd)
end
local function check_radius(radius, pname)
local is_admin = core.check_player_privs(pname, {server=true})
if not is_admin and radius > 10 then
radius = 10
return radius, S("You do not have permission to set radius that high. Reduced to @1.", radius)
end
if radius > 100 then
radius = 100
return radius, S("Radius is too high. Reduced to @1.", radius)
end
return radius
end
--- Removes nearby entities.
--
-- @chatcmd remove_entities
-- @param entity Entity technical name.
-- @tparam[opt] int radius
-- @tparam[opt] int radius Search radius (default: 100).
-- @priv server
-- @usage
-- # remove all mobs:horse entities within a radius of 10 nodes
-- /remove_entities mobs:horse 10
core.register_chatcommand(cmd_repo.entity.cmd, {
privs = {server=true},
description = S("Remove an entity from game.") .. "\n\n"
@ -209,6 +241,11 @@ core.register_chatcommand(cmd_repo.entity.cmd, {
err = cmd_repo.param.mal_radius
end
local radius, msg = check_radius(radius, name)
if msg then
core.chat_send_player(name, msg)
end
if err then
return false, err .. "\n\n" .. format_help(cmd_repo.entity.cmd)
end
@ -240,7 +277,11 @@ core.register_chatcommand(cmd_repo.entity.cmd, {
--
-- @chatcmd remove_nodes
-- @param node Node technical name.
-- @tparam[opt] int radius
-- @tparam[opt] int radius Search radius (default: 5).
-- @priv server
-- @usage
-- # remove all default:dirt nodes within a radius of 10
-- /remove_nodes default:dirt 10
core.register_chatcommand(cmd_repo.rem_node.cmd, {
privs = {server=true},
description = S("Remove a node from game.") .. "\n\n"
@ -264,6 +305,11 @@ core.register_chatcommand(cmd_repo.rem_node.cmd, {
err = cmd_repo.param.mal_radius
end
local radius, msg = check_radius(radius, name)
if msg then
core.chat_send_player(name, msg)
end
if err then
return false, err .. "\n\n" .. format_help(cmd_repo.rem_node.cmd)
end
@ -288,6 +334,10 @@ core.register_chatcommand(cmd_repo.rem_node.cmd, {
-- @chatcmd replace_items
-- @param old_item Technical name of item to replace.
-- @param new_item Technical name of item to be used in place.
-- @priv server
-- @usage
-- # replace default:sword_wood with default:sword_mese
-- /replace_items default:sword_wood default:sword_mese
core.register_chatcommand(cmd_repo.item.cmd, {
privs = {server=true},
description = S("Replace an item in game.") .. "\n\n"
@ -316,7 +366,11 @@ core.register_chatcommand(cmd_repo.item.cmd, {
-- @chatcmd replace_nodes
-- @param old_node Technical name of node to replace.
-- @param new_node Technical name of node to be used in place.
-- @tparam[opt] int radius
-- @tparam[opt] int radius Search radius (default: 5).
-- @priv server
-- @usage
-- # replace all default:dirt nodes with default:cobble within a radius of 10
-- /replace_nodes default:dirt default:cobble 10
core.register_chatcommand(cmd_repo.rep_node.cmd, {
privs = {server=true},
description = S("Replace a node in game.") .. "\n\n"
@ -342,6 +396,11 @@ core.register_chatcommand(cmd_repo.rep_node.cmd, {
return false, cmd_repo.param.mal_radius .. "\n\n" .. help
end
local radius, msg = check_radius(radius, name)
if msg then
core.chat_send_player(name, msg)
end
if not core.registered_nodes[tgt] then
return false, S('Cannot use unknown node "@1" as replacement.', tgt)
end
@ -366,7 +425,11 @@ core.register_chatcommand(cmd_repo.rep_node.cmd, {
--- Checks for nearby unknown nodes.
--
-- @chatcmd find_unknown_nodes
-- @tparam[opt] int radius Search radius.
-- @tparam[opt] int radius Search radius (default: 100).
-- @priv server
-- @usage
-- # print names of all unknown nodes within radius of 10
-- /find_unknown_nodes 10
core.register_chatcommand(cmd_repo.find_node.cmd, {
privs = {server=true},
description = S("Find names of unknown nodes.") .. "\n\n"
@ -388,6 +451,11 @@ core.register_chatcommand(cmd_repo.find_node.cmd, {
return false, cmd_repo.param.mal_radius .. "\n\n" .. help
end
local radius, msg = check_radius(radius, name)
if msg then
core.chat_send_player(name, msg)
end
local ppos = core.get_player_by_name(name):get_pos()
local checked_nodes = {}
@ -403,9 +471,9 @@ core.register_chatcommand(cmd_repo.find_node.cmd, {
end
end
local msg
if #unknown_nodes > 0 then
msg = S("Found unknown nodes: @1", table.concat(unknown_nodes, ", "))
local node_count = #unknown_nodes
if node_count > 0 then
msg = S("Found unknown nodes: @1", node_count) .. "\n " .. table.concat(unknown_nodes, ", ")
else
msg = S("No unknown nodes found.")
end
@ -414,10 +482,71 @@ core.register_chatcommand(cmd_repo.find_node.cmd, {
end,
})
--- Unsafe commands.
--- Finds names of nearby nodes.
--
-- Enabled with `cleaner.unsafe` setting.
-- @chatcmd find_nearby_nodes
-- @tparam[opt] int radius Search radius (default: 5).
-- @priv server
-- @usage
-- # print names of all node types found within radius of 10
-- /find_nearby_nodes 10
core.register_chatcommand(cmd_repo.near_node.cmd, {
privs = {server=true},
description = S("Find names of nearby nodes.") .. "\n\n"
.. format_params(cmd_repo.near_node.cmd),
params = cmd_repo.near_node.help.param_string,
func = function(name, param)
local help = format_help(cmd_repo.near_node.cmd)
if param:find(" ") then
return false, cmd_repo.param.excess .. "\n\n" .. help
end
local radius = cmd_repo.near_node.oparams.radius
if param and param:trim() ~= "" then
radius = tonumber(param)
end
if not radius then
return false, cmd_repo.param.mal_radius .. "\n\n" .. help
end
local radius, msg = check_radius(radius, name)
if msg then
core.chat_send_player(name, msg)
end
local ppos = core.get_player_by_name(name):get_pos()
local node_names = {}
for _, npos in ipairs(pos_list(ppos, radius)) do
local node = core.get_node_or_nil(npos)
if node and not node_names[node.name] then
node_names[node.name] = true
end
end
local found_nodes = {}
for k, _ in pairs(node_names) do
table.insert(found_nodes, k)
end
local msg
local node_count = #found_nodes
if node_count > 0 then
msg = S("Nearby nodes: @1", node_count) .. "\n " .. table.concat(found_nodes, ", ")
else
msg = S("No nearby nodes found.")
end
return true, msg
end,
})
--- Unsafe Commands.
--
-- Enabled with [cleaner.unsafe](settings.html#cleaner.unsafe) setting.
--
-- @section unsafe
@ -427,6 +556,12 @@ if cleaner.unsafe then
--
-- @chatcmd remove_ores
-- @param ore Ore technical name.
-- @priv server
-- @note This action is reverted after server restart. To make changes permanent,
-- use the [cleaner.json](config.html#cleaner.json) config.
-- @usage
-- # remove all registered ores that add default:stone_with_iron to world
-- /remove_ores default:stone_with_iron
core.register_chatcommand(cmd_repo.ore.cmd, {
privs = {server=true},
description = S("Remove an ore from game.") .. "\n\n"
@ -463,17 +598,24 @@ end
--- @section end
--- Manages settings for wielded cleaner tool.
--- Manages settings for wielded [cleaner tool](tools.html).
--
-- @chatcmd cleaner
-- <h3>Required Privileges:</h3>
--
-- - server
--
-- @chatcmd ctool
-- @param action Action to execute. Can be "status", "setmode", or "setnode".
-- @param value Mode or node to be set for tool.
core.register_chatcommand("cleaner", {
-- @param value Mode or node to be set for tool (not required for "status" action).
-- @usage
-- # while cleaner:pencil is wielded, configure to place default:dirt node when used
-- /ctool setmode write
-- /ctool setnode default:dirt
core.register_chatcommand(cmd_repo.tool.cmd, {
privs = {server=true},
description = S("Manage settings for wielded cleaner tool.") .. "\n\n"
.. S("Params:") .. "\n action: Action to execute. Can be one of \"status\", \"setmode\", or \"setnode\"."
.. "\n value: Mode or node to be set for tool.",
params = "<action> <value>",
.. format_params(cmd_repo.tool.cmd),
params = cmd_repo.tool.help.param_string,
func = function(name, param)
local action, value = param
local idx = param:find(" ")
@ -483,23 +625,25 @@ core.register_chatcommand("cleaner", {
value = param[2]
end
local help = format_help(cmd_repo.tool.cmd)
local player = core.get_player_by_name(name)
local stack = player:get_wielded_item()
local iname = aux.tool:format_name(stack)
local imeta = stack:get_meta()
if iname ~= "cleaner:pencil" then
return false, S("Unrecognized wielded item: @1", iname)
return false, S("Unrecognized wielded item: @1", iname) .. "\n\n" .. help
end
if action == "status" then
core.chat_send_player(name, iname .. ": "
.. S("mode=@1, node=@2", imeta:get_string("mode"), imeta:get_string("node")))
core.chat_send_player(name, iname .. ": " .. S("mode") .. "=" .. imeta:get_string("mode")
.. ", " .. S("node") .. "=" .. imeta:get_string("node"))
return true
end
if not action or not value then
return false, S("Missing parameter.")
return false, S("Missing parameter.") .. "\n\n" .. help
end
if action == "setmode" then
@ -507,7 +651,7 @@ core.register_chatcommand("cleaner", {
elseif action == "setnode" then
stack = aux.tool:set_node(stack, value, name)
else
return false, S("Unrecognized action: @1", action)
return false, S("Unrecognized action: @1", action) .. "\n\n" .. help
end
return player:set_wielded_item(stack)

View File

@ -5,6 +5,7 @@
# chat commands
entity=entidad
mode=modo
node=nodo
radius=radio
old_item=objeto_antiguo
@ -12,6 +13,8 @@ new_item=objeto_nuevo
old_node=nodo_antiguo
new_node=nodo_nuevo
ore=mineral
action=acción
value=valor
Usage:=Uso:
Params:=Parámetros:
default: @1=por defecto: @1
@ -23,11 +26,14 @@ Technical name of node to be used in place.=Nombre técnico del nodo de reemplaz
Technical name of item to be replaced.=Nombre técnico del objeto reemplazado.
Technical name of item to be used in place.=Nombre técnico del objeto de reemplazo.
Ore technical name.=Nombre técnico de mineral.
Action to execute. Can be one of "@1", "@2", or "@3".=La acción para ejecutar. Puede ser "@1", "@2", o "@3".
Mode or node to be set for tool (not required for "@1" action).=Modo o nodo para configurar a la herramienta (no se requiere para la acción de "@1").
Remove an entity from game.=Eliminar una entidad del juego.
Remove a node from game.=Eliminar un nodo del juego.
Replace an item in game.=Sustituir un objecto del juego.
Replace a node in game.=Sustituir un nodo del juego.
Find names of unknown nodes.=Encontrar los nombres de nodos desconocidos.
Find names of unknown nodes.=Descubrir los nombres de nodos desconocidos.
Find names of nearby nodes.=Descubrir los nombres de nodos cercanos.
Remove an ore from game.=Eliminar un mineral del juego.
Missing parameter.=Parámetro extraviado.
Too many parameters.=Demasiados parámetros.
@ -39,6 +45,22 @@ Removed @1 nodes.=Se eliminaron @1 nodos.
Removed @1 entities.=Se eliminaron @1 entidades.
Found unknown nodes: @1=Se encontraron @1 nodos desconocidos.
No unknown nodes found.=No se encontraron nodos desconocidos.
Nearby nodes: @1=Nodos cercanos: @1
No nearby nodes found.=No se encontraron nodos cercanos.
Ore "@1" not found, not unregistering.=No se encontró el mineral "@1", se mantiene registrado.
Unregistered @1 ores (this will be undone after server restart).=Se anuló @1 minerales del registro.
Success!=¡Éxito!
Manage settings for wielded cleaner tool.=Administrar a los ajustes de la herramienta cleaner empuñada.
Unrecognized wielded item: @1=Objeto empuñado desconocido: @1
Unrecognized action: @1=Acción desconocido: @1
You do not have permission to set radius that high. Reduced to @1.=No tienes permiso para poner al radio tan alto. Se reduce a @1.
Radius is too high. Reduced to @1.=El radio es demasiado alto. Se reduce a @1.
# tools:
@1: mode set to: @2=@1: modo configurado para: @2
@1: node set to: @2=@1: nodo configurado para: @2
Modes for tool "@1" not available.=Modos para herramienta "@1" no disponibles.
You do not have permission to use this item. Missing privs: @1=No tienes permiso para usar este objeto. Privs que faltan: @1
Unknown mode: @1=Modo desconocido: @1
Can't place node there.=No se puede poner nodo allí.
Cannot place unknown node: @1=No se puede poner nodo desconocido: @1

View File

@ -5,6 +5,7 @@
# chat commands
entity=
mode=
node=
radius=
old_item=
@ -12,6 +13,8 @@ new_item=
old_node=
new_node=
ore=
action=
value=
Usage:=
Params:=
default: @1=
@ -23,11 +26,14 @@ Technical name of node to be used in place.=
Technical name of item to be replaced.=
Technical name of item to be used in place.=
Ore technical name.=
Action to execute. Can be one of "@1", "@2", or "@3".=
Mode or node to be set for tool (not required for "@1" action).=
Remove an entity from game.=
Remove a node from game.=
Replace an item in game.=
Replace a node in game.=
Find names of unknown nodes.=
Find names of nearby nodes.=
Remove an ore from game.=
Missing parameter.=
Too many parameters.=
@ -39,6 +45,22 @@ Removed @1 nodes.=
Removed @1 entities.=
Found unknown nodes: @1=
No unknown nodes found.=
Nearby nodes: @1=
No nearby nodes found.=
Ore "@1" not found, not unregistering.=
Unregistered @1 ores (this will be undone after server restart).=
Success!=
Manage settings for wielded cleaner tool.=
Unrecognized wielded item: @1=
Unrecognized action: @1=
You do not have permission to set radius that high. Reduced to @1.=
Radius is too high. Reduced to @1.=
# tools:
@1: mode set to: @2=
Modes for tool "@1" not available.=
@1: node set to: @2=
You do not have permission to use this item. Missing privs: @1=
Can't place node there.=
Unknown mode: @1=
Cannot place unknown node: @1=

View File

@ -98,8 +98,7 @@ local tool = {
imeta:set_string("mode", mode)
if pname then
core.chat_send_player(pname, iname .. ": "
.. S("mode set to: @1", imeta:get_string("mode")))
core.chat_send_player(pname, S("@1: mode set to: @2", iname, imeta:get_string("mode")))
end
local new_stack
@ -120,7 +119,7 @@ local tool = {
local modes = self.modes[iname]
if not modes then
return false, stack, "modes for tool \"" .. stack:get_name() .. "\" not available."
return false, stack, S('Modes for tool "@1" not available.', stack:get_name())
end
local imeta = stack:get_meta()
@ -145,20 +144,21 @@ local tool = {
imeta:set_string("node", node)
if pname then
core.chat_send_player(pname, stack:get_name() .. ": "
.. S("node set to: @1", imeta:get_string("node")))
core.chat_send_player(pname, S("@1: node set to: @2", stack:get_name(), imeta:get_string("node")))
end
return stack
end,
}
local sound_handle
tool.on_use = function(stack, user, pointed_thing)
if not user:is_player() then return end
local pname = user:get_player_name()
if not core.get_player_privs(pname).server then
core.chat_send_player(pname, S("You do not have permission to use this item. Missing privs: server"))
core.chat_send_player(pname, S("You do not have permission to use this item. Missing privs: @1", "server"))
return stack
end
@ -184,7 +184,7 @@ tool.on_use = function(stack, user, pointed_thing)
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.place_node(pointed_thing.above, {name=new_node_name})
core.set_node(pointed_thing.above, {name=new_node_name})
sound_handle = core.sound_play("cleaner_pencil_write", {object=user})
else
core.chat_send_player(pname, S("Can't place node there."))

View File

@ -1,6 +1,6 @@
name = cleaner
description = A mod that can be used to remove/replace unknown entities, nodes, & items.
version = 1.1
version = 1.2
license = MIT
author = PilzAdam, Jordan Irwin (AntumDeluge)
min_minetest_version = 5.0

Binary file not shown.

After

Width:  |  Height:  |  Size: 183 KiB

View File

@ -4,9 +4,10 @@
-- @topic settings
--- Enables unsafe methods.
--- Enables unsafe methods & chat commands.
--
-- `cleaner.remove_ore`
-- - `cleaner.remove_ore`
-- - `/remove_ores`
--
-- @setting cleaner.unsafe
-- @settype bool

View File

@ -1,5 +1,6 @@
# Enables unsafe methods.
# Enables unsafe methods & chat commands.
#
# - cleaner.remove_ore
# - /remove_ores
cleaner.unsafe (Enable unsafe methods) bool false

View File

@ -9,13 +9,11 @@ local S = core.get_translator(cleaner.modname)
local aux = dofile(cleaner.modpath .. "/misc_functions.lua")
local sound_handle
--- Master Pencil
--
-- @tool cleaner:pencil
-- @img cleaner_pencil.png
-- @privs server
-- @priv server
-- @usage
-- place (right-click):
-- - when not pointing at a node, changes modes

View File

@ -1644,9 +1644,10 @@ chatlog.disable (Disable chatlog) bool false
[*cleaner]
# Enables unsafe methods.
# Enables unsafe methods & chat commands.
#
# - cleaner.remove_ore
# - /remove_ores
cleaner.unsafe (Enable unsafe methods) bool false