345 lines
13 KiB
C++
345 lines
13 KiB
C++
#include "SunClientPrecompiledHeader.h"
|
|
|
|
#include "trigger.h"
|
|
|
|
#include <misc.h>
|
|
#include <TriggerInfo.h>
|
|
#include <TriggerGroupInfo.h>
|
|
#include "TriggerManEx.h"
|
|
#include <BaseTrigger.h>
|
|
#include "IActionTriggerEx.h"
|
|
#include "IConditionTriggerEx.h"
|
|
#include <TriggerCommon.h>
|
|
#include <ConditionInfo.h>
|
|
#include <ActionInfo.h>
|
|
#include "Map.h"
|
|
|
|
#include "ConditionTriggers.h"
|
|
#include "ActionTriggers.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
|
|
//////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
#include "ObjectManager.h"
|
|
#include "MapObject.h"
|
|
|
|
|
|
Trigger::Trigger(void)
|
|
{
|
|
}
|
|
|
|
Trigger::~Trigger(void)
|
|
{
|
|
}
|
|
|
|
VOID Trigger::_Action(BOOL bDone)
|
|
{
|
|
CONDITION_TRIGGER_LIST::iterator ConditionIter;
|
|
for( ConditionIter = m_listConditionTrigger.begin(); ConditionIter != m_listConditionTrigger.end(); ++ConditionIter )
|
|
{
|
|
ConditionTriggerEx* pCondition = static_cast<ConditionTriggerEx*>(*ConditionIter);
|
|
if(eCONDITION_CLICK_OBJECT == pCondition->TriggerType() )
|
|
{
|
|
if(NULL == g_pMap)
|
|
{
|
|
assert(!"Trigger::_Action::(NULL == g_pMap)");
|
|
return;
|
|
}
|
|
|
|
int iCnt = g_pMap->GetTriggerMan()->m_vecTrgObj.size();
|
|
for(int i = 0; i < iCnt; i++)
|
|
{
|
|
sTRIGGER_OBJECT* pTO = g_pMap->GetTriggerMan()->m_vecTrgObj[i];
|
|
if(pTO->m_dwTriggerID == this->TriggerID())
|
|
{
|
|
if(FALSE == pTO->m_bLoop)
|
|
pTO->m_bActive = FALSE;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
ACTION_TRIGGER_LIST::iterator ActionIter;
|
|
for( ActionIter = m_listActionTrigger.begin(); ActionIter != m_listActionTrigger.end(); ++ActionIter )
|
|
{
|
|
ActionTriggerEx* pAction = static_cast<ActionTriggerEx*>(*ActionIter);
|
|
if( pAction )
|
|
{
|
|
pAction->SetbDone(bDone);
|
|
pAction->OnAction();
|
|
}
|
|
}
|
|
m_state = ACTIONUPDATE_STATE;
|
|
}
|
|
|
|
VOID Trigger::OnMsg( TRIGGER_MSG * pMsg, BOOL bDone )
|
|
{
|
|
// Active된 trigger만 들어 온다!!!!!!
|
|
CONDITION_TRIGGER_LIST::iterator ConditionIter;
|
|
for( ConditionIter = m_listConditionTrigger.begin(); ConditionIter != m_listConditionTrigger.end(); ++ConditionIter )
|
|
{
|
|
ConditionTriggerEx* pCondition = static_cast<ConditionTriggerEx*>(*ConditionIter);
|
|
if( pCondition )
|
|
{
|
|
// 조건체크후 만족하면 전체 만족 여부 체크
|
|
if( TRUE == pCondition->OnMsg( pMsg ) )
|
|
{
|
|
if(m_pTriggerInfo->IsAlways() && pCondition->GetAlwaysAction())
|
|
{
|
|
_Action(bDone);
|
|
pCondition->SetAlwaysAction(FALSE);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
VOID Trigger::_createCondition(ConditionInfo* pTrigger)
|
|
{
|
|
ConditionTriggerEx* 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)
|
|
__TRIGGER_CREATE_CASE(CONDITION_HAVE_ITEM)
|
|
__TRIGGER_CREATE_CASE(CONDITION_MULTI_SWITCH)
|
|
__TRIGGER_CREATE_CASE(CONDITION_MISSION_POINT)
|
|
__TRIGGER_CREATE_CASE(CONDITION_COMPARE_VARIABLE)
|
|
__TRIGGER_CREATE_CASE(CONDITION_QUEST_PROGRESS)
|
|
__TRIGGER_CREATE_CASE(CONDITION_CHECK_CLASS_ID)
|
|
__TRIGGER_CREATE_CASE(CONDITION_NPCKILL_FOR_UNITID)
|
|
__TRIGGER_CREATE_CASE(CONDITION_LIVE_PARTY_MEMBER)
|
|
__TRIGGER_CREATE_CASE(CONDITION_CHECK_OBJECT_HP)
|
|
__TRIGGER_CREATE_CASE(CONDITION_DESTROY_OBJECT)
|
|
__TRIGGER_CREATE_CASE(CONDITION_CHECK_OBJECTKIND_HP)
|
|
__TRIGGER_CREATE_CASE(CONDITION_NPC_ENTER_AREA)
|
|
|
|
//_NA_004777_20120428_ADD_COMPLETE_COLLECTION_TRIGGER
|
|
__TRIGGER_CREATE_CASE(CONDITION_COMPLETE_COLLECTION)
|
|
__TRIGGER_CREATE_CASE(CONDITION_SERVER_EVENT)
|
|
__TRIGGER_CREATE_CASE(CONDITION_CHECK_TEAM)
|
|
__TRIGGER_CREATE_CASE(CONDITION_COMPARE_SWITCH_EX)
|
|
__TRIGGER_CREATE_CASE(CONDITION_MONSTER_ENTER_AREA)
|
|
__TRIGGER_EXCEPT("등록되지 않은 컨디션 트리거입니다.1")
|
|
__TRIGGER_END_SWITCH
|
|
|
|
if (pITrigger != NULL)
|
|
{
|
|
pITrigger->Init(m_pTriggerManager, this);
|
|
m_listConditionTrigger.push_back(pITrigger);
|
|
}
|
|
}
|
|
|
|
VOID Trigger::_createAction( ActionInfo* pTrigger )
|
|
{
|
|
ActionTriggerEx* 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_CREATE_CASE( ACTION_RANDOM_MAP_MOVE )
|
|
__TRIGGER_CREATE_CASE( ACTION_QUEST_SATISFACTION )
|
|
__TRIGGER_CREATE_CASE( ACTION_QUEST_GRANT )
|
|
__TRIGGER_CREATE_CASE( ACTION_QUEST_SETUP )
|
|
__TRIGGER_CREATE_CASE( ACTION_CREATE_MONSTER_GROUP )
|
|
__TRIGGER_CREATE_CASE( ACTION_SHOW_OR_HIDE_UNIT )
|
|
__TRIGGER_CREATE_CASE( ACTION_SHOW_GUIDE_MSGBOX )
|
|
__TRIGGER_CREATE_CASE( ACTION_SHOW_OR_HIDE_MSGBOX )
|
|
__TRIGGER_CREATE_CASE( ACTION_RANDOM_AREA_MOVE )
|
|
__TRIGGER_CREATE_CASE( ACTION_RANDOM_MONSTER_SPAWN )
|
|
__TRIGGER_CREATE_CASE( ACTION_TOWER_OF_TRIAL_SHOW_THE_FLOOR )
|
|
__TRIGGER_CREATE_CASE( ACTION_REMOVE_MONSTER )
|
|
__TRIGGER_CREATE_CASE( ACTION_ADD_EXP )
|
|
__TRIGGER_CREATE_CASE( ACTION_MONSTER_STAT_UP_OR_DOWN )
|
|
__TRIGGER_CREATE_CASE( ACTION_RANDUM_TRIGER_ON_OR_OFF )
|
|
__TRIGGER_CREATE_CASE( ACTION_PLAY_MUSIC )
|
|
|
|
|
|
__TRIGGER_CREATE_CASE( ACTION_DOWN_OBJETC_HP )
|
|
__TRIGGER_CREATE_CASE( ACTION_CHANGE_ATTACK_KIND )
|
|
__TRIGGER_CREATE_CASE( ACTION_ACTIVE_STAMP )
|
|
|
|
__TRIGGER_CREATE_CASE( ACTION_ATTACK_OBJECTKIND )
|
|
__TRIGGER_CREATE_CASE( ACTION_ACTIVE_SKILL_OBJECTKIND )
|
|
__TRIGGER_CREATE_CASE( ACTION_SHOW_MESSAGEBOX_OBJECTKIND )
|
|
__TRIGGER_CREATE_CASE( ACTION_SET_ATTACK_STATE_OBJECTKIND )
|
|
__TRIGGER_CREATE_CASE( ACTION_DESTROY_OBJECTKIND )
|
|
__TRIGGER_CREATE_CASE( ACTION_CREATE_MONSTER_LINKED_MAPOBJECT )
|
|
|
|
__TRIGGER_CREATE_CASE(ACTION_CONTROL_TIMER)
|
|
|
|
__TRIGGER_CREATE_CASE(ACTION_DO_COMMAND)
|
|
__TRIGGER_CREATE_CASE(ACTION_MOVE_CONTROL)
|
|
__TRIGGER_CREATE_CASE(ACTION_ANIMATION_CONTROL)
|
|
|
|
__TRIGGER_CREATE_CASE(ACTION_NPC_APPLY_DAMAGE)
|
|
|
|
//_NA_004777_20120428_ADD_COMPLETE_COLLECTION_TRIGGER
|
|
__TRIGGER_CREATE_CASE(ACTION_COMPLETE_COLLECTION)
|
|
__TRIGGER_CREATE_CASE(ACTION_APPLY_HPMPSD)
|
|
__TRIGGER_CREATE_CASE(ACTION_CHANGE_OBJECT_HP)
|
|
__TRIGGER_CREATE_CASE(ACTION_CHANGE_RADAR_MAP)
|
|
__TRIGGER_CREATE_CASE(ACTION_ATTACH_STATE_RANGE)
|
|
__TRIGGER_CREATE_CASE(ACTION_CHANGE_PLAYER_HP)
|
|
|
|
__TRIGGER_EXCEPT( "등록되지 않은 액션 트리거입니다.1" )
|
|
__TRIGGER_END_SWITCH
|
|
|
|
if (pITrigger != NULL)
|
|
{
|
|
pITrigger->Init( m_pTriggerManager, this );
|
|
m_listActionTrigger.push_back( pITrigger );
|
|
}
|
|
}
|
|
|
|
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_DESTROY_CASE( CONDITION_COMPARE_VARIABLE )
|
|
__TRIGGER_DESTROY_CASE( CONDITION_QUEST_PROGRESS )
|
|
__TRIGGER_DESTROY_CASE( CONDITION_CHECK_CLASS_ID )
|
|
__TRIGGER_DESTROY_CASE( CONDITION_NPCKILL_FOR_UNITID )
|
|
__TRIGGER_DESTROY_CASE( CONDITION_LIVE_PARTY_MEMBER )
|
|
__TRIGGER_DESTROY_CASE( CONDITION_CHECK_OBJECT_HP )
|
|
__TRIGGER_DESTROY_CASE( CONDITION_DESTROY_OBJECT )
|
|
__TRIGGER_DESTROY_CASE( CONDITION_CHECK_OBJECTKIND_HP )
|
|
__TRIGGER_DESTROY_CASE( CONDITION_NPC_ENTER_AREA )
|
|
|
|
//_NA_004777_20120428_ADD_COMPLETE_COLLECTION_TRIGGER
|
|
__TRIGGER_DESTROY_CASE(CONDITION_COMPLETE_COLLECTION)
|
|
__TRIGGER_DESTROY_CASE(CONDITION_SERVER_EVENT)
|
|
__TRIGGER_DESTROY_CASE(CONDITION_CHECK_TEAM)
|
|
__TRIGGER_DESTROY_CASE(CONDITION_COMPARE_SWITCH_EX)
|
|
__TRIGGER_DESTROY_CASE(CONDITION_MONSTER_ENTER_AREA)
|
|
__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_DESTROY_CASE( ACTION_RANDOM_MAP_MOVE )
|
|
__TRIGGER_DESTROY_CASE( ACTION_QUEST_SATISFACTION )
|
|
__TRIGGER_DESTROY_CASE( ACTION_QUEST_GRANT )
|
|
__TRIGGER_DESTROY_CASE( ACTION_QUEST_SETUP )
|
|
__TRIGGER_DESTROY_CASE( ACTION_CREATE_MONSTER_GROUP )
|
|
__TRIGGER_DESTROY_CASE( ACTION_SHOW_OR_HIDE_UNIT )
|
|
__TRIGGER_DESTROY_CASE( ACTION_SHOW_GUIDE_MSGBOX )
|
|
__TRIGGER_DESTROY_CASE( ACTION_SHOW_OR_HIDE_MSGBOX )
|
|
__TRIGGER_DESTROY_CASE( ACTION_RANDOM_AREA_MOVE )
|
|
__TRIGGER_DESTROY_CASE( ACTION_RANDOM_MONSTER_SPAWN )
|
|
__TRIGGER_DESTROY_CASE( ACTION_TOWER_OF_TRIAL_SHOW_THE_FLOOR )
|
|
__TRIGGER_DESTROY_CASE( ACTION_REMOVE_MONSTER )
|
|
__TRIGGER_DESTROY_CASE( ACTION_ADD_EXP )
|
|
__TRIGGER_DESTROY_CASE( ACTION_MONSTER_STAT_UP_OR_DOWN )
|
|
__TRIGGER_DESTROY_CASE( ACTION_RANDUM_TRIGER_ON_OR_OFF )
|
|
__TRIGGER_DESTROY_CASE( ACTION_PLAY_MUSIC )
|
|
|
|
__TRIGGER_DESTROY_CASE( ACTION_DOWN_OBJETC_HP )
|
|
__TRIGGER_DESTROY_CASE( ACTION_CHANGE_ATTACK_KIND )
|
|
__TRIGGER_DESTROY_CASE( ACTION_ACTIVE_STAMP )
|
|
|
|
__TRIGGER_DESTROY_CASE( ACTION_ATTACK_OBJECTKIND )
|
|
__TRIGGER_DESTROY_CASE( ACTION_ACTIVE_SKILL_OBJECTKIND )
|
|
__TRIGGER_DESTROY_CASE( ACTION_SHOW_MESSAGEBOX_OBJECTKIND )
|
|
__TRIGGER_DESTROY_CASE( ACTION_SET_ATTACK_STATE_OBJECTKIND )
|
|
__TRIGGER_DESTROY_CASE( ACTION_DESTROY_OBJECTKIND )
|
|
__TRIGGER_DESTROY_CASE( ACTION_CREATE_MONSTER_LINKED_MAPOBJECT )
|
|
|
|
__TRIGGER_DESTROY_CASE(ACTION_CONTROL_TIMER)
|
|
|
|
__TRIGGER_DESTROY_CASE(ACTION_DO_COMMAND)
|
|
|
|
__TRIGGER_DESTROY_CASE(ACTION_MOVE_CONTROL)
|
|
__TRIGGER_DESTROY_CASE(ACTION_ANIMATION_CONTROL)
|
|
|
|
__TRIGGER_DESTROY_CASE( ACTION_NPC_APPLY_DAMAGE )
|
|
|
|
//_NA_004777_20120428_ADD_COMPLETE_COLLECTION_TRIGGER
|
|
__TRIGGER_DESTROY_CASE(ACTION_COMPLETE_COLLECTION)
|
|
__TRIGGER_DESTROY_CASE(ACTION_APPLY_HPMPSD)
|
|
__TRIGGER_DESTROY_CASE(ACTION_CHANGE_OBJECT_HP)
|
|
__TRIGGER_DESTROY_CASE(ACTION_CHANGE_RADAR_MAP)
|
|
__TRIGGER_DESTROY_CASE(ACTION_ATTACH_STATE_RANGE)
|
|
__TRIGGER_DESTROY_CASE(ACTION_CHANGE_PLAYER_HP)
|
|
|
|
__TRIGGER_EXCEPT( "등록되지 않은 액션 트리거입니다.2" )
|
|
__TRIGGER_END_SWITCH
|
|
}
|
|
|
|
VOID Trigger::_OnAction()
|
|
{
|
|
}
|