X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Finventorymanager.cpp;h=6187675d47e2c22002acfb3f2e8bc6166e23c1fc;hb=46d1d70e4c37973a9d9c9b69b150731ca9f53b7d;hp=7fc8c8ce4539c3f288ae565be993421ea9d24d0d;hpb=fd7ec2da911ff6eeb62035ad4457f1e5179dbaa1;p=dragonfireclient.git diff --git a/src/inventorymanager.cpp b/src/inventorymanager.cpp index 7fc8c8ce4..6187675d4 100644 --- a/src/inventorymanager.cpp +++ b/src/inventorymanager.cpp @@ -1,6 +1,6 @@ /* -Minetest-c55 -Copyright (C) 2010-2011 celeron55, Perttu Ahola +Minetest +Copyright (C) 2010-2013 celeron55, Perttu Ahola This program is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by @@ -20,7 +20,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "inventorymanager.h" #include "log.h" #include "environment.h" -#include "scriptapi.h" +#include "cpp_api/scriptapi.h" #include "serverobject.h" #include "main.h" // for g_settings #include "settings.h" @@ -226,9 +226,8 @@ void IMoveAction::apply(InventoryManager *mgr, ServerActiveObject *player, IGame to_inv.type == InventoryLocation::DETACHED && from_inv.name == to_inv.name) { - lua_State *L = player->getEnv()->getLua(); - src_can_take_count = scriptapi_detached_inventory_allow_move( - L, from_inv.name, from_list, from_i, + src_can_take_count = PLAYER_TO_SA(player)->detached_inventory_AllowMove( + from_inv.name, from_list, from_i, to_list, to_i, try_take_count, player); dst_can_put_count = src_can_take_count; } @@ -237,20 +236,18 @@ void IMoveAction::apply(InventoryManager *mgr, ServerActiveObject *player, IGame // Destination is detached if(to_inv.type == InventoryLocation::DETACHED) { - lua_State *L = player->getEnv()->getLua(); ItemStack src_item = list_from->getItem(from_i); src_item.count = try_take_count; - dst_can_put_count = scriptapi_detached_inventory_allow_put( - L, to_inv.name, to_list, to_i, src_item, player); + dst_can_put_count = PLAYER_TO_SA(player)->detached_inventory_AllowPut( + to_inv.name, to_list, to_i, src_item, player); } // Source is detached if(from_inv.type == InventoryLocation::DETACHED) { - lua_State *L = player->getEnv()->getLua(); ItemStack src_item = list_from->getItem(from_i); src_item.count = try_take_count; - src_can_take_count = scriptapi_detached_inventory_allow_take( - L, from_inv.name, from_list, from_i, src_item, player); + src_can_take_count = PLAYER_TO_SA(player)->detached_inventory_AllowTake( + from_inv.name, from_list, from_i, src_item, player); } } @@ -262,9 +259,8 @@ void IMoveAction::apply(InventoryManager *mgr, ServerActiveObject *player, IGame to_inv.type == InventoryLocation::NODEMETA && from_inv.p == to_inv.p) { - lua_State *L = player->getEnv()->getLua(); - src_can_take_count = scriptapi_nodemeta_inventory_allow_move( - L, from_inv.p, from_list, from_i, + src_can_take_count = PLAYER_TO_SA(player)->nodemeta_inventory_AllowMove( + from_inv.p, from_list, from_i, to_list, to_i, try_take_count, player); dst_can_put_count = src_can_take_count; } @@ -273,20 +269,18 @@ void IMoveAction::apply(InventoryManager *mgr, ServerActiveObject *player, IGame // Destination is nodemeta if(to_inv.type == InventoryLocation::NODEMETA) { - lua_State *L = player->getEnv()->getLua(); ItemStack src_item = list_from->getItem(from_i); src_item.count = try_take_count; - dst_can_put_count = scriptapi_nodemeta_inventory_allow_put( - L, to_inv.p, to_list, to_i, src_item, player); + dst_can_put_count = PLAYER_TO_SA(player)->nodemeta_inventory_AllowPut( + to_inv.p, to_list, to_i, src_item, player); } // Source is nodemeta if(from_inv.type == InventoryLocation::NODEMETA) { - lua_State *L = player->getEnv()->getLua(); ItemStack src_item = list_from->getItem(from_i); src_item.count = try_take_count; - src_can_take_count = scriptapi_nodemeta_inventory_allow_take( - L, from_inv.p, from_list, from_i, src_item, player); + src_can_take_count = PLAYER_TO_SA(player)->nodemeta_inventory_AllowTake( + from_inv.p, from_list, from_i, src_item, player); } } @@ -332,6 +326,18 @@ void IMoveAction::apply(InventoryManager *mgr, ServerActiveObject *player, IGame // If source is infinite, reset it's stack if(src_can_take_count == -1){ + // If destination stack is of different type and there are leftover + // items, attempt to put the leftover items to a different place in the + // destination inventory. + // The client-side GUI will try to guess if this happens. + if(from_stack_was.name != to_stack_was.name){ + for(u32 i=0; igetSize(); i++){ + if(list_to->getItem(i).empty()){ + list_to->changeItem(i, to_stack_was); + break; + } + } + } list_from->deleteItem(from_i); list_from->addItem(from_i, from_stack_was); } @@ -339,6 +345,8 @@ void IMoveAction::apply(InventoryManager *mgr, ServerActiveObject *player, IGame if(dst_can_put_count == -1){ list_to->deleteItem(to_i); list_to->addItem(to_i, to_stack_was); + list_from->deleteItem(from_i); + list_from->addItem(from_i, from_stack_was); list_from->takeItem(from_i, count); } @@ -360,7 +368,7 @@ void IMoveAction::apply(InventoryManager *mgr, ServerActiveObject *player, IGame IRollbackReportSink *rollback = gamedef->rollback(); // If source is not infinite, record item take - if(!src_can_take_count != -1){ + if(src_can_take_count != -1){ RollbackAction action; std::string loc; { @@ -373,7 +381,7 @@ void IMoveAction::apply(InventoryManager *mgr, ServerActiveObject *player, IGame rollback->reportAction(action); } // If destination is not infinite, record item put - if(!dst_can_put_count != -1){ + if(dst_can_put_count != -1){ RollbackAction action; std::string loc; { @@ -398,9 +406,8 @@ void IMoveAction::apply(InventoryManager *mgr, ServerActiveObject *player, IGame to_inv.type == InventoryLocation::DETACHED && from_inv.name == to_inv.name) { - lua_State *L = player->getEnv()->getLua(); - scriptapi_detached_inventory_on_move( - L, from_inv.name, from_list, from_i, + PLAYER_TO_SA(player)->detached_inventory_OnMove( + from_inv.name, from_list, from_i, to_list, to_i, count, player); } else @@ -408,16 +415,14 @@ void IMoveAction::apply(InventoryManager *mgr, ServerActiveObject *player, IGame // Destination is detached if(to_inv.type == InventoryLocation::DETACHED) { - lua_State *L = player->getEnv()->getLua(); - scriptapi_detached_inventory_on_put( - L, to_inv.name, to_list, to_i, src_item, player); + PLAYER_TO_SA(player)->detached_inventory_OnPut( + to_inv.name, to_list, to_i, src_item, player); } // Source is detached if(from_inv.type == InventoryLocation::DETACHED) { - lua_State *L = player->getEnv()->getLua(); - scriptapi_detached_inventory_on_take( - L, from_inv.name, from_list, from_i, src_item, player); + PLAYER_TO_SA(player)->detached_inventory_OnTake( + from_inv.name, from_list, from_i, src_item, player); } } @@ -428,25 +433,22 @@ void IMoveAction::apply(InventoryManager *mgr, ServerActiveObject *player, IGame to_inv.type == InventoryLocation::NODEMETA && from_inv.p == to_inv.p) { - lua_State *L = player->getEnv()->getLua(); - scriptapi_nodemeta_inventory_on_move( - L, from_inv.p, from_list, from_i, + PLAYER_TO_SA(player)->nodemeta_inventory_OnMove( + from_inv.p, from_list, from_i, to_list, to_i, count, player); } else{ // Destination is nodemeta if(to_inv.type == InventoryLocation::NODEMETA) { - lua_State *L = player->getEnv()->getLua(); - scriptapi_nodemeta_inventory_on_put( - L, to_inv.p, to_list, to_i, src_item, player); + PLAYER_TO_SA(player)->nodemeta_inventory_OnPut( + to_inv.p, to_list, to_i, src_item, player); } // Source is nodemeta else if(from_inv.type == InventoryLocation::NODEMETA) { - lua_State *L = player->getEnv()->getLua(); - scriptapi_nodemeta_inventory_on_take( - L, from_inv.p, from_list, from_i, src_item, player); + PLAYER_TO_SA(player)->nodemeta_inventory_OnTake( + from_inv.p, from_list, from_i, src_item, player); } } @@ -549,21 +551,19 @@ void IDropAction::apply(InventoryManager *mgr, ServerActiveObject *player, IGame // Source is detached if(from_inv.type == InventoryLocation::DETACHED) { - lua_State *L = player->getEnv()->getLua(); ItemStack src_item = list_from->getItem(from_i); src_item.count = take_count; - src_can_take_count = scriptapi_detached_inventory_allow_take( - L, from_inv.name, from_list, from_i, src_item, player); + src_can_take_count = PLAYER_TO_SA(player)->detached_inventory_AllowTake( + from_inv.name, from_list, from_i, src_item, player); } // Source is nodemeta if(from_inv.type == InventoryLocation::NODEMETA) { - lua_State *L = player->getEnv()->getLua(); ItemStack src_item = list_from->getItem(from_i); src_item.count = take_count; - src_can_take_count = scriptapi_nodemeta_inventory_allow_take( - L, from_inv.p, from_list, from_i, src_item, player); + src_can_take_count = PLAYER_TO_SA(player)->nodemeta_inventory_AllowTake( + from_inv.p, from_list, from_i, src_item, player); } if(src_can_take_count != -1 && src_can_take_count < take_count) @@ -575,7 +575,8 @@ void IDropAction::apply(InventoryManager *mgr, ServerActiveObject *player, IGame // Drop the item ItemStack item1 = list_from->getItem(from_i); - if(scriptapi_item_on_drop(player->getEnv()->getLua(), item1, player, + item1.count = take_count; + if(PLAYER_TO_SA(player)->item_OnDrop(item1, player, player->getBasePosition() + v3f(0,1,0))) { actually_dropped_count = take_count - item1.count; @@ -612,17 +613,15 @@ void IDropAction::apply(InventoryManager *mgr, ServerActiveObject *player, IGame // Source is detached if(from_inv.type == InventoryLocation::DETACHED) { - lua_State *L = player->getEnv()->getLua(); - scriptapi_detached_inventory_on_take( - L, from_inv.name, from_list, from_i, src_item, player); + PLAYER_TO_SA(player)->detached_inventory_OnTake( + from_inv.name, from_list, from_i, src_item, player); } // Source is nodemeta if(from_inv.type == InventoryLocation::NODEMETA) { - lua_State *L = player->getEnv()->getLua(); - scriptapi_nodemeta_inventory_on_take( - L, from_inv.p, from_list, from_i, src_item, player); + PLAYER_TO_SA(player)->nodemeta_inventory_OnTake( + from_inv.p, from_list, from_i, src_item, player); } /* @@ -633,7 +632,7 @@ void IDropAction::apply(InventoryManager *mgr, ServerActiveObject *player, IGame IRollbackReportSink *rollback = gamedef->rollback(); // If source is not infinite, record item take - if(!src_can_take_count != -1){ + if(src_can_take_count != -1){ RollbackAction action; std::string loc; { @@ -768,18 +767,16 @@ bool getCraftingResult(Inventory *inv, ItemStack& result, result.clear(); - // TODO: Allow different sizes of crafting grids - // Get the InventoryList in which we will operate InventoryList *clist = inv->getList("craft"); - if(!clist || clist->getSize() != 9) + if(!clist) return false; // Mangle crafting grid to an another format CraftInput ci; ci.method = CRAFT_METHOD_NORMAL; - ci.width = 3; - for(u16 i=0; i<9; i++) + ci.width = clist->getWidth() ? clist->getWidth() : 3; + for(u16 i=0; igetSize(); i++) ci.items.push_back(clist->getItem(i)); // Find out what is crafted and add it to result item slot @@ -792,7 +789,7 @@ bool getCraftingResult(Inventory *inv, ItemStack& result, if(found && decrementInput) { // CraftInput has been changed, apply changes in clist - for(u16 i=0; i<9; i++) + for(u16 i=0; igetSize(); i++) { clist->changeItem(i, ci.items[i]); }