📄 runawaystate.cpp
字号:
#include "stdafx.h"
#include "RunAwayState.h"
#include "Field.h"
#include <Timer.h>
#include <Define.h>
#include <SinTable.h>
#include "Player.h"
#include "AIParamParser.h"
RunAwayState::RunAwayState()
{
m_pRunAwayTimer = new util::Timer;
}
RunAwayState::~RunAwayState()
{
SAFE_DELETE( m_pRunAwayTimer );
}
VOID RunAwayState::Init()
{
__asm nop;
}
VOID RunAwayState::OnEnter( LPARAM param1, LPARAM param2, LPARAM param3 )
{
State::OnEnter( param1, param2, param3 );
m_pNPC->GetPos( &m_vTargetPos );
m_bTouchedSomething = FALSE;
// 档噶啊具且 利阑 茫酒辑 鸥百苞 困摹甫 悸泼茄促.
Player *pTarget = PlayerManager::Instance()->FindPlayerForObjectKey( param1 );
if( pTarget )
{
m_pNPC->SetTargetChar( (Character*)pTarget );
pTarget->GetPos( & m_vTargetPos );
}
// 档噶啊具且 矫埃阑 悸泼茄促.
AIParamInfo& stAIParamInfo = AIParamParser::Instance()->GetInfo();
if( param1 )
{
m_pRunAwayTimer->SetTimer( param2 );
}
else
{
m_pRunAwayTimer->SetTimer( stAIParamInfo.m_wRUNAWAY_TIME );
}
}
VOID RunAwayState::OnExit()
{
State::OnExit();
}
VOID RunAwayState::OnUpdate( DWORD dwDeltaTick )
{
__UNUSED( dwDeltaTick );
if( !m_pNPC->IsMoving() )
{
RunAway();
}
if( m_pRunAwayTimer->IsExpired() )
{
if( m_pNPC->GetTargetChar() )
{
m_pNPC->ChangeState( STATE_ID_HELP );
}
else
{
m_pNPC->SetTargetChar( NULL );
m_pNPC->ChangeState( STATE_ID_IDLE );
}
}
}
VOID RunAwayState::RunAway()
{
// 捞悼且 芭府甫 备茄促.
AIParamInfo& stAIParamInfo = AIParamParser::Instance()->GetInfo();
float MOVE_DISTANCE = random( stAIParamInfo.m_fMIN_MOVE_DISTANCE*10, stAIParamInfo.m_fMAX_MOVE_DISTANCE*10 ) / 10.f;
WzVector wvCurPos, wvDestPos, wvMovement;
m_pNPC->GetPos( &wvCurPos );
Field *pField = m_pNPC->GetField();
if( !pField ) return;
// 捞傈 辨茫扁俊辑 公攫啊俊 搓篮 版快 60档 雀傈矫虐绊, 弊犯瘤 臼促搁 罚待茄 规氢栏肺 器牢泼
if( m_bTouchedSomething )
{
m_bTouchedSomething = FALSE;
wvMovement = m_wvRotatedVector;
}
else
{
VectorNormalize( &wvMovement, &( wvCurPos - m_vTargetPos ) );
wvMovement.x *= MOVE_DISTANCE;
wvMovement.y *= MOVE_DISTANCE;
}
wvMovement.z = 2.f;
wvDestPos = wvCurPos + wvMovement;
if( !pField->FindPath( m_pNPC, &wvDestPos ) )
{
// 厘局拱俊 搓疽促绰 钎矫甫 窍绊 瘤陛 啊妨绰 规氢俊辑 60档 雀傈矫挪 氦磐甫 备秦敌促.
m_bTouchedSomething = TRUE;
WzVector wvDistanceWantToMove;
wvDistanceWantToMove = wvDestPos - wvCurPos;
m_wvRotatedVector.x = wvDistanceWantToMove.x * FCOS(stAIParamInfo.m_wSEARCH_ROTATE_ANGLE) + wvDistanceWantToMove.y * FSIN(stAIParamInfo.m_wSEARCH_ROTATE_ANGLE);
m_wvRotatedVector.y = -wvDistanceWantToMove.x * FSIN(stAIParamInfo.m_wSEARCH_ROTATE_ANGLE) + wvDistanceWantToMove.y * FCOS(stAIParamInfo.m_wSEARCH_ROTATE_ANGLE);
m_wvRotatedVector.z = 0.0f;
return;
}
m_pNPC->SetMoveState( CMS_RUN );
// 菩哦 焊郴扁
MSG_CG_SYNC_MOVE_THRUST_BRD sendMsg;
sendMsg.m_byCategory = CG_SYNC;
sendMsg.m_byProtocol = CG_SYNC_MOVE_THRUST_BRD;
sendMsg.m_dwObjectKey = m_pNPC->GetObjectKey();
sendMsg.m_byState = CMS_RUN;
sendMsg.wTileIndex = m_pNPC->GetPathExplorer()->GetTile();
sendMsg.wvCurPos = wvCurPos;
sendMsg.wvDestPos = wvDestPos;
m_pNPC->SendPacketAround( &sendMsg, sizeof(sendMsg) );
}
// 饭明绊 公矫
VOID RunAwayState::OnMsgLetsGo( AI_MSG *pMsg )
{
}
// 利 惯斑 公矫
VOID RunAwayState::OnMsgEnemyFound( AI_MSG *pMsg )
{
}
// 档噶惑怕啊 场唱搁 Follow(Idle)惑怕肺 汗蓖茄促.
VOID RunAwayState::OnMsgCommandFollow( AI_MSG *pMsg )
{
m_pNPC->SetTargetChar( NULL );
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -