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

📄 trackstate.cpp

📁 奇迹世界 部分源代码奇迹世界 部分源代码奇迹世界 部分源代码
💻 CPP
字号:
#include "stdafx.h"
#include <Timer.h>
#include <3DEngine/3DTerrain/AStarNode.h>
#include "TrackState.h"
#include "Field.h"
#include "FieldInfo.h"
#include <3DEngine/3DTerrain/WorldBase.h>
#include "PublicMath.h"
#include "AIParamParser.h"


TrackState::TrackState()
{
	m_pTrackTimer = new util::Timer;
	m_pReturnCheckTimer = new util::Timer;
}

TrackState::~TrackState()
{
	SAFE_DELETE( m_pTrackTimer );
	SAFE_DELETE( m_pReturnCheckTimer );
}

VOID TrackState::Init()
{
}

VOID TrackState::OnEnter( LPARAM param1, LPARAM param2, LPARAM param3 )
{
	State::OnEnter( param1, param2, param3 );

	m_pReturnCheckTimer->SetTimer( 2000 );

	// 傍拜 规过 急琶登绢 乐瘤 臼栏搁 急琶
	if( m_pNPC->GetSelectedSkill() == SKILLCODE_INVALID )
	{
		m_pNPC->SelectSkill();
	}
}

VOID TrackState::OnExit()
{
	State::OnExit();
}

VOID TrackState::OnUpdate( DWORD dwDeltaTick )
{
	__UNUSED(dwDeltaTick);

	Character *pTargetChar = m_pNPC->GetTargetChar();
	if( !pTargetChar )	return;
	WzVector vTargetPos;	pTargetChar->GetPos( &vTargetPos );
	AIParamInfo& stAIParamInfo = AIParamParser::Instance()->GetInfo();

	// 磊扁 康开阑 哈绢唱芭唱 鸥百苞狼 芭府啊 钢绢瘤搁 府畔 惑怕肺 傈捞
	if( m_pReturnCheckTimer->IsExpired() && !m_pNPC->IsFollowerOfGroup() )
	{
		if( m_pNPC->IsOutOfRegenLocationLimit( vTargetPos ) )
		{
			// 父距 弊缝狼 府歹捞搁 绿蝶备甸茄抛档 皋技瘤 焊晨
			if( m_pNPC->IsLeaderOfGroup() )
			{
				AI_MSG_CHANGESTATE AIMsg;
				AIMsg.byStateID = STATE_ID_RETURN;
				AIMsg.byMoveState = CMS_RUN;
				m_pNPC->SendAIMessageToGroupExceptMe( &AIMsg, sizeof(AIMsg), random(stAIParamInfo.m_wGROUP_AIMESSAGE_MIN_DELAY, stAIParamInfo.m_wGROUP_AIMESSAGE_MAX_DELAY) );
			}

			m_pNPC->ChangeState( STATE_ID_RETURN, CMS_RUN );
			m_pNPC->SetTargetChar( NULL );
			return;
		}
	}

	// 鸥百阑 傍拜且 荐 绝绰 惑怕捞搁 惑怕 傈捞
	if( !pTargetChar->CanBeAttacked() )
	{
		pTargetChar->FreeEnemySlot( m_pNPC->GetTrackSlot() );
		m_pNPC->SetTrackSlot( -1 );
		m_pNPC->ChangeState( STATE_ID_IDLE );
		return;
	}
	
	// 鸥百捞 傍拜 荤芭府 郴俊 甸绢乐栏搁 Attack 惑怕肺 傈捞
	if( m_pNPC->GetDistToTarget() <= m_pNPC->GetAttackRange() )
	{
		m_pNPC->ChangeState( STATE_ID_ATTACK );
		return;
	}

	if( m_pNPC->IsMoving() )
	{
		// NPC啊 捞固 顿绊 乐绰 版快

		//-----------------------------------------------------------------------------------------
		// n: 泅犁 NPC 谅钎
		// p: 泅犁 敲饭捞绢 谅钎
		// d: NPC狼 捞悼 格利 谅钎
		// a: 氦磐 n->d
		// b: 氦磐 n->p
		// 扼绊 且 锭 货肺 辨茫扁 窍绰 炼扒篮 促澜苞 鞍促.
		//
		// a客 b狼 阿捞 老沥 荐摹 捞惑 国绢瘤绊 p客 d客狼 芭府啊 NPC 傍拜 荤芭府甫 哈绢唱绰 版快
		//-----------------------------------------------------------------------------------------

		WzVector wvNPCPos, wvNPCDestPos;
		m_pNPC->GetPos( &wvNPCPos );
		wvNPCDestPos = m_pNPC->GetPathExplorer()->GetTargetPos();

		// 敲饭捞绢啊 NPC啊 顿妨绰 规氢狼 何盲裁阑 哈绢抄 阿俊 困摹窍绰啊?
		AIParamInfo& stAIParamInfo = AIParamParser::Instance()->GetInfo();
		BOOL bOutOfAngle = !Math_IsPositionInFanshapedArea( &vTargetPos, &wvNPCPos, &(wvNPCDestPos - wvNPCPos), stAIParamInfo.m_wTRACK_INNER_ANGLE );

		// 敲饭捞绢啊 NPC啊 顿妨绰 格利瘤俊辑 锭副 荐 绝绰 芭府俊 乐绰啊?
		BOOL bOutOfRange = VectorLength( &(wvNPCDestPos - vTargetPos) ) > m_pNPC->GetAttackRange();
		bOutOfRange = TRUE;

		if( m_pTrackTimer->IsExpired() && bOutOfAngle && bOutOfRange )
		{
//			printf( "捞悼吝 飘发 " );
			DoTrack();
		}
	}
	else
	{
		// NPC啊 顿绊 乐瘤 臼篮 版快
//		printf( "肛苗辑 飘发 " );
		DoTrack();
	}
}

