From 1d5d1d20df68e234c58613ab27c2a736e8937aa9 Mon Sep 17 00:00:00 2001 From: FaceDeer Date: Wed, 9 Jan 2019 00:20:02 -0700 Subject: [PATCH] a little more optimization, and sounds when placing nodes on builders and diggers --- class_layout.lua | 11 +++++++---- class_pointset.lua | 7 +++++++ nodes/node_builders.lua | 9 +++++++-- nodes/node_diggers.lua | 9 +++++++-- nodes/node_item_ejector.lua | 10 ++++++---- util_execute_cycle.lua | 2 +- 6 files changed, 35 insertions(+), 13 deletions(-) diff --git a/class_layout.lua b/class_layout.lua index d08d99c..3cec051 100644 --- a/class_layout.lua +++ b/class_layout.lua @@ -32,6 +32,10 @@ local get_node_image = function(pos, node) return node_image end +-- temporary pointsets used while searching +local to_test = Pointset.create() +local tested = Pointset.create() + function DigtronLayout.create(pos, player) local self = {} setmetatable(self, DigtronLayout) @@ -56,10 +60,6 @@ function DigtronLayout.create(pos, player) self.extents.min_y = pos.y self.extents.max_z = pos.z self.extents.min_z = pos.z - - -- temporary pointsets used while searching - local to_test = Pointset.create() - local tested = Pointset.create() tested:set(pos.x, pos.y, pos.z, true) to_test:set(pos.x + 1, pos.y, pos.z, true) @@ -168,6 +168,9 @@ function DigtronLayout.create(pos, player) digtron.award_layout(self, player) -- hook for achievements mod + to_test:clear() + tested:clear() + return self end diff --git a/class_pointset.lua b/class_pointset.lua index 8934039..40663d6 100644 --- a/class_pointset.lua +++ b/class_pointset.lua @@ -17,6 +17,13 @@ function Pointset.create() return set end +function Pointset:clear() + local points = self.points + for k, v in pairs(points) do + points[k] = nil + end +end + function Pointset:set(x, y, z, value) -- sets a value in the 3D array "points". self.points[hash_node_position_values(x,y,z)] = value diff --git a/nodes/node_builders.lua b/nodes/node_builders.lua index 92571b2..a9d783d 100644 --- a/nodes/node_builders.lua +++ b/nodes/node_builders.lua @@ -53,8 +53,13 @@ local builder_formspec = function(pos, meta) end local builder_on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) - if itemstack:get_definition().type == "node" and minetest.get_item_group(itemstack:get_name(), "digtron") > 0 then - return minetest.item_place_node(itemstack, clicker, pointed_thing) + local item_def = itemstack:get_definition() + if item_def.type == "node" and minetest.get_item_group(itemstack:get_name(), "digtron") > 0 then + local returnstack, success = minetest.item_place_node(itemstack, clicker, pointed_thing) + if success and item_def.sounds and item_def.sounds.place and item_def.sounds.place.name then + minetest.sound_play(item_def.sounds.place, {pos = pos}) + end + return returnstack, success end local meta = minetest.get_meta(pos) minetest.show_formspec(clicker:get_player_name(), diff --git a/nodes/node_diggers.lua b/nodes/node_diggers.lua index 2c9bef4..18f4ba3 100644 --- a/nodes/node_diggers.lua +++ b/nodes/node_diggers.lua @@ -61,8 +61,13 @@ local intermittent_on_construct = function(pos) end local intermittent_on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) - if itemstack:get_definition().type == "node" and minetest.get_item_group(itemstack:get_name(), "digtron") > 0 then - return minetest.item_place_node(itemstack, clicker, pointed_thing) + local item_def = itemstack:get_definition() + if item_def.type == "node" and minetest.get_item_group(itemstack:get_name(), "digtron") > 0 then + local returnstack, success = minetest.item_place_node(itemstack, clicker, pointed_thing) + if success and item_def.sounds and item_def.sounds.place and item_def.sounds.place.name then + minetest.sound_play(item_def.sounds.place, {pos = pos}) + end + return returnstack, success end local meta = minetest.get_meta(pos) minetest.show_formspec(clicker:get_player_name(), diff --git a/nodes/node_item_ejector.lua b/nodes/node_item_ejector.lua index 39a1eae..b174d92 100644 --- a/nodes/node_item_ejector.lua +++ b/nodes/node_item_ejector.lua @@ -31,7 +31,7 @@ local ejector_formspec = function(pos, meta) "tooltip[autoeject;" .. S("When checked, will eject items automatically with every Digtron cycle.\nItem ejectors can always be operated manually by punching them.") .. "]" end -local function eject_items(pos, node, player, eject_even_without_pipeworks) +local function eject_items(pos, node, player, eject_even_without_pipeworks, layout) local dir = minetest.facedir_to_dir(node.param2) local destination_pos = vector.add(pos, dir) local destination_node_name = minetest.get_node(destination_pos).name @@ -54,7 +54,9 @@ local function eject_items(pos, node, player, eject_even_without_pipeworks) return false end - local layout = DigtronLayout.create(pos, player) + if layout == nil then + layout = DigtronLayout.create(pos, player) + end -- Build a list of all the items that builder nodes want to use. local filter_items = {} @@ -141,9 +143,9 @@ minetest.register_node("digtron:inventory_ejector", { eject_items(pos, node, player, true) end, - execute_eject = function(pos, node, player) + execute_eject = function(pos, node, player, layout) local meta = minetest.get_meta(pos) - eject_items(pos, node, player, meta:get_string("nonpipe") == "true") + eject_items(pos, node, player, meta:get_string("nonpipe") == "true", layout) end, on_receive_fields = function(pos, formname, fields, sender) diff --git a/util_execute_cycle.lua b/util_execute_cycle.lua index 78219de..51b987a 100644 --- a/util_execute_cycle.lua +++ b/util_execute_cycle.lua @@ -337,7 +337,7 @@ digtron.execute_dig_cycle = function(pos, clicker) local target = minetest.get_node(location.pos) local targetdef = minetest.registered_nodes[target.name] if targetdef.execute_eject ~= nil then - targetdef.execute_eject(location.pos, target, clicker) + targetdef.execute_eject(location.pos, target, clicker, layout) else minetest.log(string.format("%s has an ejector group but is missing execute_eject method! This is an error in mod programming, file a bug.", targetdef.name)) end