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

📄 dissolutionmanager.cpp

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

#include "stdafx.h"
#include "DissolutionManager.h"
#include "MHFile.h"
#include "../[CC]Header/GameResourceStruct.h"
#include "ItemManager.h"
#include "Player.h"
#include "MapDBMsgParser.h"
#include "CheckRoutine.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CDissolutionManager::CDissolutionManager()
{
	m_DissolutionInfoList.Initialize( 1000 );	//醚 4500俺沥档 等促. 041021
	m_nTotalUnitOutNum = 0;
	ZeroMemory( m_DissolutionItemArray, sizeof(m_DissolutionItemArray) );
}

CDissolutionManager::~CDissolutionManager()
{
	Release();
}

BOOL CDissolutionManager::Init()
{
	if( !LoadDissolutionInfo() ) 
	{
		ASSERTMSG( 0, "LoadDissolutionInfo()" );
		return FALSE;
	}
	
	return TRUE;
}

void CDissolutionManager::Release()
{
	sITEM_DISSOLUTION_INFO* pInfo = NULL;
	m_DissolutionInfoList.SetPositionHead();
	while( pInfo = m_DissolutionInfoList.GetData() )
	{
		delete[] pInfo->pUnitItem;
		delete pInfo;
	}

	m_DissolutionInfoList.RemoveAll();	
}

BOOL CDissolutionManager::LoadDissolutionInfo()
{
	CMHFile file;

#ifdef _FILE_BIN_
	if( !file.Init( "./Resource/itembreak.bin", "rb" ) )
		return FALSE;
#else
	if( !file.Init( "./Resource/itembreak.txt", "rt" ) )
		return FALSE;
#endif

	if( m_DissolutionInfoList.GetDataNum() > 0 )
		Release();

	while(1)
	{
		if( file.IsEOF() )
			break;

		WORD wTempDissolutionItemIdx	= file.GetWord();
		WORD wTempUnitKindNum			= file.GetWord();
		WORD wTempUnitTotalNum			= file.GetWord();

		if( wTempDissolutionItemIdx != 0 && wTempUnitKindNum != 0 && wTempUnitTotalNum != 0
			&& m_DissolutionInfoList.GetData( wTempDissolutionItemIdx ) == NULL )
		{
			sITEM_DISSOLUTION_INFO* pInfo = new sITEM_DISSOLUTION_INFO;
			pInfo->wDissolutionItemIdx	= wTempDissolutionItemIdx;
			pInfo->wUnitKindNum			= wTempUnitKindNum;
			pInfo->wUnitTotalNum		= wTempUnitTotalNum;
			pInfo->pUnitItem			= new sITEM_DISSOLUTIONITEM[wTempUnitKindNum];

			WORD wTempTotalNum = 0;
			for( int i = 0 ; i < wTempUnitKindNum ; ++i )
			{
				WORD wTempUnitItemIdx = file.GetWord();
				WORD wTempUnitItemNum = file.GetWord();


				if( wTempUnitItemIdx != 0 && wTempUnitItemNum != 0 )
				{
					pInfo->pUnitItem[i].wUnitItemIdx	= wTempUnitItemIdx;
					pInfo->pUnitItem[i].wUnitItemNum	= wTempUnitItemNum;
					wTempTotalNum += wTempUnitItemNum;
				}
				else
				{
					file.Release();
					return FALSE;
				}
			}

			if( wTempTotalNum != pInfo->wUnitTotalNum || wTempTotalNum > 300 )	//3俺徘 葛滴绰 300捞促.
			{
				file.Release();
				return FALSE;
			}

			m_DissolutionInfoList.Add( pInfo, pInfo->wDissolutionItemIdx );
		}
		else
		{
			if( file.IsEOF())
				break;
			file.Release();
			return FALSE;
		}
	}

	file.Release();
	return TRUE;	
}

BOOL CDissolutionManager::CanDissolutionItem( WORD wItemIdx )
{
//府胶飘俊 乐绰瘤 犬牢
	sITEM_DISSOLUTION_INFO* pInfo = m_DissolutionInfoList.GetData( wItemIdx );
	if( pInfo )
	if( ITEMMGR->GetItemInfo( wItemIdx )->LimitLevel != 1 )
		return TRUE;

	return FALSE;
}

sITEM_DISSOLUTIONITEM* CDissolutionManager::GetDissolutionUnitItemInfo( WORD wDissolutionItemIdx, WORD* pwSize )
{
	sITEM_DISSOLUTION_INFO* pInfo = m_DissolutionInfoList.GetData( wDissolutionItemIdx );
	if( pInfo == NULL )
	{
		if( pwSize ) *pwSize = 0;
		return NULL;
	}

	if( pwSize ) *pwSize = pInfo->wUnitKindNum;

	return m_DissolutionInfoList.GetData(wDissolutionItemIdx)->pUnitItem;
}


int CDissolutionManager::ItemDissollution( CPlayer* pPlayer, ITEMBASE* pDissolutionItemInfo )
{
	if( !pPlayer )				return -100;
	if( !pDissolutionItemInfo ) return -101;

//--漂扁 荐访 咯何 眉农
	if(!CHKRT->AbilityOf(pPlayer, eAUKJOB_Dissolve))
		return -102;

//---盒秦且 酒捞袍捞 角力 乐绰啊?
	const ITEMBASE* pInventoryItemInfo = ITEMMGR->GetItemInfoAbsIn( pPlayer, pDissolutionItemInfo->Position );
	if( !pInventoryItemInfo ) return -103;
	
	if( pDissolutionItemInfo->dwDBIdx != pInventoryItemInfo->dwDBIdx ||
		pDissolutionItemInfo->wIconIdx != pInventoryItemInfo->wIconIdx ||
		pDissolutionItemInfo->Position != pInventoryItemInfo->Position ||
		pDissolutionItemInfo->Durability != pInventoryItemInfo->Durability ||
		pDissolutionItemInfo->QuickPosition != pInventoryItemInfo->QuickPosition )
		return -104;

//---碍拳 酒捞袍牢啊?
	if( ITEMMGR->IsOptionItem( pDissolutionItemInfo->wIconIdx, pDissolutionItemInfo->Durability ) )
	{
		return -105;
	}

//---府胶飘俊 粮犁窍绰啊?
	if( !CanDissolutionItem( pDissolutionItemInfo->wIconIdx ) )
	{
		return -106;
	}
		
	m_nTotalUnitOutNum = 0;
	ZeroMemory( m_DissolutionItemArray, sizeof(m_DissolutionItemArray) );
	int rt = FillDissolutionUnitToArray( pDissolutionItemInfo->wIconIdx );
	if( rt != 0 )	return rt;

	return AddDissolutionUnitToPlayer( pPlayer, pDissolutionItemInfo );
}

int CDissolutionManager::AddDissolutionUnitToPlayer( CPlayer* pPlayer, ITEMBASE* pDissolutionItemInfo )
{
	CInventorySlot* pInventory = (CInventorySlot*)pPlayer->GetSlot( eItemTable_Inventory );
	if( !pInventory ) return -110;

	const ITEMBASE* pitem = pInventory->GetItemInfoAbs(pDissolutionItemInfo->Position);
	ITEMBASE logitem  = *pitem;
	
	if( m_nTotalUnitOutNum == 0 || m_nTotalUnitOutNum > MAX_DISSOLUTION_UNITNUM )
		return -111;

	WORD EmptySellPos[MAX_DISSOLUTION_UNITNUM] = {0,};

	WORD wOutNum = pInventory->GetEmptyCell( EmptySellPos, m_nTotalUnitOutNum - 1 ); //窍唱绰 瘤况龙 巴捞聪鳖
	
	if( wOutNum != m_nTotalUnitOutNum - 1 )
		return -10;		//牢亥配府 傍埃捞 何练窍促.
	
	//刚历 酒捞袍 颇鲍
	if( EI_TRUE != ITEMMGR->DiscardItem( pPlayer, pDissolutionItemInfo->Position, pDissolutionItemInfo->wIconIdx,
					pDissolutionItemInfo->Durability ) )
	{
		return -112;
	}	

	// Log
	LogItemMoney(pPlayer->GetID(), pPlayer->GetObjectName(), 0, "",
		eLog_ItemDestroyDissolution, pPlayer->GetMoney(eItemTable_Inventory), 0, 0,
		logitem.wIconIdx , logitem.dwDBIdx, logitem.Position, 0, logitem.Durability, pPlayer->GetPlayerExpPoint());

	wOutNum = pInventory->GetEmptyCell( EmptySellPos, m_nTotalUnitOutNum );	//瘤况柳 磊府俊档 盲况瘤档废 促矫茄锅

	for( int i = 0 ; i < m_nTotalUnitOutNum ; ++i )
	{
		m_DissolutionItemArray[i].Position = EmptySellPos[i];
		if( pInventory->InsertItemAbs( pPlayer, EmptySellPos[i], &m_DissolutionItemArray[i], SS_PREINSERT ) == EI_TRUE )
		{
			ITEMOBTAINARRAYINFO* pArrayInfo = ITEMMGR->Alloc( pPlayer, MP_ITEM, MP_ITEM_DISSOLUTION_GETITEM, 
				pPlayer->GetID(), pPlayer->GetID(), eLog_ItemObtainDissolution, 1, 
				(DBResult)(ITEMMGR->ObtainItemDBResult) );
			ItemInsertToDB( pPlayer->GetID(), m_DissolutionItemArray[i].wIconIdx, m_DissolutionItemArray[i].Durability, EmptySellPos[i], MAKEDWORD( 1, pArrayInfo->wObtainArrayID ) );
		}
	}

	return 0;
}

int CDissolutionManager::FillDissolutionUnitToArray( WORD wDissolutionItemIdx )
{
	WORD wUnitKindNum = 0;
	sITEM_DISSOLUTIONITEM* pUnitInfo = GetDissolutionUnitItemInfo( wDissolutionItemIdx, &wUnitKindNum );
	if( pUnitInfo == NULL )
		return -120;
	
	if( wUnitKindNum > MAX_DISSOLUTION_UNITNUM ) return -121;		//辆幅啊 沫焊促 腹阑 荐绰 绝促.
	
	for( int i = 0 ; i < wUnitKindNum ; ++i )
	{
		WORD tempUnitItemIdx = pUnitInfo[i].wUnitItemIdx;
		WORD tempUnitItemNum = pUnitInfo[i].wUnitItemNum;

		if( tempUnitItemIdx == 0 || tempUnitItemNum == 0 ) return -122;

		//咯扁辑 父距 酒捞袍捞 盒秦且 荐 乐绰 酒捞袍捞搁 肚茄锅 盒秦茄促.
		eITEM_KINDBIT eItemKind = GetItemKind( tempUnitItemIdx );
		if( !(eItemKind & eEXTRA_ITEM) )
		{
			if( FillDissolutionUnitToArray( tempUnitItemIdx ) == 0 )	//盒秦登搁 酒贰啊 鞘夸绝促.
				continue;			
		}
		
		while( tempUnitItemNum > 0 )
		{
			if( m_nTotalUnitOutNum >= MAX_DISSOLUTION_UNITNUM ) return -123;	//=档 救等促.

			m_DissolutionItemArray[m_nTotalUnitOutNum].wIconIdx		= tempUnitItemIdx;

			if( tempUnitItemNum > 5 )
			{
				m_DissolutionItemArray[m_nTotalUnitOutNum].Durability	= 5;
				tempUnitItemNum -= 5;	//while(tempUnitItemNum>5) 捞骨栏肺 0焊促 累酒龙 荐绰 绝促.
			}
			else
			{
				m_DissolutionItemArray[m_nTotalUnitOutNum].Durability	= tempUnitItemNum;
				tempUnitItemNum = 0;
			}
		
			++m_nTotalUnitOutNum;
		}
	}

	if( m_nTotalUnitOutNum > MAX_DISSOLUTION_UNITNUM ) return -124;	//=捞 酒聪促.

	return 0;
}

⌨️ 快捷键说明

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