📄 trigger.cpp
字号:
#include "StdAfx.h"
#include "Trigger.h"
#include "TriggerCommon.h"
#include "IConditionTrigger.h"
#include "IActionTrigger.h"
#include "ConditionInfo.h"
#include "ActionInfo.h"
#include "ConditionTriggers.h"
#include "ActionTriggers.h"
#include "TriggerManager.h"
#define __TRIGGER_BEGIN_SWITCH sSWITCH(pTrigger->TriggerType())
#define __TRIGGER_DESTROY_CASE( className ) CASE( e##className ) className::Destroy((className*)pTrigger);
#define __TRIGGER_CREATE_CASE( className ) CASE( e##className ) \
className * pNew = className::Create(); \
pNew->Set((className##_INFO*)pTrigger); \
pITrigger = pNew;
#define __TRIGGER_EXCEPT( str ) DEFAULT ASSERT( !str );
#define __TRIGGER_END_SWITCH eSWITCH
__IMPL_POOL(Trigger)
Trigger::Trigger(void)
{
// 檬扁蔼 搬沥
m_ConditionHash.Initialize( 100 );
m_ActionHash.Initialize( 100 );
m_SatisfiedPlayerHash.Initialize( MAX_PARTYMEMBER_NUM*3 );
m_bActive = FALSE;
m_pTriggerInfo = NULL;
m_pMGR = NULL;
m_state = INACTIVATE_STATE;
m_dwClickedUserKey = 0;
}
Trigger::~Trigger(void)
{
Release();
}
VOID Trigger::Release()
{
IConditionTrigger * pCondition = NULL;
m_ConditionHash.SetFirst();
while( (pCondition=m_ConditionHash.GetNext()) != NULL )
{
_destroyCondition( pCondition );
}
m_ConditionHash.RemoveAll();
IActionTrigger * pAction = NULL;
m_ActionHash.SetFirst();
while( (pAction=m_ActionHash.GetNext()) != NULL )
{
_destroyAction( pAction );
}
m_ActionHash.RemoveAll();
OnRelease();
}
VOID Trigger::Init( TriggerManager * pMGR, TriggerInfo * pInfo )
{
ASSERT( m_ConditionHash.GetDataNum() == 0 );
ASSERT( m_ActionHash.GetDataNum() == 0 );
m_state = INACTIVATE_STATE;
m_pMGR = pMGR;
_setInfo( pInfo );
util::SolarHashTable<ConditionInfo *> & rConditionHash = _getInfo()->m_ConditionHash;
util::SolarHashTable<ActionInfo *> & rActionHash = _getInfo()->m_ActionHash;
ConditionInfo * pCondition = NULL;
rConditionHash.SetFirst();
while( (pCondition=rConditionHash.GetNext()) != NULL )
{
_createCondition(pCondition);
}
ActionInfo * pAction = NULL;
rActionHash.SetFirst();
while( (pAction=rActionHash.GetNext()) != NULL )
{
_createAction(pAction);
}
}
VOID Trigger::OnInit()
{
//ASSERT( m_ConditionPlayerHash.GetDataNum() == 0 );
ASSERT( m_SatisfiedPlayerHash.GetDataNum() == 0 );
//努腐茄 蜡历 函荐 檬扁拳
m_dwClickedUserKey = 0;
SetActive( _getInfo()->IsActive() );
// 诀单捞飘 救窃!
m_state = DONTUPDATE_STATE;
IConditionTrigger * pCondition = NULL;
m_ConditionHash.SetFirst();
while( (pCondition=m_ConditionHash.GetNext()) != NULL )
{
pCondition->Clear(); //< m_bSatistied = FALSE;
pCondition->OnInit();
if( pCondition->NeedUpdate() )
m_state = UPDATE_STATE;
}
// 霉锅掳绰 角青 : for always condition
Execute();
}
VOID Trigger::OnRelease()
{
// m_ConditionPlayerHash.RemoveAll();
m_SatisfiedPlayerHash.RemoveAll();
}
BOOL Trigger::Update()
{
// is satisfied登搁 update甫 窍瘤 臼绰促.
switch( m_state )
{
case DONTUPDATE_STATE: return TRUE;
case UPDATE_STATE:
{
// 矫埃捞 瘤唱啊搁捞扼绰 鸥涝锭巩俊 UPDATE_STATE 惑怕啊 眠啊凳
// 矫埃捞 瘤唱啊搁捞 器窃等 飘府芭绰 update啊 登扁锭巩俊 坷滚庆靛啊 奴 促弗 飘府芭客 鞍捞 荤侩窍瘤 臼绰祈捞 亮促.
// 眠饶, 飘府芭 诀单捞飘 平阑 疵赴促!
// 弥利拳 且 咯瘤啊 乐澜
Execute();
}
break;
case ACTIONUPDATE_STATE:
if( !ActionUpdate() )
{
m_state = TERMINATING_STATE;
}
else
{
break;
}
case TERMINATING_STATE: return FALSE;
}
return TRUE;
}
BOOL Trigger::Execute()
{
if( _ConditionCheck() )
{
_Action();
return TRUE;
}
else
{
_ConditionReset();
}
return FALSE;
}
BOOL Trigger::_ConditionCheck()
{
if( m_pTriggerInfo->IsAND() )
{
IConditionTrigger * pCondition = NULL;
m_ConditionHash.SetFirst();
while( (pCondition=m_ConditionHash.GetNext()) != NULL )
{
if( !pCondition->IsSatisfied() )
return FALSE;
}
return TRUE;
}
else
{
IConditionTrigger * pCondition = NULL;
m_ConditionHash.SetFirst();
while( (pCondition=m_ConditionHash.GetNext()) != NULL )
{
if( pCondition->IsSatisfied() )
return TRUE;
}
return FALSE;
}
}
VOID Trigger::_Action()
{
MSG_CG_TRIGGER_DO_ACTION_BRD msg;
msg.m_dwTriggerID = TriggerID();
m_pMGR->SendToAll( &msg, sizeof(msg) );
IActionTrigger * pAction = NULL;
m_ActionHash.SetFirst();
while( (pAction=m_ActionHash.GetNext()) != NULL )
{
pAction->OnAction();
}
m_state = ACTIONUPDATE_STATE;
}
VOID Trigger::_ConditionReset()
{
// 诀单捞飘 救窃!
m_state = DONTUPDATE_STATE;
// OPT //@@@@ 弥利拳 鞘夸!!!!
IConditionTrigger * pCondition = NULL;
m_ConditionHash.SetFirst();
while( (pCondition=m_ConditionHash.GetNext()) != NULL )
{
pCondition->OnReset();
if( pCondition->NeedUpdate() )
m_state = UPDATE_STATE;
}
}
// return FALSE捞搁 飘府芭 辆丰
BOOL Trigger::ActionUpdate()
{
BOOL bEnd = FALSE;
IActionTrigger * pAction = NULL;
m_ActionHash.SetFirst();
while( (pAction=m_ActionHash.GetNext()) != NULL )
{
if( pAction->OnActionUpdate() )
{
bEnd = TRUE;
}
}
return bEnd;
}
VOID Trigger::OnMsg( TRIGGER_MSG * pMsg )
{
// Active等 trigger父 甸绢 柯促!!!!!!
IConditionTrigger * pCondition = NULL;
m_ConditionHash.SetFirst();
while( (pCondition=m_ConditionHash.GetNext()) != NULL )
{
// 炼扒眉农饶 父练窍搁 傈眉 父练 咯何 眉农
if( TRUE == pCondition->OnMsg( pMsg ) )
{
// 泅犁 捞亥飘 皋技瘤肺 父练登菌促.
// 傈眉 父练 眉农
if( Execute() ) break;
}
}
}
/*
DWORD Trigger::GetConditionPlayerNum( ePLAYER_TRIGGER_STATE state )
{
DWORD totalNum = 0;
//DWORD nMax = m_ConditionPlayerHash.GetDataNum();
for( DWORD i = 0 ; i < nMax ; ++i )
{
if( m_PlayerTriggerInfo[i].m_State & state )
++totalNum;
}
return totalNum;
}
*/
#pragma warning ( push )
#pragma warning ( disable : 4311)
VOID Trigger::_createCondition( ConditionInfo * pTrigger )
{
IConditionTrigger * pITrigger = NULL;
__TRIGGER_BEGIN_SWITCH
__TRIGGER_CREATE_CASE( CONDITION_ALWAYS )
__TRIGGER_CREATE_CASE( CONDITION_COMPARE_SWITCH )
__TRIGGER_CREATE_CASE( CONDITION_CLICK_OBJECT )
__TRIGGER_CREATE_CASE( CONDITION_DAMAGE_OBJECT )
__TRIGGER_CREATE_CASE( CONDITION_COUNT_NPCKILL )
__TRIGGER_CREATE_CASE( CONDITION_PASS_TIME )
__TRIGGER_CREATE_CASE( CONDITION_ENTER_AREA )
m_pMGR->CreateAreaHash(pNew->Get()->GetAreaID()); //< TriggerManager狼 TriggerAreaHash积己
__TRIGGER_CREATE_CASE( CONDITION_HAVE_ITEM )
__TRIGGER_CREATE_CASE( CONDITION_MULTI_SWITCH )
__TRIGGER_CREATE_CASE( CONDITION_MISSION_POINT )
//m_pMGR->CreateAreaHash(pNew->Get()->GetAreaID()); //< TriggerManager狼 TriggerAreaHash积己
__TRIGGER_EXCEPT( "殿废登瘤 臼篮 牧叼记 飘府芭涝聪促.1" )
__TRIGGER_END_SWITCH
pITrigger->Init( m_pMGR, this );
ASSERT( NULL == m_ConditionHash.GetData((DWORD)pITrigger) );
m_ConditionHash.Add( pITrigger, (DWORD)pITrigger );
}
VOID Trigger::_createAction( ActionInfo * pTrigger )
{
IActionTrigger * pITrigger = NULL;
__TRIGGER_BEGIN_SWITCH
//__TRIGGER_CREATE_CASE( ACTION_CHANGE_SWITCH )
__TRIGGER_CREATE_CASE( ACTION_CHANGE_OBJECTANI )
__TRIGGER_CREATE_CASE( ACTION_CHANGE_PATHTILE )
__TRIGGER_CREATE_CASE( ACTION_CHANGE_OBJECTSTATE )
__TRIGGER_CREATE_CASE( ACTION_PLAY_EVENT )
__TRIGGER_CREATE_CASE( ACTION_SET_ISATTACK )
__TRIGGER_CREATE_CASE( ACTION_PORTAL_PLAYER )
__TRIGGER_CREATE_CASE( ACTION_SET_OBJECTTHRUST )
__TRIGGER_CREATE_CASE( ACTION_APPLY_DAMAGE )
__TRIGGER_CREATE_CASE( ACTION_REFLECT_DAMAGE )
__TRIGGER_CREATE_CASE( ACTION_CREATE_MONSTER )
__TRIGGER_CREATE_CASE( ACTION_DISPLAY_MSGBOX )
__TRIGGER_CREATE_CASE( ACTION_REMOVE_ITEM )
//__TRIGGER_CREATE_CASE( ACTION_PRESERVER )
__TRIGGER_CREATE_CASE( ACTION_REWARD_PLAYER )
__TRIGGER_CREATE_CASE( ACTION_CLEAR_MISSION )
__TRIGGER_CREATE_CASE( ACTION_PORTAL_RANDOM )
__TRIGGER_CREATE_CASE( ACTION_ACTIVATE_TRIGGER )
__TRIGGER_CREATE_CASE( ACTION_AREA_DAMAGE )
__TRIGGER_CREATE_CASE( ACTION_OPERATE_SWITCH )
__TRIGGER_CREATE_CASE( ACTION_ROAD_CONNECT )
__TRIGGER_CREATE_CASE( ACTION_CREATE_DIR_MONSTER )
__TRIGGER_CREATE_CASE( ACTION_CHANGE_LIGHT )
__TRIGGER_CREATE_CASE( ACTION_CHANGE_OBJECT_TYPE )
__TRIGGER_EXCEPT( "殿废登瘤 臼篮 咀记 飘府芭涝聪促.1" )
__TRIGGER_END_SWITCH
pITrigger->Init( m_pMGR, this );
ASSERT( NULL == m_ActionHash.GetData((DWORD)pITrigger) );
m_ActionHash.Add( pITrigger, (DWORD)pITrigger );
}
#pragma warning ( pop )
VOID Trigger::_destroyCondition( IConditionTrigger * pTrigger )
{
__TRIGGER_BEGIN_SWITCH
__TRIGGER_DESTROY_CASE( CONDITION_ALWAYS )
__TRIGGER_DESTROY_CASE( CONDITION_COMPARE_SWITCH )
__TRIGGER_DESTROY_CASE( CONDITION_CLICK_OBJECT )
__TRIGGER_DESTROY_CASE( CONDITION_DAMAGE_OBJECT )
__TRIGGER_DESTROY_CASE( CONDITION_COUNT_NPCKILL )
__TRIGGER_DESTROY_CASE( CONDITION_PASS_TIME )
__TRIGGER_DESTROY_CASE( CONDITION_ENTER_AREA )
__TRIGGER_DESTROY_CASE( CONDITION_HAVE_ITEM )
__TRIGGER_DESTROY_CASE( CONDITION_MULTI_SWITCH )
__TRIGGER_DESTROY_CASE( CONDITION_MISSION_POINT )
__TRIGGER_EXCEPT( "殿废登瘤 臼篮 牧叼记 飘府芭涝聪促.2" )
__TRIGGER_END_SWITCH
}
VOID Trigger::_destroyAction( IActionTrigger * pTrigger )
{
__TRIGGER_BEGIN_SWITCH
// __TRIGGER_DESTROY_CASE( ACTION_CHANGE_SWITCH )
__TRIGGER_DESTROY_CASE( ACTION_CHANGE_OBJECTANI )
__TRIGGER_DESTROY_CASE( ACTION_CHANGE_PATHTILE )
__TRIGGER_DESTROY_CASE( ACTION_CHANGE_OBJECTSTATE )
__TRIGGER_DESTROY_CASE( ACTION_PLAY_EVENT )
__TRIGGER_DESTROY_CASE( ACTION_SET_ISATTACK )
__TRIGGER_DESTROY_CASE( ACTION_PORTAL_PLAYER )
__TRIGGER_DESTROY_CASE( ACTION_SET_OBJECTTHRUST )
__TRIGGER_DESTROY_CASE( ACTION_APPLY_DAMAGE )
__TRIGGER_DESTROY_CASE( ACTION_REFLECT_DAMAGE )
__TRIGGER_DESTROY_CASE( ACTION_CREATE_MONSTER )
__TRIGGER_DESTROY_CASE( ACTION_DISPLAY_MSGBOX )
__TRIGGER_DESTROY_CASE( ACTION_REMOVE_ITEM )
// __TRIGGER_DESTROY_CASE( ACTION_PRESERVER )
__TRIGGER_DESTROY_CASE( ACTION_REWARD_PLAYER )
__TRIGGER_DESTROY_CASE( ACTION_CLEAR_MISSION )
__TRIGGER_DESTROY_CASE( ACTION_PORTAL_RANDOM )
__TRIGGER_DESTROY_CASE( ACTION_ACTIVATE_TRIGGER )
__TRIGGER_DESTROY_CASE( ACTION_AREA_DAMAGE )
__TRIGGER_DESTROY_CASE( ACTION_OPERATE_SWITCH )
__TRIGGER_DESTROY_CASE( ACTION_ROAD_CONNECT )
__TRIGGER_DESTROY_CASE( ACTION_CREATE_DIR_MONSTER )
__TRIGGER_DESTROY_CASE( ACTION_CHANGE_LIGHT )
__TRIGGER_DESTROY_CASE( ACTION_CHANGE_OBJECT_TYPE )
__TRIGGER_EXCEPT( "殿废登瘤 臼篮 咀记 飘府芭涝聪促.2" )
__TRIGGER_END_SWITCH
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -