[CSM] Add client-sided chat commands (#5092)

master
red-001 2017-01-22 08:05:09 +00:00 committed by Loïc Blot
parent 9978f5af82
commit d7bc346981
9 changed files with 100 additions and 33 deletions

View File

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

View File

@ -1,6 +1,7 @@
-- Minetest: builtin/client/init.lua -- Minetest: builtin/client/init.lua
local scriptpath = core.get_builtin_path()..DIR_DELIM local scriptpath = core.get_builtin_path()..DIR_DELIM
local clientpath = scriptpath.."client"..DIR_DELIM local clientpath = scriptpath.."client"..DIR_DELIM
local commonpath = scriptpath.."common"..DIR_DELIM
dofile(clientpath .. "register.lua") dofile(clientpath .. "register.lua")
dofile(clientpath .. "preview.lua") dofile(clientpath .. "preview.lua")

View File

@ -22,3 +22,10 @@ end)
core.register_on_damage_taken(function(hp) core.register_on_damage_taken(function(hp)
print("[PREVIEW] Damage taken " .. hp) print("[PREVIEW] Damage taken " .. hp)
end) 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,
})

View File

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

View File

@ -1,37 +1,10 @@
-- Minetest: builtin/chatcommands.lua -- Minetest: builtin/game/chatcommands.lua
-- --
-- Chat command handler -- Chat command handler
-- --
core.registered_chatcommands = {}
core.chatcommands = core.registered_chatcommands -- BACKWARDS COMPATIBILITY 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) core.register_on_chat_message(function(name, message)
local cmd, param = string.match(message, "^/([^ ]+) *(.*)") local cmd, param = string.match(message, "^/([^ ]+) *(.*)")

View File

@ -22,6 +22,7 @@ dofile(gamepath.."deprecated.lua")
dofile(gamepath.."misc.lua") dofile(gamepath.."misc.lua")
dofile(gamepath.."privileges.lua") dofile(gamepath.."privileges.lua")
dofile(gamepath.."auth.lua") dofile(gamepath.."auth.lua")
dofile(commonpath .. "chatcommands.lua")
dofile(gamepath.."chatcommands.lua") dofile(gamepath.."chatcommands.lua")
dofile(gamepath.."static_spawn.lua") dofile(gamepath.."static_spawn.lua")
dofile(gamepath.."detached_inventory.lua") dofile(gamepath.."detached_inventory.lua")

View File

@ -1582,11 +1582,7 @@ void Client::typeChatMessage(const std::wstring &message)
sendChatMessage(message); sendChatMessage(message);
// Show locally // Show locally
if (message[0] == L'/') if (message[0] != L'/')
{
pushToChatQueue((std::wstring)L"issued command: " + message);
}
else
{ {
// compatibility code // compatibility code
if (m_proto_ver < 29) { if (m_proto_ver < 29) {

View File

@ -21,6 +21,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "l_client.h" #include "l_client.h"
#include "l_internal.h" #include "l_internal.h"
#include "util/string.h" #include "util/string.h"
#include "cpp_api/s_base.h"
int ModApiClient::l_get_current_modname(lua_State *L) int ModApiClient::l_get_current_modname(lua_State *L)
{ {
@ -28,6 +29,26 @@ int ModApiClient::l_get_current_modname(lua_State *L)
return 1; 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) // display_chat_message(message)
int ModApiClient::l_display_chat_message(lua_State *L) 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(get_current_modname);
API_FCT(display_chat_message); API_FCT(display_chat_message);
API_FCT(set_last_run_mod);
API_FCT(get_last_run_mod);
} }

View File

@ -28,8 +28,16 @@ class ModApiClient : public ModApiBase
private: private:
// get_current_modname() // get_current_modname()
static int l_get_current_modname(lua_State *L); static int l_get_current_modname(lua_State *L);
// display_chat_message(message)
static int l_display_chat_message(lua_State *L); 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: public:
static void Initialize(lua_State *L, int top); static void Initialize(lua_State *L, int top);
}; };