Skip to content

Commit

Permalink
Missing tool nodes, chat message if no function or empty result (#77)
Browse files Browse the repository at this point in the history
* (#73, #74) Digtron crate for magic pen, chest labels for container tool

* fix counts_text variable and luacheck for DigtronLayout

* (#62) Chat messages if tool cannot be used on node

* (#74) Magic pen read infotext from any node

Co-authored-by: SX <sx@minetest>
  • Loading branch information
S-S-X and SX committed Dec 7, 2020
1 parent c02ebc6 commit 54d27e7
Show file tree
Hide file tree
Showing 6 changed files with 138 additions and 15 deletions.
2 changes: 2 additions & 0 deletions containertool/nodes/technic_chests.lua
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,7 @@ function definition:copy(node, pos, player)
data.color = self.settings.copy_color and (get_int(meta, "color") or has_color)
data.sort_mode = get_int(meta, "sort_mode")
data.autosort = get_int(meta, "autosort")
data.infotext = meta:get("infotext")
-- Digilines
if has_digiline(node.name) then
-- Chests seems to be clearing unchecked meta so we do the same
Expand All @@ -109,6 +110,7 @@ function definition:paste(node, pos, player, data)
set_color(meta, node, pos, data.color)
set_int(meta, "sort_mode", data.sort_mode)
set_int(meta, "autosort", data.autosort)
set_string(meta, "infotext", data.infotext)
-- Security
set_key_lock_secret(meta, data, node)
-- Pipeworks
Expand Down
8 changes: 5 additions & 3 deletions magic_pen/init.lua
Original file line number Diff line number Diff line change
Expand Up @@ -30,19 +30,21 @@ tool:ns({
end
return value
end,
get_content_title = function(content)
local title = content and content:gmatch("[\t ]*([^\r\n]+)[\r\n]")()
get_content_title = function(content, limit)
local title = content and content:gmatch("[\t ]*([^\r\n]+)")()
if type(title) == 'string' and #title > 40 then
title = title:sub(1, 40)
title = title:sub(1, limit or 40)
end
return title
end,
})

-- nodes
local modpath = minetest.get_modpath('magic_pen')
tool:load_node_definition(dofile(modpath .. '/nodes/any.lua'))
tool:load_node_definition(dofile(modpath .. '/nodes/lcd.lua'))
tool:load_node_definition(dofile(modpath .. '/nodes/book.lua'))
tool:load_node_definition(dofile(modpath .. '/nodes/digtron.lua'))
tool:load_node_definition(dofile(modpath .. '/nodes/geocache.lua'))
tool:load_node_definition(dofile(modpath .. '/nodes/textline.lua'))
tool:load_node_definition(dofile(modpath .. '/nodes/digiterms.lua'))
Expand Down
1 change: 1 addition & 0 deletions magic_pen/mod.conf
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ mobs_animal,
default,
digistuff,
digiterms,
digtron,
signs_api, display_api, boards, signs, signs_road,
signs_lib, basic_signs,
geocache,
Expand Down
27 changes: 27 additions & 0 deletions magic_pen/nodes/any.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
--
-- Register fallback node handler (wildcard node) for magic pen
--

local definition = {
name = '*',
nodes = '*',
group = 'text',
}

local get_content_title = metatool.ns('magic_pen').get_content_title

function definition:copy(node, pos, player)
local meta = minetest.get_meta(pos)
local infotext = meta:get("infotext")
if infotext then
local title = get_content_title(infotext:gsub("[\r\n]",""), 80)
return {
description = metatool.util.description(pos, node, meta),
source = meta:get("owner"),
title = title ~= infotext and title,
content = infotext,
}
end
end

return definition
75 changes: 75 additions & 0 deletions magic_pen/nodes/digtron.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
--
-- Register digtron crate for Magic pen
--

local definition = {
name = 'digtron_crate',
nodes = {
"digtron:loaded_crate",
"digtron:loaded_locked_crate",
},
group = 'text',
protection_bypass_read = "interact",
}

local digtron_on_receive_fields
if minetest.registered_nodes["digtron:loaded_crate"] then
digtron_on_receive_fields = minetest.registered_nodes["digtron:loaded_crate"].on_receive_fields
end
local get_content_title = metatool.ns('magic_pen').get_content_title

local function get_node_name(node_image)
return type(node_image.node) == "table" and node_image.node.name or "ignore"
end

local function node_pos_to_string(node_image)
if type(node_image.pos) == "table"
and type(node_image.pos.x) == "number"
and type(node_image.pos.y) == "number"
and type(node_image.pos.z) == "number" then
return ("%d,%d,%d"):format(node_image.pos.x, node_image.pos.y, node_image.pos.z)
end
return "<invalid pos>"
end

local function layout_to_text(layout)
local results = {}
local counts = {}
for _,node_image in pairs(layout.all) do
local nodename = get_node_name(node_image)
local nodepos = node_pos_to_string(node_image)
table.insert(results, ("%s at %s"):format(nodename, nodepos))
counts[nodename] = counts[nodename] and (counts[nodename] + 1) or 1
end
if #results > 0 then
local counts_text = "Component count:\n"
for nodename, count in pairs(counts) do
counts_text = ("%s%d %s\n"):format(counts_text, count, nodename)
end
return counts_text .. "Component locations:\n" .. table.concat(results, "\n")
end
end

function definition:copy(node, pos, player)
local meta = minetest.get_meta(pos)
local layout_string = meta:get_string("crated_layout")
--luacheck: read globals DigtronLayout
local layout = DigtronLayout.deserialize(layout_string)
return {
description = ("%s at %s"):format(node.name, minetest.pos_to_string(pos)),
source = meta:get("owner"),
title = meta:get("title"),
content = layout and layout_to_text(layout),
}
end

if type(digtron_on_receive_fields) == "function" then
function definition:paste(node, pos, player, data)
local title = data.title or data.content and get_content_title(data.title or data.content)
if title then
digtron_on_receive_fields(pos, "", { save = 1, title = title }, player)
end
end
end

return definition
40 changes: 28 additions & 12 deletions metatool/api.lua
Original file line number Diff line number Diff line change
Expand Up @@ -169,41 +169,55 @@ function metatool:before_write(pos, player, no_violation_record)
end

function metatool.on_tool_info(tool, player, pointed_thing, node, pos, nodedef, itemstack)
if tool.on_read_info then
if type(tool.on_read_info) == "function" then
-- Tool on_read_info method defined, call through it and let it handle nodes
return tool:on_read_info(player, pointed_thing, node, pos, nodedef, itemstack)
elseif type(nodedef.info) == "function" then
-- Only node definition had info method available, use it directly
return nodedef:info(node, pos, player, itemstack)
else
minetest.chat_send_player(player:get_player_name(), S('%s cannot inspect %s', tool.nice_name, node.name))
end
end

function metatool.on_tool_read(tool, player, pointed_thing, node, pos, nodedef, itemstack)
local data, group, description
if tool.on_read_node then
if type(tool.on_read_node) == "function" then
-- Tool on_read_node method defined, call through it and let it handle nodes
data, group, description = tool:on_read_node(player, pointed_thing, node, pos, nodedef)
elseif type(nodedef.copy) == "function" then
-- Only node definition had copy method available, use it directly
minetest.chat_send_player(player:get_player_name(), S('copying data for group %s', nodedef.group))
data = nodedef:copy(node, pos, player)
group = nodedef.group
description = type(data) == 'table' and data.description or ('Data from ' .. minetest.pos_to_string(pos))
if type(data) == 'table' then
minetest.chat_send_player(player:get_player_name(),
S('%s copied data for group %s', tool.nice_name, nodedef.group)
)
else
minetest.chat_send_player(player:get_player_name(),
S('%s copying data for group %s failed', tool.nice_name, nodedef.group)
)
end
else
minetest.chat_send_player(player:get_player_name(), S('%s cannot read from %s', tool.nice_name, node.name))
end
local separated
itemstack, separated = separate_stack(itemstack)
local result = metatool.write_data(separated or itemstack, {data=data,group=group}, description, tool)
if type(result) == 'string' then
minetest.chat_send_player(player:get_player_name(), result)
if type(data) == 'table' then
local separated
itemstack, separated = separate_stack(itemstack)
local result = metatool.write_data(separated or itemstack, {data=data,group=group}, description, tool)
if type(result) == 'string' then
minetest.chat_send_player(player:get_player_name(), result)
end
-- if stack was separated give missing items to player
return_itemstack(player, itemstack, separated)
end
-- if stack was separated give missing items to player
return_itemstack(player, itemstack, separated)
return itemstack
end

function metatool.on_tool_write(tool, player, pointed_thing, node, pos, nodedef, itemstack)
local data = metatool.read_data(itemstack)
if not tool.allow_use_empty and type(data) ~= 'table' then
if not tool.allow_use_empty and (type(data) ~= 'table' or type(data.data) ~= 'table') then
minetest.chat_send_player(
player:get_player_name(),
'no data stored in this wand, sneak+use or special+use to record data.'
Expand All @@ -217,7 +231,7 @@ function metatool.on_tool_write(tool, player, pointed_thing, node, pos, nodedef,
tooldata = data.data
group = data.group
end
if tool.on_write_node then
if type(tool.on_write_node) == "function" then
return tool:on_write_node(tooldata, group, player, pointed_thing, node, pos, nodedef)
elseif nodedef.group ~= group then
minetest.chat_send_player(
Expand All @@ -226,6 +240,8 @@ function metatool.on_tool_write(tool, player, pointed_thing, node, pos, nodedef,
)
elseif nodedef and data and type(nodedef.paste) == "function" then
return nodedef:paste(node, pos, player, tooldata)
else
minetest.chat_send_player(player:get_player_name(), S('%s cannot write to %s', tool.nice_name, node.name))
end
end

Expand Down

0 comments on commit 54d27e7

Please sign in to comment.