mirror of
https://github.com/luanti-org/luanti.git
synced 2025-10-23 20:55:43 +02:00
Entirely new version of pull request #3962
Changes to be committed: modified: builtin/game/register.lua modified: src/content_nodemeta.cpp modified: src/content_nodemeta.h modified: src/game.cpp modified: src/inventory.cpp modified: src/inventory.h modified: src/inventorymanager.cpp modified: src/inventorymanager.h modified: src/mapblock.cpp modified: src/network/clientpackethandler.cpp modified: src/nodemetadata.cpp modified: src/nodemetadata.h modified: src/player.cpp modified: src/player.h modified: src/rollback_interface.cpp modified: src/script/common/c_content.cpp modified: src/script/cpp_api/s_inventory.cpp modified: src/script/cpp_api/s_inventory.h modified: src/script/cpp_api/s_nodemeta.cpp modified: src/script/cpp_api/s_nodemeta.h modified: src/script/cpp_api/s_player.cpp modified: src/script/cpp_api/s_player.h modified: src/script/lua_api/l_inventory.cpp modified: src/script/lua_api/l_nodemeta.cpp modified: src/server.cpp modified: src/serverobject.cpp modified: src/unittest/test_inventory.cpp
This commit is contained in:
@@ -902,11 +902,11 @@ void read_inventory_list(lua_State *L, int tableindex,
|
||||
i = items.begin(); i != items.end(); i++){
|
||||
if(forcesize != -1 && index == forcesize)
|
||||
break;
|
||||
invlist->changeItem(index, *i);
|
||||
invlist->changeItem(NULL, index, *i);
|
||||
index++;
|
||||
}
|
||||
while(forcesize != -1 && index < forcesize){
|
||||
invlist->deleteItem(index);
|
||||
invlist->deleteItem(NULL, index);
|
||||
index++;
|
||||
}
|
||||
}
|
||||
|
@@ -202,6 +202,64 @@ void ScriptApiDetached::detached_inventory_OnTake(
|
||||
lua_pop(L, 1); // Pop error handler
|
||||
}
|
||||
|
||||
|
||||
void ScriptApiDetached::on_detached_inventory_remove_item(
|
||||
const std::string &name,
|
||||
const std::string &inventory_list_name,
|
||||
const ItemStack &deleted_item)
|
||||
{
|
||||
SCRIPTAPI_PRECHECKHEADER
|
||||
|
||||
lua_getglobal(L, "core");
|
||||
lua_getfield(L, -1, "registered_on_detached_inventory_remove_item");
|
||||
// Call callbacks
|
||||
lua_pushstring(L, name.c_str());// name 1
|
||||
lua_pushstring(L, inventory_list_name.c_str());// listname 2
|
||||
LuaItemStack::create(L, deleted_item); // stack 3
|
||||
runCallbacks(3, RUN_CALLBACKS_MODE_LAST);
|
||||
}
|
||||
|
||||
void ScriptApiDetached::on_detached_inventory_change_item(
|
||||
const std::string &name,
|
||||
const std::string &inventory_list_name,
|
||||
u32 query_slot,
|
||||
const ItemStack &old_item,
|
||||
const ItemStack &new_item)
|
||||
{
|
||||
SCRIPTAPI_PRECHECKHEADER
|
||||
|
||||
// Get core.registered_on_inventory_change_item
|
||||
lua_getglobal(L, "core");
|
||||
lua_getfield(L, -1, "registered_on_detached_inventory_change_item");
|
||||
// Call callbacks
|
||||
lua_pushstring(L, name.c_str());// name 1
|
||||
lua_pushstring(L, inventory_list_name.c_str());// listname 2
|
||||
lua_pushnumber(L, query_slot);// slot 3
|
||||
LuaItemStack::create(L, old_item); // stack 4
|
||||
LuaItemStack::create(L, new_item); // stack 5
|
||||
runCallbacks(5, RUN_CALLBACKS_MODE_LAST);
|
||||
}
|
||||
|
||||
void ScriptApiDetached::on_detached_inventory_add_item(
|
||||
const std::string &name,
|
||||
const std::string &inventory_list_name,
|
||||
u32 query_slot,
|
||||
const ItemStack &added_item)
|
||||
{
|
||||
SCRIPTAPI_PRECHECKHEADER
|
||||
|
||||
// Get core.registered_on_inventory_add_item
|
||||
lua_getglobal(L, "core");
|
||||
lua_getfield(L, -1, "registered_on_detached_inventory_add_item");
|
||||
// Call callbacks
|
||||
lua_pushstring(L, name.c_str());// name 1
|
||||
lua_pushstring(L, inventory_list_name.c_str());// listname 2
|
||||
lua_pushnumber(L, query_slot);
|
||||
LuaItemStack::create(L, added_item); // stack 4
|
||||
runCallbacks(4, RUN_CALLBACKS_MODE_LAST);
|
||||
}
|
||||
|
||||
|
||||
// Retrieves core.detached_inventories[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
|
||||
|
@@ -61,6 +61,25 @@ public:
|
||||
const std::string &name,
|
||||
const std::string &listname, int index, ItemStack &stack,
|
||||
ServerActiveObject *player);
|
||||
|
||||
void on_detached_inventory_remove_item(
|
||||
const std::string &name,
|
||||
const std::string &inventory_list_name,
|
||||
const ItemStack &deleted_item);
|
||||
|
||||
void on_detached_inventory_change_item(
|
||||
const std::string &name,
|
||||
const std::string &inventory_list_name,
|
||||
u32 query_slot,
|
||||
const ItemStack &old_item,
|
||||
const ItemStack &new_item);
|
||||
|
||||
void on_detached_inventory_add_item(
|
||||
const std::string &name,
|
||||
const std::string &inventory_list_name,
|
||||
u32 query_slot,
|
||||
const ItemStack &added_item);
|
||||
|
||||
private:
|
||||
bool getDetachedInventoryCallback(
|
||||
const std::string &name, const char *callbackname);
|
||||
|
@@ -233,6 +233,63 @@ void ScriptApiNodemeta::nodemeta_inventory_OnTake(v3s16 p,
|
||||
lua_pop(L, 1); // Pop error handler
|
||||
}
|
||||
|
||||
void ScriptApiNodemeta::on_nodemeta_inventory_remove_item(
|
||||
v3s16 p,
|
||||
const std::string &inventory_list_name,
|
||||
const ItemStack &deleted_item)
|
||||
{
|
||||
SCRIPTAPI_PRECHECKHEADER
|
||||
|
||||
lua_getglobal(L, "core");
|
||||
lua_getfield(L, -1, "registered_on_nodemeta_inventory_remove_item");
|
||||
// Call callbacks
|
||||
push_v3s16(L, p); // pos
|
||||
lua_pushstring(L, inventory_list_name.c_str());// listname 2
|
||||
LuaItemStack::create(L, deleted_item); // stack 3
|
||||
runCallbacks(3, RUN_CALLBACKS_MODE_LAST);
|
||||
}
|
||||
|
||||
void ScriptApiNodemeta::on_nodemeta_inventory_change_item(
|
||||
v3s16 p,
|
||||
const std::string &inventory_list_name,
|
||||
u32 query_slot,
|
||||
const ItemStack &old_item,
|
||||
const ItemStack &new_item)
|
||||
{
|
||||
SCRIPTAPI_PRECHECKHEADER
|
||||
|
||||
// Get core.registered_on_inventory_change_item
|
||||
lua_getglobal(L, "core");
|
||||
lua_getfield(L, -1, "registered_on_nodemeta_inventory_change_item");
|
||||
// Call callbacks
|
||||
push_v3s16(L, p); // pos
|
||||
lua_pushstring(L, inventory_list_name.c_str());// listname 2
|
||||
lua_pushnumber(L, query_slot);// slot 3
|
||||
LuaItemStack::create(L, old_item); // stack 4
|
||||
LuaItemStack::create(L, new_item); // stack 5
|
||||
runCallbacks(5, RUN_CALLBACKS_MODE_LAST);
|
||||
}
|
||||
|
||||
void ScriptApiNodemeta::on_nodemeta_inventory_add_item(
|
||||
v3s16 p,
|
||||
const std::string &inventory_list_name,
|
||||
u32 query_slot,
|
||||
const ItemStack &added_item)
|
||||
{
|
||||
SCRIPTAPI_PRECHECKHEADER
|
||||
|
||||
// Get core.registered_on_inventory_add_item
|
||||
lua_getglobal(L, "core");
|
||||
lua_getfield(L, -1, "registered_on_nodemeta_inventory_add_item");
|
||||
// Call callbacks
|
||||
push_v3s16(L, p); // pos
|
||||
lua_pushstring(L, inventory_list_name.c_str());// listname 2
|
||||
lua_pushnumber(L, query_slot);
|
||||
LuaItemStack::create(L, added_item); // stack 4
|
||||
runCallbacks(4, RUN_CALLBACKS_MODE_LAST);
|
||||
}
|
||||
|
||||
|
||||
ScriptApiNodemeta::ScriptApiNodemeta()
|
||||
{
|
||||
}
|
||||
|
@@ -60,6 +60,25 @@ public:
|
||||
void nodemeta_inventory_OnTake(v3s16 p,
|
||||
const std::string &listname, int index, ItemStack &stack,
|
||||
ServerActiveObject *player);
|
||||
|
||||
void on_nodemeta_inventory_remove_item(
|
||||
v3s16 p,
|
||||
const std::string &inventory_list_name,
|
||||
const ItemStack &deleted_item);
|
||||
|
||||
void on_nodemeta_inventory_change_item(
|
||||
v3s16 p,
|
||||
const std::string &inventory_list_name,
|
||||
u32 query_slot,
|
||||
const ItemStack &old_item,
|
||||
const ItemStack &new_item);
|
||||
|
||||
void on_nodemeta_inventory_add_item(
|
||||
v3s16 p,
|
||||
const std::string &inventory_list_name,
|
||||
u32 query_slot,
|
||||
const ItemStack &added_item);
|
||||
|
||||
private:
|
||||
|
||||
};
|
||||
|
@@ -22,6 +22,8 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
#include "common/c_converter.h"
|
||||
#include "common/c_content.h"
|
||||
#include "util/string.h"
|
||||
#include "script/lua_api/l_inventory.h"// For InvRef.
|
||||
#include "script/lua_api/l_item.h" // For LuaItemStack.
|
||||
|
||||
void ScriptApiPlayer::on_newplayer(ServerActiveObject *player)
|
||||
{
|
||||
@@ -190,6 +192,70 @@ void ScriptApiPlayer::on_playerReceiveFields(ServerActiveObject *player,
|
||||
runCallbacks(3, RUN_CALLBACKS_MODE_OR_SC);
|
||||
}
|
||||
|
||||
void ScriptApiPlayer::on_player_inventory_remove_item(
|
||||
ServerActiveObject *player_sao,
|
||||
Player *player,
|
||||
const std::string &inventory_list_name,
|
||||
const ItemStack &deleted_item)
|
||||
{
|
||||
SCRIPTAPI_PRECHECKHEADER
|
||||
|
||||
lua_getglobal(L, "core");
|
||||
lua_getfield(L, -1, "registered_on_player_inventory_remove_item");
|
||||
// Call callbacks
|
||||
objectrefGetOrCreate(L, player_sao); // player 1
|
||||
InvRef::createPlayer(L, player);// InvRef from 2
|
||||
lua_pushstring(L, inventory_list_name.c_str());// listname 3
|
||||
LuaItemStack::create(L, deleted_item); // stack 4
|
||||
runCallbacks(4, RUN_CALLBACKS_MODE_LAST);
|
||||
}
|
||||
|
||||
void ScriptApiPlayer::on_player_inventory_change_item(
|
||||
ServerActiveObject *player_sao,
|
||||
Player *player,
|
||||
const std::string &inventory_list_name,
|
||||
u32 query_slot,
|
||||
const ItemStack &old_item,
|
||||
const ItemStack &new_item)
|
||||
{
|
||||
SCRIPTAPI_PRECHECKHEADER
|
||||
|
||||
// Get core.registered_on_inventory_change_item
|
||||
lua_getglobal(L, "core");
|
||||
lua_getfield(L, -1, "registered_on_player_inventory_change_item");
|
||||
// Call callbacks
|
||||
objectrefGetOrCreate(L, player_sao); // player 1
|
||||
InvRef::createPlayer(L, player);// InvRef from 2
|
||||
lua_pushstring(L, inventory_list_name.c_str());// listname 3
|
||||
lua_pushnumber(L, query_slot);// slot 4
|
||||
LuaItemStack::create(L, old_item); // stack 5
|
||||
LuaItemStack::create(L, new_item); // stack 6
|
||||
runCallbacks(6, RUN_CALLBACKS_MODE_LAST);
|
||||
}
|
||||
|
||||
void ScriptApiPlayer::on_player_inventory_add_item(
|
||||
ServerActiveObject *player_sao,
|
||||
Player *player,
|
||||
const std::string &inventory_list_name,
|
||||
u32 query_slot,
|
||||
const ItemStack &added_item)
|
||||
{
|
||||
SCRIPTAPI_PRECHECKHEADER
|
||||
|
||||
// Get core.registered_on_inventory_add_item
|
||||
lua_getglobal(L, "core");
|
||||
lua_getfield(L, -1, "registered_on_player_inventory_add_item");
|
||||
// Call callbacks
|
||||
objectrefGetOrCreate(L, player_sao); // player 1
|
||||
InvRef::createPlayer(L, player);// InvRef from 2
|
||||
lua_pushstring(L, inventory_list_name.c_str());// listname 3
|
||||
lua_pushnumber(L, query_slot);
|
||||
LuaItemStack::create(L, added_item); // stack 5
|
||||
runCallbacks(5, RUN_CALLBACKS_MODE_LAST);
|
||||
}
|
||||
|
||||
|
||||
|
||||
ScriptApiPlayer::~ScriptApiPlayer()
|
||||
{
|
||||
}
|
||||
|
@@ -23,6 +23,9 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
#include "cpp_api/s_base.h"
|
||||
#include "irr_v3d.h"
|
||||
#include "util/string.h"
|
||||
#include "inventory.h" // For InventoryList and ItemStack
|
||||
|
||||
class Player;
|
||||
|
||||
struct ToolCapabilities;
|
||||
|
||||
@@ -46,6 +49,24 @@ public:
|
||||
s16 on_player_hpchange(ServerActiveObject *player, s16 hp_change);
|
||||
void on_playerReceiveFields(ServerActiveObject *player,
|
||||
const std::string &formname, const StringMap &fields);
|
||||
void on_player_inventory_remove_item(
|
||||
ServerActiveObject *player_sao,
|
||||
Player *player,
|
||||
const std::string &inventory_list_name,
|
||||
const ItemStack &deleted_item);
|
||||
void on_player_inventory_change_item(
|
||||
ServerActiveObject *player_sao,
|
||||
Player *player,
|
||||
const std::string &inventory_list_name,
|
||||
u32 query_slot,
|
||||
const ItemStack &old_item,
|
||||
const ItemStack &new_item);
|
||||
void on_player_inventory_add_item(
|
||||
ServerActiveObject *player_sao,
|
||||
Player *player,
|
||||
const std::string &inventory_list_name,
|
||||
u32 query_slot,
|
||||
const ItemStack &added_item);
|
||||
};
|
||||
|
||||
|
||||
|
@@ -197,7 +197,7 @@ int InvRef::l_set_stack(lua_State *L)
|
||||
ItemStack newitem = read_item(L, 4, getServer(L));
|
||||
InventoryList *list = getlist(L, ref, listname);
|
||||
if(list != NULL && i >= 0 && i < (int) list->getSize()){
|
||||
list->changeItem(i, newitem);
|
||||
list->changeItem(getServer(L)->getScriptIface(), i, newitem);
|
||||
reportInventoryChange(L, ref);
|
||||
lua_pushboolean(L, true);
|
||||
} else {
|
||||
@@ -298,7 +298,7 @@ int InvRef::l_add_item(lua_State *L)
|
||||
ItemStack item = read_item(L, 3, getServer(L));
|
||||
InventoryList *list = getlist(L, ref, listname);
|
||||
if(list){
|
||||
ItemStack leftover = list->addItem(item);
|
||||
ItemStack leftover = list->addItem(getServer(L)->getScriptIface(), item);
|
||||
if(leftover.count != item.count)
|
||||
reportInventoryChange(L, ref);
|
||||
LuaItemStack::create(L, leftover);
|
||||
@@ -352,7 +352,7 @@ int InvRef::l_remove_item(lua_State *L)
|
||||
ItemStack item = read_item(L, 3, getServer(L));
|
||||
InventoryList *list = getlist(L, ref, listname);
|
||||
if(list){
|
||||
ItemStack removed = list->removeItem(item);
|
||||
ItemStack removed = list->removeItem(getServer(L)->getScriptIface(), item);
|
||||
if(!removed.empty())
|
||||
reportInventoryChange(L, ref);
|
||||
LuaItemStack::create(L, removed);
|
||||
|
@@ -44,7 +44,7 @@ NodeMetadata* NodeMetaRef::getmeta(NodeMetaRef *ref, bool auto_create)
|
||||
{
|
||||
NodeMetadata *meta = ref->m_env->getMap().getNodeMetadata(ref->m_p);
|
||||
if(meta == NULL && auto_create) {
|
||||
meta = new NodeMetadata(ref->m_env->getGameDef()->idef());
|
||||
meta = new NodeMetadata(ref->m_env->getGameDef()->idef(), ref->m_p);
|
||||
if(!ref->m_env->getMap().setNodeMetadata(ref->m_p, meta)) {
|
||||
delete meta;
|
||||
return NULL;
|
||||
|
Reference in New Issue
Block a user