mirror of
https://github.com/luanti-org/luanti.git
synced 2025-06-27 16:36:03 +00:00
Add a callback: minetest.register_on_craft(itemstack, player,
old_craft_grid, craft_inv) and minetest.register_craft_predict(itemstack, player, old_craft_grid, craft_inv)
This commit is contained in:
parent
2f10cfb226
commit
bd6d4666ab
6 changed files with 93 additions and 0 deletions
|
@ -22,9 +22,12 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
|||
#include "common/c_converter.h"
|
||||
#include "common/c_content.h"
|
||||
#include "lua_api/l_item.h"
|
||||
#include "lua_api/l_inventory.h"
|
||||
#include "server.h"
|
||||
#include "log.h"
|
||||
#include "util/pointedthing.h"
|
||||
#include "inventory.h"
|
||||
#include "inventorymanager.h"
|
||||
|
||||
bool ScriptApiItem::item_OnDrop(ItemStack &item,
|
||||
ServerActiveObject *dropper, v3f pos)
|
||||
|
@ -86,6 +89,54 @@ bool ScriptApiItem::item_OnUse(ItemStack &item,
|
|||
return true;
|
||||
}
|
||||
|
||||
bool ScriptApiItem::item_OnCraft(ItemStack &item, ServerActiveObject *user,
|
||||
const InventoryList *old_craft_grid, const InventoryLocation &craft_inv)
|
||||
{
|
||||
SCRIPTAPI_PRECHECKHEADER
|
||||
|
||||
lua_getglobal(L, "minetest");
|
||||
lua_getfield(L, -1, "on_craft");
|
||||
LuaItemStack::create(L, item);
|
||||
objectrefGetOrCreate(user);
|
||||
|
||||
//Push inventory list
|
||||
std::vector<ItemStack> items;
|
||||
for(u32 i=0; i<old_craft_grid->getSize(); i++)
|
||||
items.push_back(old_craft_grid->getItem(i));
|
||||
push_items(L, items);
|
||||
|
||||
InvRef::create(L, craft_inv);
|
||||
if(lua_pcall(L, 4, 1, 0))
|
||||
scriptError("error: %s", lua_tostring(L, -1));
|
||||
if(!lua_isnil(L, -1))
|
||||
item = read_item(L,-1, getServer());
|
||||
return true;
|
||||
}
|
||||
|
||||
bool ScriptApiItem::item_CraftPredict(ItemStack &item, ServerActiveObject *user,
|
||||
const InventoryList *old_craft_grid, const InventoryLocation &craft_inv)
|
||||
{
|
||||
SCRIPTAPI_PRECHECKHEADER
|
||||
|
||||
lua_getglobal(L, "minetest");
|
||||
lua_getfield(L, -1, "craft_predict");
|
||||
LuaItemStack::create(L, item);
|
||||
objectrefGetOrCreate(user);
|
||||
|
||||
//Push inventory list
|
||||
std::vector<ItemStack> items;
|
||||
for(u32 i=0; i<old_craft_grid->getSize(); i++)
|
||||
items.push_back(old_craft_grid->getItem(i));
|
||||
push_items(L, items);
|
||||
|
||||
InvRef::create(L, craft_inv);
|
||||
if(lua_pcall(L, 4, 1, 0))
|
||||
scriptError("error: %s", lua_tostring(L, -1));
|
||||
if(!lua_isnil(L, -1))
|
||||
item = read_item(L,-1, getServer());
|
||||
return true;
|
||||
}
|
||||
|
||||
// Retrieves minetest.registered_items[name][callbackname]
|
||||
// If that is nil or on error, return false and stack is unchanged
|
||||
// If that is a function, returns true and pushes the
|
||||
|
|
|
@ -29,6 +29,8 @@ class ServerActiveObject;
|
|||
struct ItemDefinition;
|
||||
class LuaItemStack;
|
||||
class ModApiItemMod;
|
||||
class InventoryList;
|
||||
class InventoryLocation;
|
||||
|
||||
class ScriptApiItem
|
||||
: virtual public ScriptApiBase
|
||||
|
@ -40,6 +42,10 @@ public:
|
|||
ServerActiveObject *placer, const PointedThing &pointed);
|
||||
bool item_OnUse(ItemStack &item,
|
||||
ServerActiveObject *user, const PointedThing &pointed);
|
||||
bool item_OnCraft(ItemStack &item, ServerActiveObject *user,
|
||||
const InventoryList *old_craft_grid, const InventoryLocation &craft_inv);
|
||||
bool item_CraftPredict(ItemStack &item, ServerActiveObject *user,
|
||||
const InventoryList *old_craft_grid, const InventoryLocation &craft_inv);
|
||||
|
||||
protected:
|
||||
friend class LuaItemStack;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue