mirror of
https://github.com/Desour/keyevent.git
synced 2024-10-04 00:23:13 +02:00
add filter
This commit is contained in:
parent
366f7f37e8
commit
eaf38e4e03
@ -3,12 +3,14 @@
|
||||
### This mod is client- and server-side.
|
||||
|
||||
### Added functions are:
|
||||
- `keyevent.register_on_keypress_bits(func(keys, old_keys, dtime, player_name))`
|
||||
- `keyevent.register_on_keypress_bits([keys_to_be_pressed, ]func(keys, old_keys, dtime, player_name))`
|
||||
- `keys_to_be_pressed`: Optional. It can be a string, a table or a number.
|
||||
If any of these keys is changed, the event is triggered
|
||||
- `keys`: The pressed keys in bit format.
|
||||
- `old_keys`: The keys pressed before.
|
||||
- `dtime`: Time from last check.
|
||||
- `player_name`: Name of the player. Client-side this is `nil`.
|
||||
|
||||
- `keyevent.register_on_keypress(func(keys, old_keys, dtime, player_name))`
|
||||
- `keyevent.register_on_keypress([keys_to_be_pressed, ]func(keys, old_keys, dtime, player_name))`
|
||||
- Same as above but `keys` and `old_keys` is given in table format.
|
||||
|
||||
|
122
init.lua
122
init.lua
@ -11,27 +11,18 @@ local load_time_start = os.clock()
|
||||
local modname = minetest.get_current_modname()
|
||||
|
||||
|
||||
keyevent = {}
|
||||
local keyevents_bits = {}
|
||||
function keyevent.register_on_keypress_bits(func)
|
||||
keyevents_bits[#keyevents_bits+1] = func
|
||||
end
|
||||
local keyevents = {}
|
||||
function keyevent.register_on_keypress(func)
|
||||
keyevents[#keyevents+1] = func
|
||||
end
|
||||
|
||||
local function bits_to_table(bits)
|
||||
if type(bits) ~= "number" then
|
||||
return bits
|
||||
end
|
||||
local meaning = {
|
||||
[0] = "up", "down", "left",
|
||||
"right", "jump", "aux1",
|
||||
"sneak", "LMB", "RMB"
|
||||
}
|
||||
|
||||
local function bits_to_table(bits)
|
||||
if type(bits) ~= "number" then
|
||||
return bits
|
||||
end
|
||||
local t = {}
|
||||
for i = 8, 0, -1 do
|
||||
for i = #meaning, 0, -1 do
|
||||
local n = 2^i
|
||||
if bits >= n then
|
||||
bits = bits - n
|
||||
@ -43,17 +34,110 @@ local function bits_to_table(bits)
|
||||
return t
|
||||
end
|
||||
|
||||
local function table_to_bits(t)
|
||||
if type(t) ~= "table" then
|
||||
return t
|
||||
end
|
||||
local bits = 0
|
||||
for i = 0, #meaning do
|
||||
if t[meaning[i]] then
|
||||
bits = bits + 2^i
|
||||
end
|
||||
end
|
||||
return bits
|
||||
end
|
||||
|
||||
local function make_true(t)
|
||||
local out = {}
|
||||
for i = 1, #t do
|
||||
out[t[i]] = true
|
||||
end
|
||||
for i = 0, #meaning do
|
||||
out[meaning[i]] = out[meaning[i]] or false
|
||||
end
|
||||
return out
|
||||
end
|
||||
|
||||
local function look_differences(bitsa, bitsb)
|
||||
if not bitsb then
|
||||
return 511
|
||||
end
|
||||
local diff = 0
|
||||
for i = #meaning, 0, -1 do
|
||||
local n = 2^i
|
||||
local a = bitsa - n >= 0
|
||||
local b = bitsb - n >= 0
|
||||
if a ~= b then
|
||||
diff = diff + n
|
||||
end
|
||||
bitsa = bitsa - ((a and n) or 0)
|
||||
bitsb = bitsb - ((b and n) or 0)
|
||||
end
|
||||
return diff
|
||||
end
|
||||
|
||||
local function is_different(diff_shall, diff_is)
|
||||
for i = #meaning, 0, -1 do
|
||||
local n = 2^i
|
||||
local a = diff_shall - n >= 0
|
||||
local b = diff_is - n >= 0
|
||||
if a and b then
|
||||
return true
|
||||
end
|
||||
diff_shall = diff_shall - ((a and n) or 0)
|
||||
diff_is = diff_is - ((b and n) or 0)
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
local function handle_keys(keys, func)
|
||||
local keyst = type(keys)
|
||||
if keyst == "function" then
|
||||
func = keys
|
||||
keys = 511
|
||||
elseif keyst == "string" then
|
||||
for i = 0, #meaning do
|
||||
if keys == meaning[i] then
|
||||
keys = 2^i
|
||||
break
|
||||
end
|
||||
end
|
||||
elseif keyst == "table" then
|
||||
keys = table_to_bits((#keys >= 1 and make_true(keys)) or keys)
|
||||
elseif keyst ~= "number" then
|
||||
keys = 511
|
||||
end
|
||||
return keys, func
|
||||
end
|
||||
|
||||
keyevent = {}
|
||||
local keyevents_bits = {}
|
||||
function keyevent.register_on_keypress_bits(keys, func)
|
||||
keys, func = handle_keys(keys, func)
|
||||
keyevents_bits[keys] = func
|
||||
end
|
||||
local keyevents = {}
|
||||
function keyevent.register_on_keypress(func)
|
||||
keys, func = handle_keys(keys, func)
|
||||
keyevents[keys] = func
|
||||
end
|
||||
|
||||
local function on_step(dtime, player, old_keys, keys, player_name)
|
||||
if keys == old_keys then
|
||||
return
|
||||
end
|
||||
for i = 1, #keyevents_bits do
|
||||
keyevents_bits[i](keys, old_keys, dtime, player_name)
|
||||
local diff = look_differences(keys, old_keys)
|
||||
for diff_shall, f in pairs(keyevents_bits) do
|
||||
if is_different(diff_shall, diff) then
|
||||
f(keys, old_keys, dtime, player_name)
|
||||
end
|
||||
end
|
||||
local keys_t = bits_to_table(keys)
|
||||
local old_keys_t = bits_to_table(old_keys)
|
||||
for i = 1, #keyevents do
|
||||
keyevents[i](keys_t, old_keys_t, dtime, player_name)
|
||||
for diff_shall, f in pairs(keyevents) do
|
||||
if is_different(diff_shall, diff) then
|
||||
f(keys_t, old_keys_t, dtime, player_name)
|
||||
end
|
||||
end
|
||||
return keys
|
||||
end
|
||||
|
Loading…
Reference in New Issue
Block a user