]> git.lizzy.rs Git - minetest-controls.git/commitdiff
Fix crashing in modern MT versions master
authorElias Fleckenstein <54945686+EliasFleckenstein03@users.noreply.github.com>
Mon, 4 Oct 2021 17:05:02 +0000 (19:05 +0200)
committerGitHub <noreply@github.com>
Mon, 4 Oct 2021 17:05:02 +0000 (19:05 +0200)
init.lua

index d2820eef0d301ea3836388023f37ce203a355894..ef57281a4e6189e4b07643e7436e1a0fcaa0c7c2 100644 (file)
--- a/init.lua
+++ b/init.lua
@@ -1,3 +1,8 @@
+local get_connected_players = minetest.get_connected_players
+local clock = os.clock
+
+local pairs = pairs
+
 controls = {}
 controls.players = {}
 
@@ -16,19 +21,24 @@ function controls.register_on_hold(func)
        controls.registered_on_hold[#controls.registered_on_hold+1]=func
 end
 
+local known_controls = {
+       jump = true,
+       right = true,
+       left = true,
+       LMB = true,
+       RMB = true,
+       sneak = true,
+       aux1 = true,
+       down = true,
+       up = true,
+}
+
 minetest.register_on_joinplayer(function(player)
        local name = player:get_player_name()
-       controls.players[name] = {
-               jump={false}, 
-               right={false}, 
-               left={false}, 
-               LMB={false}, 
-               RMB={false}, 
-               sneak={false}, 
-               aux1={false}, 
-               down={false}, 
-               up={false}
-       }
+       controls.players[name] = {}
+       for cname,_ in pairs(known_controls) do
+               controls.players[name][cname] = { false }
+       end
 end)
 
 minetest.register_on_leaveplayer(function(player)
@@ -37,26 +47,30 @@ minetest.register_on_leaveplayer(function(player)
 end)
 
 minetest.register_globalstep(function(dtime)
-       for _, player in pairs(minetest.get_connected_players()) do
+       for _, player in pairs(get_connected_players()) do
                local player_name = player:get_player_name()
                local player_controls = player:get_player_control()
-               for cname, cbool in pairs(player_controls) do
-                       --Press a key
-                       if cbool==true and controls.players[player_name][cname][1]==false then
-                               for _, func in pairs(controls.registered_on_press) do
-                                       func(player, cname)
-                               end
-                               controls.players[player_name][cname] = {true, os.clock()}
-                       elseif cbool==true and controls.players[player_name][cname][1]==true then
-                               for _, func in pairs(controls.registered_on_hold) do
-                                       func(player, cname, os.clock()-controls.players[player_name][cname][2])
-                               end
-                       --Release a key
-                       elseif cbool==false and controls.players[player_name][cname][1]==true then
-                               for _, func in pairs(controls.registered_on_release) do
-                                       func(player, cname, os.clock()-controls.players[player_name][cname][2])
+               if controls.players[player_name] then
+                       for cname, cbool in pairs(player_controls) do
+                               if known_controls[cname] == true then
+                                       --Press a key
+                                       if cbool == true and controls.players[player_name][cname][1] == false then
+                                               for _, func in pairs(controls.registered_on_press) do
+                                                       func(player, cname)
+                                               end
+                                               controls.players[player_name][cname] = {true, clock()}
+                                       elseif cbool == true and controls.players[player_name][cname][1] == true then
+                                               for _, func in pairs(controls.registered_on_hold) do
+                                                       func(player, cname, clock()-controls.players[player_name][cname][2])
+                                               end
+                                       --Release a key
+                                       elseif cbool == false and controls.players[player_name][cname][1] == true then
+                                               for _, func in pairs(controls.registered_on_release) do
+                                                       func(player, cname, clock()-controls.players[player_name][cname][2])
+                                               end
+                                               controls.players[player_name][cname] = {false}
+                                       end
                                end
-                               controls.players[player_name][cname] = {false}
                        end
                end
        end