From eaf38e4e0381c2e02e75731528825572929fac0c Mon Sep 17 00:00:00 2001 From: DS-Minetest Date: Sat, 3 Jun 2017 12:05:32 +0200 Subject: [PATCH] add filter --- README.md | 6 ++- init.lua | 122 +++++++++++++++++++++++++++++++++++++++++++++--------- 2 files changed, 107 insertions(+), 21 deletions(-) diff --git a/README.md b/README.md index 55043c8..76801eb 100644 --- a/README.md +++ b/README.md @@ -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. diff --git a/init.lua b/init.lua index 453ddf3..0b3aadc 100644 --- a/init.lua +++ b/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 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 meaning = { - [0] = "up", "down", "left", - "right", "jump", "aux1", - "sneak", "LMB", "RMB" - } 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