forked from Mirrorlandia_minetest/minetest
[CSM] Add client-sided chat commands (#5092)
This commit is contained in:
parent
9978f5af82
commit
d7bc346981
28
builtin/client/chatcommands.lua
Normal file
28
builtin/client/chatcommands.lua
Normal 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)
|
@ -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")
|
||||||
|
@ -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,
|
||||||
|
})
|
30
builtin/common/chatcommands.lua
Normal file
30
builtin/common/chatcommands.lua
Normal 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
|
@ -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, "^/([^ ]+) *(.*)")
|
||||||
|
@ -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")
|
||||||
|
@ -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) {
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user