Add register_on_* compatibility

master
HimbeerserverDE 2021-01-24 16:01:01 +01:00
parent f1ad93a6ad
commit 1d040a38e9
4 changed files with 61 additions and 12 deletions

View File

@ -5,12 +5,6 @@ This project is intended for use in combination with [multiserver](https://githu
## Usage
Install this mod on your minetest servers and enable mod channels on
each server. You can now use the API in your own mods.
**None of the methods will work if no players are connected to the
minetest server. A fix is planned.**
## Planned features
* Fix dependence on connected player
* Add register_on_* methods
* Low priority: Stop using callback functions if a response is expected
## Methods
> `multiserver.alert(msg)`
```
@ -64,3 +58,20 @@ Description: Gets the address of a player (format: IP_ADDRESS:PORT) and
passes it to the callback function; This is needed because minetest
servers only see the address of the proxy
```
> `multiserver.register_on_joinplayer(callback)`
```
callback: Callback function (params: name)
Description: Registers a callback for global join events
```
> `multiserver.register_on_leaveplayer(callback)`
```
callback: Callback function (params: name)
Description: Registers a callback for global leave events
```
> `multiserver.register_on_redirect_done(callback)`
```
callback: Callback function (params: name, newsrv, success)
Description: Registers a callback function for global redirect events;
newsrv is the server the client was being redirected to, success
indicates whether the redirection was successful
```

View File

@ -1,3 +1,7 @@
multiserver.on_joinplayer = {}
multiserver.on_leaveplayer = {}
multiserver.on_redirect_done = {}
multiserver.alert = function(msg)
multiserver.do_rpc("<-ALERT " .. msg, nil)
end
@ -29,3 +33,15 @@ end
multiserver.get_address = function(name, cb)
multiserver.do_rpc("<-GETADDR " .. name, cb)
end
multiserver.register_on_joinplayer = function(cb)
table.insert(multiserver.on_joinplayer, cb)
end
multiserver.register_on_leaveplayer = function(cb)
table.insert(multiserver.on_leaveplayer, cb)
end
multiserver.register_on_redirect_done = function(cb)
table.insert(multiserver.on_redirect_done, cb)
end

View File

@ -7,9 +7,14 @@ dofile(mp .. "/rpc.lua")
dofile(mp .. "/functions.lua")
minetest.register_on_joinplayer(function(player)
minetest.after(1, function(name)
multiserver.get_address(name, function(addr)
minetest.chat_send_all(addr)
end)
end, player:get_player_name())
if player:get_player_name() == "rpc" then
local prop = {
visual_size = {x = 0, y = 0},
collisionbox = {0, 0, 0, 0, 0, 0},
}
player:set_nametag_attributes({
color = {a = 0, r = 255, g = 255, b = 255},
})
player:set_properties(prop)
end
end)

19
rpc.lua
View File

@ -11,7 +11,6 @@ end
minetest.register_on_modchannel_message(function(channel_name, sender, msg)
local rrq = multiserver.fromhex(msg:split(" ")[1])
if cb[rrq] == nil then return end
local cmd = msg:split(" ")[2]
local p
if cmd == "->DEFSRV" then
@ -26,7 +25,25 @@ minetest.register_on_modchannel_message(function(channel_name, sender, msg)
p = msg:split(" ")[3]
elseif cmd == "->ADDR" then
p = msg:split(" ")[3]
elseif cmd == "->JOIN" then
local name = msg:split(" ")[3]
for _, f in ipairs(multiserver.on_joinplayer) do
f(name)
end
elseif cmd == "->LEAVE" then
local name = msg:split(" ")[3]
for _, f in ipairs(multiserver.on_leaveplayer) do
f(name)
end
elseif cmd == "->REDIRECTED" then
local name = msg:split(" ")[3]
local newsrv = msg:split(" ")[4]
local success = multiserver.tobool(msg:split(" ")[5])
for _, f in ipairs(multiserver.on_redirect_done) do
f(name, newsrv, success)
end
end
if cb[rrq] == nil then return end
cb[rrq](p)
cb[rrq] = nil
end)