[CSM] Add client-sided chat commands (#5092)
authorred-001 <red-001@outlook.ie>
Sun, 22 Jan 2017 08:05:09 +0000 (08:05 +0000)
committerLoïc Blot <nerzhul@users.noreply.github.com>
Mon, 13 Mar 2017 22:56:05 +0000 (23:56 +0100)
builtin/client/chatcommands.lua [new file with mode: 0644]
builtin/client/init.lua
builtin/client/preview.lua
builtin/common/chatcommands.lua [new file with mode: 0644]
builtin/game/chatcommands.lua
builtin/game/init.lua
src/client.cpp
src/script/lua_api/l_client.cpp
src/script/lua_api/l_client.h

diff --git a/builtin/client/chatcommands.lua b/builtin/client/chatcommands.lua
new file mode 100644 (file)
index 0000000..b49c222
--- /dev/null
@@ -0,0 +1,28 @@
+-- Minetest: builtin/client/chatcommands.lua
+
+
+core.register_on_sending_chat_messages(function(message)
+       if not (message:sub(1,1) == "/") then
+               return false
+       end
+       
+       core.display_chat_message("issued command: " .. message)
+       
+       local cmd, param = string.match(message, "^/([^ ]+) *(.*)")
+       if not param then
+               param = ""
+       end
+       
+       local cmd_def = core.registered_chatcommands[cmd]
+       
+       if cmd_def then
+               core.set_last_run_mod(cmd_def.mod_origin)
+               local success, message = cmd_def.func(param)
+               if message then
+                       core.display_chat_message(message)
+               end
+               return true
+       end
+       
+       return false
+end)
\ No newline at end of file
index e06dfc995436647bf527ecc56d2a0fa6c2f99918..4797ac4b6fbac1666dfd997ebd3dfb5dd89fd2af 100644 (file)
@@ -1,6 +1,7 @@
 -- Minetest: builtin/client/init.lua
 local scriptpath = core.get_builtin_path()..DIR_DELIM
 local clientpath = scriptpath.."client"..DIR_DELIM
+local commonpath = scriptpath.."common"..DIR_DELIM
 
 dofile(clientpath .. "register.lua")
 dofile(clientpath .. "preview.lua")
index 4b277b0c65723a44add5f080199dde4d17e4aade..c421791f5f99eadf9d63452b69e0f60dd8e52566 100644 (file)
@@ -22,3 +22,10 @@ end)
 core.register_on_damage_taken(function(hp)
        print("[PREVIEW] Damage taken " .. hp)
 end)
+
+-- This is an example function to ensure it's working properly, should be removed before merge
+core.register_chatcommand("dump", {
+       func = function(name, param)
+               return true, dump(_G)
+       end,
+})
\ No newline at end of file
diff --git a/builtin/common/chatcommands.lua b/builtin/common/chatcommands.lua
new file mode 100644 (file)
index 0000000..ef3a244
--- /dev/null
@@ -0,0 +1,30 @@
+-- Minetest: builtin/common/chatcommands.lua
+
+core.registered_chatcommands = {}
+
+function core.register_chatcommand(cmd, def)
+       def = def or {}
+       def.params = def.params or ""
+       def.description = def.description or ""
+       def.privs = def.privs or {}
+       def.mod_origin = core.get_current_modname() or "??"
+       core.registered_chatcommands[cmd] = def
+end
+
+function core.unregister_chatcommand(name)
+       if core.registered_chatcommands[name] then
+               core.registered_chatcommands[name] = nil
+       else
+               core.log("warning", "Not unregistering chatcommand " ..name..
+                       " because it doesn't exist.")
+       end
+end
+
+function core.override_chatcommand(name, redefinition)
+       local chatcommand = core.registered_chatcommands[name]
+       assert(chatcommand, "Attempt to override non-existent chatcommand "..name)
+       for k, v in pairs(redefinition) do
+               rawset(chatcommand, k, v)
+       end
+       core.registered_chatcommands[name] = chatcommand
+end
\ No newline at end of file
index 5d59559728c6c672e925c7cf2b0d49b12eb7c99f..745b012e6f03be15bcd7af59bef960c3387afcf5 100644 (file)
@@ -1,37 +1,10 @@
--- Minetest: builtin/chatcommands.lua
+-- Minetest: builtin/game/chatcommands.lua
 
 --
 -- Chat command handler
 --
 
-core.registered_chatcommands = {}
 core.chatcommands = core.registered_chatcommands -- BACKWARDS COMPATIBILITY
