⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 player.cpp

📁 奇迹世界 部分源代码奇迹世界 部分源代码奇迹世界 部分源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		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 + -