]> git.lizzy.rs Git - dragonfireclient.git/blobdiff - src/script/lua_api/l_client.cpp
CSM: Revert "[CSM] Add send_chat_message and run_server_chatcommand"
[dragonfireclient.git] / src / script / lua_api / l_client.cpp
index 52c7f6f30dfdbdcbf395e524b4af9bb5907d101f..0b957a6e23a31172bff4cbcfa14eaaedabbf84a9 100644 (file)
@@ -19,13 +19,20 @@ 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 "clientenvironment.h"
+#include "common/c_content.h"
+#include "common/c_converter.h"
 #include "cpp_api/s_base.h"
 #include "gettext.h"
-#include "common/c_converter.h"
-#include "common/c_content.h"
+#include "l_internal.h"
 #include "lua_api/l_item.h"
+#include "lua_api/l_nodemeta.h"
+#include "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)
 {
@@ -57,6 +64,15 @@ int ModApiClient::l_set_last_run_mod(lua_State *L)
        return 1;
 }
 
+// print(text)
+int ModApiClient::l_print(lua_State *L)
+{
+       NO_MAP_LOCK_REQUIRED;
+       std::string text = luaL_checkstring(L, 1);
+       rawstream << text << std::endl;
+       return 0;
+}
+
 // display_chat_message(message)
 int ModApiClient::l_display_chat_message(lua_State *L)
 {
@@ -77,7 +93,7 @@ int ModApiClient::l_get_player_names(lua_State *L)
        int newTable = lua_gettop(L);
        int index = 1;
        std::list<std::string>::const_iterator iter;
-       for (iter = plist.begin(); iter != plist.end(); iter++) {
+       for (iter = plist.begin(); iter != plist.end(); ++iter) {
                lua_pushstring(L, (*iter).c_str());
                lua_rawseti(L, newTable, index);
                index++;
@@ -88,7 +104,7 @@ int ModApiClient::l_get_player_names(lua_State *L)
 // show_formspec(formspec)
 int ModApiClient::l_show_formspec(lua_State *L)
 {
-       if ( !lua_isstring(L, 1) || !lua_isstring(L, 2) )
+       if (!lua_isstring(L, 1) || !lua_isstring(L, 2))
                return 0;
 
        ClientEvent event;
@@ -107,6 +123,20 @@ int ModApiClient::l_send_respawn(lua_State *L)
        return 0;
 }
 
+// disconnect()
+int ModApiClient::l_disconnect(lua_State *L)
+{
+       // Stops badly written Lua code form causing boot loops
+       if (getClient(L)->isShutdown()) {
+               lua_pushboolean(L, false);
+               return 1;
+       }
+
+       g_gamecallback->disconnect();
+       lua_pushboolean(L, true);
+       return 1;
+}
+
 // gettext(text)
 int ModApiClient::l_gettext(lua_State *L)
 {
@@ -142,8 +172,7 @@ int ModApiClient::l_get_node_or_nil(lua_State *L)
        if (pos_ok) {
                // Return node
                pushnode(L, n, getClient(L)->ndef());
-       }
-       else {
+       } else {
                lua_pushnil(L);
        }
        return 1;
@@ -166,9 +195,147 @@ int ModApiClient::l_get_wielded_item(lua_State *L)
        return 1;
 }
 
+// get_meta(pos)
+int ModApiClient::l_get_meta(lua_State *L)
+{
+       v3s16 p = read_v3s16(L, 1);
+       NodeMetadata *meta = getClient(L)->getEnv().getMap().getNodeMetadata(p);
+       NodeMetaRef::createClient(L, meta);
+       return 1;
+}
+
+int ModApiClient::l_sound_play(lua_State *L)
+{
+       ISoundManager *sound = getClient(L)->getSoundManager();
+
+       SimpleSoundSpec spec;
+       read_soundspec(L, 1, spec);
+       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");
+               if (!lua_isnil(L, -1)) {
+                       v3f pos = read_v3f(L, -1) * BS;
+                       lua_pop(L, 1);
+                       handle = sound->playSoundAt(
+                                       spec.name, looped, gain * spec.gain, pos, pitch);
+                       lua_pushinteger(L, handle);
+                       return 1;
+               }
+       }
+
+       handle = sound->playSound(spec.name, looped, gain * spec.gain, 0.0f, pitch);
+       lua_pushinteger(L, handle);
+
+       return 1;
+}
+
+int ModApiClient::l_sound_stop(lua_State *L)
+{
+       u32 handle = luaL_checkinteger(L, 1);
+
+       getClient(L)->getSoundManager()->stopSound(handle);
+
+       return 0;
+}
+
+// get_server_info()
+int ModApiClient::l_get_server_info(lua_State *L)
+{
+       Client *client = getClient(L);
+       Address serverAddress = client->getServerAddress();
+       lua_newtable(L);
+       lua_pushstring(L, client->getAddressName().c_str());
+       lua_setfield(L, -2, "address");
+       lua_pushstring(L, serverAddress.serializeString().c_str());
+       lua_setfield(L, -2, "ip");
+       lua_pushinteger(L, serverAddress.getPort());
+       lua_setfield(L, -2, "port");
+       lua_pushinteger(L, client->getProtoVersion());
+       lua_setfield(L, -2, "protocol_version");
+       return 1;
+}
+
+// get_item_def(itemstring)
+int ModApiClient::l_get_item_def(lua_State *L)
+{
+       IGameDef *gdef = getGameDef(L);
+       assert(gdef);
+
+       IItemDefManager *idef = gdef->idef();
+       assert(idef);
+
+       if (!lua_isstring(L, 1))
+               return 0;
+
+       const std::string &name(lua_tostring(L, 1));
+       if (!idef->isKnown(name))
+               return 0;
+       const ItemDefinition &def = idef->get(name);
+
+       push_item_definition_full(L, def);
+
+       return 1;
+}
+
+// get_node_def(nodename)
+int ModApiClient::l_get_node_def(lua_State *L)
+{
+       IGameDef *gdef = getGameDef(L);
+       assert(gdef);
+
+       INodeDefManager *ndef = gdef->ndef();
+       assert(ndef);
+
+       if (!lua_isstring(L, 1))
+               return 0;
+
+       const std::string &name = lua_tostring(L, 1);
+       const ContentFeatures &cf = ndef->get(ndef->getId(name));
+       if (cf.name != name) // Unknown node. | name = <whatever>, cf.name = ignore
+               return 0;
+
+       push_content_features(L, cf);
+
+       return 1;
+}
+
+int ModApiClient::l_take_screenshot(lua_State *L)
+{
+       Client *client = getClient(L);
+       client->makeScreenshot();
+       return 0;
+}
+
+int ModApiClient::l_get_privilege_list(lua_State *L)
+{
+       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(get_current_modname);
+       API_FCT(print);
        API_FCT(display_chat_message);
        API_FCT(get_player_names);
        API_FCT(set_last_run_mod);
@@ -179,4 +346,14 @@ void ModApiClient::Initialize(lua_State *L, int top)
        API_FCT(get_node);
        API_FCT(get_node_or_nil);
        API_FCT(get_wielded_item);
+       API_FCT(disconnect);
+       API_FCT(get_meta);
+       API_FCT(sound_play);
+       API_FCT(sound_stop);
+       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);
 }