From a5e566fc7aab9e5e6caef85adf7af665ae0bae5a Mon Sep 17 00:00:00 2001 From: DS-Minetest Date: Mon, 24 Jul 2017 16:18:47 +0200 Subject: [PATCH] (try to) improve performance --- README.md | 10 ++++++---- init.lua | 54 ++++++++++++++++++++++++++++++++++++++++++------------ 2 files changed, 48 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index dbfb4df..96017ec 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,9 @@ ## Added functions are: ### For client: -- `csm_com.register_on_receive(func(msg))` +- `csm_com.register_on_receive(func(msg)[, prefix])` +`prefix` should be a string. Try not to use many different prefixes, +one per mod should be enough. If function returns `true`, remaining functions are not called. - `csm_com.send(msg)` - `csm_com.server_has()` @@ -13,10 +15,10 @@ returns `true` if server has this mod installed - `csm_com.register_on_know(func())` Called when `csm_com.server_has()` becomes `true`. ### For server: -- `csm_com.register_on_receive(func(player_name, msg))` -same as above +- `csm_com.register_on_receive(func(player_name, msg)[, prefix])` +same as above. - `csm_com.send(player_name, msg)` - `csm_com.player_has(player_name)` returns `true` if player has this mod installed - `csm_com.register_on_know(func(player_name))` -same as above +same as above. diff --git a/init.lua b/init.lua index 1208c52..2fd21af 100644 --- a/init.lua +++ b/init.lua @@ -20,20 +20,35 @@ local csm_player_a = "I have csm." if INIT == "client" then local funcs = {} - function csm_com.register_on_receive(f) - funcs[#funcs+1] = f + local funcsp = {} + function csm_com.register_on_receive(f, p) + if p then + funcsp[p][#funcsp[p]+1] = f + else + funcs[#funcs+1] = f + end end - minetest.register_on_receiving_chat_message(function(message) - if message:sub(1, #prefix_c) ~= prefix_c then + minetest.register_on_receiving_chat_message(function(msg) + if msg:sub(1, #prefix_c) ~= prefix_c then return end - message = message:sub(#prefix_c+1) - for i = 1, #funcs do - if funcs[i](message) then + msg = msg:sub(#prefix_c+1) + for pre, fs in pairs(funcsp) do + if msg:sub(1, #pre) == pre then + for i = 1, #fs do + if fs[i](msg) then + return true + end + end break end end + for i = 1, #funcs do + if funcs[i](msg) then + return true + end + end return true end) @@ -71,19 +86,34 @@ if INIT == "client" then elseif INIT == "game" then local funcs = {} - function csm_com.register_on_receive(f) - funcs[#funcs+1] = f + local funcsp = {} + function csm_com.register_on_receive(f, p) + if p then + funcsp[p][#funcsp[p]+1] = f + else + funcs[#funcs+1] = f + end end - local funco = minetest.registered_chatcommands["status"].func + local status_o = minetest.registered_chatcommands["status"].func minetest.override_chatcommand("status", {func = function(name, param) if param:sub(1, #prefix_s) ~= prefix_s then - return funco(name, param) + return status_o(name, param) end param = param:sub(#prefix_s+1) + for pre, fs in pairs(funcsp) do + if param:sub(1, #pre) == pre then + for i = 1, #fs do + if fs[i](name, param) then + return true + end + end + break + end + end for i = 1, #funcs do if funcs[i](name, param) then - break + return true end end return false