summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcheapie <no-email-for-you@example.com>2021-03-27 19:51:23 -0500
committercheapie <no-email-for-you@example.com>2021-03-27 19:51:23 -0500
commit7ad991ce409d40afa00a31dfadbc30462420de81 (patch)
tree72fae116d9486934e9d522292a4b85425d2f7973
parentd2954c52773faa86e3a414250b8a9f5acd04c787 (diff)
downloadpipeworks-master.tar
pipeworks-master.tar.gz
pipeworks-master.tar.bz2
pipeworks-master.tar.xz
pipeworks-master.zip
Assorted changes to tube breaking/repair behaviorHEADmaster
* Tubes can now be intentionally broken using a hammer * Log messages have been improved slightly for tube repair * Punching a broken tube now causes damage due to the sharp edges
-rw-r--r--item_transport.lua13
-rw-r--r--routing_tubes.lua68
-rw-r--r--tube_registration.lua12
3 files changed, 70 insertions, 23 deletions
diff --git a/item_transport.lua b/item_transport.lua
index f302bca..e1ee192 100644
--- a/item_transport.lua
+++ b/item_transport.lua
@@ -55,15 +55,22 @@ end)
-- tube overload mechanism:
-- when the tube's item count (tracked in the above tube_item_count table)
-- exceeds the limit configured per tube, replace it with a broken one.
+
+function pipeworks.break_tube(pos)
+ local node = minetest.get_node(pos)
+ local meta = minetest.get_meta(pos)
+ meta:set_string("the_tube_was", minetest.serialize(node))
+ minetest.swap_node(pos, {name = "pipeworks:broken_tube_1"})
+ pipeworks.scan_for_tube_objects(pos)
+end
+
local crunch_tube = function(pos, cnode, cmeta)
if enable_max_limit then
local h = minetest.hash_node_position(pos)
local itemcount = tube_item_count[h] or 0
if itemcount > max_tube_limit then
- cmeta:set_string("the_tube_was", minetest.serialize(cnode))
pipeworks.logger("Warning - a tube at "..minetest.pos_to_string(pos).." broke due to too many items ("..itemcount..")")
- minetest.swap_node(pos, {name = "pipeworks:broken_tube_1"})
- pipeworks.scan_for_tube_objects(pos)
+ pipeworks.break_tube(pos)
end
end
end
diff --git a/routing_tubes.lua b/routing_tubes.lua
index 1ebcf06..7a90fd4 100644
--- a/routing_tubes.lua
+++ b/routing_tubes.lua
@@ -10,6 +10,36 @@ minetest.register_craft( {
},
})
+-- The hammers that can be used to break/repair tubes
+local allowed_hammers = {
+ "anvil:hammer",
+ "cottages:hammer",
+ "glooptest:hammer_steel",
+ "glooptest:hammer_bronze",
+ "glooptest:hammer_diamond",
+ "glooptest:hammer_mese",
+ "glooptest:hammer_alatro",
+ "glooptest:hammer_arol"
+}
+
+-- Convert the above list to a format that's easier to look up
+for _,hammer in ipairs(allowed_hammers) do
+ allowed_hammers[hammer] = true
+end
+
+-- Check if the player is holding a suitable hammer or not - if they are, apply wear to it
+function pipeworks.check_and_wear_hammer(player)
+ local itemstack = player:get_wielded_item()
+ local wieldname = itemstack:get_name()
+ local playername = player:get_player_name()
+ if allowed_hammers[wieldname] then
+ itemstack:add_wear(1000)
+ player:set_wielded_item(itemstack)
+ return true
+ end
+ return false
+end
+
local nodecolor = 0xffff3030
pipeworks.register_tube("pipeworks:broken_tube", {
@@ -36,29 +66,27 @@ pipeworks.register_tube("pipeworks:broken_tube", {
local wieldname = itemstack:get_name()
local playername = puncher:get_player_name()
local log_msg = playername.." struck a broken tube at "..minetest.pos_to_string(pos).."\n"
- if wieldname == "anvil:hammer"
- or wieldname == "cottages:hammer"
- or wieldname == "glooptest:hammer_steel"
- or wieldname == "glooptest:hammer_bronze"
- or wieldname == "glooptest:hammer_diamond"
- or wieldname == "glooptest:hammer_mese"
- or wieldname == "glooptest:hammer_alatro"
- or wieldname == "glooptest:hammer_arol" then
- local meta = minetest.get_meta(pos)
- local was_node = minetest.deserialize(meta:get_string("the_tube_was"))
- if was_node and was_node ~= "" then
- pipeworks.logger(log_msg.." with "..wieldname.." to repair it.")
- minetest.swap_node(pos, { name = was_node.name, param2 = was_node.param2 })
- pipeworks.scan_for_tube_objects(pos)
- itemstack:add_wear(1000)
- puncher:set_wielded_item(itemstack)
- return itemstack
+ local meta = minetest.get_meta(pos)
+ local was_node = minetest.deserialize(meta:get_string("the_tube_was"))
+ if not was_node then
+ pipeworks.logger(log_msg.." but it can't be repaired.")
+ return
+ end
+ if not pipeworks.check_and_wear_hammer(puncher) then
+ if wieldname == "" then
+ pipeworks.logger(log_msg.." by hand. It's not very effective.")
+ if minetest.settings:get_bool("enable_damage") then
+ minetest.chat_send_player(playername,S("Broken tubes may be a bit sharp. Perhaps try with a hammer?"))
+ puncher:set_hp(puncher:get_hp()-1)
+ end
else
- pipeworks.logger(log_msg.." but it can't be repaired.")
+ pipeworks.logger(log_msg.." with "..wieldname.." but that tool is too weak.")
end
- else
- pipeworks.logger(log_msg.." with "..wieldname.." but that tool is too weak.")
+ return
end
+ pipeworks.logger(log_msg.." with "..wieldname.." to repair it.")
+ minetest.swap_node(pos, { name = was_node.name, param2 = was_node.param2 })
+ pipeworks.scan_for_tube_objects(pos)
end
}
})
diff --git a/tube_registration.lua b/tube_registration.lua
index a77154a..60d7ff8 100644
--- a/tube_registration.lua
+++ b/tube_registration.lua
@@ -113,6 +113,18 @@ local register_one_tube = function(name, tname, dropname, desc, plain, noctrs, e
connect_sides = {front = 1, back = 1, left = 1, right = 1, top = 1, bottom = 1},
priority = 50
},
+ on_punch = function(pos, node, player, pointed)
+ local playername = player:get_player_name()
+ if minetest.is_protected(pos, playername) and not minetest.check_player_privs(playername, {protection_bypass=true}) then
+ return minetest.node_punch(pos, node, player, pointed)
+ end
+ if pipeworks.check_and_wear_hammer(player) then
+ local wieldname = player:get_wielded_item():get_name()
+ pipeworks.logger(string.format("%s struck a tube at %s with %s to break it.", playername, minetest.pos_to_string(pos), wieldname))
+ pipeworks.break_tube(pos)
+ end
+ return minetest.node_punch(pos, node, player, pointed)
+ end,
after_place_node = pipeworks.after_place,
after_dig_node = pipeworks.after_dig,
on_rotate = false,