⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 conditiontriggers.cpp

📁 奇迹世界 部分源代码奇迹世界 部分源代码奇迹世界 部分源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#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 + -