📄 summonidle.cpp
字号:
#include "stdafx.h"
#include "SummonIdle.h"
#include "Field.h"
#include <Timer.h>
#include "AIParamParser.h"
#include "Summoned.h"
#include "PublicMath.h"
#include "MoveStateControl.h"
SummonIdle::SummonIdle()
{
m_pTrackTimer = new util::Timer;
m_pSpawnTimer = new util::Timer;
}
SummonIdle::~SummonIdle()
{
SAFE_DELETE( m_pTrackTimer );
SAFE_DELETE( m_pSpawnTimer );
}
VOID SummonIdle::Init()
{
}
VOID SummonIdle::OnEnter( LPARAM param1, LPARAM param2, LPARAM param3 )
{
State::OnEnter( param1, param2, param3 );
m_pTrackTimer->SetTimer( AIParamParser::Instance()->GetInfo().m_wTRACK_PERIOD );
m_pSpawnTimer->SetTimer( param1 );
m_pSummoner = m_pSummoned->GetSummoner();
m_pSummoned->SetTargetChar( NULL );
m_pSummoned->SetSkillUseDelegate( FALSE );
// test
//m_dwPrevTick = GetTickCount();
}
VOID SummonIdle::OnExit()
{
State::OnExit();
}
VOID SummonIdle::OnUpdate( DWORD dwDeltaTick )
{
// 弥檬 胶迄矫埃阑 困秦辑 老沥矫埃 扁促妨霖促.
if( !m_pSpawnTimer->IsExpired( FALSE ) ) return;
m_pSummoner = m_pSummoned->GetSummoner();
if( !m_pSummoner ) return;
m_pSummoned->GetPos( &m_vSummonedPos );
m_pSummoner->GetPos( &m_vSummonerPos );
AIParamInfo& stAIParamInfo = AIParamParser::Instance()->GetInfo();
if( m_pTrackTimer->IsExpired( FALSE ) && m_pSummoned->IsOffensive() )
{
// 林函俊 利捞 乐绰瘤 沤祸
Character* pTargetChar = m_pSummoned->SearchTarget();
if( pTargetChar )
{
m_pSummoned->SetTargetChar( pTargetChar );
m_pSummoned->ChangeState( STATE_ID_TRACK );
return;
}
}
// 家券磊客狼 芭府啊 老沥裹困 郴捞搁 捞悼阑 窍瘤 臼绰促.
float fDistance2 = Math_Vector2DLength2( &(m_vSummonedPos-m_vSummonerPos) );
if( fDistance2 <= stAIParamInfo.m_fSUMMON_FOLLOW_DISTANCE * stAIParamInfo.m_fSUMMON_FOLLOW_DISTANCE )
{
return;
}
// 家券眉啊 酒流 格钎痢俊 档崔窍瘤 臼疽歹扼档, 沤祸林扁啊 促 登菌绊 家券磊啊 框流捞绊 乐促搁 促矫 格钎痢阑 棱绰促.
if( m_pSummoned->IsMoving() )
{
if( !m_pTrackTimer->IsExpired() ) return;
// 家券磊啊 肛苗滚府搁 格钎痢阑 促矫 茫绰促.
if( !m_pSummoner->IsMoving() )
{
FollowSummoner( m_pSummoner );
}
else
{
m_vSummonerDestPos = m_pSummoned->GetPathExplorer()->GetTargetPos();
// 家券磊啊 家券眉啊 顿妨绰 规氢狼 何盲裁阑 哈绢抄 阿俊 困摹窍绰啊?
BOOL bOutOfAngle = !Math_IsPositionInFanshapedArea( &m_vSummonerPos, &m_vSummonedPos, &(m_vSummonerDestPos - m_vSummonedPos), stAIParamInfo.m_wTRACK_INNER_ANGLE );
// 家券磊啊 家券眉啊 顿妨绰 格利瘤俊辑 钢府乐绰啊?
BOOL bOutOfRange = Math_VectorLength2( m_vSummonerDestPos, m_vSummonerPos ) > stAIParamInfo.m_fSUMMON_FOLLOW_DISTANCE * stAIParamInfo.m_fSUMMON_FOLLOW_DISTANCE;
if( bOutOfAngle && bOutOfRange )
{
FollowSummoner( m_pSummoner );
// printf( "Moving Track!! DiffTick[%d]\n", GetTickCount()-m_dwPrevTick );
// m_dwPrevTick = GetTickCount();
}
}
}
else
{
FollowSummoner( m_pSummoner );
// printf( "Stop Track!! DiffTick[%d]\n", GetTickCount()-m_dwPrevTick );
// m_dwPrevTick = GetTickCount();
}
}
VOID SummonIdle::DecideMovement()
{
// 家券磊啊 捞悼窍绊 乐绰 版快俊父 捞悼抗惑 格钎痢(TargetPos)阑 捞侩茄促.
if( m_pSummoner->IsMoving() )
{
m_vSummonerDestPos = m_pSummoner->GetPathExplorer()->GetTargetPos();
}
else
{
m_vSummonerDestPos = m_vSummonerPos;
}
// 格利瘤 谅钎啊 蜡瓤茄 谅钎牢瘤 眉农
Field* pField = m_pSummoned->GetField();
if( pField )
{
if( !pField->IsMovableCoordinates( &m_vSummonerDestPos ) )
{
SUNLOG( eMIDDLE_LOG, "[DecideMovement] Is Not MovableCoordinates!" );
m_vSummonerDestPos = m_vSummonerPos;
}
}
// 规氢阿 搬沥(家券眉客 家券磊狼 弥窜芭府 规氢栏肺 搬沥)
WzVector wvNormal;
VectorNormalize( &wvNormal, &( m_vSummonedPos - m_vSummonerDestPos ) );
AIParamInfo& stAIParamInfo = AIParamParser::Instance()->GetInfo();
float fDistance = random( stAIParamInfo.m_fSUMMON_FOLLOW_DISTANCE*50, stAIParamInfo.m_fSUMMON_FOLLOW_DISTANCE*100 ) / 100.f;
m_vMovement = wvNormal * fDistance;
}
VOID SummonIdle::FollowSummoner( Character *m_pSummoner )
{
AIParamInfo& stAIParamInfo = AIParamParser::Instance()->GetInfo();
// 家券磊俊措茄 惑措 谅钎甫 备茄促.
DecideMovement();
WzVector vDestPos = m_vSummonerDestPos + m_vMovement;
eCHAR_MOVE_STATE eMoveState = m_pSummoner->GetMoveStateControl()->GetMoveState();
if( eMoveState != CMS_WALK )
{
eMoveState = CMS_RUN;
}
// 老沥芭府甫 哈绢唱搁 炮饭器飘茄促.
if( m_pSummoner->GetDist2( m_pSummoned ) > stAIParamInfo.m_fSUMMON_MAX_FOLLOW_DISTANCE * stAIParamInfo.m_fSUMMON_MAX_FOLLOW_DISTANCE )
{
Teleport( vDestPos );
}
// 捞悼 芭府啊 呈公 陋栏搁 捞悼窍瘤 富绊(菩哦 价脚 绝捞) 弊成 府畔
float fMoveLength = VectorLength2( &(vDestPos - m_vSummonedPos) );
if( fMoveLength < stAIParamInfo.m_fMIN_MOVABLE_DISTANCE*stAIParamInfo.m_fMIN_MOVABLE_DISTANCE )
{
m_pSummoned->StopMoving();
return;
}
// 辨茫扁
if( !m_pSummoned->MoveAndBroadcast( &vDestPos, eMoveState ) )
{
// 角菩矫 格钎痢阑 促矫 沥茄促.
DecideMovement();
return;
// 弊贰档 角菩矫俊绰 弊 困摹肺 况橇茄促.
// Teleport( vDestPos );
}
m_pTrackTimer->SetTimer( stAIParamInfo.m_wTRACK_PERIOD );
}
VOID SummonIdle::Teleport( WzVector &vDestPos )
{
Field* pField = m_pSummoned->GetField();
if( !pField ) return;
// 蜡瓤茄 困摹牢啊 眉农
if( !pField->IsMovableCoordinates( &vDestPos ) ) return;
pField->TeleportObject( m_pSummoned, &vDestPos );
}
VOID SummonIdle::OnMsgAttacked( AI_MSG *pMsg )
{
State::OnMsgAttacked( pMsg );
// 第蝶抚 惑怕捞搁 馆览窍瘤 臼绰促.
if( m_pSummoned->IsFollowing() )
{
return;
}
AI_MSG_ATTACKED *pAttackMsg = (AI_MSG_ATTACKED*)pMsg;
Field* pField = m_pSummoned->GetField();
if( !pField ) return;
Character* pAttacker = pField->FindCharacter( pAttackMsg->dwAttackerKey );
if( !pAttacker ) return;
// 惑措啊 利焙捞搁 傍拜 惑怕肺 傈捞
if( !m_pSummoned->IsFriend( pAttacker ) )
{
m_pSummoned->SetTargetChar( pAttacker );
m_pSummoned->ChangeState( STATE_ID_TRACK );
}
}
VOID SummonIdle::OnMsgLeaveField( AI_MSG *pMsg )
{
AI_MSG_LEAVE_FIELD *pLeaveMsg = (AI_MSG_LEAVE_FIELD*)pMsg;
m_pSummoned->RemoveEnemy( pLeaveMsg->dwObjectKey );
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -