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

📄 npc.cpp

📁 奇迹世界 部分源代码奇迹世界 部分源代码奇迹世界 部分源代码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	return m_pTargetChar ? TRUE : FALSE;
	//return !m_pBattleRecord.IsEmpty();
}

VOID NPC::AddAttackPoint( Character* pAttacker, int attackPoint )
{
	if( !pAttacker )				return;
	if( IsFriend( pAttacker ) )		return;

	BATTLE_RECORD* pRecord = m_pBattleRecord->Get( pAttacker->GetObjectKey() );
	if( pRecord == NULL )
	{
		// 唱甫 贸澜 傍拜茄 敲饭捞绢扼搁 弥檬 傍拜 痢荐甫 霖促.
		BOOL bFirstAttacker = FALSE;
		if( m_pBattleRecord->IsEmpty() )
		{
			bFirstAttacker = TRUE;
		}
		pRecord = m_pBattleRecord->Add( pAttacker, bFirstAttacker );
	}

	pRecord->IncAttackPoint( attackPoint );
}

VOID NPC::AddTotalPoint( Character* pAttacker, int TotalkPoint )
{
	if( !pAttacker )				return;
	if( IsFriend( pAttacker ) )		return;

	BATTLE_RECORD* pRecord = m_pBattleRecord->Get( pAttacker->GetObjectKey() );
	if (pRecord == NULL)
	{
		// 唱甫 贸澜 傍拜茄 敲饭捞绢扼搁 弥檬 Total 痢荐甫 霖促.
		BOOL bFirstAttacker = FALSE;
		if( m_pBattleRecord->IsEmpty() )
		{
			bFirstAttacker = TRUE;
		}
		pRecord = m_pBattleRecord->Add( pAttacker, bFirstAttacker );
	}

	pRecord->IncTotalPoint(TotalkPoint);
}

VOID NPC::AllRegisterBattleRecord()
{
	Character *pTargetArray[MAX_TARGET_NUM];
	memset( pTargetArray, 0, sizeof(Character*)*MAX_TARGET_NUM );
	BYTE byNumberOfTargets = 0;

	Field* pField = GetField();
	if( !pField )	return;

	WzVector vNPCPos;	GetPos( &vNPCPos );

	byNumberOfTargets = pField->FindTargetsByPosition( pTargetArray, GetSectorIndex(), vNPCPos, 
		GetSightRange(), 10 );

	for( int i = 0; i < byNumberOfTargets; ++i )
	{
		if( !pTargetArray[i] )			continue;
		if( pTargetArray[i]->IsDead() ) continue;

		AddAttackPoint( pTargetArray[i], 0 );

#ifdef __AGGRO_TEST__
		////////////////////////////////////////////////////////////////////////////////////////////////
		//!! 烙矫抛胶飘甫 困茄 菩哦!!! => 昏力且 巴!!
		////////////////////////////////////////////////////////////////////////////////////////////////
		BattleRecord* pRecord = GetBattleRecord();

		DWORD dwTotalPoint = 0;
		DWORD dwAttackPoint = 0;
		if( NULL != pRecord )
		{
			BATTLE_RECORD* pUnitRecord = pRecord->Get(pTargetArray[i]->GetObjectKey());
			if(NULL != pUnitRecord )
			{
				dwTotalPoint = pUnitRecord->GetTotalPoint();
				dwAttackPoint = pUnitRecord->GetAttackPoint();
			}
			else
			{
				dwTotalPoint = 0;
				dwAttackPoint= 0;
			}
		}

		char m_TempLog[255];
		memset(m_TempLog, 0x00, 255);

		sprintf(m_TempLog, "T[%d],A[%d]", dwTotalPoint, dwAttackPoint);

		MSG_CG_CONVERSATION_FIELDCHAT_BRD chatMsg;
		chatMsg.m_byCategory = CG_CONVERSATION;
		chatMsg.m_byProtocol = CG_CONVERSATION_FIELDCHAT_BRD;
		chatMsg.m_dwObjectKey = pTargetArray[i]->GetObjectKey();
		chatMsg.m_byMsgLength = 100;
		strncpy((char*)&(chatMsg.m_pszChatMsg), m_TempLog,255);

		SendPacketAround( &chatMsg, chatMsg.m_byMsgLength );
		////////////////////////////////////////////////////////////////////////////////////////////////
#endif
	}
}

