📄 npc.cpp
字号:
{
SASSERT( GetTargetChar(), "GetTargetChar() == NULL" );
WzVector wvCurPos, wvTargetPos;
GetPos( &wvCurPos );
GetTargetChar()->GetPos( &wvTargetPos );
// 臭捞啊 呈公 臭芭唱 呈公 撤栏搁 角菩
float fHeight = wvCurPos.z - wvTargetPos.z;
AIParamInfo& stAIParamInfo = AIParamParser::Instance()->GetInfo();
if( fHeight < stAIParamInfo.m_fJUMP_MIN_HEIGHT || fHeight > stAIParamInfo.m_fJUMP_MAX_HEIGHT )
{
return FALSE;
}
// 荐乞 芭府啊 呈公 钢芭唱 呈公 啊鳖快搁 角菩
float fDistance = sqrt( ( wvTargetPos.x - wvCurPos.x ) * ( wvTargetPos.x - wvCurPos.x ) +
( wvTargetPos.y - wvCurPos.y ) * ( wvTargetPos.y - wvCurPos.y ) );
if( fDistance < stAIParamInfo.m_fJUMP_MIN_DISTANCE || fDistance > stAIParamInfo.m_fJUMP_MAX_DISTANCE )
{
return FALSE;
}
return TRUE;
}
BOOL NPC::JoinGroup( ObjectGroup* pGroup )
{
// 促弗 弊缝俊 加秦乐瘤 臼酒具 茄促.
ASSERT( m_pObjectGroup == NULL );
ASSERT( pGroup != NULL );
m_pObjectGroup = pGroup;
return TRUE;
}
BOOL NPC::LeaveGroup()
{
if( !m_pObjectGroup ) return FALSE;
BOOL bRet = m_pObjectGroup->RemoveObject( GetObjectKey(), GetBaseInfo()->m_MonsterCode );
if( m_pObjectGroup->GetNumberOfObjects() == 0 )
{
Field *pField = GetField();
if( pField )
{
pField->RemoveGroup( m_pObjectGroup );
}
}
m_pObjectGroup = NULL;
return bRet;
}
BOOL NPC::IsMemberOfGroup()
{
if( m_pObjectGroup )
{
return TRUE;
}
else
{
return FALSE;
}
}
BOOL NPC::IsLeaderOfGroup()
{
if( !IsMemberOfGroup() )
{
return FALSE;
}
if( m_pObjectGroup->GetLeaderObjKey() != GetObjectKey() )
{
return FALSE;
}
return TRUE;
}
BOOL NPC::IsFollowerOfGroup()
{
if( !IsMemberOfGroup() )
{
return FALSE;
}
if( m_pObjectGroup->GetLeaderObjKey() == GetObjectKey() )
{
return FALSE;
}
return TRUE;
}
BOOL NPC::IsLeaderAlive()
{
Field *pField = GetField();
if( !pField ) return FALSE;
if( !m_pObjectGroup ) return FALSE;
if( !m_pObjectGroup->GetLeaderObjKey() ) return FALSE;
return TRUE;
}
// 辨茫扁甫 窍绊 菩哦阑 朝覆
BOOL NPC::MoveAndBroadcast( WzVector *pwvDestPos, eCHAR_MOVE_STATE moveState )
{
Field *pField = GetField();
if( !pField ) return FALSE;
// 辨茫扁... 角菩矫 府畔
if( !pField->FindPath( this, pwvDestPos ) )
{
return FALSE;
}
SetMoveState( moveState );
// 捞悼 菩哦阑 焊辰促.
WzVector vMyPos; GetPos( &vMyPos );
MSG_CG_SYNC_MOVE_BRD sendMsg;
sendMsg.m_byCategory = CG_SYNC;
sendMsg.m_byProtocol = CG_SYNC_MOVE_BRD;
sendMsg.m_dwObjectKey = GetObjectKey();
sendMsg.m_byState = (BYTE)moveState; // RUN or WALK
sendMsg.wvCurPos = vMyPos;
sendMsg.wvDestPos = *pwvDestPos;
SendPacketAround( &sendMsg, sizeof(sendMsg) );
return TRUE;
}
BOOL NPC::ThrustMoveAndBroadcast( WzVector *pwvDestPos, eCHAR_MOVE_STATE moveState, BOOL &bTouchedSomething, WzVector &wvRotatedVector )
{
Field *pField = GetField();
if( !pField ) return FALSE;
WzVector wvCurPos, wvDistanceWantToMove, wvDestPosAfterThrust;
GetPos( &wvCurPos );
wvDistanceWantToMove = *pwvDestPos - wvCurPos;
float fWantToMoveLength = VectorLength2( &wvDistanceWantToMove );
// 格利瘤鳖瘤 辨茫扁 版肺甫 悸泼茄促.
if( !pField->FindPathThrust( this, &wvDistanceWantToMove ) )
{
return FALSE;
}
// FindPath饶 汲沥等 芭府啊 狼档茄 芭府俊 给固摹搁 厘局拱俊 搓篮 巴栏肺 埃林茄促.
wvDestPosAfterThrust = GetPathExplorer()->GetTargetPos();
float fMoveLength = VectorLength2( &(wvDestPosAfterThrust - wvCurPos) );
// Thrust 芭府啊 狼档茄 芭府父怒 救登绰 版快
if( fMoveLength < fWantToMoveLength * 0.95f )
{
// 厘局拱俊 搓疽促绰 钎矫甫 窍绊 瘤陛 啊妨绰 规氢俊辑 49档 雀傈矫挪 氦磐甫 备秦敌促.
bTouchedSomething = TRUE;
AIParamInfo& stAIParamInfo = AIParamParser::Instance()->GetInfo();
wvRotatedVector.x = wvDistanceWantToMove.x * FCOS(stAIParamInfo.m_wSEARCH_ROTATE_ANGLE) + wvDistanceWantToMove.y * FSIN(stAIParamInfo.m_wSEARCH_ROTATE_ANGLE);
wvRotatedVector.y = -wvDistanceWantToMove.x * FSIN(stAIParamInfo.m_wSEARCH_ROTATE_ANGLE) + wvDistanceWantToMove.y * FCOS(stAIParamInfo.m_wSEARCH_ROTATE_ANGLE);
wvRotatedVector.z = 0.0f;
// 捞悼 芭府啊 呈公 陋栏搁 捞悼窍瘤 富绊(菩哦 价脚 绝捞) 弊成 府畔
if( fMoveLength < stAIParamInfo.m_fMIN_MOVABLE_DISTANCE*stAIParamInfo.m_fMIN_MOVABLE_DISTANCE )
{
StopMoving();
return FALSE;
}
}
SetMoveState( CMS_WALK );
// 菩哦 焊郴扁
MSG_CG_SYNC_MOVE_THRUST_BRD sendMsg;
sendMsg.m_byCategory = CG_SYNC;
sendMsg.m_byProtocol = CG_SYNC_MOVE_THRUST_BRD;
sendMsg.m_dwObjectKey = GetObjectKey();
sendMsg.m_byState = moveState;
sendMsg.wTileIndex = GetPathExplorer()->GetTile();
sendMsg.wvCurPos = wvCurPos;
sendMsg.wvDestPos = wvDestPosAfterThrust;
SendPacketAround( &sendMsg, sizeof(sendMsg) );
return TRUE;
}
float NPC::GetAttackRange() const
{
if( GetSelectedSkill() == SKILLCODE_INVALID )
{
ASSERT( GetSelectedSkill() != SKILLCODE_INVALID );
return 2.5f;
}
if( GetSelectedSkill() == SKILLCODE_NORMAL_ATTACK )
{
// 老馆 傍拜矫 NPC狼 扁夯 傍拜 荤芭府甫 府畔
return m_pBaseInfo->m_fAttRange;
}
else
{
// 胶懦 傍拜矫 秦寸 胶懦狼 傍拜 荤芭府甫 府畔
SkillScriptInfo *pBaseSkillInfo = SkillInfoParser::Instance()->GetSkillInfo( GetSelectedSkill() );
ASSERT( pBaseSkillInfo );
if(NULL == pBaseSkillInfo)
{
SUNLOG( eCRITICAL_LOG,"[NPC::GetAttackRange] SkillInfo is NULL [%d]\n", GetSelectedSkill() );
return 1.0f;
}
return pBaseSkillInfo->m_wSkillRange/10 + GetSkillRangeBonus();
}
}
BOOL NPC::IsFriend( Character *pTarget )
{
if( !pTarget ) return FALSE;
// 夯牢牢瘤 眉农茄促.
if( GetObjectKey() == pTarget->GetObjectKey() ) return TRUE;
// 夯牢苞 鸥百狼 家券等 咯何甫 犬牢茄促.
Character *pMySummoner = NULL; Character *pTargetSummoner = NULL;
SummonedNPCs *pMySummon = SummonManager::Instance()->FindSummonNPCs( m_dwSummonerKey );
SummonedNPCs *pTargetSummon = SummonManager::Instance()->FindSummonNPCs( pTarget->GetSummonerKey() );
if( pMySummon )
{
pMySummoner = pMySummon->GetSummoner();
if( pMySummoner == this ) pMySummoner = NULL;
}
if( pTargetSummon )
{
pTargetSummoner = pTargetSummon->GetSummoner();
if( pTargetSummoner == pTarget ) pTargetSummoner = NULL;
}
if( pMySummoner && pTargetSummoner )
{
// 夯牢家券磊狼 鸥涝苞 鸥百家券磊狼 鸥涝捞 鞍栏搁 酒焙捞 等促.
return pMySummoner->IsFriend( pTargetSummoner );
}
else if( pMySummoner )
{
// 夯牢家券磊狼 鸥涝苞 鸥百狼 鸥涝捞 鞍栏搁 酒焙捞 等促.
return pMySummoner->IsFriend( pTarget );
}
else if( pTargetSummoner )
{
// 夯牢 鸥涝苞 鸥百家券磊狼 鸥涝捞 鞍栏搁 酒焙捞 等促.
return IsFriend( pTargetSummoner );
}
// 鞍篮 阁胶磐尝府绰 酒焙栏肺 魄沥茄促.
if( ( pTarget->GetObjectType() & NPC_OBJECT ) == NPC_OBJECT )
{
return TRUE;
}
else
{
return FALSE;
}
}
VOID NPC::OnAttack( Character *pTarget, CODETYPE skillcode, DAMAGETYPE damage )
{
Character::OnAttack( pTarget, skillcode, damage );
// 弥檬肺 傍拜阑 啊茄 逞俊霸 檬扁 器牢飘甫 林扁困秦 AddAttackPoint甫 龋免茄促.
AddAttackPoint( pTarget, 0 );
}
DAMAGETYPE NPC::Damaged( Character *pAttacker, eATTACK_TYPE attackType, DAMAGETYPE damage )
{
if( pAttacker )
{
AddAttackPoint( pAttacker, damage );
}
return Character::Damaged( pAttacker, attackType, damage );
}
VOID NPC::SpecialAction()
{
// 老沥矫埃 埃拜栏肺 炼扒阑 眉农茄促.
if( !m_pSkillSelectTimer->IsExpired( FALSE ) ) return;
SPECIAL_CONDITION *pSpecialCondition = NULL;
// 炼扒 八荤
for( int i = 0; i < 2; ++i )
{
pSpecialCondition = &GetBaseInfo()->m_SpecialCondition[i];
if( CheckCondition( pSpecialCondition->byCondition, pSpecialCondition->wConditionParam ) )
{
// 犬伏 眉农
if( DrawLots( pSpecialCondition->byActionRate ) )
break;
}
pSpecialCondition = NULL;
}
if( !pSpecialCondition ) return;
// 诀单捞飘 林扁 盎脚
WORD wSkillUpdateTime = random( GetBaseInfo()->m_wSkillUpdateTime, GetBaseInfo()->m_wSkillUpdateTime*2 );
m_pSkillSelectTimer->SetTimer( wSkillUpdateTime );
switch( pSpecialCondition->wActionType )
{
case eNPC_SPECIAL_ACTION_HELPREQUEST:
{
// 傍拜措惑捞 绝栏搁 瘤盔夸没 公瓤
if( !m_pTargetChar ) return;
AI_MSG_HELP_REQUEST AIHelpMsg;
AIHelpMsg.dwAttackerKey = m_pTargetChar->GetObjectKey();
AIHelpMsg.dwTargetKey = GetObjectKey();
SendAIMessageAroundExceptMe( &AIHelpMsg, sizeof(AIHelpMsg) );
}
break;
case eNPC_SPECIAL_ACTION_TRANSFORMATION:
{
}
break;
case eNPC_SPECIAL_ACTION_SKILL:
{
// 傍拜措惑捞 绝栏搁 胶懦备荤 公瓤
if( !m_pTargetChar ) return;
SelectSkill( m_pTargetChar, pSpecialCondition->wActionParam );
ChangeState( STATE_ID_TRACK );
}
break;
}
}
VOID NPC::StatusResist()
{
// 老沥矫埃 埃拜栏肺 炼扒阑 眉农茄促.
if( !m_pSkillSelectTimer->IsExpired( FALSE ) ) return;
RESISTANCE_CONDITION *pResistanceCondition = NULL;
for( int i = 0; i < 2; ++i )
{
pResistanceCondition = &GetBaseInfo()->m_ResistanceCondition[i];
// 秦寸惑怕俊 吧啡绰瘤 眉农
if( !m_pStatusManager->FindStatus( (eCHAR_STATE_TYPE)pResistanceCondition->m_wStateCode ) ) continue;
// 诀单捞飘 林扁 盎脚
WORD wSkillUpdateTime = random( GetBaseInfo()->m_wSkillUpdateTime, GetBaseInfo()->m_wSkillUpdateTime*2 );
m_pSkillSelectTimer->SetTimer( wSkillUpdateTime );
// 犬伏 眉农
if( !DrawLots( pResistanceCondition->m_byRatio ) ) continue;
// 惑怕甫 秦力茄促.
m_pStatusManager->Remove( (eCHAR_STATE_TYPE)pResistanceCondition->m_wStateCode );
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -