aboutsummaryrefslogtreecommitdiff
path: root/helpers.lua
diff options
context:
space:
mode:
authorBeha <shacknetisp@mail.com>2020-04-02 00:13:33 -0400
committerGitHub <noreply@github.com>2020-04-02 00:13:33 -0400
commit4924457eac47fc3a1c6c47834ed064b1b2089923 (patch)
treed514005ca26b792ce3f9f33050970945b06e2e63 /helpers.lua
parentffedde3bd611a8f29398f9db71b198be5b23c4dc (diff)
parent13f7c692cbddb53618e904170c6ac1d6762cfa4f (diff)
downloadelevator-4924457eac47fc3a1c6c47834ed064b1b2089923.tar.gz
elevator-4924457eac47fc3a1c6c47834ed064b1b2089923.tar.bz2
elevator-4924457eac47fc3a1c6c47834ed064b1b2089923.zip
Merge pull request #10 from S-S-X/refactor
Refactoring mod structure
Diffstat (limited to 'helpers.lua')
-rw-r--r--helpers.lua38
1 files changed, 38 insertions, 0 deletions
diff --git a/helpers.lua b/helpers.lua
new file mode 100644
index 0000000..ccd8ebb
--- /dev/null
+++ b/helpers.lua
@@ -0,0 +1,38 @@
+
+-- Try to teleport player away from any closed (on) elevator node.
+elevator.teleport_player_from_elevator = function(player)
+ local function solid(pos)
+ if not minetest.registered_nodes[minetest.get_node(pos).name] then
+ return true
+ end
+ return minetest.registered_nodes[minetest.get_node(pos).name].walkable
+ end
+ local pos = vector.round(player:getpos())
+ local node = minetest.get_node(pos)
+ -- elevator_off is like a shaft, so the player would already be falling.
+ if node.name == "elevator:elevator_on" then
+ local front = vector.subtract(pos, minetest.facedir_to_dir(node.param2))
+ local front_above = vector.add(front, {x=0, y=1, z=0})
+ local front_below = vector.subtract(front, {x=0, y=1, z=0})
+ -- If the front isn't solid, it's ok to teleport the player.
+ if not solid(front) and not solid(front_above) then
+ player:setpos(front)
+ end
+ end
+end
+
+elevator.phash = function(pos)
+ return minetest.pos_to_string(pos)
+end
+
+elevator.punhash = function(pos)
+ return minetest.string_to_pos(pos)
+end
+
+-- Helper function to read unloaded nodes.
+elevator.get_node = function(pos)
+ local node = minetest.get_node_or_nil(pos)
+ if node then return node end
+ local _,_ = VoxelManip():read_from_map(pos, pos)
+ return minetest.get_node_or_nil(pos)
+end