📄 player.cpp
字号:
sendMsg.m_byCategory = CG_STATUS;
sendMsg.m_byProtocol = CG_STATUS_DEAD_BRD;
sendMsg.m_dwObjectKey = GetObjectKey();
sendMsg.m_wvCurPos = curPos;
sendMsg.m_dwExp = GetExp();
SendPacketAround( &sendMsg, sizeof(sendMsg) );
// 家券眉甫 昏力茄促.
SummonManager::Instance()->LeaveSummonNPCs( this );
// 敲饭捞绢 荤噶 肺弊
CODETYPE dwMapCode = GetField()->GetMap()->GetMapCode();
GAMELOG->WritePlayerDead( this, g_pGameServer->GetServerGUID(), GetExp(), dwMapCode,
(int)curPos.x, (int)curPos.y, (int)curPos.z );
// 敲饭捞绢 荤噶 肺弊 场
// !!!!!!!烙矫!!!!!!!!
if( ePRS_AT_PVP == GetGameZoneState() )
{
GamePVPRoom * pPVPRoom = (GamePVPRoom *)GetGameZonePtr();
if( m_KillerType == PLAYER_OBJECT )
{
pPVPRoom->GetPVPManager()->OnPVPResult( m_dwKillerObjectKey, this );
}
}
return TRUE;
}
return FALSE;
}
VOID Player::OnAttack( Character *pTarget, SLOTCODE skillcode, DAMAGETYPE damage )
{
Character::OnAttack( pTarget, skillcode, damage );
DWORD skillRecoverPercent = 100;
DWORD skillRequireMP = 0;
SkillScriptInfo* pSkillInfo = SkillInfoParser::Instance()->GetSkillInfo( skillcode );
if( pSkillInfo )
{
skillRequireMP = pSkillInfo->m_wMPSpend;
}
// 傍拜且锭 雀汗樊
DWORD recoverMP = CalcMPRecoverByAttack( GetCharType(), m_Attr.GetSPR(), skillRecoverPercent, skillRequireMP );
OnRecover( 0, recoverMP );
}
DAMAGETYPE Player::Damaged( Character *pAttacker, eATTACK_TYPE attackType, DAMAGETYPE damage )
{
// 鸥拜 罐疽阑嫐 雀汗樊
DWORD recoverMP = CalcMPRecoverByAttacked( GetCharType(), m_Attr.GetSPR(), damage );
OnRecover( 0, recoverMP );
return Character::Damaged( pAttacker, attackType, damage );
}
//-------------------------------------------------------------------------------------------------
// 困摹 函拳
//-------------------------------------------------------------------------------------------------
VOID Player::SetPos( WzVector* pwzVec )
{
Character::SetPos(pwzVec);
}
BOOL Player::ExecuteThrust( BOOL bForcedMove, WzVector *pwvMoveDistance, WzVector &wvPosAfterThrust, float fMoveDistance, BOOL bDownAfterThrust )
{
Field *pField = GetField();
if( !pField )
{
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;
}
// Player 剐府扁 贸府
if( !pField->FindPathThrust( this, pwvMoveDistance, bForcedMove ) )
{
return FALSE;
}
wvPosAfterThrust = GetPathExplorer()->GetTargetPos();
SetMoveState( CMS_SWIPE );
return TRUE;
}
//-------------------------------------------------------------------------------------------------
// 酒捞袍 包访
//-------------------------------------------------------------------------------------------------
RC::eITEM_RESULT Player::CanUseItem( BASE_ITEMINFO * pItemInfo )
{
if( GetField()==NULL )
{
return RC::RC_ITEM_INVALIDSTATEOFPLAYER;
}
if( IsDead() )
{
return RC::RC_ITEM_INVALIDSTATEOFPLAYER;
}
if( GetHP()==GetMaxHP() )
{
return RC::RC_ITEM_INVALIDSTATEOFPLAYER;
}
// 酿鸥烙捞 乐阑 版快 眉农
util::Timer * pTimer = GetItemCoolTimer( pItemInfo->m_byWasteType );
if( pTimer )
{
if( !pTimer->IsExpired( FALSE ) )
{
return RC::RC_ITEM_COOLTIME_ERROR;
}
pTimer->Reset();
}
return RC::RC_ITEM_SUCCESS;
}
VOID Player::SetActionDelay( DWORD delay )
{
m_ActionTimer.SetTimer( delay );
if( delay )
{
m_bDoingAction = TRUE;
}
else if( m_bDoingAction )
{
m_bDoingAction = FALSE;
MSG_CG_SYNC_ACTION_EXPIRED_CMD msg;
SendPacket( &msg, sizeof(msg) );
}
}
DWORD Player::GetActionDelay()
{
return m_ActionTimer.GetIntervalTime();
}
BOOL Player::IsActionExpired()
{
if( m_ActionTimer.IsExpired() )
{
return TRUE;
}
return FALSE;
}
VOID Player::ApplyPenalty()
{
//饭骇 5捞窍绰 菩澄摹 利侩 绝澜
if( GetLevel() <= 5 ) return;
// PVP绰 菩澄萍 救淋 : 烙矫
if( ePRS_AT_PVP == GetGameZoneState() ) return;
// 版氰摹俊 利侩且 菩澄萍狼 剧
DWORD dwNextAccumExp = GetAccumExp( GetLevel() + 1 );
DWORD dwCurAccumExp = GetAccumExp( GetLevel() );
DWORD dwResultExp = dwCurAccumExp;
float fRatio = 0;
if(GetLevel() > 5 && GetLevel() <= 90)
fRatio = 0.03f;
else if(GetLevel() >= 91 && GetLevel() <= MAX_LEVEL)
fRatio = 0.01f;
else
fRatio = 0;
__int64 iDiff = (__int64)( ( dwNextAccumExp - dwCurAccumExp ) * fRatio );
if( iDiff < 0 )
{
SUNLOG( eCRITICAL_LOG, "[Player::ApplyPenalty] iDiff[%I64d] dwCurAccumExp[%d] dwNextAccumExp[%d] CurExp[%d] ",
iDiff, dwCurAccumExp, dwNextAccumExp, GetExp() );
return;
}
if( dwCurAccumExp < (GetExp() - iDiff) )
{
dwResultExp = (DWORD)(GetExp() - iDiff);
m_dwDeadExp = (DWORD)iDiff;
}
else
{
if( GetExp() > dwCurAccumExp ) m_dwDeadExp = GetExp() - dwCurAccumExp;
else m_dwDeadExp = 0;
}
// 版氰摹 促款 肺弊 巢扁扁
GAMELOG->WriteDownExp( this, g_pGameServer->GetServerGUID(), dwResultExp,
m_dwDeadExp, GetLevel() );
// 版氰摹 促款 肺弊 巢扁扁 场
SetExp( dwResultExp );
}
BASE_PLAYERINFO* Player::GetCharInfo()
{
m_Attr.GetCharInfo( SCPlayer::GetCharInfo() );
return SCPlayer::GetCharInfo();
}
BOOL Player::IsFriend( Character *pTarget )
{
// 夯牢牢瘤 眉农茄促.
if( GetObjectKey() == pTarget->GetObjectKey() ) return TRUE;
// 鸥百捞 家券等 NPC牢 版快
SummonedNPCs *pSummonedNPCs = SummonManager::Instance()->FindSummonNPCs( pTarget->GetSummonerKey() );
if( pSummonedNPCs )
{
// 鸥百狼 家券磊啊 酒焙捞扼搁 鸥百档 酒焙捞 等促.
Character *pSummoner = pSummonedNPCs->GetSummoner();
if( pSummoner && pTarget != pSummoner )
{
return IsFriend( pSummoner );
}
}
// PVP 粮
if( m_pPVPInfo->GetPVPState() == ePVP_USER_MATCH )
{
// PVP 粮俊辑 评傈(颇萍家加)老 版快 鞍篮 颇萍盔甸尝府父 酒焙捞 等促.
if( m_PartyState.IsMember() )
{
if( m_PartyState.GetPartyKey() == pTarget->GetPartyState().GetPartyKey() )
return TRUE;
}
return FALSE;
}
else
{
// 鞍篮 蜡历甸尝府绰 酒焙栏肺 魄沥茄促.
if( ( pTarget->GetObjectType() & PLAYER_OBJECT ) == PLAYER_OBJECT )
return TRUE;
else
return FALSE;
}
}
BOOL Player::IsGMPlayer()
{
SERVER_ENV * pServerEnv = g_pGameServer->GetFileParser()->GetServerEnv();
if( pServerEnv->bGMListApply )
{
GM_INFO *pGMInfo = GMList::Instance()->FindGM( GetUserID() );
if( pGMInfo )
return TRUE;
else
return FALSE;
}
else
return TRUE;
}
BOOL Player::IsSuperPlayer()
{
GM_INFO *pGMInfo = GMList::Instance()->FindSuperUser( GetUserID() );
if( pGMInfo )
return TRUE;
else
return FALSE;
}
BOOL Player::CanChat()
{
if( SCPlayer::GetCharInfo()->m_byCharState == DBCHAR_STATE_CHAT_BLOCK )
return FALSE;
return TRUE;
}
BOOL Player::CanBehave()
{
if( SCPlayer::GetCharInfo()->m_byCharState == DBCHAR_STATE_BEHAVE_BLOCK )
return FALSE;
return TRUE;
}
VOID Player::SetDBCharState( eDBCHAR_STATE stat, WORD wMinutes )
{
SCPlayer::GetCharInfo()->m_byCharState = stat;
switch( stat )
{
case DBCHAR_STATE_BEHAVE_BLOCK:
{
//WZTime::GetTime( 3, SCPlayer::GetCharInfo()->m_tszStateTime, MAX_TIMEDATA_SIZE );
//眠啊利牢 矫埃 扁废
}
break;
}
}
CWarehouseSlotContainer * Player::GetWarehouseContainer()
{
return (CWarehouseSlotContainer *)GetItemManager()->GetItemSlotContainer(SI_WAREHOUSE);
}
//何劝
BOOL Player::OnResurrection( float fRecoverExp, float fRecoverHP, float fRecoverMP )
{
if( Character::OnResurrection( fRecoverExp, fRecoverHP, fRecoverMP ) )
{
if( GetCharType() == eCHAR_BERSERKER || GetCharType() == eCHAR_SHADOW )
{
SetMP( 0 );
}
// 敲饭捞绢 何劝 肺弊 巢扁扁
if( GetField() && GetField()->GetMap() )
{
WzVector vecPos; GetPos(&vecPos);
CODETYPE dwMapCode = GetField()->GetMap()->GetMapCode();
GAMELOG->WritePlayerResurrection( this, g_pGameServer->GetServerGUID(), GetExp(),
dwMapCode, (int)vecPos.x, (int)vecPos.y, (int)vecPos.z );
}
// 敲饭捞绢 何劝 肺弊 巢扁扁 场
return TRUE;
}
return FALSE;
}
BOOL Player::IsOverPlayingTime()
{
WORD wHour = GetCharInfo()->m_PlayLimitedTime / 60;
// 12矫埃阑 逞菌绰瘤 眉农
AIParamInfo& stAIParamInfo = AIParamParser::Instance()->GetInfo();
if( stAIParamInfo.m_wPLAYING_OVER_TIME && wHour >= stAIParamInfo.m_wPLAYING_OVER_TIME ) return TRUE;
return FALSE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -