]> 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 2d906985f7c5d81e51e7dbd8a7cfa61c23f96e15..0b957a6e23a31172bff4cbcfa14eaaedabbf84a9 100644 (file)
@@ -19,6 +19,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 */
 
 #include "l_client.h"
+#include "clientenvironment.h"
 #include "common/c_content.h"
 #include "common/c_converter.h"
 #include "cpp_api/s_base.h"
@@ -27,9 +28,9 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "lua_api/l_item.h"
 #include "lua_api/l_nodemeta.h"
 #include "mainmenumanager.h"
-#include "util/string.h"
-#include "clientenvironment.h"
 #include "map.h"
+#include "util/string.h"
+#include "nodedef.h"
 
 extern MainGameCallback *g_gamecallback;
 
@@ -63,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)
 {
@@ -83,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++;
@@ -200,25 +210,28 @@ int ModApiClient::l_sound_play(lua_State *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");
                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);
+                       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);
+       handle = sound->playSound(spec.name, looped, gain * spec.gain, 0.0f, pitch);
        lua_pushinteger(L, handle);
 
        return 1;
@@ -233,9 +246,96 @@ int ModApiClient::l_sound_stop(lua_State *L)
        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);
@@ -250,4 +350,10 @@ void ModApiClient::Initialize(lua_State *L, int top)
        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);
 }