1
0
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:
Foghrye4
2016-04-18 21:33:28 +03:00
parent d82c5da0dc
commit b5dca28ca3
28 changed files with 509 additions and 125 deletions

View File

@@ -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++;
}
}

View File

@@ -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

View File

@@ -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);

View File

@@ -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()
{
}

View File

@@ -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:
};

View File

@@ -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()
{
}

View File

@@ -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);
};

View File

@@ -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);

View File

@@ -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;