aboutsummaryrefslogtreecommitdiff
path: root/hooks.lua
diff options
context:
space:
mode:
Diffstat (limited to 'hooks.lua')
-rw-r--r--hooks.lua61
1 files changed, 61 insertions, 0 deletions
diff --git a/hooks.lua b/hooks.lua
new file mode 100644
index 0000000..609f0e9
--- /dev/null
+++ b/hooks.lua
@@ -0,0 +1,61 @@
+
+-- Globalstep timer.
+local time = 0
+
+minetest.register_globalstep(function(dtime)
+ -- Don't want to run this too often.
+ time = time + dtime
+ if time < 0.5 then
+ return
+ end
+ time = 0
+ -- Only count riders who are still logged in.
+ local newriding = {}
+ for _,p in ipairs(minetest.get_connected_players()) do
+ local pos = p:getpos()
+ local name = p:get_player_name()
+ newriding[name] = elevator.riding[name]
+ -- If the player is indeed riding, update their position.
+ if newriding[name] then
+ newriding[name].pos = pos
+ end
+ end
+ elevator.riding = newriding
+ for name,r in pairs(elevator.riding) do
+ -- If the box is no longer loaded or existent, create another.
+ local ok = r.box and r.box.getpos and r.box:getpos() and r.box:get_luaentity() and r.box:get_luaentity().attached == name
+ if not ok then
+ minetest.log("action", "[elevator] "..minetest.pos_to_string(r.pos).." created due to lost rider.")
+ minetest.after(0, elevator.create_box, r.motor, r.pos, r.target, minetest.get_player_by_name(name))
+ end
+ end
+ -- Ensure boxes are deleted after <PTIMEOUT> seconds if there are no players nearby.
+ for motor,obj in pairs(elevator.boxes) do
+ if type(obj) ~= "table" then
+ return
+ end
+ elevator.lastboxes[motor] = elevator.lastboxes[motor] and math.min(elevator.lastboxes[motor], elevator.PTIMEOUT) or elevator.PTIMEOUT
+ elevator.lastboxes[motor] = math.max(elevator.lastboxes[motor] - 1, 0)
+ local pos = obj:getpos()
+ if pos then
+ for _,object in ipairs(minetest.get_objects_inside_radius(pos, 5)) do
+ if object.is_player and object:is_player() then
+ elevator.lastboxes[motor] = elevator.PTIMEOUT
+ break
+ end
+ end
+ if elevator.lastboxes[motor] < 1 then
+ minetest.log("action", "[elevator] "..minetest.pos_to_string(pos).." broke due to lack of players.")
+ elevator.boxes[motor] = false
+ end
+ else
+ minetest.log("action", "[elevator] "..minetest.pos_to_string(pos).." broke due to lack of position during player check.")
+ elevator.boxes[motor] = false
+ end
+ end
+end)
+
+minetest.register_on_leaveplayer(function(player)
+ -- We don't want players potentially logging into open elevators.
+ elevator.teleport_player_from_elevator(player)
+end)