]> git.lizzy.rs Git - minetest-controls.git/blob - init.lua
Fix crashing in modern MT versions
[minetest-controls.git] / init.lua
1 local get_connected_players = minetest.get_connected_players
2 local clock = os.clock
3
4 local pairs = pairs
5
6 controls = {}
7 controls.players = {}
8
9 controls.registered_on_press = {}
10 function controls.register_on_press(func)
11         controls.registered_on_press[#controls.registered_on_press+1] = func
12 end
13
14 controls.registered_on_release = {}
15 function controls.register_on_release(func)
16         controls.registered_on_release[#controls.registered_on_release+1] = func
17 end
18
19 controls.registered_on_hold = {}
20 function controls.register_on_hold(func)
21         controls.registered_on_hold[#controls.registered_on_hold+1]=func
22 end
23
24 local known_controls = {
25         jump = true,
26         right = true,
27         left = true,
28         LMB = true,
29         RMB = true,
30         sneak = true,
31         aux1 = true,
32         down = true,
33         up = true,
34 }
35
36 minetest.register_on_joinplayer(function(player)
37         local name = player:get_player_name()
38         controls.players[name] = {}
39         for cname,_ in pairs(known_controls) do
40                 controls.players[name][cname] = { false }
41         end
42 end)
43
44 minetest.register_on_leaveplayer(function(player)
45         local name = player:get_player_name()
46         controls.players[name] = nil
47 end)
48
49 minetest.register_globalstep(function(dtime)
50         for _, player in pairs(get_connected_players()) do
51                 local player_name = player:get_player_name()
52                 local player_controls = player:get_player_control()
53                 if controls.players[player_name] then
54                         for cname, cbool in pairs(player_controls) do
55                                 if known_controls[cname] == true then
56                                         --Press a key
57                                         if cbool == true and controls.players[player_name][cname][1] == false then
58                                                 for _, func in pairs(controls.registered_on_press) do
59                                                         func(player, cname)
60                                                 end
61                                                 controls.players[player_name][cname] = {true, clock()}
62                                         elseif cbool == true and controls.players[player_name][cname][1] == true then
63                                                 for _, func in pairs(controls.registered_on_hold) do
64                                                         func(player, cname, clock()-controls.players[player_name][cname][2])
65                                                 end
66                                         --Release a key
67                                         elseif cbool == false and controls.players[player_name][cname][1] == true then
68                                                 for _, func in pairs(controls.registered_on_release) do
69                                                         func(player, cname, clock()-controls.players[player_name][cname][2])
70                                                 end
71                                                 controls.players[player_name][cname] = {false}
72                                         end
73                                 end
74                         end
75                 end
76         end
77 end)