aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorred-001 <red-001@outlook.ie>2017-01-22 08:05:09 +0000
committerLoïc Blot <nerzhul@users.noreply.github.com>2017-03-13 23:56:05 +0100
commitd7bc346981e189851e490f2417ed015a38bca79b (patch)
treec74716238c0851b8d9531544faa4433db22e6a84
parent9978f5af828550d819890fed1fc56d65838a2c4c (diff)
downloadminetest-d7bc346981e189851e490f2417ed015a38bca79b.tar.gz
minetest-d7bc346981e189851e490f2417ed015a38bca79b.tar.bz2
minetest-d7bc346981e189851e490f2417ed015a38bca79b.zip
[CSM] Add client-sided chat commands (#5092)
-rw-r--r--builtin/client/chatcommands.lua28
-rw-r--r--builtin/client/init.lua1
-rw-r--r--builtin/client/preview.lua7
-rw-r--r--builtin/common/chatcommands.lua30
-rw-r--r--builtin/game/chatcommands.lua29
-rw-r--r--builtin/game/init.lua1
-rw-r--r--src/client.cpp6
-rw-r--r--src/script/lua_api/l_client.cpp23
-rw-r--r--src/script/lua_api/l_client.h8
9 files changed, 100 insertions, 33 deletions
diff --git a/builtin/client/chatcommands.lua b/builtin/client/chatcommands.lua
new file mode 100644
index 000000000..b49c222ef
--- /dev/null
+++ b/builtin/client/chatcommands.lua
@@ -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
diff --git a/builtin/client/init.lua b/builtin/client/init.lua
index e06dfc995..4797ac4b6 100644
--- a/builtin/client/init.lua
+++ b/builtin/client/init.lua
@@ -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")
diff --git a/builtin/client/preview.lua b/builtin/client/preview.lua
index 4b277b0c6..c421791f5 100644
--- a/builtin/client/preview.lua
+++ b/builtin/client/preview.lua
@@ -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
index 000000000..ef3a24410
--- /dev/null
+++ b/builtin/common/chatcommands.lua
@@ -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
diff --git a/builtin/game/chatcommands.lua b/builtin/game/chatcommands.lua
index 5d5955972..745b012e6 100644
--- a/builtin/game/chatcommands.lua
+++ b/builtin/game/chatcommands.lua
@@ -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, "^/([^ ]+) *(.*)")
diff --git a/builtin/game/init.lua b/builtin/game/init.lua
index b5e2f7cca..793d9fe2b 100644
--- a/builtin/game/init.lua
+++ b/builtin/game/init.lua
@@ -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")
diff --git a/src/client.cpp b/src/client.cpp
index 0af6b4595..3a3e0673e 100644
--- a/src/client.cpp
+++ b/src/client.cpp
@@ -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) {
diff --git a/src/script/lua_api/l_client.cpp b/src/script/lua_api/l_client.cpp
index f4c3812ac..7eb340d78 100644
--- a/src/script/lua_api/l_client.cpp
+++ b/src/script/lua_api/l_client.cpp
@@ -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);
}
diff --git a/src/script/lua_api/l_client.h b/src/script/lua_api/l_client.h
index b4a57cb61..e3106e742 100644
--- a/src/script/lua_api/l_client.h
+++ b/src/script/lua_api/l_client.h
@@ -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);
};