summaryrefslogtreecommitdiff
path: root/init.lua
diff options
context:
space:
mode:
Diffstat (limited to 'init.lua')
-rw-r--r--init.lua159
1 files changed, 156 insertions, 3 deletions
diff --git a/init.lua b/init.lua
index 2c4d633..653d6d8 100644
--- a/init.lua
+++ b/init.lua
@@ -1,6 +1,129 @@
--Todo make lift go up and down!
+doors.register_door("lifter:door", {
+ description = "Lift Door",
+ inventory_image = "lifter_door_inv.png",
+ groups = {choppy=3, cracky=3, oddly_breakable_by_hand=1, flammable=2, door=1},
+ tiles_bottom = {"lifter_door_b.png", "lifter_door.png"},
+ tiles_top = {"lifter_door_a.png", "lifter.png"},
+ only_placer_can_open = false,
+ sounds = default.node_sound_wood_defaults(),
+ sunlight = false
+})
+
+-- should only be ignore if there's not generated map
+local function get_far_node(pos)
+ local node = minetest.get_node(pos)
+ if node.name == "ignore" then
+ minetest.get_voxel_manip():read_from_map(pos, pos)
+ node = minetest.get_node(pos)
+ end
+ return node
+end
+
+
+local function fetch_lift(pos, node, clicker, rel, i, open_door, plus)
+ local wnode = get_far_node({x=pos.x+1, y=pos.y+i, z=pos.z})
+ local snode = get_far_node({x=pos.x-1, y=pos.y+i, z=pos.z})
+ local anode = get_far_node({x=pos.x, y=pos.y+i, z=pos.z+1})
+ local dnode = get_far_node({x=pos.x, y=pos.y+i, z=pos.z-1})
+
+ if wnode.name ~= "lifter:lift" and snode.name ~= "lifter:lift" and
+ anode.name ~= "lifter:lift" and dnode.name ~= "lifter:lift" then
+
+ if wnode.name ~= "air" and snode.name ~= "air" and
+ anode.name ~= "air" and dnode.name ~= "air" then
+ print("lift not found, no air")
+ return
+ end
+
+ local test = minetest.find_nodes_in_area({x=pos.x-2, y=pos.y+i, z=pos.z-2}, {x=pos.x+2, y=pos.y+i, z=pos.z+2}, "air")
+ if #test == 16 then
+ print("lift not found, too much air")
+ return
+ end
+
+ if i%20 == 0 then
+ minetest.after(1, fetch_lift, pos, node, clicker, rel, i+plus, open_door, plus)
+ else
+ fetch_lift(pos, node, clicker, rel, i+plus, open_door, plus)
+ end
+ else
+ if wnode.name == "lifter:lift" then
+ local name = minetest.get_node({x=pos.x+1, y=pos.y+rel, z=pos.z}).name
+ if name == "air" or name == "ignore" then
+ minetest.remove_node({x=pos.x+1, y=pos.y+i, z=pos.z})
+ minetest.add_node({x=pos.x+1, y=pos.y+rel, z=pos.z}, {name="lifter:lift"})
+ else
+ print("lift blocked")
+ end
+ end
+ if snode.name == "lifter:lift" then
+ local name = minetest.get_node({x=pos.x-1, y=pos.y+rel, z=pos.z}).name
+ if name == "air" or name == "ignore" then
+ minetest.remove_node({x=pos.x-1, y=pos.y+i, z=pos.z})
+ minetest.add_node({x=pos.x-1, y=pos.y+rel, z=pos.z}, {name="lifter:lift"})
+ else
+ print("lift blocked")
+ end
+ end
+ if anode.name == "lifter:lift" then
+ local name = minetest.get_node({x=pos.x, y=pos.y+rel, z=pos.z+1}).name
+ if name == "air" or name == "ignore" then
+ minetest.remove_node({x=pos.x, y=pos.y+i, z=pos.z+1})
+ minetest.add_node({x=pos.x, y=pos.y+rel, z=pos.z+1}, {name="lifter:lift"})
+ else
+ print("lift blocked")
+ end
+ end
+ if dnode.name == "lifter:lift" then
+ local name = minetest.get_node({x=pos.x, y=pos.y+rel, z=pos.z-1}).name
+ if name == "air" or name == "ignore" then
+ minetest.remove_node({x=pos.x, y=pos.y+i, z=pos.z-1})
+ minetest.add_node({x=pos.x, y=pos.y+rel, z=pos.z-1}, {name="lifter:lift"})
+ else
+ print("lift blocked")
+ end
+ end
+ open_door(pos,node,clicker)
+ end
+end
+
+local b1rc = minetest.registered_nodes["lifter:door_b_1"].on_rightclick
+local t1rc = minetest.registered_nodes["lifter:door_t_1"].on_rightclick
+--local t2rc = minetest.registered_nodes["lifter:door_t_2"].on_rightclick
+
+minetest.override_item("lifter:door_b_1", {
+ on_rightclick = function(pos, node, clicker)
+ if clicker:is_player() then
+ minetest.chat_send_player(clicker:get_player_name(), "You called for a lift...")
+ end
+ fetch_lift(pos, node, clicker, -1, 0, b1rc, 1)
+ fetch_lift(pos, node, clicker, -1, 0, b1rc, -1)
+ end
+})
+
+--minetest.override_item("lifter:door_b_2", {
+ --on_rightclick = hijack_click(b2rc)
+--})
+
+minetest.override_item("lifter:door_t_1", {
+ on_rightclick = function(pos, node, clicker)
+ if clicker:is_player() then
+ minetest.chat_send_player(clicker:get_player_name(), "You called for a lift...")
+ end
+ fetch_lift(pos, node, clicker, -2, -1, t1rc, 1)
+ fetch_lift(pos, node, clicker, -2, -1, t1rc, -1)
+ end
+})
+
+--minetest.override_item("lifter:door_t_2", {
+ --on_rightclick = hijack_click(t2rc)
+--})
+
+local b2rc = minetest.registered_nodes["lifter:door_b_2"].on_rightclick
+
minetest.register_node("lifter:lift", {
tiles = {"lifter.png"},
description = "Lift",
@@ -19,6 +142,11 @@ minetest.register_node("lifter:lift", {
player:set_attach(obj, "", {x=0, y=15, z=0}, {x=0, y=0, z=0})
player:set_eye_offset({x=0, y=6, z=0},{x=0, y=0, z=0})
+
+ local door = minetest.find_node_near(pos, 2, "lifter:door_b_2")
+ if door then
+ b2rc(door, minetest.get_node(door), player)
+ end
end,
})
@@ -86,6 +214,14 @@ minetest.register_entity("lifter:travelling_lift", {
self.object:setvelocity({x=0, y=0, z=0})
self.object:setacceleration({x=0, y=0, z=0})
end
+ if (wnode.name:find("door") and not wbnode.name:find("door")) or
+ (snode.name:find("door") and not sbnode.name:find("door")) or
+ (anode.name:find("door") and not abnode.name:find("door")) or
+ (dnode.name:find("door") and not dbnode.name:find("door")) then
+ self.direction = 0
+ self.object:setvelocity({x=0, y=0, z=0})
+ self.object:setacceleration({x=0, y=0, z=0})
+ end
end
if wnode.name == "air" and snode.name == "air" and anode.name == "air" and dnode.name == "air" then
@@ -120,6 +256,11 @@ minetest.register_entity("lifter:travelling_lift", {
if exit then
+ local door = minetest.find_node_near(np, 2, "lifter:door_b_1")
+ if door then
+ b1rc(door, minetest.get_node(door), self.driver)
+ end
+
-- Create node and remove entity
minetest.add_node(np, {name="lifter:lift"})
self.object:remove()
@@ -135,9 +276,12 @@ minetest.register_entity("lifter:travelling_lift", {
return
end
- -- Set gravity
- self.object:setacceleration({x=0, y=self.direction*10, z=0})
-
+ if ctrl.jump or ctrl.sneak then
+ -- Set gravity
+ self.object:setacceleration({x=0, y=self.direction*5, z=0})
+ else
+ self.object:setacceleration({x=0, y=0, z=0})
+ end
end
})
@@ -150,3 +294,12 @@ minetest.register_craft({
},
})
+minetest.register_craft({
+ output = "lifter:door",
+ recipe = {
+ {"group:stick", "group:stick", "group:stick"},
+ {"group:stick", "doors:door_wood", "group:stick"},
+ {"group:stick", "group:stick", "group:stick"},
+ },
+})
+