(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:
### 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.

View File

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