]> git.lizzy.rs Git - dragonfireclient.git/commitdiff
Add function to get server info.
authorred-001 <red-001@outlook.ie>
Wed, 19 Apr 2017 13:16:54 +0000 (14:16 +0100)
committerparamat <mat.gregory@virginmedia.com>
Thu, 4 May 2017 03:25:45 +0000 (04:25 +0100)
clientmods/preview/init.lua
doc/client_lua_api.md
src/client.cpp
src/client.h
src/game.cpp
src/script/lua_api/l_client.cpp
src/script/lua_api/l_client.h

index 255c0b83f060625a74082425fc56e273af50b92f..fb606b3f46b28e8b6ab2d6dd3657b8abf649744c 100644 (file)
@@ -8,6 +8,11 @@ end)
 
 core.register_on_connect(function()
        print("[PREVIEW] Player connection completed")
+       local server_info = core.get_server_info()
+       print("Server version: " .. server_info.protocol_version)
+       print("Server ip: " .. server_info.ip)
+       print("Server address: " .. server_info.address)
+       print("Server port: " .. server_info.port)
 end)
 
 core.register_on_placenode(function(pointed_thing, node)
@@ -80,7 +85,6 @@ core.after(2, function()
        print("[PREVIEW] loaded " .. modname .. " mod")
        modstorage:set_string("current_mod", modname)
        print(modstorage:get_string("current_mod"))
-       print("Server version:" .. core.get_protocol_version())
        preview_minimap()
 end)
 
index 3e81818ae189b84472bc9cb495697024d6f42bfe..b76a406eaf594568c32bb74581dca072f5ce3330 100644 (file)
@@ -702,11 +702,10 @@ Call these functions only at load time!
 * `minetest.disconnect()`
     * Disconnect from the server and exit to main menu.
     * Returns `false` if the client is already disconnecting otherwise returns `true`.
-* `minetest.get_protocol_version()`
-    * Returns the protocol version of the server.
-    * Might not be accurate at start up as the client might not be connected to the server yet, in that case it will return 0.
 * `minetest.take_screenshot()`
     * Take a screenshot.
+* `minetest.get_server_info()`
+    * Returns [server info](#server-info).
 
 ### Misc.
 * `minetest.parse_json(string[, nullvalue])`: returns something
@@ -932,9 +931,18 @@ Can be obtained via `minetest.get_meta(pos)`.
     {
         params = "<name> <privilege>", -- Short parameter description
         description = "Remove privilege from player", -- Full description
-        func = function(param), -- Called when command is run.
-                                      -- Returns boolean success and text output.
+        func = function(param),        -- Called when command is run.
+                                       -- Returns boolean success and text output.
     }
+### Server info
+```lua
+{
+       address = "minetest.example.org", -- The domain name/IP address of a remote server or "" for a local server.
+       ip = "203.0.113.156",             -- The IP address of the server.
+       port = 30000,                     -- The port the client is connected to.
+       protocol_version = 30             -- Will not be accurate at start up as the client might not be connected to the server yet, in that case it will be 0.
+}
+```
 
 Escape sequences
 ----------------
index 3269c573a638666be7565d62595eab212e519049..1e17e7c1150cc9db8887490399132805f2eba2aa 100644 (file)
@@ -58,6 +58,7 @@ Client::Client(
                IrrlichtDevice *device,
                const char *playername,
                const std::string &password,
+               const std::string &address_name,
                MapDrawControl &control,
                IWritableTextureSource *tsrc,
                IWritableShaderSource *shsrc,
@@ -89,6 +90,7 @@ Client::Client(
        ),
        m_particle_manager(&m_env),
        m_con(PROTOCOL_ID, 512, CONNECTION_TIMEOUT, ipv6, this),
+       m_address_name(address_name),
        m_device(device),
        m_camera(NULL),
        m_minimap_disabled_by_server(false),
@@ -253,13 +255,11 @@ Client::~Client()
        delete m_minimap;
 }
 
-void Client::connect(Address address,
-               const std::string &address_name,
-               bool is_local_server)
+void Client::connect(Address address, bool is_local_server)
 {
        DSTACK(FUNCTION_NAME);
 
-       initLocalMapSaving(address, address_name, is_local_server);
+       initLocalMapSaving(address, m_address_name, is_local_server);
 
        m_con.SetTimeoutMs(0);
        m_con.Connect(address);
index 0dd519308308d1e7b8d538da8a74a18844d94e45..11b670977be7be463e6ff4356149bfbf3790e58c 100644 (file)
@@ -257,6 +257,7 @@ class Client : public con::PeerHandler, public InventoryManager, public IGameDef
                        IrrlichtDevice *device,
                        const char *playername,
                        const std::string &password,
+                       const std::string &address_name,
                        MapDrawControl &control,
                        IWritableTextureSource *tsrc,
                        IWritableShaderSource *shsrc,
@@ -284,9 +285,7 @@ class Client : public con::PeerHandler, public InventoryManager, public IGameDef
                The name of the local player should already be set when
                calling this, as it is sent in the initialization.
        */
-       void connect(Address address,
-                       const std::string &address_name,
-                       bool is_local_server);
+       void connect(Address address, bool is_local_server);
 
        /*
                Stuff that references the environment is valid only as
@@ -525,6 +524,16 @@ class Client : public con::PeerHandler, public InventoryManager, public IGameDef
 
        IrrlichtDevice *getDevice() const { return m_device; }
 
+       const Address getServerAddress()
+       {
+               return m_con.GetPeerAddress(PEER_ID_SERVER);
+       }
+
+       const std::string &getAddressName() const
+       {
+               return m_address_name;
+       }
+
 private:
 
        // Virtual methods from con::PeerHandler
@@ -576,6 +585,7 @@ class Client : public con::PeerHandler, public InventoryManager, public IGameDef
        ClientEnvironment m_env;
        ParticleManager m_particle_manager;
        con::Connection m_con;
+       std::string m_address_name;
        IrrlichtDevice *m_device;
        Camera *m_camera;
        Minimap *m_minimap;
index 7dd9c942d5e4a3785259a2c6841ce461cc5bd344..be0cc8fd5bfa8b34dcceda8859c40822301ed5f5 100644 (file)
@@ -2044,7 +2044,7 @@ bool Game::connectToServer(const std::string &playername,
        }
 
        client = new Client(device,
-                       playername.c_str(), password,
+                       playername.c_str(), password, *address,
                        *draw_control, texture_src, shader_src,
                        itemdef_manager, nodedef_manager, sound, eventmgr,
                        connect_address.isIPv6(), &flags);
@@ -2056,7 +2056,7 @@ bool Game::connectToServer(const std::string &playername,
        connect_address.print(&infostream);
        infostream << std::endl;
 
-       client->connect(connect_address, *address,
+       client->connect(connect_address,
                simple_singleplayer_mode || local_server_mode);
 
        /*
index c982a2f1146cdc51613028b2dda0d8ebd831374b..7f89a4d5dfa41c99861bc8b8325fb244cc7a0f05 100644 (file)
@@ -234,10 +234,20 @@ int ModApiClient::l_sound_stop(lua_State *L)
        return 0;
 }
 
-// get_protocol_version()
-int ModApiClient::l_get_protocol_version(lua_State *L)
+// get_server_info()
+int ModApiClient::l_get_server_info(lua_State *L)
 {
-       lua_pushinteger(L, getClient(L)->getProtoVersion());
+       Client *client = getClient(L);
+       Address serverAddress = client->getServerAddress();
+       lua_newtable(L);
+       lua_pushstring(L, client->getAddressName().c_str());
+       lua_setfield(L, -2, "address");
+       lua_pushstring(L, serverAddress.serializeString().c_str());
+       lua_setfield(L, -2, "ip");
+       lua_pushinteger(L, serverAddress.getPort());
+       lua_setfield(L, -2, "port");
+       lua_pushinteger(L, client->getProtoVersion());
+       lua_setfield(L, -2, "protocol_version");
        return 1;
 }
 
@@ -265,6 +275,6 @@ void ModApiClient::Initialize(lua_State *L, int top)
        API_FCT(get_meta);
        API_FCT(sound_play);
        API_FCT(sound_stop);
-       API_FCT(get_protocol_version);
+       API_FCT(get_server_info);
        API_FCT(take_screenshot);
 }
index 6afcd996b7c137dca16dc9524545f201a075ffc9..a36d7e51c51f655c3cc3798f885d85ca116951c4 100644 (file)
@@ -69,8 +69,8 @@ class ModApiClient : public ModApiBase
 
        static int l_sound_stop(lua_State *L);
 
-       // get_protocol_version()
-       static int l_get_protocol_version(lua_State *L);
+       // get_server_info()
+       static int l_get_server_info(lua_State *L);
 
        static int l_take_screenshot(lua_State *L);