// 林函俊辑 利阑 茫酒辑 弊 器牢磐甫 府畔茄促.
Character* NPC::SearchTarget()
{
	Field *pField = GetField();
	if( !pField ) return NULL;

	eTARGET_SEARCH_TYPE eSearchType = eRARGET_SEARCH_NEAREST;

	switch( m_pBaseInfo->m_wAttitude )
	{
	case ATTACK_ATTITUDE_AFTER:
		return NULL;
	case ATTACK_ATTITUDE_ONE_TARGET:
		if( m_pTargetChar )		return NULL;
	case ATTACK_ATTITUDE_LOW_HP_FIRST:
		eSearchType = eRARGET_SEARCH_LOW_HP;
		break;
	case ATTACK_ATTITUDE_LOW_LEVEL_FIRST:
		eSearchType = eRARGET_SEARCH_LOW_LEVEL;
		break;
	case ATTACK_ATTITUDE_HIGH_MP_FIRST:
		eSearchType = eRARGET_SEARCH_HIGH_MP;
		break;
	}

	return pField->SearchTarget( this, eSearchType, SKILL_TARGET_ENEMY );
}

VOID NPC::AIMsgProgress()
{
	AI_MSG *pRecvMsg;
	WORD wSize;

	DWORD dwCurTick = GetTickCount();

	pRecvMsg = (AI_MSG*)m_pAIMessageQueue->RecvAIMessage( wSize );
	while( pRecvMsg )
	{
		if( dwCurTick > pRecvMsg->dwDeliveryTick )
		{
			m_pNPCStatusManager->GetCurState()->OnAIMsg( pRecvMsg );
		}
		else
		{
			// 皋技瘤 掉饭捞父怒 瘤唱瘤 臼疽栏搁 烙矫 钮俊 持绊 贸府窍瘤 臼绰促.
			// 掉饭捞蔼 促矫 持绢拎具窃...两摹救鸥 -_-;
			m_pTempMessageQueue->SendAIMessage( pRecvMsg, wSize, pRecvMsg->dwDeliveryTick - dwCurTick );			
		}

		m_pAIMessageQueue->Completion( wSize );

		pRecvMsg = (AI_MSG*)m_pAIMessageQueue->RecvAIMessage( wSize );
	}

	// 烙矫 钮俊 乐带 皋技瘤 促矫 笼绢 持扁
	pRecvMsg = (AI_MSG*)m_pTempMessageQueue->RecvAIMessage( wSize );
	while( pRecvMsg )
	{
		// 掉饭捞蔼 促矫 持绢拎具窃...两摹救鸥 -_-;
		m_pAIMessageQueue->SendAIMessage( pRecvMsg, wSize, pRecvMsg->dwDeliveryTick - dwCurTick );
		m_pTempMessageQueue->Completion( wSize );
		pRecvMsg = (AI_MSG*)m_pTempMessageQueue->RecvAIMessage( wSize );
	}
}

VOID NPC::RemoveEnemy( DWORD leaveEnemyKey )
{	
	if ( GetTargetChar()!=NULL && GetTargetChar()->GetObjectKey() == leaveEnemyKey )
	{
		SetTargetChar( NULL );
		SetTrackSlot( -1 );
	}

	m_pBattleRecord->Remove( leaveEnemyKey );
}

VOID NPC::SetTargetChar( Character *pTarget )
{
	// 捞固 汲沥登绢乐绰 利捞搁 促矫 汲沥且 鞘夸 绝促.
	if (m_pTargetChar == pTarget)
	{
		return;
	}

	if (m_pTargetChar != NULL)
	{
		// 扁粮狼 target篮 歹 捞惑 脚版 救敬促.
		m_pTargetChar->RemoveObserver( GetObjectKey() );
	}

	m_pTargetChar = pTarget;

	if (m_pTargetChar != NULL)
	{
		// 货 target阑 瘤难焊磊~
		m_pTargetChar->AddObserver( this );

		// 货肺款 鸥百阑 硅撇饭内靛俊 殿废秦林扁困秦辑 AddAttackPoint甫 龋免茄促.
		AddAttackPoint( pTarget, 0 );
	}
}

// NPC 府胶飘俊 眠啊
VOID NPC::OnEnterField(Field* pField, WzVector* pwzVec)
{
	Init();

	Character::OnEnterField(pField, pwzVec);
	SASSERT( GetField() != NULL, "GetField() == NULL" );

	BOOL bAdded = pField->AddNPC( this );
	SASSERT( bAdded, "bAdded" );
}

VOID NPC::OnLeaveField()
{
	SASSERT( GetField() != NULL, "GetField() == NULL" ); 

	LeaveGroup();

	Character::OnLeaveField();

	// release救俊辑 LeaveGroup()阑 秦霖促.
	Release();
}

VOID NPC::GroupCmdAttackToGroup( Character* pTargetChar )
{
	// 弊缝狼 府歹扼搁
	if( IsLeaderOfGroup() )
	{
		AI_MSG_GROUP_C0MMAND AIGroupCmdMsg;
		AIGroupCmdMsg.byType = GROUP_CMD_TYPE_ATTACK;
		AIGroupCmdMsg.dwTargetKey = pTargetChar->GetObjectKey();

		SendAIMessageToGroupExceptMe( &AIGroupCmdMsg, sizeof(AI_MSG_GROUP_C0MMAND) );
	}
}

VOID NPC::GroupCmdStopAttackToGroup()
{
	// 弊缝狼 府歹扼搁
	if( IsLeaderOfGroup() )
	{
		AI_MSG_GROUP_C0MMAND AIGroupCmdMsg;
		AIGroupCmdMsg.byType = GROUP_CMD_TYPE_STOP_ATTACK;

		SendAIMessageToGroupExceptMe( &AIGroupCmdMsg, sizeof(AI_MSG_GROUP_C0MMAND) );
	}
}

BOOL NPC::IsSamePositionWithTarget()
{
	WzVector vTargetPos, vMyPos;
	m_pTargetChar->GetPos( &vTargetPos );
	GetPos( &vMyPos );

	if( vMyPos == vTargetPos )
	{
		return TRUE;
	}
	else
	{
		return FALSE;
	}
}

VOID NPC::GetTrackPos( WzVector &wvDestPos )
{
	// 捞傈俊 眠利窍带 鸥百浇吩阑 Release茄促.
	m_pTargetChar->FreeEnemySlot( m_iTrackSlot );

	// 货肺款 鸥百浇吩阑 茫酒辑 沥焊甫 盎脚茄促.
	WzVector vMyPos;	GetPos( &vMyPos );
	m_iTrackSlot = m_pTargetChar->AllocEnemySlot( &vMyPos, wvDestPos, GetAttackRange() * 0.9f );
}

RC::ePACKET_SEND_RESULT NPC::SendPacketAround( MSG_BASE_FORWARD * pMsg, WORD wSize, BOOL bSendToMe )
{
	return Character::SendPacketAround( pMsg, wSize, bSendToMe );
}


BOOL NPC::OnResurrection( float fRecoverExp, float fRecoverHP, float fRecoverMP )
{
	if( Character::OnResurrection( fRecoverExp, fRecoverHP, fRecoverMP ) )
	{
		ChangeState( STATE_ID_IDLE );

		return TRUE;
	}

	return FALSE;
}


BOOL NPC::OnDead()
{
	SASSERT( GetHP() == 0, "GetHP() != 0" );

	ChangeState( STATE_ID_DEAD );

	// 鸥百苞 AIMessageQueue甫 檬扁拳茄促.
	SetTargetChar( NULL );
	m_pAIMessageQueue->Clear();

	return Character::OnDead();
}

