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

📄 triggermanager.cpp

📁 奇迹世界 部分源代码奇迹世界 部分源代码奇迹世界 部分源代码
💻 CPP
字号:
#include "StdAfx.h"
#include "TriggerManager.h"
#include "TriggerGroupInfo.h"
#include "Trigger.h"
#include "TriggerAreaHash.h"
#include "TriggerMsg.h"

TriggerManager::TriggerManager(void)
{
	m_pField = NULL;
	m_ActiveTriggerHash.Initialize( 100 );
	m_TriggerHash.Initialize( 100 );
	m_TriggerAreaHash.Initialize( 50 );
	memset( m_SwitchValue, INVALID_SWITCH_ID_VALUE, sizeof(BYTE)*MAX_SWITCH_NUM );
}

TriggerManager::~TriggerManager(void)
{
	Release();
}

VOID TriggerManager::Release()
{
	Trigger * pTrigger = NULL;
	m_TriggerHash.SetFirst();
	while( (pTrigger=m_TriggerHash.GetNext()) != NULL )
	{
		pTrigger->Release();
		Trigger::Destroy( pTrigger );
	}
	m_TriggerHash.RemoveAll();
	m_ActiveTriggerHash.RemoveAll();

	TriggerAreaHash * pTriggerAreaHash = NULL;
	m_TriggerAreaHash.SetFirst();
	while( (pTriggerAreaHash=m_TriggerAreaHash.GetNext()) != NULL )
	{
		TriggerAreaHash::Destroy( pTriggerAreaHash );
	}
	m_TriggerAreaHash.RemoveAll();
	

	m_pField = NULL;
}

VOID TriggerManager::Disconnected( DWORD dwUserKey )
{
	TriggerAreaHash * pTriggerAreaHash = NULL;
	m_TriggerAreaHash.SetFirst();
	while( (pTriggerAreaHash=m_TriggerAreaHash.GetNext()) != NULL )
	{
		DWORD dwKey = pTriggerAreaHash->FindPlayer( dwUserKey );
		if( dwUserKey == dwKey )
		{
			pTriggerAreaHash->LeaveArea( dwUserKey );
		}
	}
}

VOID TriggerManager::Init( TriggerGroupInfo & IN rInfo, Field * pField )
{
	ASSERT( m_TriggerHash.GetDataNum() == 0 );
	ASSERT( m_TriggerAreaHash.GetDataNum() == 0 );
	m_pField = pField;

	// 飘府芭 沥焊 曼炼
	util::SolarHashTable<TriggerInfo *, WzID>	& pTriggerHash = rInfo.m_TriggerHash;

	TriggerInfo * pInfo = NULL;
	pTriggerHash.SetFirst();
	while( (pInfo=pTriggerHash.GetNext()) != NULL )
	{		
		Trigger * pTrigger = Trigger::Create();
		pTrigger->Init( this, pInfo );
		//ASSERT( NULL == m_TriggerHash.GetData( pTrigger->TriggerID() ) );
		SASSERT( NULL == m_TriggerHash.GetData( pTrigger->TriggerID() ), VSTR("FIELDCODE:%d,CATE:%s,TRIGGERID:%u",pField->GetFieldCode(),pInfo->CategoryName(),pTrigger->TriggerID()) );
		m_TriggerHash.Add( pTrigger, pTrigger->TriggerID() );
		if( pInfo->IsActive() )
		{
			addActiveTrigger( pTrigger );
		}
	}
}
VOID TriggerManager::CreateAreaHash( INT AreaID )
{
	if( NULL == m_TriggerAreaHash.GetData(AreaID) )
	{
		TriggerAreaHash * pHash = TriggerAreaHash::Create();
		pHash->Init();
		m_TriggerAreaHash.Add( pHash, AreaID );
	}
}

VOID TriggerManager::Update()
{
	Trigger * pTrigger = NULL;
	m_ActiveTriggerHash.SetFirst();
	while( (pTrigger=m_ActiveTriggerHash.GetNext()) != NULL )
	{
		if( !pTrigger->Update() )
		{
			if( pTrigger->IsNextActive() )
				ActiveNextTrigger( pTrigger->TriggerID() );

			if( pTrigger->IsLoop() )
			{
				pTrigger->OnRelease();
				pTrigger->OnInit();
			}
			else
			{
				removeActiveTrigger( pTrigger );
			}
		}
	}
}
VOID TriggerManager::removeActiveTrigger( Trigger * pTrigger )
{
	pTrigger->OnRelease();
	ASSERT( NULL != m_ActiveTriggerHash.GetData( pTrigger->TriggerID() ) );
	m_ActiveTriggerHash.Remove( pTrigger->TriggerID() );
}
VOID TriggerManager::addActiveTrigger( Trigger * pTrigger )
{
	pTrigger->OnInit();
	if( NULL != m_ActiveTriggerHash.GetData( pTrigger->TriggerID() ) )  return;
	m_ActiveTriggerHash.Add( pTrigger, pTrigger->TriggerID() );
}

VOID TriggerManager::OnMsg( TRIGGER_MSG * pMsg )
{
	Trigger * pTrigger = NULL;
	m_ActiveTriggerHash.SetFirst();
	while( (pTrigger=m_ActiveTriggerHash.GetNext()) != NULL )
	{
		pTrigger->OnMsg(pMsg);
	}
}

