Skip to content

Commit

Permalink
[CSM] Add client-sided chat commands (#5092)
Browse files Browse the repository at this point in the history
  • Loading branch information
red-001 authored and nerzhul committed Mar 13, 2017
1 parent 9978f5a commit d7bc346
Show file tree
Hide file tree
Showing 9 changed files with 100 additions and 33 deletions.
28 changes: 28 additions & 0 deletions 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)
1 change: 1 addition & 0 deletions 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")
Expand Down
7 changes: 7 additions & 0 deletions builtin/client/preview.lua
Expand Up @@ -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,
})
30 changes: 30 additions & 0 deletions 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
29 changes: 1 addition & 28 deletions 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, "^/([^ ]+) *(.*)")
Expand Down
1 change: 1 addition & 0 deletions builtin/game/init.lua
Expand Up @@ -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")
Expand Down
6 changes: 1 addition & 5 deletions src/client.cpp
Expand Up @@ -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) {
Expand Down
23 changes: 23 additions & 0 deletions src/script/lua_api/l_client.cpp
Expand Up @@ -21,13 +21,34 @@ 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)
{
lua_rawgeti(L, LUA_REGISTRYINDEX, CUSTOM_RIDX_CURRENT_MOD_NAME);
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)
{
Expand All @@ -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);
}
8 changes: 8 additions & 0 deletions src/script/lua_api/l_client.h
Expand Up @@ -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);
};
Expand Down

0 comments on commit d7bc346

Please sign in to comment.