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