aboutsummaryrefslogtreecommitdiff
path: root/init.lua
diff options
context:
space:
mode:
authorBeha <shacknetisp@mail.com>2017-03-07 13:50:23 -0500
committerBeha <shacknetisp@mail.com>2017-03-07 13:50:23 -0500
commitb5e38e547d961e37d6a20b093709490de92ffcf8 (patch)
tree82c8b5dc49fe19a44aaf4c0f629eb08bda00a3f5 /init.lua
parent457feb856c8ae60406b27212edf8ee3336640482 (diff)
downloadelevator-b5e38e547d961e37d6a20b093709490de92ffcf8.tar.gz
elevator-b5e38e547d961e37d6a20b093709490de92ffcf8.tar.bz2
elevator-b5e38e547d961e37d6a20b093709490de92ffcf8.zip
Eject others, check for shaft dug above box.
Diffstat (limited to 'init.lua')
-rw-r--r--init.lua56
1 files changed, 48 insertions, 8 deletions
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