-function core.register_chatcommand(cmd, def)
-       def = def or {}
-       def.params = def.params or ""
-       def.description = def.description or ""
-       def.privs = def.privs or {}
-       def.mod_origin = core.get_current_modname() or "??"
-       core.registered_chatcommands[cmd] = def
-end
-
-function core.unregister_chatcommand(name)
-       if core.registered_chatcommands[name] then
-               core.registered_chatcommands[name] = nil
-       else
-               core.log("warning", "Not unregistering chatcommand " ..name..
-                       " because it doesn't exist.")
-       end
-end
-
-function core.override_chatcommand(name, redefinition)
-       local chatcommand = core.registered_chatcommands[name]
-       assert(chatcommand, "Attempt to override non-existent chatcommand "..name)
-       for k, v in pairs(redefinition) do
-               rawset(chatcommand, k, v)
-       end
-       core.registered_chatcommands[name] = chatcommand
-end
 
 core.register_on_chat_message(function(name, message)
        local cmd, param = string.match(message, "^/([^ ]+) *(.*)")
index b5e2f7ccae5a4ed422e9e180b1bf39f22933def5..793d9fe2bcc61957a4fa30b4c9f4594e5bd3bef6 100644 (file)
@@ -22,6 +22,7 @@ dofile(gamepath.."deprecated.lua")
 dofile(gamepath.."misc.lua")
 dofile(gamepath.."privileges.lua")
 dofile(gamepath.."auth.lua")
+dofile(commonpath .. "chatcommands.lua")
 dofile(gamepath.."chatcommands.lua")
 dofile(gamepath.."static_spawn.lua")
 dofile(gamepath.."detached_inventory.lua")
index 0af6b4595e9b7d71555432072466705154dbfa8d..3a3e0673ee54678b2005392b1e237d6286efa270 100644 (file)
@@ -1582,11 +1582,7 @@ void Client::typeChatMessage(const std::wstring &message)
        sendChatMessage(message);
 
        // Show locally
-       if (message[0] == L'/')
-       {
-               pushToChatQueue((std::wstring)L"issued command: " + message);
-       }
-       else
+       if (message[0] != L'/')
        {
                // compatibility code
                if (m_proto_ver < 29) {
index f4c3812ac1ac51e1d0aec63939ae7c498349f48f..7eb340d782e3a560b1abd8a1767d21f4ec6cc44b 100644 (file)
@@ -21,6 +21,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "l_client.h"
 #include "l_internal.h"
 #include "util/string.h"
+#include "cpp_api/s_base.h"
 
 int ModApiClient::l_get_current_modname(lua_State *L)
 {
@@ -28,6 +29,26 @@ int ModApiClient::l_get_current_modname(lua_State *L)
        return 1;
 }
 
+// get_last_run_mod()
+int ModApiClient::l_get_last_run_mod(lua_State *L)
+{
+       lua_rawgeti(L, LUA_REGISTRYINDEX, CUSTOM_RIDX_CURRENT_MOD_NAME);
+       const char *current_mod = lua_tostring(L, -1);
+       if (current_mod == NULL || current_mod[0] == '\0') {
+               lua_pop(L, 1);
+               lua_pushstring(L, getScriptApiBase(L)->getOrigin().c_str());
+       }
+       return 1;
+}
+
+// set_last_run_mod(modname)
+int ModApiClient::l_set_last_run_mod(lua_State *L)
+{
+       const char *mod = lua_tostring(L, 1);
+       getScriptApiBase(L)->setOriginDirect(mod);
+       return 0;
+}
+
 // display_chat_message(message)
 int ModApiClient::l_display_chat_message(lua_State *L)
 {
@@ -42,4 +63,6 @@ void ModApiClient::Initialize(lua_State *L, int top)
 {
        API_FCT(get_current_modname);
        API_FCT(display_chat_message);
+       API_FCT(set_last_run_mod);
+       API_FCT(get_last_run_mod);
 }
index b4a57cb61ae09c88014742db6780884cd71b5dac..e3106e74214870b07cf4de8151cd406fb11456d6 100644 (file)
@@ -28,8 +28,16 @@ class ModApiClient : public ModApiBase
 private:
        // get_current_modname()
        static int l_get_current_modname(lua_State *L);
+
+       // display_chat_message(message)
        static int l_display_chat_message(lua_State *L);
 
+       // get_last_run_mod(n)
+       static int l_get_last_run_mod(lua_State *L);
+
+       // set_last_run_mod(modname)
+       static int l_set_last_run_mod(lua_State *L);
+
 public:
        static void Initialize(lua_State *L, int top);
 };