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

📄 itemmanager.cpp

📁 墨香最新私服
💻 CPP
字号:
// ItemManager.cpp: implementation of the CItemManager class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "ItemManager.h"
#include "ItemSlot.h"
#include "Player.h"
#include "Purse.h"
#include "ItemContainer.h"
#include "MHFile.h"
#include "MapDBMsgParser.h"
#include "UserTable.h"
#include "KyunggongManager.h"
#include "MugongManager.h"
#include "CharacterCalcManager.h"
#include "MunpaManager.h"
#include "GuildManager.h"
#include "AbilityManager.h"
#include "CheckRoutine.h"
#include "MHError.h"
#include "PartyManager.h"
#include "LootingManager.h"
#include "QuestManager.h"
#include "BattleSystem_Server.h"
#include "..\[CC]Header\GameResourceStruct.h"
#include "ObjectStateManager.h"
#include "MHMap.h"
#include "ReinforceManager.h"
#include "DissolutionManager.h"
#include "ChangeItemMgr.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CItemManager::CItemManager()
{
	m_ItemInfoList.Initialize(MAX_ITEM_NUM);
	m_MixItemInfoList.Initialize(MAX_ITEM_NUM);
	m_ReinforceItemInfoList.Initialize(20);
	m_ItemArrayPool.Init(500, 100, "ItemArrayPool" );
	m_ArrayIndexCreator.Init(MAX_ITEM_NUM, 1);
	m_DealerTable.Initialize(32);
	m_Key = 0;
}

CItemManager::~CItemManager()
{
	ITEM_INFO * pInfo = NULL;
	m_ItemInfoList.SetPositionHead();
	while(pInfo = m_ItemInfoList.GetData())
		delete pInfo;
	m_ItemInfoList.RemoveAll();

	DealerData* pDealer = NULL;
	m_DealerTable.SetPositionHead();
	while(pDealer = m_DealerTable.GetData())
	{
		if(pDealer)
		{
			pDealer->m_DealItemList.DeleteAll();
			delete pDealer;
			pDealer = NULL;
		}
	}
	m_DealerTable.RemoveAll();
	
	ITEM_MIX_INFO * pItemInfo = NULL;
	m_MixItemInfoList.SetPositionHead();
	while(pItemInfo = m_MixItemInfoList.GetData())
	{
		if(pItemInfo->psResultItemInfo)
		{
			for(int i = 0 ; i < pItemInfo->wResultItemNum ; ++i)
			{
				if(pItemInfo->psResultItemInfo[i].wResItemIdx != 0)
				{
					if(pItemInfo->psResultItemInfo[i].psMaterialItemInfo)
					{
						delete [] pItemInfo->psResultItemInfo[i].psMaterialItemInfo;
						pItemInfo->psResultItemInfo[i].psMaterialItemInfo = NULL;
					}
				}
			}
			delete [] pItemInfo->psResultItemInfo;
			pItemInfo->psResultItemInfo = NULL;
		}
		delete pItemInfo;
		pItemInfo = NULL;
	}
	m_MixItemInfoList.RemoveAll();

/* reinforce change
	ITEM_REINFORCE_INFO * pInfo3 = NULL;
	m_ReinforceItemInfoList.SetPositionHead();
	while(pInfo3 = m_ReinforceItemInfoList.GetData())
		delete pInfo3;
	m_ReinforceItemInfoList.RemoveAll();
*/


	m_ItemArrayPool.Release();
	m_ArrayIndexCreator.Release();
}
ITEMOBTAINARRAYINFO *	CItemManager::Alloc(CPlayer * pPlayer, BYTE c, BYTE p, DWORD dwObjectID, DWORD dwFurnisherIdx, WORD wType, WORD ObtainNum, DBResult CallBackFunc)
{
	//return m_ItemArrayPool.Alloc();
	ITEMOBTAINARRAYINFO * pArrayInfo = m_ItemArrayPool.Alloc();
	pArrayInfo->ItemArray.Init( c, p, dwObjectID );
	pArrayInfo->ItemArray.wObtainCount = ObtainNum;
	pArrayInfo->wObtainArrayID = m_ArrayIndexCreator.GenerateIndex();
	pArrayInfo->CallBack = CallBackFunc;
	pArrayInfo->dwFurnisherIdx = dwFurnisherIdx;
	pArrayInfo->wType = wType;
	pPlayer->AddArray(pArrayInfo);
	return pArrayInfo;
}
void CItemManager::Free(CPlayer * pPlayer, ITEMOBTAINARRAYINFO * info)
{
	info->ItemArray.Clear();
	pPlayer->RemoveArray(info->wObtainArrayID);
	m_ArrayIndexCreator.ReleaseIndex(info->wObtainArrayID);
}
BOOL CItemManager::IsOptionItem( WORD wItemIdx, WORD wDurability )
{
	if(wDurability != 0 && !IsDupItem(wItemIdx))
		return TRUE;
	return FALSE;
}
BOOL CItemManager::IsDupItem( WORD wItemIdx )
{
	switch( GetItemKind( wItemIdx ) )
	{
	case eYOUNGYAK_ITEM:
	case eEXTRA_ITEM_JEWEL:
	case eEXTRA_ITEM_MATERIAL:
	case eEXTRA_ITEM_METAL:
	case eEXTRA_ITEM_BOOK:
	case eEXTRA_ITEM_HERB:
	case eEXTRA_ITEM_ETC:
		return TRUE;
	}
	return FALSE;
}

void CItemManager::SendErrorMsg( CPlayer * pPlayer, MSG_ITEM_ERROR * msg, int msgSize, int ECode )
{
	msg->ECode = ECode;
	pPlayer->SendMsg(msg, msgSize);
}
void CItemManager::SendAckMsg( CPlayer * pPlayer, MSGBASE * msg, int msgSize)
{
	pPlayer->SendMsg(msg, msgSize);
}

void CItemManager::SendGuildErrorMsg( CPlayer * pPlayer, BYTE Protocol, int ECode )
{
	MSG_ITEM_ERROR msg;
	msg.Category = MP_ITEM;
	msg.Protocol = Protocol;
	msg.dwObjectID = pPlayer->GetID();
	msg.ECode = ECode;
	pPlayer->SendMsg(&msg, sizeof(msg));
}

int CItemManager::MoveItem( CPlayer * pPlayer, WORD FromItemIdx, POSTYPE FromPos, WORD ToItemIdx, POSTYPE& ToPos)
{
//	CItemSlot * pFromSlotD	= pPlayer->GetSlot(FromPos);
//	MHERROR->OutputFile("itemtable.txt", pFromSlotD->_ToStringSlot());

	if( LOOTINGMGR->IsLootedPlayer( pPlayer->GetID() ) )
	{
		return 10;
	}

	if(FromPos == ToPos)
		return 1;

	if(!CHKRT->ItemOf(pPlayer, FromPos, FromItemIdx,0,0,CB_EXIST|CB_ICONIDX))
		return 2;

	if(!CHKRT->ItemOf(pPlayer, ToPos, ToItemIdx,0,0,CB_ICONIDX))
		return 3;

	CItemSlot * pFromSlot	= pPlayer->GetSlot(FromPos);
	CItemSlot * pToSlot		= pPlayer->GetSlot(ToPos);

	const ITEMBASE * pItem = pFromSlot->GetItemInfoAbs(FromPos);
	if(!CanbeMoved(pItem->wIconIdx,ToPos,pPlayer))
	{
		ASSERT(0); //A

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -