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