summaryrefslogtreecommitdiffstats
path: root/source/Inventory.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/Inventory.cpp')
-rw-r--r--source/Inventory.cpp682
1 files changed, 0 insertions, 682 deletions
diff --git a/source/Inventory.cpp b/source/Inventory.cpp
deleted file mode 100644
index 90b998358..000000000
--- a/source/Inventory.cpp
+++ /dev/null
@@ -1,682 +0,0 @@
-
-#include "Globals.h" // NOTE: MSVC stupidness requires this to be the same across all modules
-
-#include "Inventory.h"
-#include "Entities/Player.h"
-#include "ClientHandle.h"
-#include "UI/Window.h"
-#include "Item.h"
-#include "Root.h"
-#include "World.h"
-
-#include <json/json.h>
-
-#include "Items/ItemHandler.h"
-
-
-
-
-
-cInventory::cInventory(cPlayer & a_Owner) :
- m_ArmorSlots (1, 4), // 1 x 4 slots
- m_InventorySlots(9, 3), // 9 x 3 slots
- m_HotbarSlots (9, 1), // 9 x 1 slots
- m_Owner(a_Owner)
-{
- // Ask each ItemGrid to report changes to us:
- m_ArmorSlots.AddListener(*this);
- m_InventorySlots.AddListener(*this);
- m_HotbarSlots.AddListener(*this);
-
- SetEquippedSlotNum(0);
-}
-
-
-
-
-
-void cInventory::Clear(void)
-{
- m_ArmorSlots.Clear();
- m_InventorySlots.Clear();
- m_HotbarSlots.Clear();
-}
-
-
-
-
-
-int cInventory::HowManyCanFit(const cItem & a_ItemStack, bool a_ConsiderEmptySlots)
-{
- return HowManyCanFit(a_ItemStack, 0, invNumSlots - 1, a_ConsiderEmptySlots);
-}
-
-
-
-
-
-int cInventory::HowManyCanFit(const cItem & a_ItemStack, int a_BeginSlotNum, int a_EndSlotNum, bool a_ConsiderEmptySlots)
-{
- if ((a_BeginSlotNum < 0) || (a_BeginSlotNum >= invNumSlots))
- {
- LOGWARNING("%s: Bad BeginSlotNum, got %d, there are %d slots; correcting to 0.", __FUNCTION__, a_BeginSlotNum, invNumSlots - 1);
- a_BeginSlotNum = 0;
- }
- if ((a_EndSlotNum < 0) || (a_EndSlotNum >= invNumSlots))
- {
- LOGWARNING("%s: Bad EndSlotNum, got %d, there are %d slots; correcting to %d.", __FUNCTION__, a_BeginSlotNum, invNumSlots, invNumSlots - 1);
- a_EndSlotNum = invNumSlots - 1;
- }
- if (a_BeginSlotNum > a_EndSlotNum)
- {
- std::swap(a_BeginSlotNum, a_EndSlotNum);
- }
-
- char NumLeft = a_ItemStack.m_ItemCount;
- int MaxStack = ItemHandler(a_ItemStack.m_ItemType)->GetMaxStackSize();
- for (int i = a_BeginSlotNum; i <= a_EndSlotNum; i++)
- {
- const cItem & Slot = GetSlot(i);
- if (Slot.IsEmpty())
- {
- NumLeft -= MaxStack;
- }
- else if (Slot.IsStackableWith(a_ItemStack))
- {
- NumLeft -= MaxStack - Slot.m_ItemCount;
- }
- if (NumLeft <= 0)
- {
- // All items fit
- return a_ItemStack.m_ItemCount;
- }
- } // for i - m_Slots[]
- return a_ItemStack.m_ItemCount - NumLeft;
-}
-
-
-
-
-
-int cInventory::AddItem(const cItem & a_Item, bool a_AllowNewStacks, bool a_tryToFillEquippedFirst)
-{
- cItem ToAdd(a_Item);
- int res = 0;
- if (ItemCategory::IsArmor(a_Item.m_ItemType))
- {
- res = m_ArmorSlots.AddItem(ToAdd, a_AllowNewStacks);
- ToAdd.m_ItemCount -= res;
- if (ToAdd.m_ItemCount == 0)
- {
- return res;
- }
- }
-
- res += m_HotbarSlots.AddItem(ToAdd, a_AllowNewStacks, a_tryToFillEquippedFirst ? m_EquippedSlotNum : -1);
- ToAdd.m_ItemCount = a_Item.m_ItemCount - res;
- if (ToAdd.m_ItemCount == 0)
- {
- return res;
- }
-
- res += m_InventorySlots.AddItem(ToAdd, a_AllowNewStacks);
- return res;
-}
-
-
-
-
-
-int cInventory::AddItems(cItems & a_ItemStackList, bool a_AllowNewStacks, bool a_tryToFillEquippedFirst)
-{
- int TotalAdded = 0;
- for (cItems::iterator itr = a_ItemStackList.begin(); itr != a_ItemStackList.end();)
- {
- int NumAdded = AddItem(*itr, a_AllowNewStacks, a_tryToFillEquippedFirst);
- if (itr->m_ItemCount == NumAdded)
- {
- itr = a_ItemStackList.erase(itr);
- }
- else
- {
- itr->m_ItemCount -= NumAdded;
- ++itr;
- }
- TotalAdded += NumAdded;
- }
- return TotalAdded;
-}
-
-
-
-
-
-bool cInventory::RemoveOneEquippedItem(void)
-{
- if (m_HotbarSlots.GetSlot(m_EquippedSlotNum).IsEmpty())
- {
- return false;
- }
-
- m_HotbarSlots.ChangeSlotCount(m_EquippedSlotNum, -1);
- return true;
-}
-
-
-
-
-
-int cInventory::HowManyItems(const cItem & a_Item)
-{
- return
- m_ArmorSlots.HowManyItems(a_Item) +
- m_InventorySlots.HowManyItems(a_Item) +
- m_HotbarSlots.HowManyItems(a_Item);
-}
-
-
-
-
-
-bool cInventory::HasItems(const cItem & a_ItemStack)
-{
- int CurrentlyHave = HowManyItems(a_ItemStack);
- return (CurrentlyHave >= a_ItemStack.m_ItemCount);
-}
-
-
-
-
-
-void cInventory::SetSlot(int a_SlotNum, const cItem & a_Item)
-{
- if ((a_SlotNum < 0) || (a_SlotNum >= invNumSlots))
- {
- LOGWARNING("%s: requesting an invalid slot index: %d out of %d. Ignoring.", __FUNCTION__, a_SlotNum, invNumSlots - 1);
- return;
- }
-
- int GridSlotNum = 0;
- cItemGrid * Grid = GetGridForSlotNum(a_SlotNum, GridSlotNum);
- if (Grid == NULL)
- {
- LOGWARNING("%s(%d): requesting an invalid itemgrid. Ignoring.", __FUNCTION__, a_SlotNum);
- return;
- }
- Grid->SetSlot(GridSlotNum, a_Item);
-}
-
-
-
-
-
-void cInventory::SetArmorSlot(int a_ArmorSlotNum, const cItem & a_Item)
-{
- m_ArmorSlots.SetSlot(a_ArmorSlotNum, a_Item);
-}
-
-
-
-
-
-void cInventory::SetInventorySlot(int a_InventorySlotNum, const cItem & a_Item)
-{
- m_InventorySlots.SetSlot(a_InventorySlotNum, a_Item);
-}
-
-
-
-
-
-void cInventory::SetHotbarSlot(int a_HotBarSlotNum, const cItem & a_Item)
-{
- m_HotbarSlots.SetSlot(a_HotBarSlotNum, a_Item);
-}
-
-
-
-
-
-const cItem & cInventory::GetSlot(int a_SlotNum) const
-{
- if ((a_SlotNum < 0) || (a_SlotNum >= invNumSlots))
- {
- LOGWARNING("%s: requesting an invalid slot index: %d out of %d. Returning the first inventory slot instead.", __FUNCTION__, a_SlotNum, invNumSlots - 1);
- return m_InventorySlots.GetSlot(0);
- }
- int GridSlotNum = 0;
- const cItemGrid * Grid = GetGridForSlotNum(a_SlotNum, GridSlotNum);
- if (Grid == NULL)
- {
- // Something went wrong, but we don't know what. We must return a value, so return the first inventory slot
- LOGWARNING("%s(%d): requesting an invalid ItemGrid, returning the first inventory slot instead.", __FUNCTION__, a_SlotNum);
- return m_InventorySlots.GetSlot(0);
- }
- return Grid->GetSlot(GridSlotNum);
-}
-
-
-
-
-
-const cItem & cInventory::GetArmorSlot(int a_ArmorSlotNum) const
-{
- if ((a_ArmorSlotNum < 0) || (a_ArmorSlotNum >= invArmorCount))
- {
- LOGWARNING("%s: requesting an invalid slot index: %d out of %d. Returning the first one instead", __FUNCTION__, a_ArmorSlotNum, invArmorCount - 1);
- return m_ArmorSlots.GetSlot(0);
- }
- return m_ArmorSlots.GetSlot(a_ArmorSlotNum);
-}
-
-
-
-
-
-const cItem & cInventory::GetInventorySlot(int a_InventorySlotNum) const
-{
- if ((a_InventorySlotNum < 0) || (a_InventorySlotNum >= invInventoryCount))
- {
- LOGWARNING("%s: requesting an invalid slot index: %d out of %d. Returning the first one instead", __FUNCTION__, a_InventorySlotNum, invInventoryCount - 1);
- return m_InventorySlots.GetSlot(0);
- }
- return m_InventorySlots.GetSlot(a_InventorySlotNum);
-}
-
-
-
-
-
-const cItem & cInventory::GetHotbarSlot(int a_SlotNum) const
-{
- if ((a_SlotNum < 0) || (a_SlotNum >= invHotbarCount))
- {
- LOGWARNING("%s: requesting an invalid slot index: %d out of %d. Returning the first one instead", __FUNCTION__, a_SlotNum, invHotbarCount - 1);
- return m_HotbarSlots.GetSlot(0);
- }
- return m_HotbarSlots.GetSlot(a_SlotNum);
-}
-
-
-
-
-
-const cItem & cInventory::GetEquippedItem(void) const
-{
- return GetHotbarSlot(m_EquippedSlotNum);
-}
-
-
-
-
-
-void cInventory::SetEquippedSlotNum(int a_SlotNum)
-{
- if ((a_SlotNum < 0) || (a_SlotNum >= invHotbarCount))
- {
- LOGWARNING("%s: requesting invalid slot index: %d out of %d. Setting 0 instead.", __FUNCTION__, a_SlotNum, invHotbarCount - 1);
- m_EquippedSlotNum = 0;
- }
- else
- {
- m_EquippedSlotNum = a_SlotNum;
- }
-}
-
-
-
-
-
-bool cInventory::DamageEquippedItem(short a_Amount)
-{
- return DamageItem(invHotbarOffset + m_EquippedSlotNum, a_Amount);
-}
-
-
-
-
-
-int cInventory::ChangeSlotCount(int a_SlotNum, int a_AddToCount)
-{
- int GridSlotNum = 0;
- cItemGrid * Grid = GetGridForSlotNum(a_SlotNum, GridSlotNum);
- if (Grid == NULL)
- {
- LOGWARNING("%s: invalid slot number, expected 0 .. %d, got %d; ignoring", __FUNCTION__, invNumSlots, a_SlotNum);
- return -1;
- }
- return Grid->ChangeSlotCount(GridSlotNum, a_AddToCount);
-}
-
-
-
-
-
-bool cInventory::DamageItem(int a_SlotNum, short a_Amount)
-{
- if ((a_SlotNum < 0) || (a_SlotNum >= invNumSlots))
- {
- LOGWARNING("%s: requesting an invalid slot index: %d out of %d", __FUNCTION__, a_SlotNum, invNumSlots - 1);
- return false;
- }
-
- int GridSlotNum = 0;
- cItemGrid * Grid = GetGridForSlotNum(a_SlotNum, GridSlotNum);
- if (Grid == NULL)
- {
- LOGWARNING("%s(%d, %d): requesting an invalid grid, ignoring.", __FUNCTION__, a_SlotNum, a_Amount);
- return false;
- }
- if (!Grid->DamageItem(GridSlotNum, a_Amount))
- {
- // The item has been damaged, but did not break yet
- return false;
- }
-
- // The item has broken, remove it:
- Grid->EmptySlot(GridSlotNum);
- return true;
-}
-
-
-
-
-
-void cInventory::CopyToItems(cItems & a_Items)
-{
- m_ArmorSlots.CopyToItems(a_Items);
- m_InventorySlots.CopyToItems(a_Items);
- m_HotbarSlots.CopyToItems(a_Items);
-}
-
-
-
-
-
-void cInventory::SendSlot(int a_SlotNum)
-{
- cItem Item(GetSlot(a_SlotNum));
- if (Item.IsEmpty())
- {
- // Sanitize items that are not completely empty (ie. count == 0, but type != empty)
- Item.Empty();
- }
- m_Owner.GetClientHandle()->SendInventorySlot(0, a_SlotNum + 5, Item); // Slots in the client are numbered "+ 5" because of crafting grid and result
-}
-
-
-
-
-
-/*
-int cInventory::MoveItem(short a_ItemType, short a_ItemDamage, int a_Count, int a_BeginSlot, int a_EndSlot)
-{
- int res = 0;
- for (int i = a_BeginSlot; i <= a_EndSlot; i++)
- {
- if (
- m_Slots[i].IsEmpty() ||
- ((m_Slots[i].m_ItemType == a_ItemType) && (m_Slots[i].m_ItemDamage == a_ItemDamage))
- )
- {
- int MaxCount = ItemHandler(a_ItemType)->GetMaxStackSize();
- ASSERT(m_Slots[i].m_ItemCount <= MaxCount);
- int NumToMove = std::min(a_Count, MaxCount - m_Slots[i].m_ItemCount);
- m_Slots[i].m_ItemCount += NumToMove;
- m_Slots[i].m_ItemDamage = a_ItemDamage;
- m_Slots[i].m_ItemType = a_ItemType;
- SendSlot(i);
- res += NumToMove;
- a_Count -= NumToMove;
- if (a_Count <= 0)
- {
- // No more items to distribute
- return res;
- }
- }
- } // for i - m_Slots[]
- // No more space to distribute to
- return res;
-}
-*/
-
-
-
-
-
-int cInventory::ArmorSlotNumToEntityEquipmentID(short a_ArmorSlotNum)
-{
- switch (a_ArmorSlotNum)
- {
- case 0: return 4; // Helmet
- case 1: return 3; // Chestplate
- case 2: return 2; // Leggings
- case 3: return 1; // Boots
- }
- LOGWARN("%s: invalid armor slot number: %d", __FUNCTION__, a_ArmorSlotNum);
- return 0;
-}
-
-
-
-
-
-#if 0
-bool cInventory::AddToBar( cItem & a_Item, const int a_Offset, const int a_Size, bool* a_bChangedSlots, int a_Mode /* = 0 */ )
-{
- // Fill already present stacks
- if( a_Mode < 2 )
- {
- int MaxStackSize = cItemHandler::GetItemHandler(a_Item.m_ItemType)->GetMaxStackSize();
- for(int i = 0; i < a_Size; i++)
- {
- if( m_Slots[i + a_Offset].m_ItemType == a_Item.m_ItemType && m_Slots[i + a_Offset].m_ItemCount < MaxStackSize && m_Slots[i + a_Offset].m_ItemDamage == a_Item.m_ItemDamage )
- {
- int NumFree = MaxStackSize - m_Slots[i + a_Offset].m_ItemCount;
- if( NumFree >= a_Item.m_ItemCount )
- {
-
- //printf("1. Adding %i items ( free: %i )\n", a_Item.m_ItemCount, NumFree );
- m_Slots[i + a_Offset].m_ItemCount += a_Item.m_ItemCount;
- a_Item.m_ItemCount = 0;
- a_bChangedSlots[i + a_Offset] = true;
- break;
- }
- else
- {
- //printf("2. Adding %i items\n", NumFree );
- m_Slots[i + a_Offset].m_ItemCount += (char)NumFree;
- a_Item.m_ItemCount -= (char)NumFree;
- a_bChangedSlots[i + a_Offset] = true;
- }
- }
- }
- }
-
- if( a_Mode > 0 )
- {
- // If we got more left, find first empty slot
- for(int i = 0; i < a_Size && a_Item.m_ItemCount > 0; i++)
- {
- if( m_Slots[i + a_Offset].m_ItemType == -1 )
- {
- m_Slots[i + a_Offset] = a_Item;
- a_Item.m_ItemCount = 0;
- a_bChangedSlots[i + a_Offset] = true;
- }
- }
- }
-
- return true;
-}
-#endif
-
-
-
-
-
-void cInventory::SaveToJson(Json::Value & a_Value)
-{
- // The JSON originally included the 4 crafting slots and the result, so we have to put empty items there, too:
- cItem EmptyItem;
- Json::Value EmptyItemJson;
- EmptyItem.GetJson(EmptyItemJson);
- for (int i = 0; i < 5; i++)
- {
- a_Value.append(EmptyItemJson);
- }
-
- // The 4 armor slots follow:
- for (int i = 0; i < invArmorCount; i++)
- {
- Json::Value JSON_Item;
- m_ArmorSlots.GetSlot(i).GetJson(JSON_Item);
- a_Value.append(JSON_Item);
- }
-
- // Next comes the main inventory:
- for (int i = 0; i < invInventoryCount; i++)
- {
- Json::Value JSON_Item;
- m_InventorySlots.GetSlot(i).GetJson(JSON_Item);
- a_Value.append(JSON_Item);
- }
-
- // The hotbar is the last:
- for (int i = 0; i < invHotbarCount; i++)
- {
- Json::Value JSON_Item;
- m_HotbarSlots.GetSlot(i).GetJson(JSON_Item);
- a_Value.append(JSON_Item);
- }
-}
-
-
-
-
-
-bool cInventory::LoadFromJson(Json::Value & a_Value)
-{
- int SlotIdx = 0;
-
- for (Json::Value::iterator itr = a_Value.begin(); itr != a_Value.end(); ++itr, SlotIdx++)
- {
- cItem Item;
- Item.FromJson(*itr);
-
- // The JSON originally included the 4 crafting slots and the result slot, so we need to skip the first 5 items:
- if (SlotIdx < 5)
- {
- continue;
- }
-
- // If we loaded all the slots, stop now, even if the JSON has more:
- if (SlotIdx - 5 >= invNumSlots)
- {
- break;
- }
-
- int GridSlotNum = 0;
- cItemGrid * Grid = GetGridForSlotNum(SlotIdx - 5, GridSlotNum);
- ASSERT(Grid != NULL);
- Grid->SetSlot(GridSlotNum, Item);
- } // for itr - a_Value[]
- return true;
-}
-
-
-
-
-
-const cItemGrid * cInventory::GetGridForSlotNum(int a_SlotNum, int & a_GridSlotNum) const
-{
- ASSERT(a_SlotNum >= 0);
-
- if (a_SlotNum < invArmorCount)
- {
- a_GridSlotNum = a_SlotNum;
- return &m_ArmorSlots;
- }
- a_SlotNum -= invArmorCount;
- if (a_SlotNum < invInventoryCount)
- {
- a_GridSlotNum = a_SlotNum;
- return &m_InventorySlots;
- }
- a_GridSlotNum = a_SlotNum - invInventoryCount;
- return &m_HotbarSlots;
-}
-
-
-
-
-
-cItemGrid * cInventory::GetGridForSlotNum(int a_SlotNum, int & a_GridSlotNum)
-{
- ASSERT(a_SlotNum >= 0);
-
- if (a_SlotNum < invArmorCount)
- {
- a_GridSlotNum = a_SlotNum;
- return &m_ArmorSlots;
- }
- a_SlotNum -= invArmorCount;
- if (a_SlotNum < invInventoryCount)
- {
- a_GridSlotNum = a_SlotNum;
- return &m_InventorySlots;
- }
- a_GridSlotNum = a_SlotNum - invInventoryCount;
- return &m_HotbarSlots;
-}
-
-
-
-
-
-void cInventory::OnSlotChanged(cItemGrid * a_ItemGrid, int a_SlotNum)
-{
- // Send the neccessary updates to whoever needs them
-
- if (m_Owner.IsDestroyed())
- {
- // Owner is not (yet) valid, skip for now
- return;
- }
-
- // Armor update needs broadcast to other players:
- cWorld * World = m_Owner.GetWorld();
- if ((a_ItemGrid == &m_ArmorSlots) && (World != NULL))
- {
- World->BroadcastEntityEquipment(
- m_Owner, ArmorSlotNumToEntityEquipmentID(a_SlotNum),
- m_ArmorSlots.GetSlot(a_SlotNum), m_Owner.GetClientHandle()
- );
- }
-
- // Convert the grid-local a_SlotNum to our global SlotNum:
- int Base = 0;
- if (a_ItemGrid == &m_ArmorSlots)
- {
- Base = invArmorOffset;
- }
- else if (a_ItemGrid == &m_InventorySlots)
- {
- Base = invInventoryOffset;
- }
- else if (a_ItemGrid == &m_HotbarSlots)
- {
- Base = invHotbarOffset;
- }
- else
- {
- ASSERT(!"Unknown ItemGrid calling OnSlotChanged()");
- return;
- }
-
- SendSlot(Base + a_SlotNum);
-}
-
-
-
-