(try to) improve performance

master
DS-Minetest 2017-07-24 16:18:47 +02:00
parent e206e704b4
commit a5e566fc7a
2 changed files with 48 additions and 16 deletions

View File

@ -5,7 +5,9 @@
## Added functions are: ## Added functions are:
### For client: ### 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. If function returns `true`, remaining functions are not called.
- `csm_com.send(msg)` - `csm_com.send(msg)`
- `csm_com.server_has()` - `csm_com.server_has()`
@ -13,10 +15,10 @@ returns `true` if server has this mod installed
- `csm_com.register_on_know(func())` - `csm_com.register_on_know(func())`
Called when `csm_com.server_has()` becomes `true`. Called when `csm_com.server_has()` becomes `true`.
### For server: ### For server:
- `csm_com.register_on_receive(func(player_name, msg))` - `csm_com.register_on_receive(func(player_name, msg)[, prefix])`
same as above same as above.
- `csm_com.send(player_name, msg)` - `csm_com.send(player_name, msg)`
- `csm_com.player_has(player_name)` - `csm_com.player_has(player_name)`
returns `true` if player has this mod installed returns `true` if player has this mod installed
- `csm_com.register_on_know(func(player_name))` - `csm_com.register_on_know(func(player_name))`
same as above same as above.

View File

@ -20,20 +20,35 @@ local csm_player_a = "I have csm."
if INIT == "client" then if INIT == "client" then
local funcs = {} local funcs = {}
function csm_com.register_on_receive(f) local funcsp = {}
funcs[#funcs+1] = f function csm_com.register_on_receive(f, p)
if p then
funcsp[p][#funcsp[p]+1] = f
else
funcs[#funcs+1] = f
end
end end
minetest.register_on_receiving_chat_message(function(message) minetest.register_on_receiving_chat_message(function(msg)
if message:sub(1, #prefix_c) ~= prefix_c then if msg:sub(1, #prefix_c) ~= prefix_c then
return return
end end
message = message:sub(#prefix_c+1) msg = msg:sub(#prefix_c+1)
for i = 1, #funcs do for pre, fs in pairs(funcsp) do
if funcs[i](message) then if msg:sub(1, #pre) == pre then
for i = 1, #fs do
if fs[i](msg) then
return true
end
end
break break
end end
end end
for i = 1, #funcs do
if funcs[i](msg) then
return true
end
end
return true return true
end) end)
@ -71,19 +86,34 @@ if INIT == "client" then
elseif INIT == "game" then elseif INIT == "game" then
local funcs = {} local funcs = {}
function csm_com.register_on_receive(f) local funcsp = {}
funcs[#funcs+1] = f function csm_com.register_on_receive(f, p)
if p then
funcsp[p][#funcsp[p]+1] = f
else
funcs[#funcs+1] = f
end
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) minetest.override_chatcommand("status", {func = function(name, param)
if param:sub(1, #prefix_s) ~= prefix_s then if param:sub(1, #prefix_s) ~= prefix_s then
return funco(name, param) return status_o(name, param)
end end
param = param:sub(#prefix_s+1) 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 for i = 1, #funcs do
if funcs[i](name, param) then if funcs[i](name, param) then
break return true
end end
end end
return false return false