// TEMP !!!!!!!
// 唱吝俊 肋给等 蔼捞 逞绢 棵 荐 乐促绰 巴阑 堪滴俊 滴扼!!!!
VOID TriggerManager::OnLeaveArea( TRIGGER_LEAVE_AREA * pMsg )
{
	//SUNLOG( eFULL_LOG,  "LeaveArea(%d)", pMsg->m_AreaID );
	TriggerAreaHash * pHash = m_TriggerAreaHash.GetData( pMsg->m_AreaID );
	if( !pHash )
	{
		ASSERT(NULL);
		SUNLOG( eCRITICAL_LOG,  "[TriggerManager::OnLeaveArea] [%d]坷幅:ENTER LEAVE啊 措览登瘤 臼绰促.", pMsg->m_AreaID );
		// error
		return;
	}
	pHash->LeaveArea( pMsg->m_dwUserKey );
	OnMsg( pMsg );
}

VOID TriggerManager::OnEnterArea( TRIGGER_ENTER_AREA * pMsg )
{
	//SUNLOG( eFULL_LOG,  "EnterArea(%d)", pMsg->m_AreaID );
	TriggerAreaHash * pHash = m_TriggerAreaHash.GetData( pMsg->m_AreaID );
	if( !pHash )
	{
		ASSERT(NULL);
		SUNLOG( eCRITICAL_LOG,  "[TriggerManager::OnEnterArea] [%d]坷幅:ENTER LEAVE啊 措览登瘤 臼绰促.", pMsg->m_AreaID );
		// error
		return;
	}
	pHash->EnterArea( pMsg->m_dwUserKey );
	OnMsg( pMsg );
}

DWORD TriggerManager::GetPlayerNumForAreaID( INT AreaID )
{
	TriggerAreaHash * pHash = m_TriggerAreaHash.GetData( AreaID );	
	ASSERT( pHash );
	return pHash->GetPlayerNum();
}
/*
BOOL TriggerManager::CheckValidPlayer( INT AreaID )
{
	TriggerAreaHash * pHash = m_TriggerAreaHash.GetData(AreaID);
	ASSERT( pHash );
	return pHash->CheckValidPlayer();
}
*/
//----------------------------------------------------------------------------------------------------
// 
// Trigger俊辑 荤侩窍绰 窃荐
// 
//----------------------------------------------------------------------------------------------------
VOID TriggerManager::ActiveNextTrigger( WzID curWzTriggerID )
{
	TRIGGER_ITR it = m_TriggerHash.find( curWzTriggerID );
	if( it == m_TriggerHash.end() ) return;

	Trigger * pTrigger = *(++it);
	if( pTrigger ) ActiveTrigger( pTrigger->TriggerID(), TRUE );
}

VOID TriggerManager::ActiveTrigger( WzID wzTriggerID, BOOL bActive )
{
	Trigger * pTrigger = NULL;
	if( bActive )
	{
		// Active窍扼!
		pTrigger = m_ActiveTriggerHash.GetData( wzTriggerID );
		if( pTrigger ) return;			//< Active飘府芭俊 殿废登绢 乐栏搁 公矫
		pTrigger = m_TriggerHash.GetData( wzTriggerID );
		if( !pTrigger ) return;			//< 绝栏搁 公矫
		addActiveTrigger( pTrigger );
	}
	else
	{
		pTrigger = m_ActiveTriggerHash.GetData( wzTriggerID );
		if( !pTrigger ) return;			//< 绝栏搁 公矫
		removeActiveTrigger( pTrigger );
	}
	pTrigger->SetActive( bActive );
}


VOID TriggerManager::SetAttribute( int iTileID, BYTE byAttr ) 
{ 
	m_pField->SetActiveRoom();
	m_pField->GetWorldBase()->x_pPathFinder->SetAttribute( iTileID, byAttr ); 
}

VOID TriggerManager::UnsetAttribute( int iTileID, BYTE byAttr )
{ 
	m_pField->SetActiveRoom();
	m_pField->GetWorldBase()->x_pPathFinder->UnsetAttribute( iTileID, byAttr );
}


WzSpecialArea * TriggerManager::GetAreaInfo( INT index ) 
{ 
	return m_pField->GetFieldInfo()->GetAreaInfoByIndex( index ); 
}

VOID TriggerManager::CreateNPC( CODETYPE MonsterCode, DWORD dwNumberOfNPC, WzVector * pvPos, DWORD dwAreaID, DWORD dwGroupID )
{
	m_pField->CreateNPC( MONSTER_OBJECT, MonsterCode, dwNumberOfNPC, pvPos, dwAreaID, dwGroupID );
}

// 规氢 爱绰 阁胶磐 积己
VOID TriggerManager::CreateNPC_Dir( CODETYPE MonsterCode, DWORD dwNumberOfNPC, WzVector * pvPos, DWORD dwAreaID, DWORD dwGroupID, WORD wAngle )
{
	m_pField->CreateNPC_Dir( MONSTER_OBJECT, MonsterCode, dwNumberOfNPC, pvPos, dwAreaID, dwGroupID, wAngle );
}

WzVector TriggerManager::GetRandomPosInTile( int iTile )
{
	return m_pField->GetFieldInfo()->GetWorldBase()->GetRandomPosInTile(iTile);
}

INT TriggerManager::GetTileToStand( WzVector * pvPos )
{
	m_pField->SetActiveRoom();
	return m_pField->GetWorldBase()->x_pPathFinder->GetTileToStand( *pvPos, NULL, -1.0f, 100.0f );
}

MapObject * TriggerManager::FindMapObject( const DWORD dwObjectKey )
{
	return m_pField->FindMapObject( dwObjectKey );
}

BOOL TriggerManager::RemoveMapObject( const DWORD dwObjectKey )
{
	return m_pField->RemoveMapObject( dwObjectKey );
}

VOID TriggerManager::SendToAll( MSG_BASE_FORWARD * pMsg, WORD wSize )
{
	m_pField->SendPacketToAll( pMsg, wSize );
}

DWORD TriggerManager::GetPlayerNum()
{
	return m_pField->GetPlayerNum();
}

⌨️ 快捷键说明

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