📄 itemmanager.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 + -