summaryrefslogtreecommitdiff
path: root/castle_gates/gate_functions.lua
diff options
context:
space:
mode:
Diffstat (limited to 'castle_gates/gate_functions.lua')
-rw-r--r--castle_gates/gate_functions.lua20
1 files changed, 13 insertions, 7 deletions
diff --git a/castle_gates/gate_functions.lua b/castle_gates/gate_functions.lua
index 4a3c7f7..92150d3 100644
--- a/castle_gates/gate_functions.lua
+++ b/castle_gates/gate_functions.lua
@@ -153,9 +153,9 @@ local get_door_layout = function(pos, facedir, player)
local test_node_def = minetest.registered_nodes[test_node.name]
can_slide_to:set_pos(test_pos, test_node_def.buildable_to == true)
- if test_node_def.paramtype2 == "facedir" then
+ if test_node_def.paramtype2 == "facedir" then -- prospective door nodes need to be of type facedir
local test_node_dirs = get_dirs(test_node.param2)
- local coplanar = vector.equals(test_node_dirs.back, door.directions.back)
+ local coplanar = vector.equals(test_node_dirs.back, door.directions.back) -- the "back" vector needs to point in the same direction as the rest of the door
if castle_gate_group_value == nil and test_node_def.groups.castle_gate ~= nil then
castle_gate_group_value = test_node_def.groups.castle_gate -- read the group value from the first gate node encountered
@@ -163,17 +163,18 @@ local get_door_layout = function(pos, facedir, player)
if coplanar and test_node_def.groups.castle_gate == castle_gate_group_value then
local entry = {["pos"] = test_pos, ["node"] = test_node}
- table.insert(door.all, entry)
- if test_node_def._gate_hinge ~= nil then
+ table.insert(door.all, entry) -- it's definitely a gate node of some sort.
+ if test_node_def._gate_hinge ~= nil then -- it's a hinge type of node, need to do extra work
local axis, placement = interpret_hinge(test_node_def._gate_hinge, test_pos, test_node_dirs)
- if door.hinge == nil then
+ if door.hinge == nil then -- this is the first hinge we've encountered.
door.hinge = {axis=axis, placement=placement}
- elseif door.hinge.axis ~= axis then
+ door.directions = test_node_dirs -- force the door as a whole to use the same reference frame as the first hinge
+ elseif door.hinge.axis ~= axis then -- there was a previous hinge. Do they rotate on the same axis?
return nil -- Misaligned hinge axes, door cannot rotate.
else
local axis_dir = {x=0, y=0, z=0}
axis_dir[axis] = 1
- local displacement = vector.normalize(vector.subtract(placement, door.hinge.placement))
+ local displacement = vector.normalize(vector.subtract(placement, door.hinge.placement)) -- check if this new hinge is displaced relative to the first hinge on any axis other than the rotation axis
if not (vector.equals(displacement, axis_dir) or vector.equals(displacement, vector.multiply(axis_dir, -1))) then
return nil -- Misaligned hinge offset, door cannot rotate.
end
@@ -251,10 +252,15 @@ local get_door_layout = function(pos, facedir, player)
local swing_corner = {} -- the corner of the square "arc" that a Minetest gate swings through
local scan_dir
+ minetest.debug(axis)
+ minetest.debug(backfront)
+ minetest.debug(leftright)
swing_corner[axis] = door_node.pos[axis]
swing_corner[backfront] = newpos[backfront]
swing_corner[leftright] = door_node.pos[leftright]
if not (vector.equals(newpos, swing_corner) or vector.equals(door_node.pos, swing_corner)) then -- we're right next to the hinge, no need for further testing
+ minetest.debug(dump(newpos))
+ minetest.debug(dump(swing_corner))
scan_dir = vector.direction(newpos, swing_corner) -- get the direction from the new door position toward the swing corner
repeat
newpos = vector.add(newpos, scan_dir) -- we start with newpos on the destination node, which has already been tested.