271 lines
9.4 KiB
C++
271 lines
9.4 KiB
C++
|
|
#include "stdafx.h"
|
|||
|
|
#include "DnWorldChestProp.h"
|
|||
|
|
#include "DNProtocol.h"
|
|||
|
|
#include "TaskManager.h"
|
|||
|
|
#include "DnPartyTask.h"
|
|||
|
|
#include "DnItemTask.h"
|
|||
|
|
#include "DNUserSession.h"
|
|||
|
|
#include "DnWorld.h"
|
|||
|
|
#include "DnPropState.h"
|
|||
|
|
#include "DnPropCondition.h"
|
|||
|
|
#include "DnPropCondiNeedItem.h"
|
|||
|
|
#include "DnPropStateDoAction.h"
|
|||
|
|
#include "DnPropStateCmdOperation.h"
|
|||
|
|
#include "DnPropStateTrigger.h"
|
|||
|
|
#include "DnPropStateItemDrop.h"
|
|||
|
|
#include "DnPropOperatedCondition.h"
|
|||
|
|
#include "DNLogConnection.h"
|
|||
|
|
#include "DNGameTask.h"
|
|||
|
|
|
|||
|
|
|
|||
|
|
CDnWorldChestProp::CDnWorldChestProp( CMultiRoom *pRoom )
|
|||
|
|
: CDnWorldOperationProp( pRoom ), m_iOperateState( CLOSED )
|
|||
|
|
{
|
|||
|
|
//m_nCloseActionIndex = -1;
|
|||
|
|
m_iNeedKeyID = 0;
|
|||
|
|
m_iItemDropGroupTableID = 0;
|
|||
|
|
m_bRemoveNeedKeyItem = false;
|
|||
|
|
m_iNumNeedKeyItem = 0;
|
|||
|
|
|
|||
|
|
m_pNeedItemCondition = NULL;
|
|||
|
|
m_pItemDropState = NULL;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CDnWorldChestProp::~CDnWorldChestProp()
|
|||
|
|
{
|
|||
|
|
ReleasePostCustomParam();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
bool CDnWorldChestProp::InitializeTable( int nTableID )
|
|||
|
|
{
|
|||
|
|
if( CDnWorldActProp::InitializeTable( nTableID ) == false ) return false;
|
|||
|
|
if( GetData() ) {
|
|||
|
|
ChestStruct *pStruct = (ChestStruct*)GetData();
|
|||
|
|
m_iNeedKeyID = pStruct->nNeedKeyID;
|
|||
|
|
m_iItemDropGroupTableID = pStruct->nItemDropGroupTableID;
|
|||
|
|
m_bRemoveNeedKeyItem = (pStruct->bRemoveKeyItem == TRUE);
|
|||
|
|
m_iNumNeedKeyItem = pStruct->nNumNeedItem;
|
|||
|
|
m_bEnableOwnership = (pStruct->bEnableOwnership == TRUE);
|
|||
|
|
|
|||
|
|
string strLevelBoundDescription;
|
|||
|
|
string strLevelBoundRewardItemDropGroupID;
|
|||
|
|
|
|||
|
|
if( pStruct->strLevelBoundDescription )
|
|||
|
|
strLevelBoundDescription.assign( pStruct->strLevelBoundDescription );
|
|||
|
|
|
|||
|
|
if( pStruct->strLevelBoundRewardItemDropGroupID )
|
|||
|
|
strLevelBoundRewardItemDropGroupID.assign( pStruct->strLevelBoundRewardItemDropGroupID );
|
|||
|
|
|
|||
|
|
//// <20><EFBFBD>Ʈ<EFBFBD><C6AE>.
|
|||
|
|
//strLevelBoundDescription.assign( "1~20;21~30;31~40;41~50" );
|
|||
|
|
//strLevelBoundRewardItemDropGroupID.assign( "1;2;3;4" );
|
|||
|
|
|
|||
|
|
bool bValidLevelBoundSetting = true;
|
|||
|
|
vector<string> vlLevelPair;
|
|||
|
|
TokenizeA( strLevelBoundDescription, vlLevelPair, ";" );
|
|||
|
|
vector<string> vlRewards;
|
|||
|
|
TokenizeA( strLevelBoundRewardItemDropGroupID, vlRewards, ";" );
|
|||
|
|
if( (false == vlLevelPair.empty()) &&
|
|||
|
|
(vlLevelPair.size() == vlRewards.size()) )
|
|||
|
|
{
|
|||
|
|
for( int i = 0; i < (int)vlLevelPair.size(); ++i )
|
|||
|
|
{
|
|||
|
|
string& strLevelBound = vlLevelPair.at( i );
|
|||
|
|
vector<string> vlLevelBound;
|
|||
|
|
TokenizeA( strLevelBound, vlLevelBound, "~" );
|
|||
|
|
if( 2 == (int)vlLevelBound.size() )
|
|||
|
|
{
|
|||
|
|
S_LEVEL_BOUNDS_REWARD Reward;
|
|||
|
|
Reward.iLevelStart = atoi( vlLevelBound.at(0).c_str() );
|
|||
|
|
Reward.iLevelEnd = atoi( vlLevelBound.at(1).c_str() );
|
|||
|
|
Reward.iItemDropGroupTableID = atoi( vlRewards.at(i).c_str() );
|
|||
|
|
|
|||
|
|
m_vlLevelBoundsReward.push_back( Reward );
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
bValidLevelBoundSetting = false;
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if( false == bValidLevelBoundSetting )
|
|||
|
|
m_vlLevelBoundsReward.clear();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
if( m_vlLevelBoundsReward.empty() &&
|
|||
|
|
m_iItemDropGroupTableID > 0 )
|
|||
|
|
{
|
|||
|
|
CalcDropItemList();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
bool CDnWorldChestProp::Initialize( CEtWorldSector *pParentSector, const char *szPropName, EtVector3 &vPos, EtVector3 &vRotate, EtVector3 &vScale )
|
|||
|
|
{
|
|||
|
|
CDnPropState* pNormalState = CDnPropState::Create( GetMySmartPtr(), CDnPropState::NORMAL );
|
|||
|
|
CDnPropState* pCmdOpenedOpState = CDnPropState::Create( GetMySmartPtr(), CDnPropState::CMD_OPERATION );
|
|||
|
|
CDnPropState* pOpenActionState = CDnPropState::Create( GetMySmartPtr(), CDnPropState::DO_ACTION );
|
|||
|
|
CDnPropState* pItemDropState = CDnPropState::Create( GetMySmartPtr(), CDnPropState::ITEM_DROP );
|
|||
|
|
CDnPropState* pTriggerState = CDnPropState::Create( GetMySmartPtr(), CDnPropState::TRIGGER );
|
|||
|
|
static_cast<CDnPropStateCmdOperation*>(pCmdOpenedOpState)->SetOperateIDToSend( OPEN_SUCCESS );
|
|||
|
|
static_cast<CDnPropStateDoAction*>(pOpenActionState)->AddActionName( "Close_Open" );
|
|||
|
|
static_cast<CDnPropStateTrigger*>(pTriggerState)->SetFuncName( "CDnWorldProp::OnClickProp" );
|
|||
|
|
m_pTriggerActionState = static_cast<CDnPropStateTrigger*>(pTriggerState);
|
|||
|
|
m_pItemDropState = static_cast<CDnPropStateItemDrop*>(pItemDropState);
|
|||
|
|
|
|||
|
|
CDnPropCondition* pOpCondition = CDnPropCondition::Create( GetMySmartPtr(), CDnPropCondition::OPERATED );
|
|||
|
|
CDnPropCondition* pNeedKeyCondition = CDnPropCondition::Create( GetMySmartPtr(), CDnPropCondition::NEED_ITEM );
|
|||
|
|
m_pNeedItemCondition = static_cast<CDnPropCondiNeedItem*>(pNeedKeyCondition);
|
|||
|
|
CDnPropCondition* pNULLCondition = CDnPropCondition::Create( GetMySmartPtr(), CDnPropCondition::NULL_CONDITION );
|
|||
|
|
static_cast<CDnPropOperatedCondition*>(pOpCondition)->SetRequireState( TRY_OPEN );
|
|||
|
|
|
|||
|
|
m_pFSM->AddCondition( pOpCondition );
|
|||
|
|
m_pFSM->AddCondition( pNeedKeyCondition );
|
|||
|
|
m_pFSM->AddCondition( pNULLCondition );
|
|||
|
|
|
|||
|
|
m_pFSM->AddState( pNormalState );
|
|||
|
|
m_pFSM->AddState( pOpenActionState );
|
|||
|
|
m_pFSM->AddState( pItemDropState );
|
|||
|
|
m_pFSM->AddState( pTriggerState );
|
|||
|
|
m_pFSM->AddState( pCmdOpenedOpState );
|
|||
|
|
|
|||
|
|
vector< TDnFSMTransitCondition<DnPropHandle>* > vlConditions;
|
|||
|
|
vlConditions.push_back( pOpCondition );
|
|||
|
|
vlConditions.push_back( pNeedKeyCondition );
|
|||
|
|
pNormalState->AddTransitState( pCmdOpenedOpState, vlConditions );
|
|||
|
|
pCmdOpenedOpState->AddTransitState( pOpenActionState, pNULLCondition );
|
|||
|
|
pOpenActionState->AddTransitState( pItemDropState, pNULLCondition );
|
|||
|
|
pItemDropState->AddTransitState( pTriggerState, pNULLCondition );
|
|||
|
|
|
|||
|
|
m_pFSM->SetEntryState( pNormalState );
|
|||
|
|
|
|||
|
|
return CDnWorldActProp::Initialize( pParentSector, szPropName, vPos, vRotate, vScale );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void CDnWorldChestProp::OnDispatchMessage( CDNUserSession *pSession, DWORD dwProtocol, BYTE *pPacket )
|
|||
|
|
{
|
|||
|
|
if( false == (pSession && pSession->GetActorHandle()) )
|
|||
|
|
return;
|
|||
|
|
|
|||
|
|
switch( dwProtocol ) {
|
|||
|
|
case eProp::CS_CMDOPERATION:
|
|||
|
|
{
|
|||
|
|
#ifdef PRE_FIX_PROP_SHOW_BY_TRIGGER
|
|||
|
|
if (IsVisible() == false)
|
|||
|
|
return;
|
|||
|
|
#else
|
|||
|
|
#ifdef PRE_FIX_PROP_RANDOM_VISIBLE
|
|||
|
|
if( false == m_bRandomResultIsVisible )
|
|||
|
|
return;
|
|||
|
|
#endif // #ifdef PRE_FIX_PROP_RANDOM_VISIBLE
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
if( false == IsShow() )
|
|||
|
|
return;
|
|||
|
|
|
|||
|
|
#if !defined( PRE_TRIGGER_TEST )
|
|||
|
|
if( std::find( m_hVecDisableActor.begin(), m_hVecDisableActor.end(), pSession->GetActorHandle() ) != m_hVecDisableActor.end() ) break;
|
|||
|
|
#endif // #if defined( PRE_TRIGGER_TEST )
|
|||
|
|
|
|||
|
|
// <20>̹<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>¸<EFBFBD> <20><> <20>̻<EFBFBD> <20><><EFBFBD>۵<EFBFBD><DBB5><EFBFBD> <20>ʵ<EFBFBD><CAB5><EFBFBD> <20><><EFBFBD><EFBFBD>.
|
|||
|
|
CDnPropState* pNowState = static_cast<CDnPropState*>(m_pFSM->GetCurrentState());
|
|||
|
|
if( false == (pNowState && pNowState->GetType() == CDnPropState::NORMAL) )
|
|||
|
|
break;
|
|||
|
|
|
|||
|
|
m_iOperateState = TRY_OPEN;
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD>ٷ<EFBFBD> <20><><EFBFBD>̽<EFBFBD>Ŵ. <20><EFBFBD><DEBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ġ <20>Ǵ<EFBFBD> <20><><EFBFBD><EFBFBD> ó<><C3B3><EFBFBD>ؾ<EFBFBD> <20><>Ŷ<EFBFBD><C5B6> <20><><EFBFBD>ÿ<EFBFBD> <20><><EFBFBD>ų<EFBFBD> <20>з<EFBFBD><D0B7><EFBFBD><EFBFBD><EFBFBD> <20><> <20><> ó<><C3B3><EFBFBD>ȴ<EFBFBD>.
|
|||
|
|
m_pNeedItemCondition->SetAccessActor( pSession->GetActorHandle() );
|
|||
|
|
m_pNeedItemCondition->SetNeedItemID( m_iNeedKeyID );
|
|||
|
|
m_pNeedItemCondition->SetNumNeedItem( m_iNumNeedKeyItem );
|
|||
|
|
m_pNeedItemCondition->SetRemoveNeedItem( m_bRemoveNeedKeyItem );
|
|||
|
|
m_pTriggerActionState->AddFuncParam( "LastOperationActor", ( pSession && pSession->GetActorHandle() ) ? pSession->GetActorHandle()->GetUniqueID() : -1 );
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD><C7BE>ִٸ<D6B4> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>.
|
|||
|
|
if( false == m_vlLevelBoundsReward.empty() )
|
|||
|
|
{
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>༮<EFBFBD><E0BCAE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>´<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ID <20><><EFBFBD><EFBFBD>.
|
|||
|
|
m_iItemDropGroupTableID = 0;
|
|||
|
|
int iAccessActorLevel = pSession->GetActorHandle()->GetLevel();
|
|||
|
|
for( int i = 0; i < (int)m_vlLevelBoundsReward.size(); ++i )
|
|||
|
|
{
|
|||
|
|
const S_LEVEL_BOUNDS_REWARD LevelBoundsReward = m_vlLevelBoundsReward.at( i );
|
|||
|
|
if( LevelBoundsReward.iLevelStart <= iAccessActorLevel &&
|
|||
|
|
iAccessActorLevel <= LevelBoundsReward.iLevelEnd )
|
|||
|
|
{
|
|||
|
|
m_iItemDropGroupTableID = LevelBoundsReward.iItemDropGroupTableID;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ã<><C3A3> <20><> <20><><EFBFBD>ٸ<EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ó<><C3B3>.
|
|||
|
|
if( 0 == m_iItemDropGroupTableID )
|
|||
|
|
m_iItemDropGroupTableID = m_vlLevelBoundsReward.back().iItemDropGroupTableID;
|
|||
|
|
|
|||
|
|
m_VecDropItemList.clear();
|
|||
|
|
CalcDropItemList();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// #37265 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ǿ<EFBFBD><C7BE>ִٸ<D6B4> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> state <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
|||
|
|
if( m_bEnableOwnership )
|
|||
|
|
{
|
|||
|
|
m_pItemDropState->SetDropItemOwner( pSession->GetActorHandle() );
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
m_pItemDropState->SetDropItemOwner( DnActorHandle() );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
m_pFSM->Process( 0, 0.0f );
|
|||
|
|
m_pNeedItemCondition->SetAccessActor( CDnActor::Identity() );
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
};
|
|||
|
|
CDnWorldActProp::OnDispatchMessage( pSession, dwProtocol, pPacket );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void CDnWorldChestProp::CmdOperation( int iOperateID )
|
|||
|
|
{
|
|||
|
|
BYTE pBuffer[128];
|
|||
|
|
CPacketCompressStream Stream( pBuffer, 128 );
|
|||
|
|
|
|||
|
|
//ChestStateEnum State = ChestStateEnum::Opening;
|
|||
|
|
|
|||
|
|
Stream.Write( &iOperateID, sizeof(int), CPacketCompressStream::INTEGER_SHORT );
|
|||
|
|
m_iOperateState = iOperateID;
|
|||
|
|
|
|||
|
|
Send( eProp::SC_CMDOPERATION, &Stream );
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void CDnWorldChestProp::CalcDropItemList()
|
|||
|
|
{
|
|||
|
|
CDnDropItem::CalcDropItemList( GetRoom(), Dungeon::Difficulty::Max, m_iItemDropGroupTableID, m_VecDropItemList );
|
|||
|
|
|
|||
|
|
if (m_VecDropItemList.empty())
|
|||
|
|
{
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>α<EFBFBD>
|
|||
|
|
//g_pLogConnection->QueryLogStage(GetRoom()->GetRoomID(), pTask->GetMapTableID(), 0, 0, nTableID); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>α<EFBFBD> 090226
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
for( DWORD i=0; i<m_VecDropItemList.size(); i++ ) {
|
|||
|
|
#if defined(PRE_ADD_STAGE_CLEAR_ENCHANT_REWARD)
|
|||
|
|
if( CDnDropItem::PreInitializeItem( GetRoom(), m_VecDropItemList[i].nItemID, m_VecDropItemList[i].nEnchantID ) == false )
|
|||
|
|
#else // #if defined(PRE_ADD_STAGE_CLEAR_ENCHANT_REWARD)
|
|||
|
|
if( CDnDropItem::PreInitializeItem( GetRoom(), m_VecDropItemList[i].nItemID ) == false )
|
|||
|
|
#endif // #if defined(PRE_ADD_STAGE_CLEAR_ENCHANT_REWARD)
|
|||
|
|
{
|
|||
|
|
m_VecDropItemList.erase( m_VecDropItemList.begin() + i );
|
|||
|
|
i--;
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>α<EFBFBD>
|
|||
|
|
//g_pLogConnection->QueryLogStage(GetRoom()->GetRoomID(), pTask->GetMapTableID(), 0, m_VecDropItemList[i].nItemID, nTableID); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>α<EFBFBD> 090226
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|