From 469b50633862b4838e4304750ef01195fd9850e8 Mon Sep 17 00:00:00 2001 From: SX Date: Thu, 13 Feb 2020 22:23:06 +0200 Subject: Refactoring hooks, storage, register --- hooks.lua | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 hooks.lua (limited to 'hooks.lua') diff --git a/hooks.lua b/hooks.lua new file mode 100644 index 0000000..ff6d4cb --- /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, create_box, r.motor, r.pos, r.target, minetest.get_player_by_name(name)) + end + end + -- Ensure boxes are deleted after 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], PTIMEOUT) or 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] = 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) -- cgit v1.2.3