📄 state.cpp
字号:
#include "stdafx.h"
#include "State.h"
#include "Field.h"
#include "Player.h"
#include "PlayerManager.h"
#include "TargetFinder.h"
#include <3DEngine/3DTerrain/PathExplorer.h>
#include <SinTable.h>
#include "PublicMath.h"
#include "AIParamParser.h"
State::State() : m_pNPC(NULL)
{
}
State::~State()
{
}
VOID State::OnEnter( LPARAM param1, LPARAM param2, LPARAM param3 )
{
__UNUSED(param1);
__UNUSED(param2);
__UNUSED(param3);
}
VOID State::OnExit()
{
}
VOID State::OnAIMsg( AI_MSG *pMsg )
{
switch( pMsg->dwMsgID )
{
case AI_MSG_ID_FORCE_ATTACK:
OnMsgForceAttack( pMsg );
break;
case AI_MSG_ID_ATTACKED:
OnMsgAttacked( pMsg );
break;
case AI_MSG_ID_HELP_REQUEST:
OnMsgHelpRequest( pMsg );
break;
case AI_MSG_ID_LEAVE_FIELD:
OnMsgLeaveField( pMsg );
break;
case AI_MSG_ID_THRUST:
OnMsgThrust( pMsg );
break;
case AI_MSG_ID_GROUP_C0MMAND:
OnMsgGroupCommand( pMsg );
case AI_MSG_ID_FLYING:
OnMsgFlying( pMsg );
break;
case AI_MSG_ID_KNOCKDOWN:
OnMsgKnockDown( pMsg );
break;
case AI_MSG_ID_STUN:
OnMsgStun( pMsg );
break;
case AI_MSG_ID_LETSGO:
OnMsgLetsGo( pMsg );
break;
case AI_MSG_ID_CHANGESTATE:
OnMsgChangeState( pMsg );
break;
case AI_MSG_ID_ENEMY_FOUND:
OnMsgEnemyFound( pMsg );
break;
case AI_MSG_ID_GROUP_MEMBER_ATTACKED:
OnMsgGroupAttacked( pMsg );
break;
case AI_MSG_ID_RUNAWAY:
OnMsgRunAway( pMsg );
break;
case AI_MSG_ID_CHAOS:
OnMsgChaos( pMsg );
break;
case AI_MSG_ID_COMMAND_FOLLOW:
OnMsgCommandFollow( pMsg );
break;
case AI_MSG_ID_USE_SKILL:
OnMsgUseSkill( pMsg );
break;
default:
LogToFile( "AIMessageLog.txt", "[State::OnAIMsg] 沥狼登瘤 臼篮 AI Message! " );
// ASSERT( !"沥狼登瘤 臼篮 AI Message!" );
SUNLOG( eCRITICAL_LOG, "[State::OnAIMsg] AIMsgID doesn't exist! " );
}
}
VOID State::OnMsgForceAttack( AI_MSG *pMsg )
{
AI_MSG_FORCE_ATTACK *pAttackMsg = (AI_MSG_FORCE_ATTACK*)pMsg;
Field* pField = m_pNPC->GetField();
if( !pField ) return;
// 傍拜措惑阑 茫绰促.
Character* pTarget = pField->FindCharacter( pAttackMsg->dwTargetKey );
if( !pTarget ) return;
// 惑措啊 利焙捞搁 傍拜 惑怕肺 傈捞
if( !m_pNPC->IsFriend( pTarget ) )
{
m_pNPC->SetTargetChar( pTarget );
m_pNPC->ChangeState( STATE_ID_TRACK );
// 弊缝盔捞搁 弊缝 糕滚甸俊霸 利惯斑 皋技瘤 焊晨
if( m_pNPC->IsMemberOfGroup() )
{
AI_MSG_ENEMY_FOUND aiMsg;
aiMsg.dwTargetObjectKey = pAttackMsg->dwTargetKey;
m_pNPC->SendAIMessageToGroupExceptMe( &aiMsg, sizeof(aiMsg) );
}
}
}
VOID State::OnMsgAttacked( AI_MSG *pMsg )
{
AI_MSG_ATTACKED *pAttackedMsg = (AI_MSG_ATTACKED*)pMsg;
// 弊缝盔捞搁 弊缝 糕滚甸俊霸 利惯斑 皋技瘤 焊晨
if( m_pNPC->IsMemberOfGroup() )
{
AI_MSG_ENEMY_FOUND aiMsg;
aiMsg.dwTargetObjectKey = pAttackedMsg->dwAttackerKey;
m_pNPC->SendAIMessageToGroupExceptMe( &aiMsg, sizeof(aiMsg) );
}
if( m_pNPC->GetBaseInfo()->m_SpecialCondition[0].wActionType == 1 )
{
AIParamInfo& stAIParamInfo = AIParamParser::Instance()->GetInfo();
if( m_pNPC->GetHP() <= m_pNPC->GetMaxHP() * stAIParamInfo.m_fHELP_REQUEST_HP_PERCENT )
{
AI_MSG_HELP_REQUEST AIHelpMsg;
AIHelpMsg.dwAttackerKey = pAttackedMsg->dwAttackerKey;
AIHelpMsg.dwTargetKey = m_pNPC->GetObjectKey();
m_pNPC->SendAIMessageAroundExceptMe( &AIHelpMsg, sizeof(AI_MSG_HELP_REQUEST) );
}
}
Field* pField = m_pNPC->GetField();
if( !pField ) return;
Character* pAttacker = pField->FindCharacter( pAttackedMsg->dwAttackerKey );
if( !pAttacker ) return;
// 傍拜茄 措惑阑 硅撇饭内靛俊 殿废秦霖促.
m_pNPC->AddAttackPoint( pAttacker, 0 );
}
VOID State::OnMsgHelpRequest( AI_MSG *pMsg )
{
AI_MSG_HELP_REQUEST *pHelpMsg = (AI_MSG_HELP_REQUEST*)pMsg;
Field* pField = m_pNPC->GetField();
if( !pField ) return;
Character* pAttacker = pField->FindCharacter( pHelpMsg->dwAttackerKey );
if( !pAttacker ) return;
AIParamInfo& stAIParamInfo = AIParamParser::Instance()->GetInfo();
// 敲饭捞绢啊 捞固 咯矾NPC肺何磐 傍拜阑 罐绊 乐栏搁 Help夸没俊 瘤盔阑 啊瘤 臼绰促.
/* ObjectList Observers = pAttacker->GetObservers();
if( Observers.size() >= stAIParamInfo.m_byMAX_OBSERVERS_PER_PLAYER )
{
return;
}*/
// Help 夸没俊 览翠窍绰 加己捞 乐阑 版快俊父 瘤盔阑 埃促.
if( m_pNPC->GetDistToNewTarget( pAttacker ) <= ( m_pNPC->GetSightRange() * stAIParamInfo.m_fHELP_SIGHTRANGE_RATIO ) )
{
m_pNPC->SetTargetChar( pAttacker );
m_pNPC->ChangeState( STATE_ID_HELP );
}
}
VOID State::OnMsgLeaveField( AI_MSG *pMsg )
{
AI_MSG_LEAVE_FIELD *pLeaveMsg = (AI_MSG_LEAVE_FIELD*)pMsg;
m_pNPC->RemoveEnemy( pLeaveMsg->dwObjectKey );
m_pNPC->ChangeState( STATE_ID_IDLE );
}
VOID State::OnMsgThrust( AI_MSG *pMsg )
{
// Thrust 惑怕啊 场抄 饶俊 促款阑 矫难临 巴牢啊甫 THRUST 惑怕狼 霉锅掳 颇扼固磐肺 傈崔
AI_MSG_THRUST *pRecvMsg = (AI_MSG_THRUST *)pMsg;
if( pRecvMsg->bDownAfterThrust )
{
m_pNPC->ChangeState( STATE_ID_THRUST, STATE_ID_KNOCKDOWN );
}
else
{
m_pNPC->ChangeState( STATE_ID_THRUST );
}
}
VOID State::OnMsgFlying( AI_MSG *pMsg )
{
AI_MSG_FLYING *pRecvMsg = (AI_MSG_FLYING *)pMsg;
m_pNPC->ChangeState( STATE_ID_FLYING, (LPARAM)pRecvMsg->dwFlyingTick );
}
VOID State::OnMsgKnockDown( AI_MSG *pMsg )
{
AI_MSG_KNOCKDOWN *pRecvMsg = (AI_MSG_KNOCKDOWN*)pMsg;
m_pNPC->ChangeState( STATE_ID_KNOCKDOWN, (LPARAM)pRecvMsg->dwKnockDownTick );
}
VOID State::OnMsgStun( AI_MSG *pMsg )
{
AI_MSG_STUN *pRecvMsg = (AI_MSG_STUN*)pMsg;
m_pNPC->ChangeState( STATE_ID_KNOCKDOWN, (LPARAM)pRecvMsg->dwStunTick );
}
VOID State::OnMsgGroupCommand( AI_MSG *pMsg )
{
AI_MSG_GROUP_C0MMAND *pGroupCmdMsg = (AI_MSG_GROUP_C0MMAND*)pMsg;
switch( pGroupCmdMsg->byType )
{
case GROUP_CMD_TYPE_ATTACK:
OnMsgGroupCommand_Attack( pGroupCmdMsg->dwTargetKey );
break;
case GROUP_CMD_TYPE_STOP_ATTACK:
OnMsgGroupCommand_StopAttack();
break;
default:
SUNLOG( eMIDDLE_LOG, "[State::OnMsgGroupCommand] Wrong GroupCommand Type! " );
}
}
VOID State::OnMsgGroupCommand_Attack( DWORD dwTargetKey )
{
Field* pField = m_pNPC->GetField();
if( !pField ) return;
Character* pTargetChar = pField->FindCharacter( dwTargetKey );
if( !pTargetChar ) return;
m_pNPC->SetTargetChar( pTargetChar );
m_pNPC->ChangeState( STATE_ID_HELP );
}
VOID State::OnMsgGroupCommand_StopAttack()
{
if( m_pNPC->GetTargetChar() )
{
m_pNPC->GetTargetChar()->FreeEnemySlot( m_pNPC->GetTrackSlot() );
m_pNPC->SetTrackSlot( -1 );
}
m_pNPC->ChangeState( STATE_ID_IDLE );
}
VOID State::OnMsgGroupAttacked( AI_MSG *pMsg )
{
/* AI_MSG_GROUP_MEMBER_ATTACKED *pGroupMsg = (AI_MSG_GROUP_MEMBER_ATTACKED*)pMsg;
Field* pField = m_pNPC->GetField();
if( !pField ) return;
Character* pTargetChar = pField->FindCharacter( pGroupMsg->dwAttackerKey );
if( !pTargetChar ) return;
// TODO: 弊缝狼 鸥百阑 官层具摆促绊 魄窜登搁 何窍甸俊霸 疙飞
// 货肺款 鸥百栏肺 妇捞 缠府绰瘤 八荤
Character* pNewTarget = m_pNPC->GetGreatestAttackPointEnemy();
if( pNewTarget != NULL )
{
// 货 利阑 茫篮 版快..
if( m_pNPC->GetDistToNewTarget( pNewTarget ) <= m_pNPC->GetAttackRange() )
{
m_pNPC->SetTargetChar( pNewTarget );
m_pNPC->ChangeState( STATE_ID_ATTACK );
}
else
{
m_pNPC->SetTargetChar( pNewTarget );
m_pNPC->ChangeState( STATE_ID_HELP );
}
// 何窍甸俊霸档 货肺款 利阑 傍拜窍档废 疙飞茄促.
m_pNPC->GroupCmdAttackToGroup( pNewTarget );
}
*/
}
VOID State::OnMsgLetsGo( AI_MSG *pMsg )
{
AI_MSG_LETSGO *pRecvMsg = (AI_MSG_LETSGO*)pMsg;
WzVector wvCurPos;
m_pNPC->GetPos( &wvCurPos );
WzVector wvDestPos = pRecvMsg->wvDestPos;
WzVector wvRandomDistance;
// 府歹尔 悼老 谅钎肺 救啊扁 困秦辑 辟贸谅钎甫 促矫 茫绰促.
AIParamInfo& stAIParamInfo = AIParamParser::Instance()->GetInfo();
float fMoveLength = random( stAIParamInfo.m_fGROUP_FOLLOWER_MIN_RADIUS*100, stAIParamInfo.m_fGROUP_FOLLOWER_MAX_RADIUS*100 ) / 100.f;
int iAngle = rand() % 360;
wvRandomDistance.x = (float)( fMoveLength * FCOS(iAngle) );
wvRandomDistance.y = (float)( fMoveLength * FSIN(iAngle) );
wvRandomDistance.z = 0.0f;
wvDestPos += wvRandomDistance;
// 辨茫扁
if( m_pNPC->MoveAndBroadcast( &wvDestPos, (eCHAR_MOVE_STATE)pRecvMsg->byMoveState ) )
{
return;
}
// 角菩矫 府歹客 悼老 谅钎肺 促矫 辨茫扁
m_pNPC->MoveAndBroadcast( &pRecvMsg->wvDestPos, (eCHAR_MOVE_STATE)pRecvMsg->byMoveState );
}
VOID State::OnMsgChangeState( AI_MSG *pMsg )
{
AI_MSG_CHANGESTATE *pRecvMsg = (AI_MSG_CHANGESTATE*)pMsg;
// 泅犁绰 ReturnState肺狼 傈券父 绊妨茄促. 捞饶 促弗 惑怕肺狼 傈券捞 鞘夸且 锭 促矫 绊妨且 巴!!!
if( pRecvMsg->byStateID == STATE_ID_RETURN )
{
m_pNPC->ChangeState( pRecvMsg->byStateID, pRecvMsg->byMoveState );
m_pNPC->SetTargetChar( NULL );
}
else
{
ASSERT( ! "[State::OnMsgChangeState] 绊妨窍瘤 臼篮 惑怕函券捞促. 捞 何盒阑 促矫 混旗杭 巴!" );
}
}
VOID State::OnMsgEnemyFound( AI_MSG *pMsg )
{
AI_MSG_ENEMY_FOUND *pRecvMsg = (AI_MSG_ENEMY_FOUND*)pMsg;
Field* pField = m_pNPC->GetField();
if( !pField ) return;
Character* pTarget = pField->FindCharacter( pRecvMsg->dwTargetObjectKey );
if( !pTarget ) return;
// 惑措啊 利焙捞搁 傍拜 惑怕肺 傈捞
if( !m_pNPC->IsFriend( pTarget ) )
{
m_pNPC->SetTargetChar( pTarget );
m_pNPC->ChangeState( STATE_ID_TRACK );
}
}
VOID State::OnMsgRunAway( AI_MSG *pMsg )
{
AI_MSG_RUNAWAY *pRecvMsg = (AI_MSG_RUNAWAY*)pMsg;
m_pNPC->ChangeState( STATE_ID_RUNAWAY, pRecvMsg->dwTargetKey, pRecvMsg->dwRunAwayTime );
}
VOID State::OnMsgChaos( AI_MSG *pMsg )
{
AI_MSG_CHAOS *pRecvMsg = (AI_MSG_CHAOS*)pMsg;
m_pNPC->ChangeState( STATE_ID_CHAOS, pRecvMsg->dwChaosTime );
}
VOID State::OnMsgCommandFollow( AI_MSG *pMsg )
{
// 阿辆 捞惑惑怕(促款, 剐府扁, 去鄂 殿殿)啊 酒聪扼搁 IDLE 惑怕肺 汗蓖茄促.
m_pNPC->SetTargetChar( NULL );
m_pNPC->ChangeState( STATE_ID_IDLE );
}
VOID State::OnMsgUseSkill( AI_MSG *pMsg )
{
AI_MSG_USE_SKILL *pSkillMsg = (AI_MSG_USE_SKILL*)pMsg;
Field* pField = m_pNPC->GetField();
if( !pField ) return;
// 傍拜措惑阑 茫绰促.
Character* pTarget = pField->FindCharacter( pSkillMsg->dwTargetKey );
if( !pTarget ) return;
// 惑措啊 利焙捞搁 傍拜 惑怕肺 傈捞
// if( !m_pNPC->IsFriend( pTarget ) )
{
m_pNPC->SelectSkill( pTarget, pSkillMsg->dwSkillCode );
m_pNPC->ChangeState( STATE_ID_TRACK );
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -