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

📄 changeitemmgr.cpp

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

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

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

CChangeItemMgr::CChangeItemMgr()
{

}

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

void CChangeItemMgr::Init()
{
	m_ChangeItemList.Initialize( 100 );
	LoadItemChange();
}

void CChangeItemMgr::Release()
{
	sCHANGEITEM* pData = NULL;
	m_ChangeItemList.SetPositionHead();
	while( pData = m_ChangeItemList.GetData() )
	{
		delete[] pData->pItemUnit;
		delete pData;
	}
	m_ChangeItemList.RemoveAll();	
}

BOOL CChangeItemMgr::LoadItemChange()
{
	CMHFile file;
#ifdef _FILE_BIN_
	if( !file.Init( "./Resource/ItemChangeList.bin", "rb" ) )
		return FALSE;
#else
	if( !file.Init( "./Resource/ItemChangeList.txt", "rt" ) )
		return FALSE;
#endif

	while( 1 )
	{
		if( file.IsEOF() )
			break;
		sCHANGEITEM* pData = new sCHANGEITEM;
		pData->wItemIdx = file.GetWord();
		pData->wMaxToItem = file.GetWord();
		pData->pItemUnit = new sCHANGEITEMUNIT[pData->wMaxToItem];
		for( WORD i = 0; i < pData->wMaxToItem; ++i )
		{
			pData->pItemUnit[i].wToItemIdx = file.GetWord();
			pData->pItemUnit[i].wToItemDur = file.GetWord();
			pData->pItemUnit[i].wPercent = file.GetWord();
		}

		m_ChangeItemList.Add( pData, pData->wItemIdx );
	}

	file.Release();
	return TRUE;	
}

sCHANGEITEMUNIT* CChangeItemMgr::GetItemUnitFromCalPercent( WORD wItemIdx )
{
	sCHANGEITEM* pData = m_ChangeItemList.GetData( wItemIdx );

	WORD RandRate = rand()%10001;	
	WORD FromPercent = 0;
	WORD ToPercent = 0;

	for( WORD i = 0; i < pData->wMaxToItem; ++i )
	{
		FromPercent = ToPercent;
		ToPercent += pData->pItemUnit[i].wPercent;
		if( FromPercent <= RandRate && RandRate < ToPercent )
		{
			return &pData->pItemUnit[i];
		}
	}

	return NULL;
}

int CChangeItemMgr::UseChangeItem( CPlayer* pPlayer, WORD TargetPos, WORD wItemIdx )
{
	if( pPlayer->GetState() == eObjectState_Die )
		return 0;
	if( !CHKRT->ItemOf( pPlayer, TargetPos, wItemIdx, 0, 0, CB_EXIST|CB_ICONIDX) )
		return 0;
	if( pPlayer->GetState() == eObjectState_Immortal )
		OBJECTSTATEMGR_OBJ->EndObjectState( pPlayer, eObjectState_Immortal );

	CItemSlot* pSlot = pPlayer->GetSlot( TargetPos );
	const ITEMBASE* pItemBase = pSlot->GetItemInfoAbs( TargetPos );
	ITEMBASE Item = *pItemBase;
	ITEM_INFO* pItemInfo = ITEMMGR->GetItemInfo( wItemIdx );
	
	if( pItemInfo )
	if( pItemInfo->ItemKind == eCHANGE_ITEM )
	{
		sCHANGEITEMUNIT* pItemUnit = GetItemUnitFromCalPercent( wItemIdx );
		if( pItemUnit )
		{
			if( EI_TRUE != ITEMMGR->DiscardItem( pPlayer, TargetPos, wItemIdx, 1 ) )
				return 0;

			// send item use
			MSG_ITEM_USE_ACK msg;
			msg.Category = MP_ITEM;
			msg.Protocol = MP_ITEM_USE_ACK;
			msg.dwObjectID = pPlayer->GetID();
			msg.TargetPos = TargetPos;
			msg.wItemIdx = wItemIdx;
			ITEMMGR->SendAckMsg( pPlayer, &msg, sizeof(msg) );

			if( pItemUnit->wToItemIdx == 7999 )		// money
			{
				pPlayer->SetMoney( pItemUnit->wToItemDur, MONEY_ADDITION, MF_OBTAIN );
			}
			else if( pItemUnit->wToItemIdx == 7998 )
			{
				MSGBASE msg;
				msg.Category = MP_USERCONN;
				msg.Protocol = MP_USERCONN_EVENTITEM_USE;
				pPlayer->SendMsg( &msg, sizeof(msg) );
			}
			else
				ITEMMGR->ObtainItemFromChangeItem( pPlayer, pItemUnit->wToItemIdx, pItemUnit->wToItemDur );
		}
		else
			return 0;		
	}
	else
		return 0;

	return 1;
}

⌨️ 快捷键说明

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