VOID TrackState::DoTrack()
{
	Character *pTargetChar = m_pNPC->GetTargetChar();
	ASSERT( NULL != pTargetChar );

	WzVector vTargetPos, wvCurPos;
	pTargetChar->GetPos( &vTargetPos );
	m_pNPC->GetPos( &wvCurPos );

	// 痢橇 加己捞 乐绰 阁胶磐狼 版快 磊脚捞 痢橇 鸥老 困俊 辑乐栏搁 臭捞 魄窜饶 碍力 痢橇!
	if( m_pNPC->GetBaseInfo()->m_bJump )
	{
		if( m_pNPC->IsStandingOnJumpTile() && m_pNPC->IsOnGoodPositionToJump() )
		{
			float fJumpWaitingTick = Math_VectorLength( vTargetPos, wvCurPos ) * 60.0f;
			m_pNPC->ChangeState( STATE_ID_JUMP, STATE_ID_UNKNOWN, (LPARAM)fJumpWaitingTick );
			return;
		}
	}

	// 货肺款 Track Position阑 茫绰促.
	WzVector vTrackPos;
	m_pNPC->GetTrackPos( vTrackPos );

	// 鸥百捞 捞悼吝捞扼搁 捞悼 规氢 皑救秦辑 眠利痢 焊沥
	if( pTargetChar->IsMoving() )
	{
		WzVector wvPlayerDestPos = pTargetChar->GetPathExplorer()->GetTargetPos();
		// 鸥百 敲饭捞绢啊 NPC狼 馆措率栏肺 捞悼窍妨绰 版快俊父 焊沥
		if( !Math_IsPositionInFanshapedArea( &wvCurPos, &vTargetPos, &(wvPlayerDestPos - vTargetPos), 180 ) )
		{
			WzVector wvNormal;
			VectorNormalize( &wvNormal, &( wvPlayerDestPos - vTargetPos ) );
			wvNormal = wvNormal * 2.0f;
			vTrackPos = vTrackPos + wvNormal;
		}
	}

	// 辨茫扁
	if( !m_pNPC->MoveAndBroadcast( &vTrackPos, CMS_RUN ) )
	{
		// 角菩矫 Target苞 悼老 谅钎肺 促矫 辨茫扁
		if( !m_pNPC->MoveAndBroadcast( &vTargetPos, CMS_RUN ) )
		{
			// 弊贰档 角菩窍搁 惑怕 傈捞
			m_pNPC->ChangeState( STATE_ID_RETURN, CMS_RUN );
			m_pNPC->SetTargetChar( NULL );
		}
	}

	m_pTrackTimer->SetTimer( AIParamParser::Instance()->GetInfo().m_wTRACK_PERIOD );
}

VOID TrackState::OnMsgHelpRequest( AI_MSG *pMsg )
{
	// 利阑 眠利吝牢 版快俊绰 快急鉴困甫 魄窜秦辑 NewTarget阑 搬沥茄促.
}


// 饭明绊 公矫
VOID TrackState::OnMsgLetsGo( AI_MSG *pMsg )
{
	State::OnMsgLetsGo( pMsg );
}

// 利 惯斑 公矫
VOID TrackState::OnMsgEnemyFound( AI_MSG *pMsg )
{
}

⌨️ 快捷键说明

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