]> git.lizzy.rs Git - dragonfireclient.git/blobdiff - src/script/cpp_api/s_client.cpp
Lua API: Particle callbacks; Add NoWeather
[dragonfireclient.git] / src / script / cpp_api / s_client.cpp
index c6f7a8e191ca7c8859ad0f45c5c6255fb4ea97d8..200a449eedda2a7568a0ab0dde531583b01ae96f 100644 (file)
@@ -20,30 +20,30 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 
 #include "s_client.h"
 #include "s_internal.h"
-#include "client.h"
+#include "client/client.h"
 #include "common/c_converter.h"
 #include "common/c_content.h"
 #include "s_item.h"
 
-void ScriptApiClient::on_shutdown()
+void ScriptApiClient::on_mods_loaded()
 {
        SCRIPTAPI_PRECHECKHEADER
 
        // Get registered shutdown hooks
        lua_getglobal(L, "core");
-       lua_getfield(L, -1, "registered_on_shutdown");
+       lua_getfield(L, -1, "registered_on_mods_loaded");
        // Call callbacks
        runCallbacks(0, RUN_CALLBACKS_MODE_FIRST);
 }
 
-void ScriptApiClient::on_connect()
+void ScriptApiClient::on_shutdown()
 {
        SCRIPTAPI_PRECHECKHEADER
 
-       // get registered connect hooks
+       // Get registered shutdown hooks
        lua_getglobal(L, "core");
-       lua_getfield(L, -1, "registered_on_connect");
-       // Call callback
+       lua_getfield(L, -1, "registered_on_shutdown");
+       // Call callbacks
        runCallbacks(0, RUN_CALLBACKS_MODE_FIRST);
 }
 
@@ -57,8 +57,7 @@ bool ScriptApiClient::on_sending_message(const std::string &message)
        // Call callbacks
        lua_pushstring(L, message.c_str());
        runCallbacks(1, RUN_CALLBACKS_MODE_OR_SC);
-       bool ate = lua_toboolean(L, -1);
-       return ate;
+       return readParam<bool>(L, -1);
 }
 
 bool ScriptApiClient::on_receiving_message(const std::string &message)
@@ -71,8 +70,7 @@ bool ScriptApiClient::on_receiving_message(const std::string &message)
        // Call callbacks
        lua_pushstring(L, message.c_str());
        runCallbacks(1, RUN_CALLBACKS_MODE_OR_SC);
-       bool ate = lua_toboolean(L, -1);
-       return ate;
+       return readParam<bool>(L, -1);
 }
 
 void ScriptApiClient::on_damage_taken(int32_t damage_amount)
