mirror of
https://github.com/Desour/keyevent.git
synced 2024-10-05 17:13:12 +02:00
add filter
This commit is contained in:
parent
366f7f37e8
commit
eaf38e4e03
@ -3,12 +3,14 @@
|
|||||||
### This mod is client- and server-side.
|
### This mod is client- and server-side.
|
||||||
|
|
||||||
### Added functions are:
|
### 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.
|
- `keys`: The pressed keys in bit format.
|
||||||
- `old_keys`: The keys pressed before.
|
- `old_keys`: The keys pressed before.
|
||||||
- `dtime`: Time from last check.
|
- `dtime`: Time from last check.
|
||||||
- `player_name`: Name of the player. Client-side this is `nil`.
|
- `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.
|
- 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()
|
local modname = minetest.get_current_modname()
|
||||||
|
|
||||||
|
|
||||||
keyevent = {}
|
local meaning = {
|
||||||
local keyevents_bits = {}
|
[0] = "up", "down", "left",
|
||||||
function keyevent.register_on_keypress_bits(func)
|
"right", "jump", "aux1",
|
||||||
keyevents_bits[#keyevents_bits+1] = func
|
"sneak", "LMB", "RMB"
|
||||||
end
|
}
|
||||||
local keyevents = {}
|
|
||||||
function keyevent.register_on_keypress(func)
|
|
||||||
keyevents[#keyevents+1] = func
|
|
||||||
end
|
|
||||||
|
|
||||||
local function bits_to_table(bits)
|
local function bits_to_table(bits)
|
||||||
if type(bits) ~= "number" then
|
if type(bits) ~= "number" then
|
||||||
return bits
|
return bits
|
||||||
end
|
end
|
||||||
local meaning = {
|
|
||||||
[0] = "up", "down", "left",
|
|
||||||
"right", "jump", "aux1",
|
|
||||||
"sneak", "LMB", "RMB"
|
|
||||||
}
|
|
||||||
local t = {}
|
local t = {}
|
||||||
for i = 8, 0, -1 do
|
for i = #meaning, 0, -1 do
|
||||||
local n = 2^i
|
local n = 2^i
|
||||||
if bits >= n then
|
if bits >= n then
|
||||||
bits = bits - n
|
bits = bits - n
|
||||||
@ -43,17 +34,110 @@ local function bits_to_table(bits)
|
|||||||
return t
|
return t
|
||||||
end
|
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)
|
local function on_step(dtime, player, old_keys, keys, player_name)
|
||||||
if keys == old_keys then
|
if keys == old_keys then
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
for i = 1, #keyevents_bits do
|
local diff = look_differences(keys, old_keys)
|
||||||
keyevents_bits[i](keys, old_keys, dtime, player_name)
|
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
|
end
|
||||||
local keys_t = bits_to_table(keys)
|
local keys_t = bits_to_table(keys)
|
||||||
local old_keys_t = bits_to_table(old_keys)
|
local old_keys_t = bits_to_table(old_keys)
|
||||||
for i = 1, #keyevents do
|
for diff_shall, f in pairs(keyevents) do
|
||||||
keyevents[i](keys_t, old_keys_t, dtime, player_name)
|
if is_different(diff_shall, diff) then
|
||||||
|
f(keys_t, old_keys_t, dtime, player_name)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
return keys
|
return keys
|
||||||
end
|
end
|
||||||
|
Loading…
Reference in New Issue
Block a user