📄 character.cpp
字号:
DWORD dwRecoverMP = (DWORD)( GetMaxMP() * fRecoverMP );
SetHP( dwRecoverHP );
SetMP( dwRecoverMP );
return TRUE;
}
VOID Character::OnAttack( Character *pTarget, CODETYPE skillcode, DAMAGETYPE damage )
{
m_pStatusManager->Attack( damage );
}
VOID Character::Attacked()
{
m_pStatusManager->Attacked();
}
DAMAGETYPE Character::Damaged( Character *pAttacker, eATTACK_TYPE attackType, DAMAGETYPE damage )
{
if( pAttacker )
{
m_KillerType = pAttacker->GetObjectType();
m_dwKillerObjectKey = pAttacker->GetObjectKey();
}
else
{
m_KillerType = MAX_OBJECT;
m_dwKillerObjectKey = 0;
}
m_pStatusManager->Damaged( pAttacker, attackType, damage );
DAMAGETYPE wResultDamage = (DAMAGETYPE)DecreaseHP( damage );
Attacked();
return wResultDamage;
}
BOOL Character::CanAttack() const
{
if( IsDead() )
{
return FALSE;
}
// 漂沥 惑怕俊 吧啡阑 版快 傍拜 阂啊
return m_pStatusManager->CanAttack();
}
BOOL Character::CanMove()
{
// 漂沥 惑怕俊 吧啡阑 版快 捞悼 阂啊
return m_pStatusManager->CanMove();
}
BOOL Character::CanBeAttacked() const
{
if ( IsDead() )
{
return FALSE;
}
// 漂沥 惑怕俊 吧啡阑 版快 傍拜阑 罐瘤 臼澜
return m_pStatusManager->CanBeAttacked();
}
float Character::GetDist(Character* pTargetCharacter) const
{
// 鸥百苞狼 芭府 备窍扁
WzVector vCurPos, vTargetPos;
GetPos( &vCurPos );
pTargetCharacter->GetPos( &vTargetPos );
return VectorLength( &(vTargetPos - vCurPos) );
}
float Character::GetDist(const WzVector& vTargetPos) const
{
// 鸥百苞狼 芭府 备窍扁
WzVector vCurPos;
GetPos( &vCurPos );
return VectorLength( &(vTargetPos - vCurPos) );
}
float Character::GetDist2( Character* pTargetCharacter ) const
{
// 鸥百苞狼 芭府 备窍扁
WzVector vCurPos, vTargetPos;
GetPos( &vCurPos );
pTargetCharacter->GetPos( &vTargetPos );
return VectorLength2( &(vTargetPos - vCurPos) );
}
float Character::GetDist2( const WzVector& vTargetPos ) const
{
// 鸥百苞狼 芭府 备窍扁
WzVector vCurPos;
GetPos( &vCurPos );
return VectorLength2( &(vTargetPos - vCurPos) );
}
BOOL Character::IsStandingOnJumpTile()
{
if( !GetField() ) return FALSE;
// 泅犁 辑乐绰 鸥老 加己 掘绢郴扁
GetField()->SetActiveRoom();
int iTile = GetPathExplorer()->GetTile();
WORD wTileAttr = GetWorldBase()->x_pPathFinder->GetAttribute( iTile );
// 痢橇 加己捞 器窃登绢 乐绰瘤 八荤
if( (wTileAttr & PTA_ONLY_JUMP) == 0 ) return FALSE;
return TRUE;
}
BOOL Character::CheckArea( WzVector &vTargetPos, WzVector &vMainTargetPos, BYTE byRangeForm, float fArea )
{
WzVector vAttackerPos;
GetPos( &vAttackerPos );
if( byRangeForm == SRF_FOWARD_120 )
{
// 120档
WzVector diffVec = vMainTargetPos - vAttackerPos;
if( !Math_IsPositionInFanshapedArea( &vTargetPos, &vAttackerPos, &diffVec, 120 ) )
{
return FALSE;
}
}
else if( byRangeForm == SRF_FOWARD_160 )
{
// 160档
WzVector diffVec = vMainTargetPos - vAttackerPos;
if( !Math_IsPositionInFanshapedArea( &vTargetPos, &vAttackerPos, &diffVec, 160 ) )
{
return FALSE;
}
}
else if( byRangeForm == SRF_PIERCE )
{
// 包烹
if( Math_IsPositionInOBB( &vAttackerPos, &vMainTargetPos, fArea*2, &vTargetPos ) )
return TRUE;
else
return FALSE;
}
// SkillArea甫 眉农茄促.(MainTarget阑 吝缴栏肺 窍绰 盔康开) ... 包烹老 版快绰 眉农窍瘤 臼绰促.
AIParamInfo& stAIParamInfo = AIParamParser::Instance()->GetInfo();
if( fArea && Math_Vector2DLength( vMainTargetPos, vTargetPos ) >= fArea + stAIParamInfo.m_fRANGE_TOLERANCE )
{
return FALSE;
}
return TRUE;
}
// 傍拜磊 扁霖
BOOL Character::CheckSkillRange( WzVector &vTargetPos, float fSkillRange )
{
WzVector vAttackerPos; GetPos( &vAttackerPos );
// 胶懦 荤芭府 魄喊(傍拜磊客 鸥百苞狼 芭府)
AIParamInfo& stAIParamInfo = AIParamParser::Instance()->GetInfo();
if( fSkillRange && Math_Vector2DLength( vAttackerPos, vTargetPos ) >= fSkillRange + GetSkillRangeBonus() + 2*stAIParamInfo.m_fRANGE_TOLERANCE )
{
// SUNLOG( eFULL_LOG, "[SkillAreaCheck] : Out of SkillRange! " );
return FALSE;
}
return TRUE;
}
VOID Character::SendPacketToParty( MSG_BASE_FORWARD * pMsg, WORD wSize )
{
// 颇萍甫 茫绰促.
Party *pParty = PartyManager::Instance()->FindParty( m_PartyState.GetPartyKey() );
if( !pParty ) return;
pParty->SendPacketAll( pMsg, wSize );
}
RC::ePACKET_SEND_RESULT Character::SendPacketAround( MSG_BASE_FORWARD * pMsg, WORD wSize, BOOL bSendToMe )
{
if( !GetField() ) return RC::RC_SEND_FAILED;
if( bSendToMe )
{
return GetField()->SendPacketAround( GetSectorIndex(), pMsg, wSize, 0 );
}
else
{
return GetField()->SendPacketAround( GetSectorIndex(), pMsg, wSize, GetObjectKey() );
}
}
RC::ePACKET_SEND_RESULT Character::SendExPacketAround( DWORD dwNumberOfMessages, BYTE **pMsg, WORD *pwSize, BOOL bSendToMe )
{
if( !GetField() ) return RC::RC_SEND_FAILED;
if( bSendToMe )
{
return GetField()->SendExPacketAround( GetSectorIndex(), dwNumberOfMessages, pMsg, pwSize, 0 );
}
else
{
return GetField()->SendExPacketAround( GetSectorIndex(), dwNumberOfMessages, pMsg, pwSize, GetObjectKey() );
}
}
VOID Character::PeriodicRecover( eCHAR_STATE_TYPE eStateID, int recoverHP, int recoverMP, int iApplicationTime, int iPeriodicTime )
{
EtcStatus *pBaseStatus = (EtcStatus*)m_pStatusManager->AllocStatus( eStateID, iApplicationTime, iPeriodicTime );
if( pBaseStatus ) pBaseStatus->SetRegenInfo( recoverHP, recoverMP );
}
BOOL Character::OnRecover( int recoverHP, int recoverMP )
{
BOOL bChanged = FALSE;
if( recoverHP > 0 )
{
DWORD oldHP = GetHP();
IncreaseHP( recoverHP );
bChanged = (oldHP != GetHP());
}
else if( recoverHP < 0 )
{
DWORD oldHP = GetHP();
DecreaseHP( -recoverHP );
bChanged = (oldHP != GetHP());
}
if( recoverMP > 0 )
{
DWORD oldMP = GetMP();
IncreaseMP( recoverMP );
bChanged = bChanged || (oldMP != GetMP());
}
else if( recoverMP < 0 )
{
DWORD oldMP = GetMP();
DecreaseMP( -recoverMP );
bChanged = (oldMP != GetMP());
}
if( bChanged )
{
MSG_CG_STATUS_RECOVER_ATTR_BRD sendMsg;
sendMsg.m_byCategory = CG_STATUS;
sendMsg.m_byProtocol = CG_STATUS_RECOVER_ATTR_BRD;
sendMsg.m_dwObjectKey = GetObjectKey();
sendMsg.m_dwTargetHP = GetHP();
sendMsg.m_dwTargetMP = GetMP();
SERVER_ENV * pServerEnv = g_pGameServer->GetFileParser()->GetServerEnv();
if( pServerEnv->bVillageRenderInfo && m_eGameZoneState == ePRS_AT_VILLAGE )
{
SendPacket( &sendMsg, sizeof(sendMsg) );
}
else
{
SendPacketAround( &sendMsg, sizeof(sendMsg) );
}
}
return TRUE;
}
BOOL Character::CheckCondition( BYTE byCondition, WORD wParam )
{
switch( byCondition )
{
case 1:
return CheckCondition_Under_HP( wParam );
case 2:
return CheckCondition_Under_MP( wParam );
case 3:
return CheckCondition_Same_HP( wParam );
case 4:
return CheckCondition_Same_MP( wParam );
}
return FALSE;
}
// HP啊 漂沥 欺季飘 捞窍捞搁 TRUE甫 府畔茄促.
BOOL Character::CheckCondition_Under_HP( WORD wPercent )
{
if( GetMaxHP() == 0 )
{
ASSERT( ! "MaxHP == 0" );
return FALSE;
}
return GetHP() * 100 / GetMaxHP() <= wPercent;
}
// MP啊 漂沥 欺季飘 捞窍捞搁 TRUE甫 府畔茄促.
BOOL Character::CheckCondition_Under_MP( WORD wPercent )
{
if( GetMaxMP() == 0 )
{
ASSERT( ! "MaxMP == 0" );
return FALSE;
}
return GetMP() * 100 / GetMaxMP() <= wPercent;
}
// HP啊 漂沥 欺季飘客 悼老窍搁 TRUE甫 府畔茄促.
BOOL Character::CheckCondition_Same_HP( WORD wPercent )
{
if( GetMaxHP() == 0 )
{
ASSERT( ! "MaxHP == 0" );
return FALSE;
}
return GetHP() * 100 / GetMaxHP() == wPercent;
}
// MP啊 漂沥 欺季飘客 悼老窍搁 TRUE甫 府畔茄促.
BOOL Character::CheckCondition_Same_MP( WORD wPercent )
{
if( GetMaxMP() == 0 )
{
ASSERT( ! "MaxMP == 0" );
return FALSE;
}
return GetMP() * 100 / GetMaxMP() == wPercent;
}
RC::eSKILL_RESULT Character::CanUseSkill( SLOTCODE SkillCode, BOOL bCoolTimerReset )
{
SkillScriptInfo *pBaseSkillInfo = (SkillScriptInfo *)SkillInfoParser::Instance()->GetSkillInfo( SkillCode );
if( !pBaseSkillInfo )
{
// SUNLOG( eFULL_LOG, "Character : [CanUseSkill] Can't Find SkillInfo! " );
return RC::RC_SKILL_BASEINFO_NOTEXIST;
}
// 傍拜且 荐 绝绰 惑炔捞扼搁
if( !CanAttack() )
{
return RC::RC_SKILL_STATE_WHERE_CANNOT_ATTACK_ENEMY;
}
// 酿鸥烙阑 眉农茄促.
util::Timer * pTimer = GetCoolTimer( pBaseSkillInfo->m_SkillClassCode );
if(!pTimer)
{
return RC::RC_SKILL_COOLTIME_ERROR;
}
if( !pTimer->IsExpired( FALSE ) )
{
return RC::RC_SKILL_COOLTIME_ERROR;
}
// 鞘夸 MP, HP啊 乐绰瘤 眉农茄促.
if( GetHP() <= pBaseSkillInfo->m_wHPSpend || GetMP() < pBaseSkillInfo->m_wMPSpend )
{
// SUNLOG( eFULL_LOG, "Character : [CanUseSkill] Either HP or MP of The Player run short! " );
return RC::RC_SKILL_HPMP_RUN_SHORT;
}
// 豪牢 惑怕俊 吧啡绰瘤 眉农
RC::eSKILL_RESULT rcResult = m_pStatusManager->CanUseSkill();
if( rcResult != RC::RC_SKILL_SUCCESS )
{
return rcResult;
}
return RC::RC_SKILL_SUCCESS;
}
VOID Character::SendAttrChange(eATTR_TYPE attrType, DWORD dwValue)
{
MSG_CG_STATUS_ATTR_CHANGE_BRD sendMsg;
sendMsg.m_dwObjKey = GetObjectKey();
sendMsg.m_AttrType = (BYTE)attrType;
sendMsg.m_dwValue = dwValue;
SendPacketAround( &sendMsg, sizeof(sendMsg), FALSE );
}
BOOL Character::IsCoincidentWithTargetType( Character *pTarget, eSKILL_TARGET_TYPE eTargetType )
{
switch( eTargetType )
{
case SKILL_TARGET_ME: case SKILL_TARGET_REACHABLE_ME:
{
if( GetObjectKey() != pTarget->GetObjectKey() ) return FALSE;
}
break;
case SKILL_TARGET_FRIEND: case SKILL_TARGET_REACHABLE_FRIEND:
{
if( !IsFriend( pTarget ) ) return FALSE;
}
break;
case SKILL_TARGET_ENEMY: case SKILL_TARGET_REACHABLE_ENEMY: case SKILL_TARGET_AREA:
{
if( IsFriend( pTarget ) ) return FALSE;
}
break;
case SKILL_TARGET_FRIEND_CORPSE:
{
if( IsAlive() ) return FALSE;
if( !IsFriend( pTarget ) ) return FALSE;
}
break;
}
return TRUE;
}
BOOL Character::IsStatus( eCHAR_STATE_TYPE eStateID )
{
if( m_pStatusManager->FindStatus( eStateID ) )
return TRUE;
else
return FALSE;
}
VOID Character::ModifyPosition( WzVector &vCurPos, WzVector &vDestPos, WzVector &vResultCurPos, WzVector &vResultDestPos, SLOTCODE SkillCode )
{
SkillScriptInfo *pBaseSkillInfo = (SkillScriptInfo *)SkillInfoParser::Instance()->GetSkillInfo( SkillCode );
WzVector vServerPos, vPosAfterThrust; GetPos( &vServerPos );
// 辑滚啊 舅绊 乐绰 敲饭捞绢狼 谅钎客 努扼捞攫飘啊 焊辰 谅钎啊 5m 捞惑 瞒捞唱绰 版快 辑滚甫 扁霖栏肺 茄促.
float fCurPosDiff = Math_Vector2DLength( vServerPos, vCurPos );
if( fCurPosDiff > 5.0f )
{
SUNLOG( eFULL_LOG, "[Player::ModifyPosition] The Server CurPos is different from the Client CurPos! CurPosDiff[%f]", fCurPosDiff );
vResultCurPos = vServerPos;
vResultDestPos = vServerPos;
}
// 努扼甫 瓜绊 敲饭捞绢狼 cur 困摹甫 嘎苗淋
else
{
vResultCurPos = vCurPos;
vResultDestPos = vDestPos;
if( pBaseSkillInfo && pBaseSkillInfo->IsNonStopSkill() )
{
// 敲饭捞绢绰 肛眠瘤臼绊 拌加 瘤唱埃促.
}
else
{
// 敲饭捞绢 困摹甫 努扼啊 焊郴霖 绢琶 矫累痢栏肺 颗变促.
SetPos( &vCurPos );
}
}
// 格利瘤肺 Thrust
if( vResultCurPos != vResultDestPos )
{
WzVector vDiff = vResultDestPos - vResultCurPos;
float fThrustDist = VectorLength( &vDiff );
ExecuteThrust( FALSE, &vDiff, vPosAfterThrust, fThrustDist );
}
}
VOID Character::SetMoveState( eCHAR_MOVE_STATE state )
{
m_pMoveStateControl->SetMoveState( state );
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -