📄 inventory.cpp
字号:
////////////////////////////////////////////////////////////////////////////////// Filename : Inventory.cpp// Written By : elca@ewestsoft.com// Revised By : 辫己刮// Description : ////////////////////////////////////////////////////////////////////////////////#include "Inventory.h"#include "Assert.h"#include "ItemInfoManager.h"#include "VolumeInfo.h"#include "ParkingCenter.h"#include "ObjectRegistry.h"#include "ItemUtil.h"#include "EffectSchedule.h"#include "Zone.h"#include <hash_map>#include "Key.h"#include "Belt.h"#include "EffectVampirePortal.h"//////////////////////////////////////////////////////////////////////////////////// CONSTRUCTOR & DESTRUCTOR//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 扁夯 积己磊////////////////////////////////////////////////////////////Inventory::Inventory(CoordInven_t Width, CoordInven_t Height, bool bDeleteAll) throw(){ __BEGIN_TRY m_Owner = ""; m_Width = Width; m_Height = Height; m_TotalNum = 0; m_TotalWeight = 0; m_bDeleteAll = bDeleteAll; m_pInventorySlot = NULL; m_pInventorySlot = new InventorySlot*[m_Width]; for (int i=0; i < m_Width ; i ++) { m_pInventorySlot[i] = new InventorySlot[m_Height]; } __END_CATCH}////////////////////////////////////////////////////////////// 汗荤 积己磊////////////////////////////////////////////////////////////Inventory::Inventory(const Inventory* pInventory) throw(){ __BEGIN_TRY m_Width = pInventory->getWidth(); m_Height = pInventory->getHeight(); m_TotalNum = pInventory->getItemNum(); m_TotalWeight = pInventory->getWeight(); m_bDeleteAll = pInventory->getDeleteAllFlag(); m_pInventorySlot = NULL; m_pInventorySlot = new InventorySlot*[m_Width]; for (int i=0; i < m_Width ; i ++) { m_pInventorySlot[i] = new InventorySlot[m_Height]; } for (int x=0; x<m_Width; x++) { for (int y=0; y<m_Height; y++) { Item* pItem = pInventory->getInventorySlot(x, y).getItem(); if (pItem != NULL) m_pInventorySlot[x][y].addItem(pItem); } } __END_CATCH}////////////////////////////////////////////////////////////// 家戈磊////////////////////////////////////////////////////////////Inventory::~Inventory() throw(){ __BEGIN_TRY int i, j, k; try { if (m_pInventorySlot != NULL) { // 牢亥配府俊 粮犁窍绰 葛电 酒捞袍甸阑 昏力茄促. // 酒捞袍 农扁甫 荤侩窍搁 粱歹 弥利拳且 荐 乐阑 巴捞促. for (j = 0 ; j < m_Height ; j++) { for (i = 0 ; i < m_Width ; i++) { Item* pItem = m_pInventorySlot[i][j].getItem(); if (pItem != NULL) { // 牢亥配府 浇儿阑 NULL 肺 瘤沥茄促. deleteItem(i,j); if (m_bDeleteAll) { // 凯艰老 版快俊 ParkingCenter俊辑 坷配官捞 沥焊甫 哗辰促澜. // Zone俊辑 坷配官捞甫 昏力秦林绊, ParkingCenter俊 坷配官捞甫 昏力茄促. // 盔贰 彬阐窍霸 窍扁 困秦急 GamePlayer 郴瘤绰 Creature狼 destructor俊辑 // 秦具窍唱, 八祸 矫埃狼 窜绵阑 困秦辑 睬荐肺 咯扁辑 窍档废 茄促. // 捞芭 绝局谷, 俺 等促. if (pItem->getItemClass() == Item::ITEM_CLASS_KEY) { Key* pKey = dynamic_cast<Key*>(pItem); // 傲 埃窜窍霸 捞救俊辑 舅酒辑 粮俊辑 瘤况 林档废 窍磊. if (g_pParkingCenter->hasMotorcycleBox(pKey->getTarget())) { g_pParkingCenter->deleteMotorcycleBox(pKey->getTarget()); } } SAFE_DELETE(pItem); } // end of if (m_bDeleteAll) } // end of if (pItem != NULL) } // end of for } // end of for //Assert(m_TotalNum == 0); //Assert(m_TotalWeight == 0); // 烙矫肺 持绢敌 内靛.. 弊成 箭磊唱 焊绊 酵绢辑 - -; by sigi. 2002.5.15 if (m_TotalNum != 0) { filelog("inventoryBug.txt", "TotalNum=%d", m_TotalNum); } Assert(m_TotalNum == 0); for (k = 0; k < m_Width; k++) { if (m_pInventorySlot[k] != NULL) { SAFE_DELETE_ARRAY(m_pInventorySlot[k]); } } SAFE_DELETE_ARRAY(m_pInventorySlot); } } catch (Throwable & t) { //cerr << t.toString() << endl; } __END_CATCH} //////////////////////////////////////////////////////////////////////////////////// CHECK METHODS//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 瘤沥等 困摹俊 酒捞袍捞 乐绰啊?////////////////////////////////////////////////////////////bool Inventory::hasItem(CoordInven_t X, CoordInven_t Y) throw(){ __BEGIN_TRY if (X < m_Width && Y < m_Height) { InventorySlot& slot = getInventorySlot(X, Y); return (slot.getItem() != NULL) ? true : false; } return false; __END_CATCH}////////////////////////////////////////////////////////////// 瘤沥等 酒捞袍捞 乐绰啊?////////////////////////////////////////////////////////////bool Inventory::hasItem(ObjectID_t ObjectID) throw(){ __BEGIN_TRY CoordInven_t x, y; if (findItemOID(ObjectID, x, y) != NULL) return true; return false; __END_CATCH}////////////////////////////////////////////////////////////// 瘤沥等 酒捞袍捞 乐绰啊?////////////////////////////////////////////////////////////bool Inventory::hasItemWithItemID(ItemID_t ItemID) throw(){ __BEGIN_TRY CoordInven_t x, y; if (findItemIID(ItemID, x, y) != NULL) return true; return false; __END_CATCH}////////////////////////////////////////////////////////////// 瘤沥等 鸥百阑 鸥百栏肺 窍绰 凯艰甫 啊瘤绊 乐绰啊?////////////////////////////////////////////////////////////bool Inventory::hasKey(ItemID_t TargetItemID) throw(){ __BEGIN_TRY for (int x = 0; x < m_Width; x++) { for (int y = 0; y < m_Height; y++) { Item* pSlotItem = m_pInventorySlot[x][y].getItem(); if (pSlotItem != NULL && pSlotItem->getItemClass() == Item::ITEM_CLASS_KEY) { Key* pKey = dynamic_cast<Key*>(pSlotItem); if (pKey->getTarget() == TargetItemID) return true; } } } return false; __END_CATCH}////////////////////////////////////////////////////////////// 林绢柳 困摹俊 酒捞袍阑 歹且 荐 乐绰啊? // 捞 窃荐绰 窍唱绰 付快胶俊 嘿老 荐 乐促绊 啊沥窍绊 // 搬苞甫 府畔茄促.////////////////////////////////////////////////////////////bool Inventory::canAdding(CoordInven_t X, CoordInven_t Y, Item* pItem) throw(){ __BEGIN_TRY // get Volume's Size Width, Height VolumeWidth_t ItemWidth = pItem->getVolumeWidth(); VolumeHeight_t ItemHeight = pItem->getVolumeHeight(); int ItemCount = 0; ObjectID_t ItemObjectID; if ((X+ItemWidth > m_Width) || (Y+ItemHeight > m_Height)) return false; for (int x = X; x < X + ItemWidth ; x++) { for (int y = Y; y < Y + ItemHeight ; y++) { if (hasItem(x, y)) { Item* pTempItem = m_pInventorySlot[x][y].getItem(); ObjectID_t TempObjectID = pTempItem->getObjectID(); if (ItemCount == 0) { ItemObjectID = TempObjectID; ItemCount++; } if (ItemObjectID != TempObjectID) { ItemCount++; } } } } if (ItemCount > 1) return false; // if not false return true return true; __END_CATCH}////////////////////////////////////////////////////////////// 林绢柳 困摹俊 酒捞袍阑 嘿老 荐 乐绰啊? // 捞 窃荐绰 付快胶俊 酒捞袍阑 嘿老 荐 乐促绊 // 啊沥窍瘤 ***臼绰促.***////////////////////////////////////////////////////////////bool Inventory::canAddingEx(CoordInven_t X, CoordInven_t Y, Item* pItem) throw(){ __BEGIN_TRY VolumeWidth_t ItemWidth = pItem->getVolumeWidth(); VolumeHeight_t ItemHeight = pItem->getVolumeHeight(); list<Item*> prevItemList; if ((X+ItemWidth > m_Width) || (Y+ItemHeight > m_Height)) return false; // 牢亥配府甫 八祸窍搁辑, 弊 磊府俊 酒捞袍捞 乐促搁, // 府胶飘俊 弊 酒捞袍捞 绝绰瘤 八荤茄 饶, 府胶飘俊促 酒捞袍阑 笼绢持绰促. for (int x=X; x<X+ItemWidth; x++) { for (int y=Y; y<Y+ItemHeight; y++) { Item* pInvenItem = m_pInventorySlot[x][y].getItem(); // 弊 磊府俊 酒捞袍捞 乐促搁... if (pInvenItem != NULL) { bool bAdd = true; // 府胶飘俊 粮犁窍绰瘤 八荤 list<Item*>::iterator itr = prevItemList.begin(); for (; itr != prevItemList.end(); itr++) { if (*itr == pInvenItem) { bAdd = false; break; } } // 府胶飘俊促啊 酒捞袍阑 歹茄促. if (bAdd) prevItemList.push_back(pInvenItem); } } } // 酒捞袍阑 持栏妨绊 窍绰 镑俊 滴 啊瘤 捞惑狼 酒捞袍捞 乐促搁, // 酒捞袍阑 持阑 荐 绝促. if (prevItemList.size() > 1) return false; // 酒捞袍捞 窍唱 乐促搁 弊 酒捞袍篮 阶捞绰 酒捞袍捞绢具 窍绊, // 阶栏妨绰 酒捞袍苞 努贰胶客 鸥涝捞 鞍酒具 茄促. if (prevItemList.size() == 1) { Item::ItemClass IClass = pItem->getItemClass(); ItemType_t IType = pItem->getItemType(); Item* pInvenItem = prevItemList.front(); Item::ItemClass InvenIClass = pInvenItem->getItemClass(); ItemType_t InvenIType = pInvenItem->getItemType(); // 酒捞袍捞 辆幅啊 促弗 巴捞扼搁 寸楷洒 false村. if (IClass != InvenIClass || IType != InvenIType) return false; // 阶老 荐 乐绰 酒捞袍捞 酒聪菌促搁 寸楷洒 false村. if (!isStackable(pItem)) return false; // 肮荐甫 逞绢档 寸楷洒 false村. uint MaxStack = ItemMaxStack[IClass]; if ((pItem->getNum() + pInvenItem->getNum()) > (int)(MaxStack)) return false; } prevItemList.clear(); return true; __END_CATCH}//////////////////////////////////////////////////////////////////////////////////// ADDITION & DELETION RELATED METHODS//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 瘤沥等 困摹俊 酒捞袍阑 歹茄促.////////////////////////////////////////////////////////////bool Inventory::addItem(CoordInven_t X, CoordInven_t Y, Item* pItem) throw(){ __BEGIN_TRY __BEGIN_DEBUG if (pItem == NULL) { //cerr << "Inventory::addItem() : 酒捞袍 器牢磐啊 澄涝聪促." << endl; return false; } VolumeWidth_t ItemWidth = pItem->getVolumeWidth(); VolumeHeight_t ItemHeight = pItem->getVolumeHeight(); Weight_t ItemWeight = pItem->getWeight(); // 酒捞袍阑 歹窍扁 傈俊 犬牢阑 茄促. for (int x = X; x < X + ItemWidth ; x++) for (int y = Y; y < Y + ItemHeight ; y++) if (getInventorySlot(x, y).getItem() != NULL) return false; // Add Item to Inventory for (int x = X; x < X + ItemWidth ; x++) { for (int y = Y; y < Y + ItemHeight ; y++) { InventorySlot& slot = getInventorySlot(x, y); slot.addItem(pItem); } } // 酒捞袍 肮荐父怒 公霸甫 歹窍绊, 肮荐档 歹茄促. m_TotalWeight += (ItemWeight* pItem->getNum()); m_TotalNum += pItem->getNum(); return true; __END_DEBUG __END_CATCH}////////////////////////////////////////////////////////////// 瘤沥等 困摹俊 酒捞袍阑 歹茄促.////////////////////////////////////////////////////////////Item* Inventory::addItemEx(CoordInven_t X, CoordInven_t Y, Item* pItem) throw(Error){ __BEGIN_TRY __BEGIN_DEBUG if (!canAddingEx(X, Y, pItem)) { //cerr << "Inventory::addItemEx() : canAddingExCheck failed!!!" << endl; //cerr << toString() << endl; throw Error("Inventory::addItemEx() : 酒捞袍阑 歹且 荐 绝嚼聪促!"); } VolumeWidth_t ItemWidth = pItem->getVolumeWidth(); VolumeHeight_t ItemHeight = pItem->getVolumeHeight(); Item* pInvenItem = m_pInventorySlot[X][Y].getItem(); // 酒捞袍捞 粮犁茄促搁 阶老 荐 乐绰 酒捞袍捞扁 // 锭巩俊, 箭磊甫 刘啊矫难 霖促. if (pInvenItem != NULL) { pInvenItem->setNum(pItem->getNum()+pInvenItem->getNum()); // 器牢磐甫 昏力窍扁俊 菊辑, 公霸客 酒捞袍 箭磊甫 刘啊矫难霖促. m_TotalWeight += (pItem->getWeight()* pItem->getNum()); m_TotalNum += pItem->getNum(); // 牢亥配府 酒捞袍狼 墨款飘甫 刘啊矫淖栏聪鳖, // 歹窍扼绊 柯 酒捞袍篮 昏力秦霖促. // *** 盔贰绰 昏力甫 沁菌绰单, // 酒公贰档 捞惑秦辑, 老窜篮 弊成 出敌促. *** //SAFE_DELETE(pItem); //pItem = NULL; return pInvenItem; } for (int x=X; x<X+ItemWidth; x++) { for (int y=Y; y<Y+ItemHeight; y++) { // 酒捞袍捞 绝促搁...葛电 浇吩俊促啊 鞍篮 器牢磐甫 且寸秦 霖促. m_pInventorySlot[x][y].addItem(pItem); } } m_TotalWeight += (pItem->getWeight()* pItem->getNum()); m_TotalNum += pItem->getNum(); return pItem; __END_DEBUG __END_CATCH}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -