Clean up tool mode switching

master
Jordan Irwin 2021-07-29 15:47:03 -07:00
parent 982a746e23
commit 182726e999
2 changed files with 35 additions and 17 deletions

View File

@ -485,7 +485,7 @@ core.register_chatcommand("cleaner", {
local player = core.get_player_by_name(name)
local stack = player:get_wielded_item()
local iname = stack:get_name()
local iname = aux.tool:format_name(stack)
local imeta = stack:get_meta()
if iname ~= "cleaner:pencil" then

View File

@ -71,10 +71,9 @@ end
local tool = {
modes = {
erase = true,
write = true,
swap = true,
["cleaner:pencil"] = {"erase", "write", "swap"},
},
format_name = function(self, stack)
local iname = stack:get_name()
if iname == "cleaner:pencil_1" then
@ -87,7 +86,7 @@ local tool = {
set_mode = function(self, stack, mode, pname)
local iname = self:format_name(stack)
if not self.modes[mode] then
if not self.modes[iname] then
if pname then
core.chat_send_player(pname, iname .. ": " .. S("unknown mode: @1", mode))
end
@ -116,6 +115,31 @@ local tool = {
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)
@ -157,7 +181,6 @@ tool.on_use = function(stack, user, pointed_thing)
if mode == "swap" then
core.swap_node(npos, {name=new_node_name})
sound_handle = core.sound_play("cleaner_pencil_write", {object=user})
return stack
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
@ -166,11 +189,11 @@ tool.on_use = function(stack, user, pointed_thing)
else
core.chat_send_player(pname, S("Can't place node there."))
end
return stack
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))
@ -187,17 +210,12 @@ tool.on_secondary_use = function(stack, user, pointed_thing)
return stack
end
local imeta = stack:get_meta()
local mode = imeta:get_string("mode")
if mode == "erase" or mode == "" then
mode = "write"
elseif mode == "write" then
mode = "swap"
else
mode = "erase"
local success, stack, msg = tool.next_mode(tool, stack, pname)
if not success then
core.chat_send_player(pname, msg)
end
return tool:set_mode(stack, mode, pname)
return stack
end
tool.on_place = function(stack, placer, pointed_thing)