Skip to content

Commit

Permalink
[CSM] Add method that display chat to client-sided lua. (#5089) (#5091)
Browse files Browse the repository at this point in the history
* squashed: [Client-sided scripting] Don't register functions that don't work. (#5091)
  • Loading branch information
red-001 authored and nerzhul committed Mar 13, 2017
1 parent 2efae3f commit cb3a61f
Show file tree
Hide file tree
Showing 10 changed files with 66 additions and 6 deletions.
6 changes: 3 additions & 3 deletions src/client.cpp
Expand Up @@ -1584,7 +1584,7 @@ void Client::typeChatMessage(const std::wstring &message)
// Show locally
if (message[0] == L'/')
{
m_chat_queue.push((std::wstring)L"issued command: " + message);
pushToChatQueue((std::wstring)L"issued command: " + message);
}
else
{
Expand All @@ -1593,7 +1593,7 @@ void Client::typeChatMessage(const std::wstring &message)
LocalPlayer *player = m_env.getLocalPlayer();
assert(player != NULL);
std::wstring name = narrow_to_wide(player->getName());
m_chat_queue.push((std::wstring)L"<" + name + L"> " + message);
pushToChatQueue((std::wstring)L"<" + name + L"> " + message);
}
}
}
Expand Down Expand Up @@ -1867,7 +1867,7 @@ void Client::makeScreenshot(IrrlichtDevice *device)
} else {
sstr << "Failed to save screenshot '" << filename << "'";
}
m_chat_queue.push(narrow_to_wide(sstr.str()));
pushToChatQueue(narrow_to_wide(sstr.str()));
infostream << sstr.str() << std::endl;
image->drop();
}
Expand Down
5 changes: 5 additions & 0 deletions src/client.h
Expand Up @@ -557,6 +557,11 @@ class Client : public con::PeerHandler, public InventoryManager, public IGameDef

void makeScreenshot(IrrlichtDevice *device);

inline void pushToChatQueue(const std::wstring &input)
{
m_chat_queue.push(input);
}

private:

// Virtual methods from con::PeerHandler
Expand Down
4 changes: 2 additions & 2 deletions src/network/clientpackethandler.cpp
Expand Up @@ -142,7 +142,7 @@ void Client::handleCommand_AcceptSudoMode(NetworkPacket* pkt)
}
void Client::handleCommand_DenySudoMode(NetworkPacket* pkt)
{
m_chat_queue.push(L"Password change denied. Password NOT changed.");
pushToChatQueue(L"Password change denied. Password NOT changed.");
// reset everything and be sad
deleteAuthData();
}
Expand Down Expand Up @@ -414,7 +414,7 @@ void Client::handleCommand_ChatMessage(NetworkPacket* pkt)

// If chat message not consummed by client lua API
if (!m_script->on_receiving_message(wide_to_utf8(message))) {
m_chat_queue.push(message);
pushToChatQueue(message);
}
}

Expand Down
2 changes: 1 addition & 1 deletion src/script/clientscripting.cpp
Expand Up @@ -49,6 +49,6 @@ ClientScripting::ClientScripting(Client *client):

void ClientScripting::InitializeModApi(lua_State *L, int top)
{
ModApiUtil::Initialize(L, top);
ModApiUtil::InitializeClient(L, top);
ModApiClient::Initialize(L, top);
}
6 changes: 6 additions & 0 deletions src/script/lua_api/l_base.cpp
Expand Up @@ -37,6 +37,12 @@ Server *ModApiBase::getServer(lua_State *L)
return getScriptApiBase(L)->getServer();
}

#ifndef SERVER
Client *ModApiBase::getClient(lua_State *L)
{
return getScriptApiBase(L)->getClient();
}
#endif
Environment *ModApiBase::getEnv(lua_State *L)
{
return getScriptApiBase(L)->getEnv();
Expand Down
8 changes: 8 additions & 0 deletions src/script/lua_api/l_base.h
Expand Up @@ -28,6 +28,10 @@ extern "C" {
#include <lauxlib.h>
}

#ifndef SERVER
#include "client.h"
#endif

class ScriptApiBase;
class Server;
class Environment;
Expand All @@ -38,6 +42,10 @@ class ModApiBase {
public:
static ScriptApiBase* getScriptApiBase(lua_State *L);
static Server* getServer(lua_State *L);
#ifndef SERVER
static Client* getClient(lua_State *L);
#endif // !SERVER

static Environment* getEnv(lua_State *L);
static GUIEngine* getGuiEngine(lua_State *L);
// When we are not loading the mod, this function returns "."
Expand Down
12 changes: 12 additions & 0 deletions src/script/lua_api/l_client.cpp
Expand Up @@ -20,14 +20,26 @@ with this program; if not, write to the Free Software Foundation, Inc.,

#include "l_client.h"
#include "l_internal.h"
#include "util/string.h"

int ModApiClient::l_get_current_modname(lua_State *L)
{
lua_rawgeti(L, LUA_REGISTRYINDEX, CUSTOM_RIDX_CURRENT_MOD_NAME);
return 1;
}

// display_chat_message(message)
int ModApiClient::l_display_chat_message(lua_State *L)
{
NO_MAP_LOCK_REQUIRED;

std::string message = luaL_checkstring(L, 1);
getClient(L)->pushToChatQueue(utf8_to_wide(message));
return 1;
}

void ModApiClient::Initialize(lua_State *L, int top)
{
API_FCT(get_current_modname);
API_FCT(display_chat_message);
}
1 change: 1 addition & 0 deletions src/script/lua_api/l_client.h
Expand Up @@ -28,6 +28,7 @@ class ModApiClient : public ModApiBase
private:
// get_current_modname()
static int l_get_current_modname(lua_State *L);
static int l_display_chat_message(lua_State *L);

public:
static void Initialize(lua_State *L, int top);
Expand Down
26 changes: 26 additions & 0 deletions src/script/lua_api/l_util.cpp
Expand Up @@ -526,6 +526,32 @@ void ModApiUtil::Initialize(lua_State *L, int top)
API_FCT(get_version);
}

void ModApiUtil::InitializeClient(lua_State *L, int top)
{
API_FCT(log);

API_FCT(setting_set);
API_FCT(setting_get);
API_FCT(setting_setbool);
API_FCT(setting_getbool);
API_FCT(setting_save);

API_FCT(parse_json);
API_FCT(write_json);

API_FCT(is_yes);

API_FCT(get_builtin_path);

API_FCT(compress);
API_FCT(decompress);

API_FCT(encode_base64);
API_FCT(decode_base64);

API_FCT(get_version);
}

void ModApiUtil::InitializeAsync(AsyncEngine& engine)
{
ASYNC_API_FCT(log);
Expand Down
2 changes: 2 additions & 0 deletions src/script/lua_api/l_util.h
Expand Up @@ -110,6 +110,8 @@ class ModApiUtil : public ModApiBase {
public:
static void Initialize(lua_State *L, int top);

static void InitializeClient(lua_State *L, int top);

static void InitializeAsync(AsyncEngine& engine);

};
Expand Down

0 comments on commit cb3a61f

Please sign in to comment.