diff --git a/mods/nc_api_craft/craft_check.lua b/mods/nc_api_craft/craft_check.lua index e2d7bc64..7d0cc4b7 100644 --- a/mods/nc_api_craft/craft_check.lua +++ b/mods/nc_api_craft/craft_check.lua @@ -125,13 +125,14 @@ local function craftcheck(recipe, pos, node, data, xx, xz, zx, zz) if recipe.after then recipe.after(pos, data) end if data.after then data.after(pos, data) end nodecore.player_discover(data.crafter, "craft:" .. recipe.label) - if recipe.witness then + local witness = data.witness or recipe.witness + if witness then local lut = {} for _, v in pairs(recipe.nodes) do lut[minetest.hash_node_position(v)] = true end - nodecore.witness(pos, {recipe.action, recipe.label}, - type(recipe.witness) == "number" and recipe.witness or nil, + nodecore.witness(pos, {recipe.action, recipe.label, data.label}, + type(witness) == "number" and witness or nil, function(p) return lut[minetest.hash_node_position(p)] end ) end diff --git a/mods/nc_api_craft/item_place_node.lua b/mods/nc_api_craft/item_place_node.lua index deceeb1a..c44512b1 100644 --- a/mods/nc_api_craft/item_place_node.lua +++ b/mods/nc_api_craft/item_place_node.lua @@ -8,11 +8,11 @@ function minetest.item_place_node(itemstack, placer, pointed_thing, ...) local old_add = minetest.add_node minetest.add_node = function(pos, node, ...) local function helper2(...) - nodecore.craft_check(pos, node, { - action = "place", - crafter = placer, - pointed = pointed_thing - }) + nodecore.craft_check(pos, node, nodecore.underride({ + action = "place", + crafter = placer, + pointed = pointed_thing + }, pointed_thing.craftdata or {})) return ... end return helper2(old_add(pos, node, ...)) diff --git a/mods/nc_api_hints/witness.lua b/mods/nc_api_hints/witness.lua index bedbd3d2..e75b7bc2 100644 --- a/mods/nc_api_hints/witness.lua +++ b/mods/nc_api_hints/witness.lua @@ -1,8 +1,8 @@ -- LUALOCALS < --------------------------------------------------------- -local math, minetest, nodecore, pairs, type, vector - = math, minetest, nodecore, pairs, type, vector -local math_pi - = math.pi +local math, minetest, nodecore, pairs, string, type, vector + = math, minetest, nodecore, pairs, string, type, vector +local math_pi, string_format, string_gsub + = math.pi, string.format, string.gsub -- LUALOCALS > --------------------------------------------------------- local function playercheck(player, pos, maxdist, check) @@ -35,10 +35,16 @@ local function playercheck(player, pos, maxdist, check) end function nodecore.witness(pos, label, maxdist, check) + maxdist = maxdist or 16 + nodecore.log("action", string_format("witness %s at %s range %d", + string_gsub(minetest.serialize(label), "^return ", ""), + minetest.pos_to_string(pos), maxdist)) for _, player in pairs(minetest.get_connected_players()) do - if playercheck(player, pos, maxdist or 32, check) then + if playercheck(player, pos, maxdist, check) then for _, l in pairs(type(label) == "table" and label or {label}) do - nodecore.player_discover(player, "witness:" .. l) + if l then + nodecore.player_discover(player, "witness:" .. l) + end end end end diff --git a/mods/nc_doors/hints.lua b/mods/nc_doors/hints.lua index a33e833c..a2ee9458 100644 --- a/mods/nc_doors/hints.lua +++ b/mods/nc_doors/hints.lua @@ -37,3 +37,13 @@ nodecore.register_hint("propel hinged panel with focused light", "door ablation", {"nc_optics:lens_on", "group:door"} ) + +nodecore.register_hint("place a node with a door", + "witness:door placement", + "group:door" +) + +nodecore.register_hint("complete a craft with a door", + "witness:door place-craft", + "group:door" +) diff --git a/mods/nc_doors/presscraft.lua b/mods/nc_doors/presscraft.lua index a287b2b4..87953f59 100644 --- a/mods/nc_doors/presscraft.lua +++ b/mods/nc_doors/presscraft.lua @@ -69,6 +69,7 @@ local function pressify(rc) nr.action = "press" nr.toolgroups = nil + nr.witness = 16 local oldcheck = nr.check nr.check = function(pos, data) @@ -102,6 +103,28 @@ nodecore.register_craft = function(def, ...) return helper(oldreg(def, ...)) end +nodecore.register_craft({ + action = "press", + label = "press node craft", + priority = -1, + nodes = {{match = {groups = {stack_as_node = true}}}}, + check = function(pos, data) + if not backstop(pos, vector.subtract(data.pointed.under, + data.pointed.above), 4) then return end + return true + end, + after = function(pos, data) + return nodecore.craft_check(pos, + minetest.get_node(pos), + { + action = "place", + pointed = data.pointed, + witness = 16, + label = "door place-craft" + }) + end + }) + local checkedstack = {} nodecore.register_craft({ action = "press", @@ -126,36 +149,17 @@ nodecore.register_craft({ local stack = data[checkedstack] if not stack then return end minetest.remove_node(pos) - stack = minetest.item_place_node(stack, nil, data.pointed) + nodecore.witness(pos, "door placement") + local pt = {} + for k, v in pairs(data.pointed) do pt[k] = v end + pt.craftdata = { + witness = 16, + label = "door place-craft" + } + stack = minetest.item_place_node(stack, nil, pt) nodecore.node_sound(pos, "place") if not stack:is_empty() then nodecore.item_eject(pos, stack) end - return nodecore.craft_check(pos, - minetest.get_node(pos), - { - action = "place", - pointed = data.pointed - }) - end - }) - -nodecore.register_craft({ - action = "press", - label = "press node craft", - priority = -1, - nodes = {{match = {groups = {stack_as_node = true}}}}, - check = function(pos, data) - if not backstop(pos, vector.subtract(data.pointed.under, - data.pointed.above), 4) then return end - return true - end, - after = function(pos, data) - return nodecore.craft_check(pos, - minetest.get_node(pos), - { - action = "place", - pointed = data.pointed - }) end })