Skip to content

Commit 0a4ae97

Browse files
authored
Always provide the vector metatable to node callbacks (#121)
Use vector.new/copy/offset as appropriate and replace deprecated use of vector.new by vector.copy.
1 parent 2bab3fc commit 0a4ae97

File tree

11 files changed

+50
-42
lines changed

11 files changed

+50
-42
lines changed

class_layout.lua

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ digtron.DigtronLayout.__index = digtron.DigtronLayout
55
-- Creation
66

77
local get_node_image = function(pos, node)
8-
local node_image = {node=node, pos={x=pos.x, y=pos.y, z=pos.z}}
8+
local node_image = {node=node, pos=vector.copy(pos)}
99
local node_def = digtron.get_nodedef(node.name)
1010
node_image.paramtype2 = node_def.paramtype2
1111
local meta = minetest.get_meta(pos)
@@ -59,7 +59,7 @@ function digtron.DigtronLayout.create(pos, player)
5959
self.old_pos_pointset = digtron.Pointset.create() -- For tracking original location of nodes if we do transformations on the Digtron
6060
self.nodes_dug = digtron.Pointset.create() -- For tracking adjacent nodes that will have been dug by digger heads in future
6161
self.contains_protected_node = false -- used to indicate if at least one node in this digtron array is protected from the player.
62-
self.controller = {x=pos.x, y=pos.y, z=pos.z} --Make a deep copy of the pos parameter just in case the calling code wants to play silly buggers with it
62+
self.controller = vector.copy(pos) --Make a deep copy of the pos parameter just in case the calling code wants to play silly buggers with it
6363

6464
-- We never visit the source node, so insert it into the all table a priori.
6565
-- Revisit this design decision if a controller node is created that contains fuel or inventory or whatever.
@@ -397,7 +397,7 @@ local node_callbacks = function(player)
397397

398398
for _, callback in ipairs(minetest.registered_on_dignodes) do
399399
-- Copy pos and node because callback can modify them
400-
local pos_copy = {x=old_pos.x, y=old_pos.y, z=old_pos.z}
400+
local pos_copy = vector.copy(old_pos)
401401
local oldnode_copy = {name=old_node.name, param1=old_node.param1, param2=old_node.param2}
402402
callback(pos_copy, oldnode_copy, digtron.fake_player)
403403
end
@@ -417,7 +417,7 @@ local node_callbacks = function(player)
417417

418418
for _, callback in ipairs(minetest.registered_on_placenodes) do
419419
-- Copy pos and node because callback can modify them
420-
local pos_copy = {x=new_pos.x, y=new_pos.y, z=new_pos.z}
420+
local pos_copy = vector.copy(new_pos)
421421
local oldnode_copy = {name=old_node.name, param1=old_node.param1, param2=old_node.param2}
422422
local newnode_copy = {name=new_node.name, param1=new_node.param1, param2=new_node.param2}
423423
callback(pos_copy, newnode_copy, digtron.fake_player, oldnode_copy)

init.lua

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,23 @@ digtron.auto_controller_colorize = "#88000030"
66
digtron.pusher_controller_colorize = "#00880030"
77
digtron.soft_digger_colorize = "#88880030"
88

9+
if not vector.copy then
10+
error("[digtron] Your Luanti/Minetest version is too old. Please update to 5.5.0 or newer.")
11+
end
12+
13+
digtron.set_inventory_action_loggers = function(def, name)
14+
default.set_inventory_action_loggers(def, name)
15+
return def
16+
end
17+
18+
if not default.set_inventory_action_loggers then
19+
minetest.log("error", "[digtron] Your Minetest Game (default mod) version seems very old. Digtron may not work correctly. Please consider updating to a current version.")
20+
21+
digtron.set_inventory_action_loggers = function(def)
22+
return def
23+
end
24+
end
25+
926
-- A global dictionary is used here so that other substitutions can be added easily by other mods, if necessary
1027
digtron.builder_read_item_substitutions = {
1128
["default:torch_ceiling"] = "default:torch",

mod.conf

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,4 @@ optional_depends = pipeworks, doc, hopper, awards, catacomb, intllib, technic
77
license = MIT, LGPL 2.1 or later
88
forum = https://forum.minetest.net/viewtopic.php?t=16295
99
version = 0.8
10+
min_minetest_version = 5.5

nodes/node_battery_holder.lua

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,4 @@ local def = {
115115
after_dig_node = (function() if minetest.get_modpath("pipeworks")then return pipeworks.after_dig end end)()
116116
}
117117

118-
default.set_inventory_action_loggers(def, "digtron battery holder")
119-
120-
minetest.register_node("digtron:battery_holder", def)
118+
minetest.register_node("digtron:battery_holder", digtron.set_inventory_action_loggers(def))

nodes/node_controllers.lua

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -294,7 +294,7 @@ minetest.register_node("digtron:auto_controller", {
294294

295295
offset = offset or 0
296296
local newpos = pos
297-
local markerpos = {x=newpos.x, y=newpos.y, z=newpos.z}
297+
local markerpos = vector.copy(newpos)
298298
local x_pos = math.floor((newpos[controlling_coordinate]+offset)/slope)*slope - offset
299299
markerpos[controlling_coordinate] = x_pos
300300
minetest.add_entity(markerpos, "digtron:marker_vertical")

nodes/node_crate.lua

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ local store_digtron = function(pos, clicker, loaded_node_name, protected)
6969

7070
for _, callback in ipairs(minetest.registered_on_dignodes) do
7171
-- Copy pos and node because callback can modify them
72-
local pos_copy = {x=old_pos.x, y=old_pos.y, z=old_pos.z}
72+
local pos_copy = vector.copy(old_pos)
7373
local oldnode_copy = {name=old_node.name, param1=old_node.param1, param2=old_node.param2}
7474
callback(pos_copy, oldnode_copy, clicker)
7575
end

nodes/node_duplicator.lua

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ minetest.register_node("digtron:duplicator", {
137137
return
138138
end
139139

140-
layout.all[1] = {node={name=target_node.name}, meta={fields = {}, inventory = {}}, pos={x=pos.x, y=pos.y, z=pos.z}} -- replace the duplicator's image with the empty crate image
140+
layout.all[1] = {node={name=target_node.name}, meta={fields = {}, inventory = {}}, pos=vector.copy(pos)} -- replace the duplicator's image with the empty crate image
141141

142142
-- count required nodes, skipping node 1 since it's the crate and we already know it's present in-world
143143
local required_count = {}

nodes/node_storage.lua

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,6 @@ local S = digtron.S
55

66
local pipeworks_path = minetest.get_modpath("pipeworks")
77

8-
---Apply `default.set_inventory_action_loggers` onto the given `def` table
9-
---@see default.set_inventory_action_loggers
10-
---@param def table
11-
---@param name string
12-
---@return table def
13-
local function set_logger(def, name)
14-
default.set_inventory_action_loggers(def, name)
15-
return def
16-
end
17-
188
local inventory_formspec_string =
199
"size[8,9.3]" ..
2010
default.gui_bg ..
@@ -34,7 +24,7 @@ end
3424

3525
-- Storage buffer. Builder nodes draw from this inventory and digger nodes deposit into it.
3626
-- Note that inventories are digtron group 2.
37-
minetest.register_node("digtron:inventory", set_logger({
27+
minetest.register_node("digtron:inventory", digtron.set_inventory_action_loggers({
3828
description = S("Digtron Inventory Storage"),
3929
_doc_items_longdesc = digtron.doc.inventory_longdesc,
4030
_doc_items_usagehelp = digtron.doc.inventory_usagehelp,
@@ -121,7 +111,7 @@ end
121111

122112
-- Fuel storage. Controller node draws fuel from here.
123113
-- Note that fuel stores are digtron group 5.
124-
minetest.register_node("digtron:fuelstore", set_logger({
114+
minetest.register_node("digtron:fuelstore", digtron.set_inventory_action_loggers({
125115
description = S("Digtron Fuel Storage"),
126116
_doc_items_longdesc = digtron.doc.fuelstore_longdesc,
127117
_doc_items_usagehelp = digtron.doc.fuelstore_usagehelp,
@@ -227,7 +217,7 @@ local combined_storage_formspec = function()
227217
end
228218

229219
-- Combined storage. Group 6 has both an inventory and a fuel store
230-
minetest.register_node("digtron:combined_storage", set_logger({
220+
minetest.register_node("digtron:combined_storage", digtron.set_inventory_action_loggers({
231221
description = S("Digtron Combined Storage"),
232222
_doc_items_longdesc = digtron.doc.combined_storage_longdesc,
233223
_doc_items_usagehelp = digtron.doc.combined_storage_usagehelp,

util.lua

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -425,34 +425,34 @@ end
425425
digtron.show_offset_markers = function(pos, offset, period)
426426
local buildpos = digtron.find_new_pos(pos, minetest.get_node(pos).param2)
427427
local x_pos = math.floor((buildpos.x+offset)/period)*period - (offset or 0)
428-
safe_add_entity({x=x_pos, y=buildpos.y, z=buildpos.z}, "digtron:marker")
428+
safe_add_entity(vector.new(x_pos, buildpos.y, buildpos.z), "digtron:marker")
429429
if x_pos >= buildpos.x then
430-
safe_add_entity({x=x_pos - period, y=buildpos.y, z=buildpos.z}, "digtron:marker")
430+
safe_add_entity(vector.new(x_pos - period, buildpos.y, buildpos.z), "digtron:marker")
431431
end
432432
if x_pos <= buildpos.x then
433-
safe_add_entity({x=x_pos + period, y=buildpos.y, z=buildpos.z}, "digtron:marker")
433+
safe_add_entity(vector.new(x_pos + period, buildpos.y, buildpos.z), "digtron:marker")
434434
end
435435

436436
local y_pos = math.floor((buildpos.y+offset)/period)*period - offset
437-
safe_add_entity({x=buildpos.x, y=y_pos, z=buildpos.z}, "digtron:marker_vertical")
437+
safe_add_entity(vector.new(buildpos.x, y_pos, buildpos.z), "digtron:marker_vertical")
438438
if y_pos >= buildpos.y then
439-
safe_add_entity({x=buildpos.x, y=y_pos - period, z=buildpos.z}, "digtron:marker_vertical")
439+
safe_add_entity(vector.new(buildpos.x, y_pos - period, buildpos.z), "digtron:marker_vertical")
440440
end
441441
if y_pos <= buildpos.y then
442-
safe_add_entity({x=buildpos.x, y=y_pos + period, z=buildpos.z}, "digtron:marker_vertical")
442+
safe_add_entity(vector.new(buildpos.x, y_pos + period, buildpos.z), "digtron:marker_vertical")
443443
end
444444

445445
local z_pos = math.floor((buildpos.z+offset)/period)*period - offset
446446

447-
local entity = safe_add_entity({x=buildpos.x, y=buildpos.y, z=z_pos}, "digtron:marker")
447+
local entity = safe_add_entity(vector.new(buildpos.x, buildpos.y, z_pos), "digtron:marker")
448448
if entity ~= nil then entity:set_yaw(1.5708) end
449449

450450
if z_pos >= buildpos.z then
451-
entity = safe_add_entity({x=buildpos.x, y=buildpos.y, z=z_pos - period}, "digtron:marker")
451+
entity = safe_add_entity(vector.new(buildpos.x, buildpos.y, z_pos - period), "digtron:marker")
452452
if entity ~= nil then entity:set_yaw(1.5708) end
453453
end
454454
if z_pos <= buildpos.z then
455-
entity = safe_add_entity({x=buildpos.x, y=buildpos.y, z=z_pos + period}, "digtron:marker")
455+
entity = safe_add_entity(vector.new(buildpos.x, buildpos.y, z_pos + period), "digtron:marker")
456456
if entity ~= nil then entity:set_yaw(1.5708) end
457457
end
458458
end

util_execute_cycle.lua

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -336,7 +336,7 @@ digtron.execute_dig_cycle = function(pos, clicker)
336336
if not layout:write_layout_image(clicker) then
337337
return pos, "unrecoverable write_layout_image error", 1
338338
end
339-
local oldpos = {x=pos.x, y=pos.y, z=pos.z}
339+
local oldpos = vector.copy(pos)
340340
pos = vector.add(pos, dir)
341341
meta = minetest.get_meta(pos)
342342
if move_player then
@@ -430,7 +430,7 @@ digtron.execute_dig_cycle = function(pos, clicker)
430430
end
431431
-- all of the digtron's nodes wind up in nodes_dug, so this is an ideal place to stick
432432
-- a check to make sand fall after the digtron has passed.
433-
minetest.check_for_falling({x=node_to_dig.x, y=node_to_dig.y+1, z=node_to_dig.z})
433+
minetest.check_for_falling(vector.offset(node_to_dig, 0, 1, 0))
434434
node_to_dig, whether_to_dig = layout.nodes_dug:pop()
435435
end
436436
return pos, status_text, 0
@@ -595,7 +595,7 @@ digtron.execute_downward_dig_cycle = function(pos, clicker)
595595
if not layout:write_layout_image(clicker) then
596596
return pos, "unrecoverable write_layout_image error", 1
597597
end
598-
local oldpos = {x=pos.x, y=pos.y, z=pos.z}
598+
local oldpos = vector.copy(pos)
599599
pos = vector.add(pos, dir)
600600
meta = minetest.get_meta(pos)
601601
if move_player then

0 commit comments

Comments
 (0)