Update cleaner mod to Git commit 182726e...
https://github.com/AntumMT/mod-cleaner/tree/182726e
This commit is contained in:
parent
65702b88c4
commit
09b94a0279
@ -11,7 +11,7 @@ The game includes the mods from the default [minetest_game](https://github.com/m
|
|||||||
|
|
||||||
* admin/
|
* admin/
|
||||||
* [alternode][] ([MIT][lic.alternode]) -- version: [1.3][ver.alternode] *2021-05-18*
|
* [alternode][] ([MIT][lic.alternode]) -- version: [1.3][ver.alternode] *2021-05-18*
|
||||||
* [cleaner][] ([MIT][lic.cleaner]) -- version: [9fa1b2b Git][ver.cleaner] *2021-07-20*
|
* [cleaner][] ([MIT][lic.cleaner]) -- version: [182726e Git][ver.cleaner] *2021-07-29*
|
||||||
* [no_fall_damage][] ([MIT][lic.no_fall_damage]) -- version [1.0.0][ver.no_fall_damage] *2020-12-19*
|
* [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*
|
* [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*
|
* [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.castle_weapons]: https://github.com/minetest-mods/castle_weapons/tree/d3cf095
|
||||||
[ver.chatlog]: https://github.com/AntumMT/mod-chatlog/tree/v1.1
|
[ver.chatlog]: https://github.com/AntumMT/mod-chatlog/tree/v1.1
|
||||||
[ver.christmas]: https://github.com/TheZenKitteh/minetest-christmas/tree/d3bd872
|
[ver.christmas]: https://github.com/TheZenKitteh/minetest-christmas/tree/d3bd872
|
||||||
[ver.cleaner]: https://github.com/AntumMT/mod-cleaner/tree/9fa1b2b
|
[ver.cleaner]: https://github.com/AntumMT/mod-cleaner/tree/182726e
|
||||||
[ver.cmer]: https://github.com/AntumMT/mod-cmer/tree/2843875
|
[ver.cmer]: https://github.com/AntumMT/mod-cmer/tree/2843875
|
||||||
[ver.cmer_chicken]: http://github.com/AntumMT/mod-cmer/tree/085706f
|
[ver.cmer_chicken]: http://github.com/AntumMT/mod-cmer/tree/085706f
|
||||||
[ver.cmer_ghost]: https://github.com/AntumMT/mod-cmer/tree/2f70906
|
[ver.cmer_ghost]: https://github.com/AntumMT/mod-cmer/tree/2f70906
|
||||||
|
@ -6,7 +6,11 @@ A [Minetest][] mod that can be used to remove/replace unknown entities, nodes, &
|
|||||||
|
|
||||||
### Licensing:
|
### Licensing:
|
||||||
|
|
||||||
[MIT](LICENSE.txt)
|
- 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:
|
### Requirements:
|
||||||
|
|
||||||
|
@ -4,4 +4,9 @@ TODO:
|
|||||||
- update inventories when items are replaced:
|
- update inventories when items are replaced:
|
||||||
- creative
|
- creative
|
||||||
- storage (chests, etc.)
|
- storage (chests, etc.)
|
||||||
- fix top nodes disappearing with /replace_node command
|
- 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
|
||||||
|
@ -3,15 +3,19 @@ v1.2
|
|||||||
----
|
----
|
||||||
- added API
|
- added API
|
||||||
- added chat commands:
|
- added chat commands:
|
||||||
- remove_entity
|
- remove_entities
|
||||||
- remove_node
|
- remove_nodes
|
||||||
- replace_item
|
- replace_items
|
||||||
- replace_node
|
- replace_nodes
|
||||||
- find_unknown_nodes
|
- find_unknown_nodes
|
||||||
|
- replace_ores (unsafe)
|
||||||
|
- added support for unregistering ores (unsafe)
|
||||||
- added setting for enabling "unsafe" methods & commands
|
- added setting for enabling "unsafe" methods & commands
|
||||||
- added support for unregistering ores
|
|
||||||
- all types are loaded from <world_path>/cleaner.json file
|
- all types are loaded from <world_path>/cleaner.json file
|
||||||
- added localization support
|
- added localization support
|
||||||
|
- added Spanish localization
|
||||||
|
- added pencil tool for erasing, adding, & swapping nodes
|
||||||
|
- added "cleaner" chat command for managing pencil tool settings
|
||||||
|
|
||||||
v1.1
|
v1.1
|
||||||
----
|
----
|
||||||
|
@ -7,6 +7,8 @@
|
|||||||
local S = core.get_translator(cleaner.modname)
|
local S = core.get_translator(cleaner.modname)
|
||||||
|
|
||||||
|
|
||||||
|
local aux = dofile(cleaner.modpath .. "/misc_functions.lua")
|
||||||
|
|
||||||
local function pos_list(ppos, radius)
|
local function pos_list(ppos, radius)
|
||||||
local plist = {}
|
local plist = {}
|
||||||
|
|
||||||
@ -21,54 +23,44 @@ local function pos_list(ppos, radius)
|
|||||||
return plist
|
return plist
|
||||||
end
|
end
|
||||||
|
|
||||||
local param_desc = {
|
local param_def = {
|
||||||
["radius"] = S("Search radius."),
|
radius = {name=S("radius"), desc=S("Search radius.")},
|
||||||
["entity"] = S("Entity technical name."),
|
entity = {name=S("entity"), desc=S("Entity technical name.")},
|
||||||
["node"] = S("Node technical name."),
|
node = {name=S("node"), desc=S("Node technical name.")},
|
||||||
["old_node"] = S("Technical name of node to be replaced."),
|
old_node = {name=S("old_node"), desc=S("Technical name of node to be replaced.")},
|
||||||
["new_node"] = S("Technical name of node to be used in place."),
|
new_node = {name=S("new_node"), desc=S("Technical name of node to be used in place.")},
|
||||||
["old_item"] = S("Technical name of item to be replaced."),
|
old_item = {name=S("old_item"), desc=S("Technical name of item to be replaced.")},
|
||||||
["new_item"] = S("Technical name of item to be used in place."),
|
new_item = {name=S("new_item"), desc=S("Technical name of item to be used in place.")},
|
||||||
["ore"] = S("Ore technical name."),
|
ore = {name=S("ore"), desc=S("Ore technical name.")},
|
||||||
}
|
}
|
||||||
|
|
||||||
local function format_help(cmd, param_string, params)
|
|
||||||
local retval = S("Usage:") .. "\n /" .. cmd .. " " .. param_string
|
|
||||||
.. "\n"
|
|
||||||
|
|
||||||
local p_count = 0
|
|
||||||
for _, p in ipairs(params) do
|
|
||||||
if p_count == 0 then
|
|
||||||
retval = retval .. "\n" .. S("Params:")
|
|
||||||
end
|
|
||||||
|
|
||||||
retval = retval .. "\n " .. S(p) .. ": " .. param_desc[p]
|
|
||||||
p_count = p_count + 1
|
|
||||||
end
|
|
||||||
|
|
||||||
return retval
|
|
||||||
end
|
|
||||||
|
|
||||||
local cmd_repo = {
|
local cmd_repo = {
|
||||||
entity = {
|
entity = {
|
||||||
cmd = "remove_entity",
|
cmd = "remove_entities",
|
||||||
params = "<" .. S("entity") .. "> [" .. S("radius") .. "]",
|
params = {"entity"},
|
||||||
|
oparams = {radius=100},
|
||||||
},
|
},
|
||||||
node = {
|
rem_node = {
|
||||||
cmd_rem = "remove_node",
|
cmd = "remove_nodes",
|
||||||
cmd_rep = "replace_node",
|
params = {"node"},
|
||||||
cmd_find = "find_unknown_nodes",
|
oparams = {radius=5},
|
||||||
params_rem = "<" .. S("node") .. "> [" .. S("radius") .. "]",
|
},
|
||||||
params_rep = "<" .. S("old_node") .. "> <" .. S("new_node") .. "> [" .. S("radius") .. "]",
|
rep_node = {
|
||||||
params_find = "[" .. S("radius") .. "]",
|
cmd = "replace_nodes",
|
||||||
|
params = {"old_node", "new_node"},
|
||||||
|
oparams = {radius=5},
|
||||||
|
},
|
||||||
|
find_node = {
|
||||||
|
cmd = "find_unknown_nodes",
|
||||||
|
oparams = {radius=100},
|
||||||
},
|
},
|
||||||
item = {
|
item = {
|
||||||
cmd = "replace_item",
|
cmd = "replace_items",
|
||||||
params = "<" .. S("old_item") .. "> <" .. S("new_item") .. ">",
|
params = {"old_item", "new_item"},
|
||||||
},
|
},
|
||||||
ore = {
|
ore = {
|
||||||
cmd = "remove_ore",
|
cmd = "remove_ores",
|
||||||
params = "<" .. S("ore") .. ">",
|
params = {"ore"},
|
||||||
},
|
},
|
||||||
param = {
|
param = {
|
||||||
missing = S("Missing parameter."),
|
missing = S("Missing parameter."),
|
||||||
@ -77,19 +69,131 @@ local cmd_repo = {
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for k, def in pairs(cmd_repo) do
|
||||||
|
if k ~= "param" then
|
||||||
|
local cmd_help = {
|
||||||
|
param_string = "",
|
||||||
|
usage_string = "/" .. def.cmd,
|
||||||
|
}
|
||||||
|
|
||||||
|
if def.params or def.oparams then
|
||||||
|
if def.params then
|
||||||
|
local params = {}
|
||||||
|
for _, p in ipairs(def.params) do
|
||||||
|
-- translate
|
||||||
|
table.insert(params, S(p))
|
||||||
|
end
|
||||||
|
|
||||||
|
cmd_help.param_string = "<" .. table.concat(params, "> <") .. ">"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if def.oparams then
|
||||||
|
for k, v in pairs(def.oparams) do
|
||||||
|
local op = k
|
||||||
|
if type(op) == "number" then
|
||||||
|
op = v
|
||||||
|
end
|
||||||
|
|
||||||
|
cmd_help.param_string = cmd_help.param_string .. " [" .. S(op) .. "]"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if cmd_help.param_string ~= "" then
|
||||||
|
cmd_help.usage_string = cmd_help.usage_string .. " " .. cmd_help.param_string
|
||||||
|
end
|
||||||
|
|
||||||
|
cmd_repo[k].help = cmd_help
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function get_cmd_def(cmd)
|
||||||
|
for k, v in pairs(cmd_repo) do
|
||||||
|
if v.cmd == cmd then return v end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function format_usage(cmd)
|
||||||
|
local def = get_cmd_def(cmd)
|
||||||
|
if def then
|
||||||
|
return S("Usage:") .. "\n " .. def.help.usage_string
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function format_params(cmd)
|
||||||
|
local def = get_cmd_def(cmd)
|
||||||
|
|
||||||
|
local param_count
|
||||||
|
local all_params = {}
|
||||||
|
if def.params then
|
||||||
|
for k, v in ipairs(def.params) do
|
||||||
|
table.insert(all_params, p)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if def.oparams then
|
||||||
|
for k, v in pairs(def.oparams) do
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local retval = ""
|
||||||
|
local p_count = 0
|
||||||
|
|
||||||
|
if def.params then
|
||||||
|
for _, p in ipairs(def.params) do
|
||||||
|
if p_count == 0 then
|
||||||
|
retval = retval .. S("Params:")
|
||||||
|
end
|
||||||
|
|
||||||
|
retval = retval .. "\n " .. S(p) .. ": " .. param_def[p].desc
|
||||||
|
|
||||||
|
p_count = p_count + 1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if def.oparams then
|
||||||
|
for k, v in pairs(def.oparams) do
|
||||||
|
if p_count == 0 then
|
||||||
|
retval = retval .. S("Params:")
|
||||||
|
end
|
||||||
|
|
||||||
|
local p = k
|
||||||
|
local dvalue = v
|
||||||
|
if type(p) == "number" then
|
||||||
|
p = v
|
||||||
|
dvalue = nil
|
||||||
|
end
|
||||||
|
|
||||||
|
retval = retval .. "\n " .. S(p) .. ": " .. param_def[p].desc
|
||||||
|
if dvalue then
|
||||||
|
retval = retval .. " (" .. S("default: @1", dvalue) .. ")"
|
||||||
|
end
|
||||||
|
|
||||||
|
p_count = p_count + 1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return retval
|
||||||
|
end
|
||||||
|
|
||||||
|
local function format_help(cmd)
|
||||||
|
return format_usage(cmd) .. "\n\n" .. format_params(cmd)
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
--- Removes nearby entities.
|
--- Removes nearby entities.
|
||||||
--
|
--
|
||||||
-- @chatcmd remove_entity
|
-- @chatcmd remove_entities
|
||||||
-- @param entity Entity technical name.
|
-- @param entity Entity technical name.
|
||||||
-- @tparam[opt] int radius
|
-- @tparam[opt] int radius
|
||||||
core.register_chatcommand(cmd_repo.entity.cmd, {
|
core.register_chatcommand(cmd_repo.entity.cmd, {
|
||||||
privs = {server=true},
|
privs = {server=true},
|
||||||
description = S("Remove an entity from game."),
|
description = S("Remove an entity from game.") .. "\n\n"
|
||||||
params = cmd_repo.entity.params,
|
.. format_params(cmd_repo.entity.cmd),
|
||||||
|
params = cmd_repo.entity.help.param_string,
|
||||||
func = function(name, param)
|
func = function(name, param)
|
||||||
local entity
|
local entity
|
||||||
local radius = 100
|
local radius = cmd_repo.entity.oparams.radius
|
||||||
if param:find(" ") then
|
if param:find(" ") then
|
||||||
entity = param:split(" ")
|
entity = param:split(" ")
|
||||||
radius = tonumber(entity[2])
|
radius = tonumber(entity[2])
|
||||||
@ -106,8 +210,7 @@ core.register_chatcommand(cmd_repo.entity.cmd, {
|
|||||||
end
|
end
|
||||||
|
|
||||||
if err then
|
if err then
|
||||||
return false, err .. "\n\n"
|
return false, err .. "\n\n" .. format_help(cmd_repo.entity.cmd)
|
||||||
.. format_help(cmd_repo.entity.cmd, cmd_repo.entity.params, {"entity", "radius"})
|
|
||||||
end
|
end
|
||||||
|
|
||||||
local player = core.get_player_by_name(name)
|
local player = core.get_player_by_name(name)
|
||||||
@ -135,16 +238,17 @@ core.register_chatcommand(cmd_repo.entity.cmd, {
|
|||||||
|
|
||||||
--- Removes nearby nodes.
|
--- Removes nearby nodes.
|
||||||
--
|
--
|
||||||
-- @chatcmd remove_node
|
-- @chatcmd remove_nodes
|
||||||
-- @param node Node technical name.
|
-- @param node Node technical name.
|
||||||
-- @tparam[opt] int radius
|
-- @tparam[opt] int radius
|
||||||
core.register_chatcommand(cmd_repo.node.cmd_rem, {
|
core.register_chatcommand(cmd_repo.rem_node.cmd, {
|
||||||
privs = {server=true},
|
privs = {server=true},
|
||||||
description = S("Remove a node from game."),
|
description = S("Remove a node from game.") .. "\n\n"
|
||||||
params = cmd_repo.node.params_rem,
|
.. format_params(cmd_repo.rem_node.cmd),
|
||||||
|
params = cmd_repo.rem_node.help.param_string,
|
||||||
func = function(name, param)
|
func = function(name, param)
|
||||||
local nname
|
local nname
|
||||||
local radius = 100
|
local radius = cmd_repo.rem_node.oparams.radius
|
||||||
if param:find(" ") then
|
if param:find(" ") then
|
||||||
nname = param:split(" ")
|
nname = param:split(" ")
|
||||||
radius = tonumber(nname[2])
|
radius = tonumber(nname[2])
|
||||||
@ -161,8 +265,7 @@ core.register_chatcommand(cmd_repo.node.cmd_rem, {
|
|||||||
end
|
end
|
||||||
|
|
||||||
if err then
|
if err then
|
||||||
return false, err .. "\n\n"
|
return false, err .. "\n\n" .. format_help(cmd_repo.rem_node.cmd)
|
||||||
.. format_help(cmd_repo.node.cmd_rem, cmd_repo.node.params_rem, {"node", "radius"})
|
|
||||||
end
|
end
|
||||||
|
|
||||||
local ppos = core.get_player_by_name(name):get_pos()
|
local ppos = core.get_player_by_name(name):get_pos()
|
||||||
@ -182,18 +285,17 @@ core.register_chatcommand(cmd_repo.node.cmd_rem, {
|
|||||||
|
|
||||||
--- Replaces an item.
|
--- Replaces an item.
|
||||||
--
|
--
|
||||||
-- @chatcmd replace_item
|
-- @chatcmd replace_items
|
||||||
-- @param old_item Technical name of item to replace.
|
-- @param old_item Technical name of item to replace.
|
||||||
-- @param new_item Technical name of item to be used in place.
|
-- @param new_item Technical name of item to be used in place.
|
||||||
core.register_chatcommand(cmd_repo.item.cmd, {
|
core.register_chatcommand(cmd_repo.item.cmd, {
|
||||||
privs = {server=true},
|
privs = {server=true},
|
||||||
description = S("Replace an item in game."),
|
description = S("Replace an item in game.") .. "\n\n"
|
||||||
params = cmd_repo.item.params,
|
.. format_params(cmd_repo.item.cmd),
|
||||||
|
params = cmd_repo.item.help.param_string,
|
||||||
func = function(name, param)
|
func = function(name, param)
|
||||||
local help = format_help(cmd_repo.item.cmd, cmd_repo.item.params, {"old_item", "new_item"})
|
|
||||||
|
|
||||||
if not param:find(" ") then
|
if not param:find(" ") then
|
||||||
return false, cmd_repo.param.missing .. "\n\n" .. help
|
return false, cmd_repo.param.missing .. "\n\n" .. format_help(cmd_repo.item.cmd)
|
||||||
end
|
end
|
||||||
|
|
||||||
local src = param:split(" ")
|
local src = param:split(" ")
|
||||||
@ -211,24 +313,23 @@ core.register_chatcommand(cmd_repo.item.cmd, {
|
|||||||
|
|
||||||
--- Replaces nearby nodes.
|
--- Replaces nearby nodes.
|
||||||
--
|
--
|
||||||
-- FIXME: sometimes nodes on top disappear
|
-- @chatcmd replace_nodes
|
||||||
--
|
|
||||||
-- @chatcmd replace_node
|
|
||||||
-- @param old_node Technical name of node to replace.
|
-- @param old_node Technical name of node to replace.
|
||||||
-- @param new_node Technical name of node to be used in place.
|
-- @param new_node Technical name of node to be used in place.
|
||||||
-- @tparam[opt] int radius
|
-- @tparam[opt] int radius
|
||||||
core.register_chatcommand(cmd_repo.node.cmd_rep, {
|
core.register_chatcommand(cmd_repo.rep_node.cmd, {
|
||||||
privs = {server=true},
|
privs = {server=true},
|
||||||
description = S("Replace a node in game."),
|
description = S("Replace a node in game.") .. "\n\n"
|
||||||
params = cmd_repo.node.params_rep,
|
.. format_params(cmd_repo.rep_node.cmd),
|
||||||
|
params = cmd_repo.rep_node.help.param_string,
|
||||||
func = function(name, param)
|
func = function(name, param)
|
||||||
local help = format_help(cmd_repo.node.cmd_rep, cmd_repo.node.params_rep, {"old_node", "new_node", "radius"})
|
local help = format_help(cmd_repo.rep_node.cmd)
|
||||||
|
|
||||||
if not param:find(" ") then
|
if not param:find(" ") then
|
||||||
return false, cmd_repo.param.missing .. "\n\n" .. help
|
return false, cmd_repo.param.missing .. "\n\n" .. help
|
||||||
end
|
end
|
||||||
|
|
||||||
local radius = 100
|
local radius = cmd_repo.rep_node.oparams.radius
|
||||||
local params = param:split(" ")
|
local params = param:split(" ")
|
||||||
|
|
||||||
local src = params[1]
|
local src = params[1]
|
||||||
@ -241,8 +342,7 @@ core.register_chatcommand(cmd_repo.node.cmd_rep, {
|
|||||||
return false, cmd_repo.param.mal_radius .. "\n\n" .. help
|
return false, cmd_repo.param.mal_radius .. "\n\n" .. help
|
||||||
end
|
end
|
||||||
|
|
||||||
local new_node = core.registered_nodes[tgt]
|
if not core.registered_nodes[tgt] then
|
||||||
if not new_node then
|
|
||||||
return false, S('Cannot use unknown node "@1" as replacement.', tgt)
|
return false, S('Cannot use unknown node "@1" as replacement.', tgt)
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -251,9 +351,11 @@ core.register_chatcommand(cmd_repo.node.cmd_rep, {
|
|||||||
for _, npos in ipairs(pos_list(ppos, radius)) do
|
for _, npos in ipairs(pos_list(ppos, radius)) do
|
||||||
local node = core.get_node_or_nil(npos)
|
local node = core.get_node_or_nil(npos)
|
||||||
if node and node.name == src then
|
if node and node.name == src then
|
||||||
core.remove_node(npos)
|
if core.swap_node(npos, {name=tgt}) then
|
||||||
core.place_node(npos, new_node)
|
|
||||||
total_replaced = total_replaced + 1
|
total_replaced = total_replaced + 1
|
||||||
|
else
|
||||||
|
cleaner.log("error", "could not replace node at " .. core.pos_to_string(npos, 0))
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -265,18 +367,19 @@ core.register_chatcommand(cmd_repo.node.cmd_rep, {
|
|||||||
--
|
--
|
||||||
-- @chatcmd find_unknown_nodes
|
-- @chatcmd find_unknown_nodes
|
||||||
-- @tparam[opt] int radius Search radius.
|
-- @tparam[opt] int radius Search radius.
|
||||||
core.register_chatcommand(cmd_repo.node.cmd_find, {
|
core.register_chatcommand(cmd_repo.find_node.cmd, {
|
||||||
privs = {server=true},
|
privs = {server=true},
|
||||||
description = S("Find names of unknown nodes."),
|
description = S("Find names of unknown nodes.") .. "\n\n"
|
||||||
params = cmd_repo.node.params_find,
|
.. format_params(cmd_repo.find_node.cmd),
|
||||||
|
params = cmd_repo.find_node.help.param_string,
|
||||||
func = function(name, param)
|
func = function(name, param)
|
||||||
local help = format_help(cmd_repo.node.cmd_find, cmd_repo.node.params_find, {"radius"})
|
local help = format_help(cmd_repo.find_node.cmd)
|
||||||
|
|
||||||
if param:find(" ") then
|
if param:find(" ") then
|
||||||
return false, cmd_repo.param.excess .. "\n\n" .. help
|
return false, cmd_repo.param.excess .. "\n\n" .. help
|
||||||
end
|
end
|
||||||
|
|
||||||
local radius = 100
|
local radius = cmd_repo.find_node.oparams.radius
|
||||||
if param and param:trim() ~= "" then
|
if param and param:trim() ~= "" then
|
||||||
radius = tonumber(param)
|
radius = tonumber(param)
|
||||||
end
|
end
|
||||||
@ -322,12 +425,13 @@ core.register_chatcommand(cmd_repo.node.cmd_find, {
|
|||||||
if cleaner.unsafe then
|
if cleaner.unsafe then
|
||||||
--- Registers an ore to be removed.
|
--- Registers an ore to be removed.
|
||||||
--
|
--
|
||||||
-- @chatcmd remove_ore
|
-- @chatcmd remove_ores
|
||||||
-- @param ore Ore technical name.
|
-- @param ore Ore technical name.
|
||||||
core.register_chatcommand(cmd_repo.ore.cmd, {
|
core.register_chatcommand(cmd_repo.ore.cmd, {
|
||||||
privs = {server=true},
|
privs = {server=true},
|
||||||
description = S("Remove an ore from game."),
|
description = S("Remove an ore from game.") .. "\n\n"
|
||||||
params = cmd_repo.ore.params,
|
.. format_params(cmd_repo.ore.cmd),
|
||||||
|
params = cmd_repo.ore.help.param_string,
|
||||||
func = function(name, param)
|
func = function(name, param)
|
||||||
local err
|
local err
|
||||||
if not param or param:trim() == "" then
|
if not param or param:trim() == "" then
|
||||||
@ -337,7 +441,7 @@ if cleaner.unsafe then
|
|||||||
end
|
end
|
||||||
|
|
||||||
if err then
|
if err then
|
||||||
return false, err .. "\n\n" .. format_help(cmd_repo.ore.cmd, cmd_repo.ore.params, {"ore"})
|
return false, err .. "\n\n" .. format_help(cmd_repo.ore.cmd)
|
||||||
end
|
end
|
||||||
|
|
||||||
local success = false
|
local success = false
|
||||||
@ -355,3 +459,57 @@ if cleaner.unsafe then
|
|||||||
end
|
end
|
||||||
})
|
})
|
||||||
end
|
end
|
||||||
|
|
||||||
|
--- @section end
|
||||||
|
|
||||||
|
|
||||||
|
--- Manages settings for wielded cleaner tool.
|
||||||
|
--
|
||||||
|
-- @chatcmd cleaner
|
||||||
|
-- @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", {
|
||||||
|
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>",
|
||||||
|
func = function(name, param)
|
||||||
|
local action, value = param
|
||||||
|
local idx = param:find(" ")
|
||||||
|
if idx then
|
||||||
|
param = string.split(param, " ")
|
||||||
|
action = param[1]
|
||||||
|
value = param[2]
|
||||||
|
end
|
||||||
|
|
||||||
|
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)
|
||||||
|
end
|
||||||
|
|
||||||
|
if action == "status" then
|
||||||
|
core.chat_send_player(name, iname .. ": "
|
||||||
|
.. S("mode=@1, node=@2", imeta:get_string("mode"), imeta:get_string("node")))
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
|
if not action or not value then
|
||||||
|
return false, S("Missing parameter.")
|
||||||
|
end
|
||||||
|
|
||||||
|
if action == "setmode" then
|
||||||
|
stack = aux.tool:set_mode(stack, value, name)
|
||||||
|
elseif action == "setnode" then
|
||||||
|
stack = aux.tool:set_node(stack, value, name)
|
||||||
|
else
|
||||||
|
return false, S("Unrecognized action: @1", action)
|
||||||
|
end
|
||||||
|
|
||||||
|
return player:set_wielded_item(stack)
|
||||||
|
end,
|
||||||
|
})
|
||||||
|
@ -1,7 +1,3 @@
|
|||||||
--[[ Cleaner mod
|
|
||||||
License: MIT
|
|
||||||
]]
|
|
||||||
|
|
||||||
|
|
||||||
cleaner = {}
|
cleaner = {}
|
||||||
cleaner.modname = core.get_current_modname()
|
cleaner.modname = core.get_current_modname()
|
||||||
@ -40,6 +36,7 @@ local scripts = {
|
|||||||
"settings",
|
"settings",
|
||||||
"api",
|
"api",
|
||||||
"chat",
|
"chat",
|
||||||
|
"tools",
|
||||||
"entities",
|
"entities",
|
||||||
"nodes",
|
"nodes",
|
||||||
"items",
|
"items",
|
||||||
|
44
mods/admin/cleaner/locale/cleaner.es.tr
Normal file
44
mods/admin/cleaner/locale/cleaner.es.tr
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
# textdomain:cleaner
|
||||||
|
|
||||||
|
# Translators: Jordan Irwin (AntumDeluge)
|
||||||
|
|
||||||
|
|
||||||
|
# chat commands
|
||||||
|
entity=entidad
|
||||||
|
node=nodo
|
||||||
|
radius=radio
|
||||||
|
old_item=objeto_antiguo
|
||||||
|
new_item=objeto_nuevo
|
||||||
|
old_node=nodo_antiguo
|
||||||
|
new_node=nodo_nuevo
|
||||||
|
ore=mineral
|
||||||
|
Usage:=Uso:
|
||||||
|
Params:=Parámetros:
|
||||||
|
default: @1=por defecto: @1
|
||||||
|
Search radius.=Radio de búsqueda.
|
||||||
|
Entity technical name.=Nombre técnico de entidad.
|
||||||
|
Node technical name.=Nombre técnico de nodo.
|
||||||
|
Technical name of node to be replaced.=Nombre técnico del nodo reemplazado.
|
||||||
|
Technical name of node to be used in place.=Nombre técnico del nodo de reemplazo.
|
||||||
|
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.
|
||||||
|
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.
|
||||||
|
Remove an ore from game.=Eliminar un mineral del juego.
|
||||||
|
Missing parameter.=Parámetro extraviado.
|
||||||
|
Too many parameters.=Demasiados parámetros.
|
||||||
|
Radius must be a number.=El radio debe ser un número.
|
||||||
|
Cannot use unknown item "@1" as replacement.=El objeto "@1" es desonocido, no se puede utilizar como sustitución.
|
||||||
|
Cannot use unknown node "@1" as replacement.=El nodo "@1" es desonocido, no se puede utilizar como sustitución.
|
||||||
|
Replaced @1 nodes.=Nodos sustituidos: @1
|
||||||
|
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.
|
||||||
|
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!
|
@ -1,4 +1,6 @@
|
|||||||
# Translated by
|
# textdomain:cleaner
|
||||||
|
|
||||||
|
# Translators:
|
||||||
|
|
||||||
|
|
||||||
# chat commands
|
# chat commands
|
||||||
@ -12,6 +14,7 @@ new_node=
|
|||||||
ore=
|
ore=
|
||||||
Usage:=
|
Usage:=
|
||||||
Params:=
|
Params:=
|
||||||
|
default: @1=
|
||||||
Search radius.=
|
Search radius.=
|
||||||
Entity technical name.=
|
Entity technical name.=
|
||||||
Node technical name.=
|
Node technical name.=
|
||||||
|
@ -1,4 +1,7 @@
|
|||||||
|
|
||||||
|
local S = core.get_translator(cleaner.modname)
|
||||||
|
|
||||||
|
|
||||||
--- Cleans duplicate entries from indexed table.
|
--- Cleans duplicate entries from indexed table.
|
||||||
--
|
--
|
||||||
-- @local
|
-- @local
|
||||||
@ -66,9 +69,178 @@ local function update_world_data(t, data)
|
|||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local tool = {
|
||||||
|
modes = {
|
||||||
|
["cleaner:pencil"] = {"erase", "write", "swap"},
|
||||||
|
},
|
||||||
|
|
||||||
|
format_name = function(self, stack)
|
||||||
|
local iname = stack:get_name()
|
||||||
|
if iname == "cleaner:pencil_1" then
|
||||||
|
iname = "cleaner:pencil"
|
||||||
|
end
|
||||||
|
|
||||||
|
return iname
|
||||||
|
end,
|
||||||
|
|
||||||
|
set_mode = function(self, stack, mode, pname)
|
||||||
|
local iname = self:format_name(stack)
|
||||||
|
|
||||||
|
if not self.modes[iname] then
|
||||||
|
if pname then
|
||||||
|
core.chat_send_player(pname, iname .. ": " .. S("unknown mode: @1", mode))
|
||||||
|
end
|
||||||
|
cleaner.log("warning", iname .. ": unknown mode: " .. mode)
|
||||||
|
return stack
|
||||||
|
end
|
||||||
|
|
||||||
|
local imeta = stack:get_meta()
|
||||||
|
imeta:set_string("mode", mode)
|
||||||
|
|
||||||
|
if pname then
|
||||||
|
core.chat_send_player(pname, iname .. ": "
|
||||||
|
.. S("mode set to: @1", imeta:get_string("mode")))
|
||||||
|
end
|
||||||
|
|
||||||
|
local new_stack
|
||||||
|
if mode == "erase" then
|
||||||
|
new_stack = ItemStack("cleaner:pencil_1")
|
||||||
|
else
|
||||||
|
new_stack = ItemStack("cleaner:pencil")
|
||||||
|
end
|
||||||
|
|
||||||
|
local new_meta = new_stack:get_meta()
|
||||||
|
new_meta:from_table(imeta:to_table())
|
||||||
|
|
||||||
|
return new_stack
|
||||||
|
end,
|
||||||
|
|
||||||
|
next_mode = function(self, stack, pname)
|
||||||
|
local iname = self:format_name(stack)
|
||||||
|
local modes = self.modes[iname]
|
||||||
|
|
||||||
|
if not modes then
|
||||||
|
return false, stack, "modes for tool \"" .. stack:get_name() .. "\" not available."
|
||||||
|
end
|
||||||
|
|
||||||
|
local imeta = stack:get_meta()
|
||||||
|
local current_mode = imeta:get_string("mode")
|
||||||
|
if not current_mode or current_mode:trim() == "" then
|
||||||
|
return true, self:set_mode(stack, modes[1], pname)
|
||||||
|
end
|
||||||
|
|
||||||
|
local idx = 1
|
||||||
|
for _, m in ipairs(modes) do
|
||||||
|
if current_mode == m then
|
||||||
|
break
|
||||||
|
end
|
||||||
|
idx = idx + 1
|
||||||
|
end
|
||||||
|
|
||||||
|
return true, self:set_mode(stack, modes[idx+1] or modes[1], pname)
|
||||||
|
end,
|
||||||
|
|
||||||
|
set_node = function(self, stack, node, pname)
|
||||||
|
local imeta = stack:get_meta()
|
||||||
|
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")))
|
||||||
|
end
|
||||||
|
|
||||||
|
return stack
|
||||||
|
end,
|
||||||
|
}
|
||||||
|
|
||||||
|
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"))
|
||||||
|
return stack
|
||||||
|
end
|
||||||
|
|
||||||
|
if sound_handle then
|
||||||
|
core.sound_stop(sound_handle)
|
||||||
|
sound_handle = nil
|
||||||
|
end
|
||||||
|
|
||||||
|
if pointed_thing.type == "node" then
|
||||||
|
local npos = core.get_pointed_thing_position(pointed_thing)
|
||||||
|
local imeta = stack:get_meta()
|
||||||
|
local mode = imeta:get_string("mode")
|
||||||
|
local new_node_name = imeta:get_string("node")
|
||||||
|
|
||||||
|
if mode == "erase" then
|
||||||
|
core.remove_node(npos)
|
||||||
|
sound_handle = core.sound_play("cleaner_pencil_erase", {object=user})
|
||||||
|
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})
|
||||||
|
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})
|
||||||
|
sound_handle = core.sound_play("cleaner_pencil_write", {object=user})
|
||||||
|
else
|
||||||
|
core.chat_send_player(pname, S("Can't place node there."))
|
||||||
|
end
|
||||||
|
else
|
||||||
|
core.chat_send_player(pname, S("Unknown mode: @1", mode))
|
||||||
|
end
|
||||||
|
|
||||||
|
return stack
|
||||||
|
end
|
||||||
|
|
||||||
|
core.chat_send_player(pname, S("Cannot place unknown node: @1", new_node_name))
|
||||||
|
return stack
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
tool.on_secondary_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: @1", "server"))
|
||||||
|
return stack
|
||||||
|
end
|
||||||
|
|
||||||
|
local success, stack, msg = tool.next_mode(tool, stack, pname)
|
||||||
|
if not success then
|
||||||
|
core.chat_send_player(pname, msg)
|
||||||
|
end
|
||||||
|
|
||||||
|
return stack
|
||||||
|
end
|
||||||
|
|
||||||
|
tool.on_place = function(stack, placer, pointed_thing)
|
||||||
|
if not placer:is_player() then return end
|
||||||
|
|
||||||
|
local pname = placer: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: @1", "server"))
|
||||||
|
return stack
|
||||||
|
end
|
||||||
|
|
||||||
|
if pointed_thing.type == "node" then
|
||||||
|
local node = core.get_node_or_nil(core.get_pointed_thing_position(pointed_thing))
|
||||||
|
if node then
|
||||||
|
stack = tool:set_node(stack, node.name, pname)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return stack
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
clean_duplicates = clean_duplicates,
|
clean_duplicates = clean_duplicates,
|
||||||
get_world_data = get_world_data,
|
get_world_data = get_world_data,
|
||||||
update_world_data = update_world_data,
|
update_world_data = update_world_data,
|
||||||
|
tool = tool,
|
||||||
}
|
}
|
||||||
|
@ -75,12 +75,9 @@ core.register_lbm({
|
|||||||
nodenames = {"group:to_replace"},
|
nodenames = {"group:to_replace"},
|
||||||
run_at_every_load = true,
|
run_at_every_load = true,
|
||||||
action = function(pos, node)
|
action = function(pos, node)
|
||||||
core.remove_node(pos)
|
|
||||||
|
|
||||||
local new_node_name = cleaner.get_replace_nodes()[node.name]
|
local new_node_name = cleaner.get_replace_nodes()[node.name]
|
||||||
local new_node = core.registered_nodes[new_node_name]
|
if core.registered_nodes[new_node_name] then
|
||||||
if new_node then
|
core.swap_node(pos, {name=new_node_name})
|
||||||
core.place_node(pos, new_node)
|
|
||||||
else
|
else
|
||||||
cleaner.log("error", "cannot replace with unregistered node \"" .. tostring(new_node_name) .. "\"")
|
cleaner.log("error", "cannot replace with unregistered node \"" .. tostring(new_node_name) .. "\"")
|
||||||
end
|
end
|
||||||
|
BIN
mods/admin/cleaner/sounds/cleaner_pencil_erase.ogg
Normal file
BIN
mods/admin/cleaner/sounds/cleaner_pencil_erase.ogg
Normal file
Binary file not shown.
BIN
mods/admin/cleaner/sounds/cleaner_pencil_write.ogg
Normal file
BIN
mods/admin/cleaner/sounds/cleaner_pencil_write.ogg
Normal file
Binary file not shown.
BIN
mods/admin/cleaner/textures/cleaner_pencil.png
Normal file
BIN
mods/admin/cleaner/textures/cleaner_pencil.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 255 B |
46
mods/admin/cleaner/tools.lua
Normal file
46
mods/admin/cleaner/tools.lua
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
|
||||||
|
--- Cleaner Tools
|
||||||
|
--
|
||||||
|
-- @topic tools
|
||||||
|
|
||||||
|
|
||||||
|
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
|
||||||
|
-- @usage
|
||||||
|
-- place (right-click):
|
||||||
|
-- - when not pointing at a node, changes modes
|
||||||
|
-- - when pointing at a node, sets node to be used
|
||||||
|
--
|
||||||
|
-- use (left-click):
|
||||||
|
-- - executes action for current mode:
|
||||||
|
-- - erase: erases pointed node
|
||||||
|
-- - write: adds node
|
||||||
|
-- - swap: replaces pointed node
|
||||||
|
core.register_tool(cleaner.modname .. ":pencil", {
|
||||||
|
description = S("Master Pencil"),
|
||||||
|
inventory_image = "cleaner_pencil.png",
|
||||||
|
liquids_pointable = true,
|
||||||
|
on_use = aux.tool.on_use,
|
||||||
|
on_secondary_use = aux.tool.on_secondary_use,
|
||||||
|
on_place = aux.tool.on_place,
|
||||||
|
})
|
||||||
|
|
||||||
|
core.register_tool(cleaner.modname .. ":pencil_1", {
|
||||||
|
description = S("Master Pencil"),
|
||||||
|
inventory_image = "cleaner_pencil.png^[transformFXFY",
|
||||||
|
liquids_pointable = true,
|
||||||
|
groups = {not_in_creative_inventory=1},
|
||||||
|
on_use = aux.tool.on_use,
|
||||||
|
on_secondary_use = aux.tool.on_secondary_use,
|
||||||
|
on_place = aux.tool.on_place,
|
||||||
|
})
|
Loading…
x
Reference in New Issue
Block a user