From b5e38e547d961e37d6a20b093709490de92ffcf8 Mon Sep 17 00:00:00 2001 From: Beha Date: Tue, 7 Mar 2017 13:50:23 -0500 Subject: Eject others, check for shaft dug above box. --- init.lua | 56 ++++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 48 insertions(+), 8 deletions(-) (limited to 'init.lua') diff --git a/init.lua b/init.lua index 35d0596..657c77c 100644 --- a/init.lua +++ b/init.lua @@ -8,6 +8,26 @@ local elevator = { } local boxes = {} local formspecs = {} +local lastpp = {} +local time = 0 +minetest.register_globalstep(function(dtime) + time = time + dtime + if time < 0.5 then + return + end + time = 0 + for _,p in ipairs(minetest.get_connected_players()) do + local pos = p:getpos() + if minetest.get_node(pos).name ~= "elevator:elevator_on" then + lastpp[p:get_player_name()] = pos + end + end +end) +minetest.register_on_leaveplayer(function(player) + if lastpp[player:get_player_name()] and vector.distance(lastpp[player:get_player_name()], player:getpos()) < 20 then + player:setpos(lastpp[player:get_player_name()]) + end +end) local elevator_file = minetest.get_worldpath() .. "/elevator" local function load_elevator() @@ -123,7 +143,11 @@ local function unbuild(pos, add) end minetest.after(0.01, function(p2) p2.y = p2.y + add - build_motor(locate_motor(p2)) + local motorhash = locate_motor(p2) + build_motor(motorhash) + if boxes[motorhash] and minetest.string_to_pos(motorhash).y >= boxes[motorhash]:getpos().y then + boxes[motorhash] = nil + end end, table.copy(pos)) end @@ -141,10 +165,7 @@ minetest.register_node("elevator:motor", { build_motor(phash(pos)) end, on_destruct = function(pos) - if boxes[phash(pos)] then - boxes[phash(pos)]:remove() - boxes[phash(pos)] = nil - end + boxes[phash(pos)] = nil elevator.motors[phash(pos)] = nil save_elevator() end, @@ -178,8 +199,8 @@ else --{0.4 , -0.5, -0.48, 0.5, 1.5, -0.5}, --groundplate to stand on - { -0.5,-0.5,-0.5,0.5,-0.48, 0.5}, - { -0.5, 1.45,-0.5,0.5, 1.5, 0.5}, + --{ -0.5,-0.5,-0.5,0.5,-0.48, 0.5}, + --{ -0.5, 1.45,-0.5,0.5, 1.5, 0.5}, } end minetest.register_node(nodename, { @@ -284,8 +305,11 @@ minetest.register_on_player_receive_fields(function(sender, formname, fields) if not pos then return end + local meta = minetest.get_meta(pos) + if vector.distance(sender:get_pos(), pos) > 1 or boxes[meta:get_string("motor")] then + return + end if fields.go then - local meta = minetest.get_meta(pos) local motorhash = meta:get_string("motor") local motor = elevator.motors[motorhash] if not motor then @@ -327,6 +351,17 @@ minetest.register_on_player_receive_fields(function(sender, formname, fields) obj:setvelocity({x=0, y=SPEED*obj:get_luaentity().vmult, z=0}) obj:setacceleration({x=0, y=ACCEL*obj:get_luaentity().vmult, z=0}) boxes[motorhash] = obj + + for _,p in ipairs(motor.elevators) do + local p = minetest.string_to_pos(p) + for _,object in ipairs(minetest.get_objects_inside_radius(p, 2)) do + if object.is_player and object:is_player() and minetest.get_node(object:getpos()).name == "elevator:elevator_on" then + if object:get_player_name() ~= obj:get_luaentity().attached then + object:setpos(lastpp[sender:get_player_name()]) + end + end + end + end else minetest.chat_send_player(sender:get_player_name(), "This target is invalid.") return true @@ -490,6 +525,11 @@ local box_entity = { boxes[self.motor] = nil return end + if not boxes[self.motor] then + minetest.get_player_by_name(self.attached):set_eye_offset({x=0, y=0, z=0},{x=0, y=0, z=0}) + self.object:remove() + return + end local pos = self.object:getpos() self.lastpos = self.lastpos or pos for y=self.lastpos.y,pos.y,((self.lastpos.y > pos.y) and -1 or 1) do -- cgit v1.2.3