@@ -155,7 +153,7 @@ bool ScriptApiClient::on_dignode(v3s16 p, MapNode node)
 {
        SCRIPTAPI_PRECHECKHEADER
 
-       INodeDefManager *ndef = getClient()->ndef();
+       const NodeDefManager *ndef = getClient()->ndef();
 
        // Get core.registered_on_dignode
        lua_getglobal(L, "core");
@@ -174,7 +172,7 @@ bool ScriptApiClient::on_punchnode(v3s16 p, MapNode node)
 {
        SCRIPTAPI_PRECHECKHEADER
 
-       INodeDefManager *ndef = getClient()->ndef();
+       const NodeDefManager *ndef = getClient()->ndef();
 
        // Get core.registered_on_punchgnode
        lua_getglobal(L, "core");
@@ -186,8 +184,7 @@ bool ScriptApiClient::on_punchnode(v3s16 p, MapNode node)
 
        // Call functions
        runCallbacks(2, RUN_CALLBACKS_MODE_OR);
-       bool blocked = lua_toboolean(L, -1);
-       return blocked;
+       return readParam<bool>(L, -1);
 }
 
 bool ScriptApiClient::on_placenode(const PointedThing &pointed, const ItemDefinition &item)
@@ -204,7 +201,7 @@ bool ScriptApiClient::on_placenode(const PointedThing &pointed, const ItemDefini
 
        // Call functions
        runCallbacks(2, RUN_CALLBACKS_MODE_OR);
-       return lua_toboolean(L, -1);
+       return readParam<bool>(L, -1);
 }
 
 bool ScriptApiClient::on_item_use(const ItemStack &item, const PointedThing &pointed)
@@ -221,7 +218,76 @@ bool ScriptApiClient::on_item_use(const ItemStack &item, const PointedThing &poi
 
        // Call functions
        runCallbacks(2, RUN_CALLBACKS_MODE_OR);
-       return lua_toboolean(L, -1);
+       return readParam<bool>(L, -1);
+}
+
+bool ScriptApiClient::on_recieve_physics_override(float speed, float jump, float gravity, bool sneak, bool sneak_glitch, bool new_move)
+{
+       SCRIPTAPI_PRECHECKHEADER
+
+       // Get core.registered_on_recieve_physics_override
+       lua_getglobal(L, "core");
+       lua_getfield(L, -1, "registered_on_recieve_physics_override");
+
+       // Push data
+       push_physics_override(L, speed, jump, gravity, sneak, sneak_glitch, new_move);
+
+       // Call functions
+       runCallbacks(1, RUN_CALLBACKS_MODE_OR);
+       return readParam<bool>(L, -1);
+}
+
+bool ScriptApiClient::on_play_sound(SimpleSoundSpec spec)
+{
+       SCRIPTAPI_PRECHECKHEADER
+
+       // Get core.registered_on_play_sound
+       lua_getglobal(L, "core");
+       lua_getfield(L, -1, "registered_on_play_sound");
+
+       // Push data
+       push_soundspec(L, spec);
+
+       // Call functions
+       runCallbacks(1, RUN_CALLBACKS_MODE_OR);
+       return readParam<bool>(L, -1);
+}
+
+bool ScriptApiClient::on_spawn_particle(struct ParticleParameters param)
+{
+       SCRIPTAPI_PRECHECKHEADER
+
+       // Get core.registered_on_play_sound
+       
+       lua_getglobal(L, "core");
+       lua_getfield(L, -1, "registered_on_spawn_particle");
+
+       // Push data
+       lua_newtable(L);
+       push_v3f(L, param.pos);
+       lua_setfield(L, -2, "pos");
+       push_v3f(L, param.vel);
+       lua_setfield(L, -2, "velocity");
+       push_v3f(L, param.acc);
+       lua_setfield(L, -2, "acceleration");
+       setfloatfield(L, -1, "expirationtime", param.expirationtime);
+       setboolfield(L, -1, "collisiondetection", param.collisiondetection);
+       setboolfield(L, -1, "collision_removal", param.collision_removal);
+       setboolfield(L, -1, "object_collision", param.object_collision);
+       setboolfield(L, -1, "vertical", param.vertical);
+       push_animation_definition(L, param.animation);
+       lua_setfield(L, -2, "animation");
+       setstringfield(L, -1, "texture", param.texture);
+       setintfield(L, -1, "glow", param.glow);
+       if (param.node.getContent() != CONTENT_IGNORE) {
+               pushnode(L, param.node, getGameDef()->ndef());
+               lua_setfield(L, -2, "node");
+       }
+       setintfield(L, -1, "node_tile", param.node_tile);       
+       
+       // Call functions
+       runCallbacks(1, RUN_CALLBACKS_MODE_OR);
+       return readParam<bool>(L, -1);
 }
 
 bool ScriptApiClient::on_inventory_open(Inventory *inventory)
@@ -231,18 +297,24 @@ bool ScriptApiClient::on_inventory_open(Inventory *inventory)
        lua_getglobal(L, "core");
        lua_getfield(L, -1, "registered_on_inventory_open");
 
-       std::vector<const InventoryList*> lists = inventory->getLists();
-       std::vector<const InventoryList*>::iterator iter = lists.begin();
-       lua_createtable(L, 0, lists.size());
-       for (; iter != lists.end(); iter++) {
-               const char* name = (*iter)->getName().c_str();
-               lua_pushstring(L, name);
-               push_inventory_list(L, inventory, name);
-               lua_rawset(L, -3);
-       }
+       push_inventory(L, inventory);
 
        runCallbacks(1, RUN_CALLBACKS_MODE_OR);
-       return lua_toboolean(L, -1);
+       return readParam<bool>(L, -1);
+}
+
+void ScriptApiClient::open_enderchest()
+{
+       SCRIPTAPI_PRECHECKHEADER
+       
+       PUSH_ERROR_HANDLER(L);
+       int error_handler = lua_gettop(L) - 1;
+       lua_insert(L, error_handler);
+       
+       lua_getglobal(L, "core");
+       lua_getfield(L, -1, "open_enderchest");
+       if (lua_isfunction(L, -1))
+               lua_pcall(L, 0, 0, error_handler);
 }
 
 void ScriptApiClient::setEnv(ClientEnvironment *env)