BOOL NPC::ExecuteThrust( BOOL bForcedMove, WzVector *pwvMoveDistance, WzVector &wvPosAfterThrust, float fMoveDistance, BOOL bDownAfterThrust )
{
	Field *pField = GetField();
	if( !pField ) return FALSE;

	// 肯傈 沥瘤屈牢 版快 剐府啊啊 救等促.
	if( m_pBaseInfo->m_wMoveAttitude == eMOVE_ATTITUDE_ETERNAL_STOP )	return FALSE;

	// 惑怕俊 蝶扼辑 剐府扁啊 救瞪 荐档 乐促.
	if( !m_pStatusManager->CanThrustDown() )	return FALSE;
 
	// TODO: 剐府绰 规氢捞 绝绰 版快 巩力啊 积变促. 罚待栏肺??
	if (pwvMoveDistance->x == 0.0f && pwvMoveDistance->y == 0.0f )
	{
		pwvMoveDistance->x = 1.0f;
		WzVector wvTemp = *pwvMoveDistance;
		Math_ZRotateVector( &wvTemp, *pwvMoveDistance, rand() % 360 );
		*pwvMoveDistance = *pwvMoveDistance * fMoveDistance;
	}

	// NPC 剐府扁 贸府
	if( !pField->FindPathThrust( this, pwvMoveDistance, bForcedMove ) )
	{
		return FALSE;
	}

	if( !IsMoving() ) return FALSE;

	// 剐府扁 饶狼 捞悼 谅钎 掘扁
	wvPosAfterThrust = GetPathExplorer()->GetTargetPos();

	// NPC俊霸 剐府扁 皋技瘤甫 焊晨
	AI_MSG_THRUST thrustMsg;
	thrustMsg.bDownAfterThrust = bDownAfterThrust;	// 剐府扁 饶俊 促款 惑怕肺 逞绢哎 巴牢啊?
	SendAIMessage( &thrustMsg, sizeof(thrustMsg) );

	return TRUE;
}

BOOL NPC::IsTooCloseToTarget()
{
	// 鸥百捞 夯牢老 版快(伎橇鳃)
	if( m_pTargetChar == this )		return FALSE;

	// 呈公 啊鳖款 版快.. 坷洒妨 钢绢瘤磊
	// (!) Player狼 傍拜芭府尔 瞒捞啊 腹捞 唱绰 版快绰 敲饭捞绢啊 促啊啊搁 公炼扒 钢绢瘤绰 版氢阑 焊老 荐 乐促.
	//		--> 利寸洒 扁夯 傍拜芭府甫 烹老窍电瘤 倾侩 裹困甫 炼例窍电瘤 秦具且淀

	AIParamInfo& stAIParamInfo = AIParamParser::Instance()->GetInfo();

	WzVector vCurPos, vTargetPos;
	GetPos( &vCurPos );	m_pTargetChar->GetPos( &vTargetPos );
	float fDistToTarget2 = VectorLength2( &(vCurPos-vTargetPos) );

	// 鸥百苞狼 芭府啊 MAX_ATTACK_RANGE_LIMIT捞惑捞搁 弊成 傍拜->厘芭府牢 局甸捞 呈公 钢绢瘤绰吧 规瘤
	if( fDistToTarget2 < stAIParamInfo.m_fFALLAPART_MIN_ATTACK_RANGE_LIMIT*stAIParamInfo.m_fFALLAPART_MIN_ATTACK_RANGE_LIMIT )
	{
		return TRUE;
	}

	return FALSE;
}

BOOL NPC::CanFallApartFromTarget()
{
	WzVector vTargetPos;
	GetTrackPos( vTargetPos );

	// 1瞒 辨茫扁 矫档
	return GetField()->FindPath( this, &vTargetPos );
}


BOOL NPC::NeedToRetreatFromTarget()
{
	if( GetSelectedSkill() != SKILLCODE_NORMAL_ATTACK ) return FALSE;

	// 傍拜芭府啊 5m绰 逞绢具 饶硼 傍拜阑 茄促.
	AIParamInfo& stAIParamInfo = AIParamParser::Instance()->GetInfo();
	if (m_pTargetChar != NULL && GetAttackRange()>=stAIParamInfo.m_fRETREAT_MIN_DISTANCE_LIMIT)
	{
		float fDistToTarget = GetDistToTarget();
		float fMinAttackDist = GetAttackRange() * stAIParamInfo.m_fRETREAT_MIN_DISTANCE_LIMIT_RATIO;

		if (fDistToTarget < fMinAttackDist)
		{
			return TRUE;
		}
	}

	return FALSE;
}

// 鸥百焊促 利寸洒 臭篮 困摹俊 乐绊 荐乞 芭府档 面盒洒 啊鳖况具 痢橇且 荐 乐栏骨肺 眉农茄促.
BOOL NPC::IsOnGoodPositionToJump()

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -