]> git.lizzy.rs Git - minetest.git/blobdiff - src/script/cpp_api/s_item.cpp
[CSM] Add core.get_timeofday & core.get_day_count env calls (#5401)
[minetest.git] / src / script / cpp_api / s_item.cpp
index 4d4d416ec7ad33639cd2f37d11931d0961abda21..cbb83380735095033d89f11660aa374585422f20 100644 (file)
@@ -34,6 +34,8 @@ bool ScriptApiItem::item_OnDrop(ItemStack &item,
 {
        SCRIPTAPI_PRECHECKHEADER
 
+       int error_handler = PUSH_ERROR_HANDLER(L);
+
        // Push callback function on stack
        if (!getItemCallback(item.name.c_str(), "on_drop"))
                return false;
@@ -42,15 +44,15 @@ bool ScriptApiItem::item_OnDrop(ItemStack &item,
        LuaItemStack::create(L, item);
        objectrefGetOrCreate(L, dropper);
        pushFloatPos(L, pos);
-       PCALL_RES(lua_pcall(L, 3, 1, m_errorhandler));
+       PCALL_RES(lua_pcall(L, 3, 1, error_handler));
        if (!lua_isnil(L, -1)) {
                try {
-                       item = read_item(L,-1, getServer());
+                       item = read_item(L, -1, getServer()->idef());
                } catch (LuaError &e) {
                        throw LuaError(std::string(e.what()) + ". item=" + item.name);
                }
        }
-       lua_pop(L, 1);  // Pop item
+       lua_pop(L, 2);  // Pop item and error handler
        return true;
 }
 
@@ -59,6 +61,8 @@ bool ScriptApiItem::item_OnPlace(ItemStack &item,
 {
        SCRIPTAPI_PRECHECKHEADER
 
+       int error_handler = PUSH_ERROR_HANDLER(L);
+
        // Push callback function on stack
        if (!getItemCallback(item.name.c_str(), "on_place"))
                return false;
@@ -67,15 +71,15 @@ bool ScriptApiItem::item_OnPlace(ItemStack &item,
        LuaItemStack::create(L, item);
        objectrefGetOrCreate(L, placer);
        pushPointedThing(pointed);
-       PCALL_RES(lua_pcall(L, 3, 1, m_errorhandler));
+       PCALL_RES(lua_pcall(L, 3, 1, error_handler));
        if (!lua_isnil(L, -1)) {
                try {
-                       item = read_item(L,-1, getServer());
+                       item = read_item(L, -1, getServer()->idef());
                } catch (LuaError &e) {
                        throw LuaError(std::string(e.what()) + ". item=" + item.name);
                }
        }
-       lua_pop(L, 1);  // Pop item
+       lua_pop(L, 2);  // Pop item and error handler
        return true;
 }
 
@@ -84,6 +88,8 @@ bool ScriptApiItem::item_OnUse(ItemStack &item,
 {
        SCRIPTAPI_PRECHECKHEADER
 
+       int error_handler = PUSH_ERROR_HANDLER(L);
+
        // Push callback function on stack
        if (!getItemCallback(item.name.c_str(), "on_use"))
                return false;
@@ -92,15 +98,41 @@ bool ScriptApiItem::item_OnUse(ItemStack &item,
        LuaItemStack::create(L, item);
        objectrefGetOrCreate(L, user);
        pushPointedThing(pointed);
-       PCALL_RES(lua_pcall(L, 3, 1, m_errorhandler));
+       PCALL_RES(lua_pcall(L, 3, 1, error_handler));
        if(!lua_isnil(L, -1)) {
                try {
-                       item = read_item(L,-1, getServer());
+                       item = read_item(L, -1, getServer()->idef());
+               } catch (LuaError &e) {
+                       throw LuaError(std::string(e.what()) + ". item=" + item.name);
+               }
+       }
+       lua_pop(L, 2);  // Pop item and error handler
+       return true;
+}
+
+bool ScriptApiItem::item_OnSecondaryUse(ItemStack &item, ServerActiveObject *user)
+{
+       SCRIPTAPI_PRECHECKHEADER
+       
+       int error_handler = PUSH_ERROR_HANDLER(L);
+       
+       if (!getItemCallback(item.name.c_str(), "on_secondary_use"))
+               return false;
+       
+       LuaItemStack::create(L, item);
+       objectrefGetOrCreate(L, user);
+       PointedThing pointed;
+       pointed.type = POINTEDTHING_NOTHING;
+       pushPointedThing(pointed);
+       PCALL_RES(lua_pcall(L, 3, 1, error_handler));
+       if (!lua_isnil(L, -1)) {
+               try {
+                       item = read_item(L, -1, getServer()->idef());
                } catch (LuaError &e) {
                        throw LuaError(std::string(e.what()) + ". item=" + item.name);
                }
        }
-       lua_pop(L, 1);  // Pop item
+       lua_pop(L, 2);  // Pop item and error handler
        return true;
 }
 
@@ -109,6 +141,8 @@ bool ScriptApiItem::item_OnCraft(ItemStack &item, ServerActiveObject *user,
 {
        SCRIPTAPI_PRECHECKHEADER
 
+       int error_handler = PUSH_ERROR_HANDLER(L);
+
        lua_getglobal(L, "core");
        lua_getfield(L, -1, "on_craft");
        LuaItemStack::create(L, item);
@@ -122,15 +156,15 @@ bool ScriptApiItem::item_OnCraft(ItemStack &item, ServerActiveObject *user,
        push_items(L, items);
 
        InvRef::create(L, craft_inv);
-       PCALL_RES(lua_pcall(L, 4, 1, m_errorhandler));
+       PCALL_RES(lua_pcall(L, 4, 1, error_handler));
        if (!lua_isnil(L, -1)) {
                try {
-                       item = read_item(L,-1, getServer());
+                       item = read_item(L, -1, getServer()->idef());
                } catch (LuaError &e) {
                        throw LuaError(std::string(e.what()) + ". item=" + item.name);
                }
        }
-       lua_pop(L, 1);  // Pop item
+       lua_pop(L, 2);  // Pop item and error handler
        return true;
 }
 
@@ -139,6 +173,8 @@ bool ScriptApiItem::item_CraftPredict(ItemStack &item, ServerActiveObject *user,
 {
        SCRIPTAPI_PRECHECKHEADER
 
+       int error_handler = PUSH_ERROR_HANDLER(L);
+
        lua_getglobal(L, "core");
        lua_getfield(L, -1, "craft_predict");
        LuaItemStack::create(L, item);
@@ -152,15 +188,15 @@ bool ScriptApiItem::item_CraftPredict(ItemStack &item, ServerActiveObject *user,
        push_items(L, items);
 
        InvRef::create(L, craft_inv);
-       PCALL_RES(lua_pcall(L, 4, 1, m_errorhandler));
+       PCALL_RES(lua_pcall(L, 4, 1, error_handler));
        if (!lua_isnil(L, -1)) {
                try {
-                       item = read_item(L,-1, getServer());
+                       item = read_item(L, -1, getServer()->idef());
                } catch (LuaError &e) {
                        throw LuaError(std::string(e.what()) + ". item=" + item.name);
                }
        }
-       lua_pop(L, 1);  // Pop item
+       lua_pop(L, 2);  // Pop item and error handler
        return true;
 }