add filter

This commit is contained in:
DS-Minetest 2017-06-03 12:05:32 +02:00
parent 366f7f37e8
commit eaf38e4e03
2 changed files with 107 additions and 21 deletions

@ -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

@ -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