📄 npc.cpp
字号:
return m_pTargetChar ? TRUE : FALSE;
//return !m_pBattleRecord.IsEmpty();
}
VOID NPC::AddAttackPoint( Character* pAttacker, int attackPoint )
{
if( !pAttacker ) return;
if( IsFriend( pAttacker ) ) return;
BATTLE_RECORD* pRecord = m_pBattleRecord->Get( pAttacker->GetObjectKey() );
if( pRecord == NULL )
{
// 唱甫 贸澜 傍拜茄 敲饭捞绢扼搁 弥檬 傍拜 痢荐甫 霖促.
BOOL bFirstAttacker = FALSE;
if( m_pBattleRecord->IsEmpty() )
{
bFirstAttacker = TRUE;
}
pRecord = m_pBattleRecord->Add( pAttacker, bFirstAttacker );
}
pRecord->IncAttackPoint( attackPoint );
}
VOID NPC::AddTotalPoint( Character* pAttacker, int TotalkPoint )
{
if( !pAttacker ) return;
if( IsFriend( pAttacker ) ) return;
BATTLE_RECORD* pRecord = m_pBattleRecord->Get( pAttacker->GetObjectKey() );
if (pRecord == NULL)
{
// 唱甫 贸澜 傍拜茄 敲饭捞绢扼搁 弥檬 Total 痢荐甫 霖促.
BOOL bFirstAttacker = FALSE;
if( m_pBattleRecord->IsEmpty() )
{
bFirstAttacker = TRUE;
}
pRecord = m_pBattleRecord->Add( pAttacker, bFirstAttacker );
}
pRecord->IncTotalPoint(TotalkPoint);
}
VOID NPC::AllRegisterBattleRecord()
{
Character *pTargetArray[MAX_TARGET_NUM];
memset( pTargetArray, 0, sizeof(Character*)*MAX_TARGET_NUM );
BYTE byNumberOfTargets = 0;
Field* pField = GetField();
if( !pField ) return;
WzVector vNPCPos; GetPos( &vNPCPos );
byNumberOfTargets = pField->FindTargetsByPosition( pTargetArray, GetSectorIndex(), vNPCPos,
GetSightRange(), 10 );
for( int i = 0; i < byNumberOfTargets; ++i )
{
if( !pTargetArray[i] ) continue;
if( pTargetArray[i]->IsDead() ) continue;
AddAttackPoint( pTargetArray[i], 0 );
#ifdef __AGGRO_TEST__
////////////////////////////////////////////////////////////////////////////////////////////////
//!! 烙矫抛胶飘甫 困茄 菩哦!!! => 昏力且 巴!!
////////////////////////////////////////////////////////////////////////////////////////////////
BattleRecord* pRecord = GetBattleRecord();
DWORD dwTotalPoint = 0;
DWORD dwAttackPoint = 0;
if( NULL != pRecord )
{
BATTLE_RECORD* pUnitRecord = pRecord->Get(pTargetArray[i]->GetObjectKey());
if(NULL != pUnitRecord )
{
dwTotalPoint = pUnitRecord->GetTotalPoint();
dwAttackPoint = pUnitRecord->GetAttackPoint();
}
else
{
dwTotalPoint = 0;
dwAttackPoint= 0;
}
}
char m_TempLog[255];
memset(m_TempLog, 0x00, 255);
sprintf(m_TempLog, "T[%d],A[%d]", dwTotalPoint, dwAttackPoint);
MSG_CG_CONVERSATION_FIELDCHAT_BRD chatMsg;
chatMsg.m_byCategory = CG_CONVERSATION;
chatMsg.m_byProtocol = CG_CONVERSATION_FIELDCHAT_BRD;
chatMsg.m_dwObjectKey = pTargetArray[i]->GetObjectKey();
chatMsg.m_byMsgLength = 100;
strncpy((char*)&(chatMsg.m_pszChatMsg), m_TempLog,255);
SendPacketAround( &chatMsg, chatMsg.m_byMsgLength );
////////////////////////////////////////////////////////////////////////////////////////////////
#endif
}
}
// 林函俊辑 利阑 茫酒辑 弊 器牢磐甫 府畔茄促.
Character* NPC::SearchTarget()
{
Field *pField = GetField();
if( !pField ) return NULL;
eTARGET_SEARCH_TYPE eSearchType = eRARGET_SEARCH_NEAREST;
switch( m_pBaseInfo->m_wAttitude )
{
case ATTACK_ATTITUDE_AFTER:
return NULL;
case ATTACK_ATTITUDE_ONE_TARGET:
if( m_pTargetChar ) return NULL;
case ATTACK_ATTITUDE_LOW_HP_FIRST:
eSearchType = eRARGET_SEARCH_LOW_HP;
break;
case ATTACK_ATTITUDE_LOW_LEVEL_FIRST:
eSearchType = eRARGET_SEARCH_LOW_LEVEL;
break;
case ATTACK_ATTITUDE_HIGH_MP_FIRST:
eSearchType = eRARGET_SEARCH_HIGH_MP;
break;
}
return pField->SearchTarget( this, eSearchType, SKILL_TARGET_ENEMY );
}
VOID NPC::AIMsgProgress()
{
AI_MSG *pRecvMsg;
WORD wSize;
DWORD dwCurTick = GetTickCount();
pRecvMsg = (AI_MSG*)m_pAIMessageQueue->RecvAIMessage( wSize );
while( pRecvMsg )
{
if( dwCurTick > pRecvMsg->dwDeliveryTick )
{
m_pNPCStatusManager->GetCurState()->OnAIMsg( pRecvMsg );
}
else
{
// 皋技瘤 掉饭捞父怒 瘤唱瘤 臼疽栏搁 烙矫 钮俊 持绊 贸府窍瘤 臼绰促.
// 掉饭捞蔼 促矫 持绢拎具窃...两摹救鸥 -_-;
m_pTempMessageQueue->SendAIMessage( pRecvMsg, wSize, pRecvMsg->dwDeliveryTick - dwCurTick );
}
m_pAIMessageQueue->Completion( wSize );
pRecvMsg = (AI_MSG*)m_pAIMessageQueue->RecvAIMessage( wSize );
}
// 烙矫 钮俊 乐带 皋技瘤 促矫 笼绢 持扁
pRecvMsg = (AI_MSG*)m_pTempMessageQueue->RecvAIMessage( wSize );
while( pRecvMsg )
{
// 掉饭捞蔼 促矫 持绢拎具窃...两摹救鸥 -_-;
m_pAIMessageQueue->SendAIMessage( pRecvMsg, wSize, pRecvMsg->dwDeliveryTick - dwCurTick );
m_pTempMessageQueue->Completion( wSize );
pRecvMsg = (AI_MSG*)m_pTempMessageQueue->RecvAIMessage( wSize );
}
}
VOID NPC::RemoveEnemy( DWORD leaveEnemyKey )
{
if ( GetTargetChar()!=NULL && GetTargetChar()->GetObjectKey() == leaveEnemyKey )
{
SetTargetChar( NULL );
SetTrackSlot( -1 );
}
m_pBattleRecord->Remove( leaveEnemyKey );
}
VOID NPC::SetTargetChar( Character *pTarget )
{
// 捞固 汲沥登绢乐绰 利捞搁 促矫 汲沥且 鞘夸 绝促.
if (m_pTargetChar == pTarget)
{
return;
}
if (m_pTargetChar != NULL)
{
// 扁粮狼 target篮 歹 捞惑 脚版 救敬促.
m_pTargetChar->RemoveObserver( GetObjectKey() );
}
m_pTargetChar = pTarget;
if (m_pTargetChar != NULL)
{
// 货 target阑 瘤难焊磊~
m_pTargetChar->AddObserver( this );
// 货肺款 鸥百阑 硅撇饭内靛俊 殿废秦林扁困秦辑 AddAttackPoint甫 龋免茄促.
AddAttackPoint( pTarget, 0 );
}
}
// NPC 府胶飘俊 眠啊
VOID NPC::OnEnterField(Field* pField, WzVector* pwzVec)
{
Init();
Character::OnEnterField(pField, pwzVec);
SASSERT( GetField() != NULL, "GetField() == NULL" );
BOOL bAdded = pField->AddNPC( this );
SASSERT( bAdded, "bAdded" );
}
VOID NPC::OnLeaveField()
{
SASSERT( GetField() != NULL, "GetField() == NULL" );
LeaveGroup();
Character::OnLeaveField();
// release救俊辑 LeaveGroup()阑 秦霖促.
Release();
}
VOID NPC::GroupCmdAttackToGroup( Character* pTargetChar )
{
// 弊缝狼 府歹扼搁
if( IsLeaderOfGroup() )
{
AI_MSG_GROUP_C0MMAND AIGroupCmdMsg;
AIGroupCmdMsg.byType = GROUP_CMD_TYPE_ATTACK;
AIGroupCmdMsg.dwTargetKey = pTargetChar->GetObjectKey();
SendAIMessageToGroupExceptMe( &AIGroupCmdMsg, sizeof(AI_MSG_GROUP_C0MMAND) );
}
}
VOID NPC::GroupCmdStopAttackToGroup()
{
// 弊缝狼 府歹扼搁
if( IsLeaderOfGroup() )
{
AI_MSG_GROUP_C0MMAND AIGroupCmdMsg;
AIGroupCmdMsg.byType = GROUP_CMD_TYPE_STOP_ATTACK;
SendAIMessageToGroupExceptMe( &AIGroupCmdMsg, sizeof(AI_MSG_GROUP_C0MMAND) );
}
}
BOOL NPC::IsSamePositionWithTarget()
{
WzVector vTargetPos, vMyPos;
m_pTargetChar->GetPos( &vTargetPos );
GetPos( &vMyPos );
if( vMyPos == vTargetPos )
{
return TRUE;
}
else
{
return FALSE;
}
}
VOID NPC::GetTrackPos( WzVector &wvDestPos )
{
// 捞傈俊 眠利窍带 鸥百浇吩阑 Release茄促.
m_pTargetChar->FreeEnemySlot( m_iTrackSlot );
// 货肺款 鸥百浇吩阑 茫酒辑 沥焊甫 盎脚茄促.
WzVector vMyPos; GetPos( &vMyPos );
m_iTrackSlot = m_pTargetChar->AllocEnemySlot( &vMyPos, wvDestPos, GetAttackRange() * 0.9f );
}
RC::ePACKET_SEND_RESULT NPC::SendPacketAround( MSG_BASE_FORWARD * pMsg, WORD wSize, BOOL bSendToMe )
{
return Character::SendPacketAround( pMsg, wSize, bSendToMe );
}
BOOL NPC::OnResurrection( float fRecoverExp, float fRecoverHP, float fRecoverMP )
{
if( Character::OnResurrection( fRecoverExp, fRecoverHP, fRecoverMP ) )
{
ChangeState( STATE_ID_IDLE );
return TRUE;
}
return FALSE;
}
BOOL NPC::OnDead()
{
SASSERT( GetHP() == 0, "GetHP() != 0" );
ChangeState( STATE_ID_DEAD );
// 鸥百苞 AIMessageQueue甫 檬扁拳茄促.
SetTargetChar( NULL );
m_pAIMessageQueue->Clear();
return Character::OnDead();
}
BOOL NPC::ExecuteThrust( BOOL bForcedMove, WzVector *pwvMoveDistance, WzVector &wvPosAfterThrust, float fMoveDistance, BOOL bDownAfterThrust )
{
Field *pField = GetField();
if( !pField ) return FALSE;
// 肯傈 沥瘤屈牢 版快 剐府啊啊 救等促.
if( m_pBaseInfo->m_wMoveAttitude == eMOVE_ATTITUDE_ETERNAL_STOP ) return FALSE;
// 惑怕俊 蝶扼辑 剐府扁啊 救瞪 荐档 乐促.
if( !m_pStatusManager->CanThrustDown() ) return FALSE;
// TODO: 剐府绰 规氢捞 绝绰 版快 巩力啊 积变促. 罚待栏肺??
if (pwvMoveDistance->x == 0.0f && pwvMoveDistance->y == 0.0f )
{
pwvMoveDistance->x = 1.0f;
WzVector wvTemp = *pwvMoveDistance;
Math_ZRotateVector( &wvTemp, *pwvMoveDistance, rand() % 360 );
*pwvMoveDistance = *pwvMoveDistance * fMoveDistance;
}
// NPC 剐府扁 贸府
if( !pField->FindPathThrust( this, pwvMoveDistance, bForcedMove ) )
{
return FALSE;
}
if( !IsMoving() ) return FALSE;
// 剐府扁 饶狼 捞悼 谅钎 掘扁
wvPosAfterThrust = GetPathExplorer()->GetTargetPos();
// NPC俊霸 剐府扁 皋技瘤甫 焊晨
AI_MSG_THRUST thrustMsg;
thrustMsg.bDownAfterThrust = bDownAfterThrust; // 剐府扁 饶俊 促款 惑怕肺 逞绢哎 巴牢啊?
SendAIMessage( &thrustMsg, sizeof(thrustMsg) );
return TRUE;
}
BOOL NPC::IsTooCloseToTarget()
{
// 鸥百捞 夯牢老 版快(伎橇鳃)
if( m_pTargetChar == this ) return FALSE;
// 呈公 啊鳖款 版快.. 坷洒妨 钢绢瘤磊
// (!) Player狼 傍拜芭府尔 瞒捞啊 腹捞 唱绰 版快绰 敲饭捞绢啊 促啊啊搁 公炼扒 钢绢瘤绰 版氢阑 焊老 荐 乐促.
// --> 利寸洒 扁夯 傍拜芭府甫 烹老窍电瘤 倾侩 裹困甫 炼例窍电瘤 秦具且淀
AIParamInfo& stAIParamInfo = AIParamParser::Instance()->GetInfo();
WzVector vCurPos, vTargetPos;
GetPos( &vCurPos ); m_pTargetChar->GetPos( &vTargetPos );
float fDistToTarget2 = VectorLength2( &(vCurPos-vTargetPos) );
// 鸥百苞狼 芭府啊 MAX_ATTACK_RANGE_LIMIT捞惑捞搁 弊成 傍拜->厘芭府牢 局甸捞 呈公 钢绢瘤绰吧 规瘤
if( fDistToTarget2 < stAIParamInfo.m_fFALLAPART_MIN_ATTACK_RANGE_LIMIT*stAIParamInfo.m_fFALLAPART_MIN_ATTACK_RANGE_LIMIT )
{
return TRUE;
}
return FALSE;
}
BOOL NPC::CanFallApartFromTarget()
{
WzVector vTargetPos;
GetTrackPos( vTargetPos );
// 1瞒 辨茫扁 矫档
return GetField()->FindPath( this, &vTargetPos );
}
BOOL NPC::NeedToRetreatFromTarget()
{
if( GetSelectedSkill() != SKILLCODE_NORMAL_ATTACK ) return FALSE;
// 傍拜芭府啊 5m绰 逞绢具 饶硼 傍拜阑 茄促.
AIParamInfo& stAIParamInfo = AIParamParser::Instance()->GetInfo();
if (m_pTargetChar != NULL && GetAttackRange()>=stAIParamInfo.m_fRETREAT_MIN_DISTANCE_LIMIT)
{
float fDistToTarget = GetDistToTarget();
float fMinAttackDist = GetAttackRange() * stAIParamInfo.m_fRETREAT_MIN_DISTANCE_LIMIT_RATIO;
if (fDistToTarget < fMinAttackDist)
{
return TRUE;
}
}
return FALSE;
}
// 鸥百焊促 利寸洒 臭篮 困摹俊 乐绊 荐乞 芭府档 面盒洒 啊鳖况具 痢橇且 荐 乐栏骨肺 眉农茄促.
BOOL NPC::IsOnGoodPositionToJump()
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -