From a3966d1a029cbeaaf6778313ee44dd6ada9ed369 Mon Sep 17 00:00:00 2001 From: SX Date: Fri, 14 Feb 2020 02:07:10 +0200 Subject: Refactoring crafts formspecs components helpers --- helpers.lua | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 helpers.lua (limited to 'helpers.lua') 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 -- cgit v1.2.3