diff options
author | root <root@linuxworks.belug.de> | 2017-10-15 19:56:05 +0200 |
---|---|---|
committer | root <root@linuxworks.belug.de> | 2017-10-15 19:56:05 +0200 |
commit | 848741a294363431a2a6e9c32ddf693951951fec (patch) | |
tree | 011f49ffd45455c86022e79dd2207f9ec002de42 /wielder.lua | |
parent | 7e390cfda2bafb000c1d6688da472a71e591bc94 (diff) | |
parent | 30bedbfecc57f515f3c8578e225e27671e52316b (diff) |
Merge branch 'master' of https://github.com/minetest-mods/pipeworks
Diffstat (limited to 'wielder.lua')
-rw-r--r-- | wielder.lua | 61 |
1 files changed, 54 insertions, 7 deletions
diff --git a/wielder.lua b/wielder.lua index 36c1eb9..51ee278 100644 --- a/wielder.lua +++ b/wielder.lua @@ -19,6 +19,27 @@ local function set_wielder_formspec(data, meta) meta:set_string("infotext", data.description) end +local can_tool_dig_node = function(nodename, toolcaps, toolname) + --pipeworks.logger("can_tool_dig_node() STUB nodename="..tostring(nodename).." toolname="..tostring(toolname).." toolcaps: "..dump(toolcaps)) + -- brief documentation of minetest.get_dig_params() as it's not yet documented in lua_api.txt: + -- takes two arguments, a node's block groups and a tool's capabilities, + -- both as they appear in their respective definitions. + -- returns a table with the following fields: + -- diggable: boolean, can this tool dig this node at all + -- time: float, time needed to dig with this tool + -- wear: int, number of wear points to inflict on the item + local nodegroups = minetest.registered_nodes[nodename].groups + local diggable = minetest.get_dig_params(nodegroups, toolcaps).diggable + if not diggable then + -- a pickaxe can't actually dig leaves based on it's groups alone, + -- but a player holding one can - the game seems to fall back to the hand. + -- fall back to checking the hand's properties if the tool isn't the correct one. + local hand_caps = minetest.registered_items[""].tool_capabilities + diggable = minetest.get_dig_params(nodegroups, hand_caps) + end + return diggable +end + local function wielder_on(data, wielder_pos, wielder_node) data.fixup_node(wielder_pos, wielder_node) if wielder_node.name ~= data.name_base.."_off" then return end @@ -281,19 +302,22 @@ end if pipeworks.enable_node_breaker then local data + -- see after end of data table for other use of these variables + local name_base = "pipeworks:nodebreaker" + local wield_inv_name = "pick" data = { - name_base = "pipeworks:nodebreaker", + name_base = name_base, description = "Node Breaker", texture_base = "pipeworks_nodebreaker", texture_stateful = { top = true, bottom = true, side2 = true, side1 = true, front = true }, tube_connect_sides = { top=1, bottom=1, left=1, right=1, back=1 }, tube_permit_anteroposterior_insert = false, - wield_inv_name = "pick", + wield_inv_name = wield_inv_name, wield_inv_width = 1, wield_inv_height = 1, can_dig_nonempty_wield_inv = true, ghost_inv_name = "ghost_pick", - ghost_tool = "default:pick_mese", + ghost_tool = ":", -- hand by default fixup_node = function (pos, node) local meta = minetest.get_meta(pos) local inv = meta:get_inventory() @@ -346,17 +370,26 @@ if pipeworks.enable_node_breaker then masquerade_as_owner = true, sneak = false, act = function(virtplayer, pointed_thing) + --local dname = "nodebreaker.act() " local wieldstack = virtplayer:get_wielded_item() local oldwieldstack = ItemStack(wieldstack) local on_use = (minetest.registered_items[wieldstack:get_name()] or {}).on_use if on_use then + --pipeworks.logger(dname.."invoking on_use "..tostring(on_use)) wieldstack = on_use(wieldstack, virtplayer, pointed_thing) or wieldstack virtplayer:set_wielded_item(wieldstack) else local under_node = minetest.get_node(pointed_thing.under) local on_dig = (minetest.registered_nodes[under_node.name] or {on_dig=minetest.node_dig}).on_dig - on_dig(pointed_thing.under, under_node, virtplayer) - wieldstack = virtplayer:get_wielded_item() + -- check that the current tool is capable of destroying the target node. + -- if we can't, don't dig, and leave the wield stack unchanged. + -- note that wieldstack:get_tool_capabilities() returns hand properties if the item has none of it's own. + if can_tool_dig_node(under_node.name, wieldstack:get_tool_capabilities(), wieldstack:get_name()) then + on_dig(pointed_thing.under, under_node, virtplayer) + wieldstack = virtplayer:get_wielded_item() + else + --pipeworks.logger(dname.."couldn't dig node!") + end end local wieldname = wieldstack:get_name() if wieldname == oldwieldstack:get_name() then @@ -379,9 +412,9 @@ if pipeworks.enable_node_breaker then minetest.register_craft({ output = "pipeworks:nodebreaker_off", recipe = { - { "group:wood", "default:pick_mese", "group:wood" }, + { "pipeworks:gear", "pipeworks:gear", "pipeworks:gear" }, { "default:stone", "mesecons:piston", "default:stone" }, - { "default:stone", "mesecons:mesecon", "default:stone" }, + { "group:wood", "mesecons:mesecon", "group:wood" }, } }) -- aliases for when someone had technic installed, but then uninstalled it but not pipeworks @@ -391,6 +424,20 @@ if pipeworks.enable_node_breaker then minetest.register_alias("technic:node_breaker_on", "pipeworks:nodebreaker_on") -- turn legacy auto-tree-taps into node breakers dofile(pipeworks.modpath.."/legacy.lua") + + -- register LBM for transition to cheaper node breakers + local lbm_id = "pipeworks:refund_node_breaker_pick" + minetest.register_lbm({ + name = lbm_id, + label = "Give back mese pick for pre-transition node breakers", + run_at_every_load = false, + nodenames = { name_base.."_on", name_base.."_off" }, + action = function(pos, node) + pipeworks.logger(lbm_id.." entry, nodename="..node.name) + local invref = minetest.get_meta(pos):get_inventory() + invref:add_item(wield_inv_name, ItemStack("default:pick_mese")) + end + }) end if pipeworks.enable_deployer then |