Files
Sun1602/Client/GameClient/Trigger.cpp
T
2022-10-26 12:25:11 +08:00

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()
{
}