📄 conditiontriggers.cpp
字号:
#include "StdAfx.h"
#include ".\conditiontriggers.h"
#include ".\TriggerManager.h"
#include ".\TriggerMsg.h"
#include ".\Trigger.h"
#include ".\Player.h"
#include ".\ItemManager.h"
#include ".\MissionManager.h"
#include "TriggerAreaHash.h"
__IMPL_POOL(CONDITION_ALWAYS)
VOID CONDITION_ALWAYS::OnInit()
{
setSatisfied( TRUE );
}
__IMPL_POOL(CONDITION_COMPARE_SWITCH)
BOOL CONDITION_COMPARE_SWITCH::IsSatisfied()
{
if( m_bSatisfied ) return TRUE;
// OPT //@@@@@@ 器牢磐肺 固府(OnInit()) 历厘秦狄栏肺结 弥利拳 啊瓷
BYTE Value = getMGR()->GetSwitchValue( Get()->GetSwitchID() );
sSWITCH ( Get()->GetOperationType() )
CASE(eCOMPARE_EQUAL)
if( Value == Get()->GetValue() ) setSatisfied( TRUE );
CASE(eCOMPARE_MORE)
if( Value > Get()->GetValue() ) setSatisfied( TRUE );
CASE(eCOMPARE_LESS)
if( Value < Get()->GetValue() ) setSatisfied( TRUE );
CASE(eCOMPARE_LESSTHAN)
if( Value <= Get()->GetValue() ) setSatisfied( TRUE );
CASE(eCOMPARE_MORETHAN)
if( Value >= Get()->GetValue() ) setSatisfied( TRUE );
CASE(eCOMPARE_NOTEQUAL)
if( Value != Get()->GetValue() ) setSatisfied( TRUE );
eSWITCH
return m_bSatisfied;
}
__IMPL_POOL(CONDITION_CLICK_OBJECT)
VOID CONDITION_CLICK_OBJECT::onMsg( TRIGGER_MSG * pmsg )
{
switch( pmsg->m_dwMsgID )
{
case eTRIGGER_CLICK_OBJECT:
{
TRIGGER_CLICK_OBJECT * pMsg = (TRIGGER_CLICK_OBJECT *)pmsg;
ASSERT( Get()->GetObjectID() >= 0 );
if( pMsg->m_dwObjectKey == (DWORD)Get()->GetObjectID() )
{
getParent()->SetClickedUserKey( pMsg->m_dwUserKey );
SUNLOG( eFULL_LOG, "[CONDITION_CLICK_OBJECT::onMsg] [ID:%u]:CONDITION_CLICK_OBJECT", getParent()->TriggerID() );
setSatisfied( TRUE );
}
}
break;
}
}
VOID CONDITION_CLICK_OBJECT::OnReset()
{
getParent()->SetClickedUserKey( 0 );
}
__IMPL_POOL(CONDITION_DAMAGE_OBJECT)
VOID CONDITION_DAMAGE_OBJECT::onMsg( TRIGGER_MSG * pmsg )
{
switch( pmsg->m_dwMsgID )
{
case eTRIGGER_DAMAGE_OBJECT:
{
TRIGGER_DAMAGE_OBJECT * pMsg = (TRIGGER_DAMAGE_OBJECT *)pmsg;
ASSERT( Get()->GetObjectID() >= 0 );
if( pMsg->m_dwObjectKey == (DWORD)Get()->GetObjectID() )
{
/*
//捞康开俊 敲饭捞绢啊 乐绰瘤 眉农
MapObject * pMapObject = getMGR()->FindMapObject( m_pCondition->m_iObjectID );
ASSERT(NULL != pMapObject);
DEBUG_CODE( if( !pMapObject ) return FALSE; );
if( pMapObject->GetHP() <= m_pCondition->m_fDamage )
{
SUNLOG( eFULL_LOG, "[ID:%u]:TriggerDamageObjectCondition", m_pContainer->GetID() );
setSatisfied( TRUE );
}
*/
}
}
break;
}
}
__IMPL_POOL(CONDITION_COUNT_NPCKILL)
VOID CONDITION_COUNT_NPCKILL::OnInstanciate()
{
m_PartyMemberHash.Initialize(MAX_PARTYMEMBER_NUM);
}
VOID CONDITION_COUNT_NPCKILL::OnInit()
{
m_PartyMemberHash.RemoveAll();
memset( m_PartyMember, 0, sizeof(PARTY_MEMBER)*MAX_PARTYMEMBER_NUM );
}
VOID CONDITION_COUNT_NPCKILL::onMsg( TRIGGER_MSG * pmsg )
{
switch( pmsg->m_dwMsgID )
{
case eTRIGGER_KILL_MONSTER:
{
TRIGGER_KILL_MONSTER * pMsg = (TRIGGER_KILL_MONSTER *)pmsg;
if( PARTY == Get()->GetIsParty() )
{
// 颇萍
ASSERT( Get()->GetMonsterCode() >= 0 );
if( pMsg->m_dwMonsterCode == (DWORD)Get()->GetMonsterCode() )
{
++m_PartyMember[0].m_iKillCount;
}
if( m_PartyMember[0].m_iKillCount == Get()->GetKillCount() )
{
SUNLOG( eFULL_LOG, "[CONDITION_COUNT_NPCKILL::onMsg] [ID:%u]:CONDITION_COUNT_NPCKILL(MONSTER:%d)", getParent()->TriggerID(), Get()->GetMonsterCode() );
setSatisfied( TRUE );
}
}
else
{
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// 瘤陛 颇萍矫俊 阁胶磐甫 磷牢 敲饭捞绢 沥焊甫 掘阑 荐 啊 绝促.!!!
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
if( Get()->GetMethod() == METHOD_GENERAL )
{
PARTY_MEMBER * pPartyMember = m_PartyMemberHash.GetData( pMsg->m_dwObjectKey );
if( pPartyMember )
{
// 乐栏搁
if( pMsg->m_dwMonsterCode == (DWORD)Get()->GetMonsterCode() )
{
++pPartyMember->m_iKillCount;
pPartyMember->m_iKillCount = BOUND_CHECK( 0, pPartyMember->m_iKillCount, Get()->GetKillCount() );
}
}
else
{
// 绝栏搁
int i = 0;
while( i < MAX_PARTYMEMBER_NUM )
{
if( 0 == m_PartyMember[i].m_dwPlayerKey )
{
// 后浇吩
m_PartyMember[i].m_dwPlayerKey = pMsg->m_dwObjectKey;
if( pMsg->m_dwMonsterCode == (DWORD)Get()->GetMonsterCode() )
{
++m_PartyMember[i].m_iKillCount;
m_PartyMember[i].m_iKillCount = BOUND_CHECK( 0, m_PartyMember[i].m_iKillCount, Get()->GetKillCount() );
}
m_PartyMemberHash.Add( &m_PartyMember[i], m_PartyMember[i].m_dwPlayerKey );
break;
}
++i;
}
}
BOOL bSuccess = TRUE;
m_PartyMemberHash.SetFirst();
while( ( pPartyMember = m_PartyMemberHash.GetNext() ) != NULL )
{
if( pPartyMember->m_iKillCount != Get()->GetKillCount() )
{
bSuccess = FALSE;
break;
}
}
if( bSuccess )
{
SUNLOG( eFULL_LOG, "[CONDITION_COUNT_NPCKILL::onMsg] [ID:%u]:CONDITION_COUNT_NPCKILL老馆", getParent()->TriggerID() );
setSatisfied( TRUE );
}
}
else if( Get()->GetMethod() == METHOD_ACCUMULATE )
{
if( pMsg->m_dwMonsterCode == (DWORD)Get()->GetMonsterCode() )
{
++m_PartyMember[0].m_iKillCount;
}
if( m_PartyMember[0].m_iKillCount >= Get()->GetKillCount()*(int)getMGR()->GetPlayerNum() )
{
SUNLOG( eFULL_LOG, "[CONDITION_COUNT_NPCKILL::onMsg] [ID:%u]:CONDITION_COUNT_NPCKILL(MONSTER:%d)穿利", getParent()->TriggerID(), Get()->GetMonsterCode() );
setSatisfied( TRUE );
}
}
}
}
break;
}
}
__IMPL_POOL(CONDITION_PASS_TIME)
VOID CONDITION_PASS_TIME::OnInit()
{
m_dwStartTick = GetTickCount();
}
BOOL CONDITION_PASS_TIME::IsSatisfied()
{
if( m_bSatisfied ) return TRUE;
if( m_dwStartTick + Get()->GetPassTime() <= GetTickCount() )
{
setSatisfied( TRUE );
}
return m_bSatisfied;
}
class AddSatisfiedPlayer
{
Trigger * m_pTrigger;
BOOL m_bChanged;
public:
AddSatisfiedPlayer(Trigger * po):m_pTrigger(po),m_bChanged(FALSE){}
~AddSatisfiedPlayer(){}
BOOL IsChanged() { return m_bChanged; }
BOOL operator()( DWORD UserKey )
{
Player * pPlayer = PlayerManager::Instance()->FindPlayer( UserKey );
if( !pPlayer || !pPlayer->GetField() )
{
m_bChanged = TRUE;
return FALSE;
}
m_pTrigger->AddSatisfiedPlayer( pPlayer );
return TRUE;
}
};
__IMPL_POOL(CONDITION_ENTER_AREA)
VOID CONDITION_ENTER_AREA::OnInit()
{
getParent()->RemoveAllSatisfiedPlayer();
}
VOID CONDITION_ENTER_AREA::OnReset()
{
getParent()->RemoveAllSatisfiedPlayer();
setSatisfied(FALSE);
}
BOOL CONDITION_ENTER_AREA::IsSatisfied()
{
if( m_bSatisfied ) return TRUE;
if( getMGR()->GetPlayerNumForAreaID(Get()->GetAreaID()) == Get()->GetPlayerCount() )
{
// 炼扒俊 父练茄促.
// 敲饭捞绢狼 蜡瓤己 眉农
// 蜡瓤窍瘤 臼绰促搁, 敲饭绢 力芭
AddSatisfiedPlayer op(getParent());
getMGR()->For_EachPlayerInArea(Get()->GetAreaID(), op);
if( !op.IsChanged() )
{
setSatisfied( TRUE );
}
}
return m_bSatisfied;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -