📄 trackstate.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 + -