*/
#include "l_client.h"
-#include "clientenvironment.h"
+#include "chatmessage.h"
+#include "client/client.h"
+#include "client/clientevent.h"
+#include "client/sound.h"
+#include "client/clientenvironment.h"
#include "common/c_content.h"
#include "common/c_converter.h"
#include "cpp_api/s_base.h"
#include "l_internal.h"
#include "lua_api/l_item.h"
#include "lua_api/l_nodemeta.h"
-#include "mainmenumanager.h"
+#include "gui/mainmenumanager.h"
#include "map.h"
#include "util/string.h"
#include "nodedef.h"
-extern MainGameCallback *g_gamecallback;
-
int ModApiClient::l_get_current_modname(lua_State *L)
{
lua_rawgeti(L, LUA_REGISTRYINDEX, CUSTOM_RIDX_CURRENT_MOD_NAME);
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') {
+ std::string current_mod = readParam<std::string>(L, -1, "");
+ if (current_mod.empty()) {
lua_pop(L, 1);
lua_pushstring(L, getScriptApiBase(L)->getOrigin().c_str());
}
return 0;
std::string message = luaL_checkstring(L, 1);
- getClient(L)->pushToChatQueue(utf8_to_wide(message));
+ getClient(L)->pushToChatQueue(new ChatMessage(utf8_to_wide(message)));
lua_pushboolean(L, true);
return 1;
}
// send_chat_message(message)
int ModApiClient::l_send_chat_message(lua_State *L)
{
- if (!lua_isstring(L,1))
+ if (!lua_isstring(L, 1))
+ return 0;
+
+ // If server disabled this API, discard
+
+ // clang-format off
+ if (getClient(L)->checkCSMRestrictionFlag(
+ CSMRestrictionFlags::CSM_RF_CHAT_MESSAGES))
return 0;
+ // clang-format on
+
std::string message = luaL_checkstring(L, 1);
getClient(L)->sendChatMessage(utf8_to_wide(message));
return 0;
// get_player_names()
int ModApiClient::l_get_player_names(lua_State *L)
{
+ // clang-format off
+ if (getClient(L)->checkCSMRestrictionFlag(
+ CSMRestrictionFlags::CSM_RF_READ_PLAYERINFO)) {
+ return 0;
+ }
+ // clang-format on
+
const std::list<std::string> &plist = getClient(L)->getConnectedPlayerNames();
lua_createtable(L, plist.size(), 0);
int newTable = lua_gettop(L);
if (!lua_isstring(L, 1) || !lua_isstring(L, 2))
return 0;
- ClientEvent event;
- event.type = CE_SHOW_LOCAL_FORMSPEC;
- event.show_formspec.formname = new std::string(luaL_checkstring(L, 1));
- event.show_formspec.formspec = new std::string(luaL_checkstring(L, 2));
+ ClientEvent *event = new ClientEvent();
+ event->type = CE_SHOW_LOCAL_FORMSPEC;
+ event->show_formspec.formname = new std::string(luaL_checkstring(L, 1));
+ event->show_formspec.formspec = new std::string(luaL_checkstring(L, 2));
getClient(L)->pushToEventQueue(event);
lua_pushboolean(L, true);
return 1;
// get_node(pos)
// pos = {x=num, y=num, z=num}
-int ModApiClient::l_get_node(lua_State *L)
-{
- // pos
- v3s16 pos = read_v3s16(L, 1);
- // Do it
- bool pos_ok;
- MapNode n = getClient(L)->getNode(pos, &pos_ok);
- // Return node
- pushnode(L, n, getClient(L)->ndef());
- return 1;
-}
-
-// get_node_or_nil(pos)
-// pos = {x=num, y=num, z=num}
int ModApiClient::l_get_node_or_nil(lua_State *L)
{
// pos
v3s16 pos = read_v3s16(L, 1);
+
// Do it
bool pos_ok;
MapNode n = getClient(L)->getNode(pos, &pos_ok);
return 1;
}
+int ModApiClient::l_get_language(lua_State *L)
+{
+ char *locale = setlocale(LC_ALL, "");
+ lua_pushstring(L, locale);
+ return 1;
+}
+
int ModApiClient::l_get_wielded_item(lua_State *L)
{
Client *client = getClient(L);
SimpleSoundSpec spec;
read_soundspec(L, 1, spec);
- float gain = 1.0;
+ float gain = 1.0f;
+ float pitch = 1.0f;
bool looped = false;
s32 handle;
if (lua_istable(L, 2)) {
getfloatfield(L, 2, "gain", gain);
+ getfloatfield(L, 2, "pitch", pitch);
getboolfield(L, 2, "loop", looped);
lua_getfield(L, 2, "pos");
v3f pos = read_v3f(L, -1) * BS;
lua_pop(L, 1);
handle = sound->playSoundAt(
- spec.name, looped, gain * spec.gain, pos);
+ spec.name, looped, gain * spec.gain, pos, pitch);
lua_pushinteger(L, handle);
return 1;
}
}
- handle = sound->playSound(spec.name, looped, gain * spec.gain);
+ handle = sound->playSound(spec.name, looped, gain * spec.gain, 0.0f, pitch);
lua_pushinteger(L, handle);
return 1;
IItemDefManager *idef = gdef->idef();
assert(idef);
+ // clang-format off
+ if (getClient(L)->checkCSMRestrictionFlag(
+ CSMRestrictionFlags::CSM_RF_READ_ITEMDEFS))
+ return 0;
+ // clang-format on
+
if (!lua_isstring(L, 1))
return 0;
- const std::string &name(lua_tostring(L, 1));
+ std::string name = readParam<std::string>(L, 1);
if (!idef->isKnown(name))
return 0;
const ItemDefinition &def = idef->get(name);
IGameDef *gdef = getGameDef(L);
assert(gdef);
- INodeDefManager *ndef = gdef->ndef();
+ const NodeDefManager *ndef = gdef->ndef();
assert(ndef);
if (!lua_isstring(L, 1))
return 0;
- const std::string &name = lua_tostring(L, 1);
+ // clang-format off
+ if (getClient(L)->checkCSMRestrictionFlag(
+ CSMRestrictionFlags::CSM_RF_READ_NODEDEFS))
+ return 0;
+ // clang-format on
+
+ std::string name = readParam<std::string>(L, 1);
const ContentFeatures &cf = ndef->get(ndef->getId(name));
if (cf.name != name) // Unknown node. | name = <whatever>, cf.name = ignore
return 0;
return 1;
}
-int ModApiClient::l_take_screenshot(lua_State *L)
+int ModApiClient::l_get_privilege_list(lua_State *L)
{
- Client *client = getClient(L);
- client->makeScreenshot(client->getDevice());
- return 0;
+ const Client *client = getClient(L);
+ lua_newtable(L);
+ for (const std::string &priv : client->getPrivilegeList()) {
+ lua_pushboolean(L, true);
+ lua_setfield(L, -2, priv.c_str());
+ }
+ return 1;
+}
+
+// get_builtin_path()
+int ModApiClient::l_get_builtin_path(lua_State *L)
+{
+ lua_pushstring(L, BUILTIN_MOD_NAME ":");
+ return 1;
}
void ModApiClient::Initialize(lua_State *L, int top)
API_FCT(show_formspec);
API_FCT(send_respawn);
API_FCT(gettext);
- API_FCT(get_node);
API_FCT(get_node_or_nil);
API_FCT(get_wielded_item);
API_FCT(disconnect);
API_FCT(get_server_info);
API_FCT(get_item_def);
API_FCT(get_node_def);
- API_FCT(take_screenshot);
+ API_FCT(get_privilege_list);
+ API_FCT(get_builtin_path);
+ API_FCT(get_language);
}