⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 inventory.cpp

📁 天之炼狱1服务器端源文件游戏服务端不完整
💻 CPP
📖 第 1 页 / 共 3 页
字号:
////////////////////////////////////////////////////////////////////////////////// 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 + -