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

📄 player_skill.cpp

📁 奇迹世界 部分源代码奇迹世界 部分源代码奇迹世界 部分源代码
💻 CPP
字号:
#include "stdafx.h"
#include "Player.h"
#include "Skill.h"
#include "SkillInfoParser.h"
#include "ResultCode.h"
#include "SCSlotContainer.h"
#include "ItemManager.h"
#include "SkillManager.h"
#include "SCSkillSlotContainer.h"
#include "ItemInfoParser.h"
#include "GameServer.h"


RC::eSKILL_RESULT Player::CanUseSkill( SLOTCODE SkillCode, BOOL bCoolTimerReset )
{
	SkillScriptInfo *pBaseSkillInfo = (SkillScriptInfo *)SkillInfoParser::Instance()->GetSkillInfo( SkillCode );
	if( !pBaseSkillInfo )
	{
		return RC::RC_SKILL_BASEINFO_NOTEXIST;
	}

	RC::eSKILL_RESULT rcResult;
	if( !pBaseSkillInfo->IsSummonSkill() )
	{
		rcResult = Character::CanUseSkill( SkillCode, bCoolTimerReset );
		if( rcResult != RC::RC_SKILL_SUCCESS )	return rcResult;
	}

	// 胶懦阑 嚼垫窍绊 乐绰瘤 眉农茄促.
	SCSkillSlotContainer *pContainer = m_pSkillManager->GetSkillSlotContainer();
	SCSkillSlot *pCurSkillSlot = pContainer->GetSkillSlotByCode( SkillCode );
	if( !pCurSkillSlot )
	{
		SUNLOG( eMIDDLE_LOG,  "Player::CanUseSkill The Player doesn't have the skill! " );
		return RC::RC_SKILL_DOES_NOT_HAVE;
	}

	// 夸备饭骇阑 眉农茄促.
	if( GetLevel() < pBaseSkillInfo->m_wRequireLv )
	{
		SUNLOG( eFULL_LOG,  "Player : [CanUseSkill] The Level of Player doesn't reach RequireLevel! " );
		return RC::RC_SKILL_REQUIRE_LEVEL_LIMIT;
	}

	// 夸备 槛访档1 眉农
	if( pBaseSkillInfo->m_wRequireSkillStat[0] && GetExperty1() < pBaseSkillInfo->m_wRequireSkillStat[0] )
	{
		SUNLOG( eFULL_LOG,  "Player : [CanUseSkill] The SkillStat1 of Player doesn't reach RequireSkillStat1! " );
		return RC::RC_SKILL_REQUIRE_SKILLSTAT_LIMIT;
	}

	// 夸备 槛访档2 眉农
	if( pBaseSkillInfo->m_wRequireSkillStat[1] && GetExperty2() < pBaseSkillInfo->m_wRequireSkillStat[1] )
	{
		SUNLOG( eFULL_LOG,  "Player : [CanUseSkill] The SkillStat2 of Player doesn't reach RequireSkillStat2! " );
		return RC::RC_SKILL_REQUIRE_SKILLSTAT_LIMIT;
	}

	// 家券眉 胶懦捞 酒聪扼搁 眉农秦具且 亲格
	if( !pBaseSkillInfo->IsSummonSkill() )
	{
		// 胶懦阑 荤侩且 荐 乐绰 某腐磐牢瘤 眉农茄促.
		if( !CheckClassDefine( pBaseSkillInfo->m_bySkillUserType, pBaseSkillInfo->m_dwClassDefine ) )
		{
			SUNLOG( eFULL_LOG,  "Player::CanUseSkill The Type Of Character is Invalid! " );
			return RC::RC_SKILL_CHAR_CLASS_LIMIT;
		}

		// 胶懦, 绢呼府萍 喊肺 炼扒 眉农
		rcResult = CheckSkillCondition( SkillCode );
		if( rcResult != RC::RC_SKILL_SUCCESS )	return rcResult;

		// 公扁 力茄
		if( pBaseSkillInfo->m_iWeaponDefine[0] != -1 )
		{
			DWORD dwCurWeaponKind = GetWeaponKind();

			// 公扁啊 绝栏搁 胶懦荤侩 阂啊
			if( dwCurWeaponKind == 0 )
			{
				SUNLOG( eFULL_LOG,  "[Player::CanUseSkill] The Weapon Type is Invalid! " );
				return RC::RC_SKILL_WEAPON_LIMIT;
			}

			// 公扁 力茄炼扒 4俺甫 眉农茄促.
			BOOL bSuccess = FALSE;
			for( int i = 0; i < 4; ++i )
			{
				if( dwCurWeaponKind == pBaseSkillInfo->m_iWeaponDefine[i] )
				{
					bSuccess = TRUE;
					break;
				}
			}
			if( !bSuccess )
			{
				SUNLOG( eFULL_LOG,  "Player : [CanUseSkill] The Weapon Type is Invalid! " );
				return RC::RC_SKILL_WEAPON_LIMIT;
			}
		}
	}

	if( bCoolTimerReset )
	{
		util::Timer * pTimer = GetCoolTimer( pBaseSkillInfo->m_SkillClassCode );
		if(!pTimer)
		{
			return RC::RC_SKILL_COOLTIME_ERROR;
		}
		pTimer->Reset();
	}

	return RC::RC_SKILL_SUCCESS;
}

RC::eSKILL_RESULT Player::CheckSkillCondition( SLOTCODE SkillCode )
{
	SkillScriptInfo *pBaseSkillInfo = (SkillScriptInfo *)SkillInfoParser::Instance()->GetSkillInfo( SkillCode );

	// HP 家柳 : HP啊 何练窍搁 胶懦 炼扒捞 救等促.
	BASE_ABILITYINFO *pBaseAbilityInfo = pBaseSkillInfo->GetAbilityInfo( eABILITY_EXHAUST_HP );
	if( pBaseAbilityInfo )
	{
		int iValueType = pBaseAbilityInfo->m_iParam[0];
		int iValue = pBaseAbilityInfo->m_iParam[1];

		// HP 趣篮 MP甫 瘤沥 荐摹父怒父 巢扁绊 葛滴 家柳矫挪促.
		if( iValueType == VALUE_TYPE_PERCENT_PER_MAX )			iValue = GetMaxHP() * iValue / 1000;
		else if( iValueType == VALUE_TYPE_PERCENT_PER_CUR )		iValue = GetHP() * iValue / 1000;

		if( iValue <= 0 )	return RC::RC_SKILL_HPMP_RUN_SHORT;
	}

	pBaseAbilityInfo = pBaseSkillInfo->GetAbilityInfo( eABILITY_FIGHTING_ENERGY_NUM_INCREASE );
	if( pBaseAbilityInfo )
	{
		if( GetFightingEnergy() >= MAX_FIGHTING_ENERGY_NUM )	return RC::RC_SKILL_FIGHTING_ENERGY_FULL;
	}

	pBaseAbilityInfo = pBaseSkillInfo->GetAbilityInfo( eABILITY_BONUS_DAMAGE_PER_SP );
	if( pBaseAbilityInfo )
	{
		DWORD dwCheckMP = GetMaxMP() * pBaseAbilityInfo->m_iOption2 / 1000;
		if( GetMP() < dwCheckMP )
		{
			return RC::RC_SKILL_HPMP_RUN_SHORT;
		}
	}

	return RC::RC_SKILL_SUCCESS;
}


BOOL Player::CanApplyPassiveSkill( SLOTCODE SkillCode )
{
	SkillScriptInfo *pBaseSkillInfo = (SkillScriptInfo *)SkillInfoParser::Instance()->GetSkillInfo( SkillCode );

	// 菩矫宏 胶懦牢瘤 眉农茄促.
	if( pBaseSkillInfo->m_bySkillType != SKILL_TYPE_PASSIVE )	return FALSE;

	// 胶懦阑 荤侩且 荐 乐绰 某腐磐牢瘤 眉农茄促.
	if( !CheckClassDefine( pBaseSkillInfo->m_bySkillUserType, pBaseSkillInfo->m_dwClassDefine ) )
	{
//		SUNLOG( eFULL_LOG,  "Player : [CanApplyPassiveSkill] The Type Of Character is Invalid! " );
		return FALSE;
	}

	// 公扁 力茄
	if( pBaseSkillInfo->m_iWeaponDefine[0] != -1 )
	{
		DWORD dwCurWeaponKind = GetWeaponKind();

		// 公扁啊 绝栏搁 胶懦荤侩 阂啊
		if( dwCurWeaponKind == 0 )
		{
//			SUNLOG( eFULL_LOG,  "Player : [CanApplyPassiveSkill] The Weapon Type is Invalid! " );
			return FALSE;
		}

		// 公扁 力茄炼扒 4俺甫 眉农茄促.
		BOOL bSuccess = FALSE;
		for( int i = 0; i < 4; ++i )
		{
			if( dwCurWeaponKind == pBaseSkillInfo->m_iWeaponDefine[i] )
			{
				bSuccess = TRUE;
				break;
			}
		}
		if( !bSuccess )
		{
//			SUNLOG( eFULL_LOG,  "Player : [CanApplyPassiveSkill] The Weapon Type is Invalid! " );
			return FALSE;
		}
	}

	// 夸备饭骇阑 眉农茄促.
	if( GetLevel() < pBaseSkillInfo->m_wRequireLv )
	{
//		SUNLOG( eFULL_LOG,  "Player : [CanUseSkill] The Level of Player doesn't reach RequireLevel! " );
		return FALSE;
	}

	// 夸备 槛访档1 眉农
	if( pBaseSkillInfo->m_wRequireSkillStat[0] && GetExperty1() < pBaseSkillInfo->m_wRequireSkillStat[0] )
	{
//		SUNLOG( eFULL_LOG,  "Player : [CanUseSkill] The SkillStat1 of Player doesn't reach RequireSkillStat1! " );
		return FALSE;
	}

	// 夸备 槛访档2 眉农
	if( pBaseSkillInfo->m_wRequireSkillStat[1] && GetExperty2() < pBaseSkillInfo->m_wRequireSkillStat[1] )
	{
//		SUNLOG( eFULL_LOG,  "Player : [CanUseSkill] The SkillStat2 of Player doesn't reach RequireSkillStat2! " );
		return FALSE;
	}

	// 胶懦, 绢呼府萍 喊肺 炼扒 眉农
	RC::eSKILL_RESULT rcResult = CheckSkillCondition( SkillCode );
	if( rcResult != RC::RC_SKILL_SUCCESS )	return FALSE;

	return TRUE;
}

//-------------------------------------------------------------------------------------------------
// 胶懦, 胶鸥老 嚼垫
//-------------------------------------------------------------------------------------------------

RC::eSKILL_RESULT Player::CanLevelUpSkill( BOOL bSkill, SLOTCODE CurSkillCode, SLOTCODE &NextSkillCode )
{
	SCSkillSlotContainer *pContainer = GetSkillManager()->GetSkillSlotContainer();
	SCSkillSlot *pSkillSlot = pContainer->GetSkillSlotByCode( CurSkillCode );

	// 胶懦阑 啊瘤绊 乐栏骨肺 饭骇诀阑 窍绰 版快捞促.
	if( pSkillSlot )
	{
		// 胶懦 饭骇诀 炼扒阑 眉农茄促.
		RC::eSKILL_RESULT rcResult;
		if( bSkill )	rcResult = m_pSkillManager->CanLevelUpSkill( CurSkillCode, CurSkillCode + 1 );
		else			rcResult = m_pSkillManager->CanLevelUpStyle( CurSkillCode, CurSkillCode + 1 );

		if( rcResult != RC::RC_SKILL_SUCCESS )		return rcResult;

		// 饭骇诀捞 等 促澜 胶懦内靛甫 茫绰促.
		NextSkillCode = CurSkillCode + 1;
	}
	// 胶懦阑 啊瘤绊 乐瘤 臼栏骨肺 贸澜栏肺 硅快绰 版快捞促.
	else
	{
		// 胶懦阑 弥檬肺 殿废窍绰 版快 嚼垫炼扒阑 眉农茄促.
		RC::eSKILL_RESULT rcResult;
		if( bSkill )	rcResult = m_pSkillManager->CanLearnSkill( CurSkillCode );
		else			rcResult = m_pSkillManager->CanLearnStyle( CurSkillCode );

		if( rcResult != RC::RC_SKILL_SUCCESS )		return rcResult;

		// 贸澜栏肺 硅匡 版快(LV.0) 努扼俊辑 dwCurSkillCode甫 LV.1楼府牢 dwNextSkillCode客 悼老茄 内靛甫 焊郴林扁肺 沁促.
		NextSkillCode = CurSkillCode;
	}

	return RC::RC_SKILL_SUCCESS;
}

DWORD Player::LevelUpSkill( BOOL bSkill, SLOTCODE CurSkillCode, SLOTCODE NextSkillCode, SKILLSLOT &SkillSlot )
{
	// 巢篮 胶懦器牢飘甫 鞘夸胶懦器牢飘 父怒 郴赴促.
	if( bSkill )
	{
		SkillScriptInfo *pBaseSkillInfo = SkillInfoParser::Instance()->GetSkillInfo( NextSkillCode );
		SCPlayer::GetCharInfo()->m_dwRemainSkill -= pBaseSkillInfo->m_byRequireSkillPoint;
	}
	else
	{
		BASE_STYLEINFO *pBaseStylenfo = SkillInfoParser::Instance()->GetStyleInfo( NextSkillCode );
		SCPlayer::GetCharInfo()->m_dwRemainSkill -= pBaseStylenfo->m_byRequireSkillPoint;
	}

	//肺弊沥焊俊 巢辨 敲饭捞绢 困摹
	WzVector vecPos;
	GetPos(&vecPos);

	// CurSkillCode客 NextSkillCode啊 鞍栏搁 货肺 嚼垫窍绰 版快捞促.
	if( CurSkillCode == NextSkillCode )
	{
		if( bSkill )	m_pSkillManager->LearnSkill( CurSkillCode, SkillSlot );		
		else			m_pSkillManager->LearnStyle( CurSkillCode, SkillSlot );

		// 胶懦 裙垫 肺弊 巢扁扁
		GAMELOG->WriteSkillLevelUp( this, g_pGameServer->GetServerGUID(), CurSkillCode, FALSE );
		// 胶懦 裙垫 肺弊 巢扁扁 场

	}
	else
	{
		if( bSkill )	m_pSkillManager->LevelUpSkill( CurSkillCode, NextSkillCode, SkillSlot );
		else			m_pSkillManager->LevelUpStyle( CurSkillCode, NextSkillCode, SkillSlot );

		// 胶懦 饭骇诀 肺弊 巢扁扁
		GAMELOG->WriteSkillLevelUp( this, g_pGameServer->GetServerGUID(), NextSkillCode, TRUE );

		// 胶懦 饭骇诀 肺弊 巢扁扁 场

	}

	return SCPlayer::GetCharInfo()->m_dwRemainSkill;
}

SLOTCODE Player::GetDefaultStyle( DWORD dwWeaponCode )
{
	// 盖颊老 版快
	if( !dwWeaponCode )
	{
		return GetPunchStyle();
	}

	BASE_ITEMINFO *pItemInfo = ItemInfoParser::Instance()->GetItemInfo( dwWeaponCode );
	if( !pItemInfo )	return GetPunchStyle();

	switch( pItemInfo->m_wType )
	{	
	case eITEMTYPE_TWOHANDSWORD:		return eSTYLE_TWOHANDSWORD_NORMAL;		// 剧颊 八 扁夯
	case eITEMTYPE_TWOHANDAXE:			return eSTYLE_TWOHANDAXE_NORMAL;		// 剧颊 档尝 扁夯
	case eITEMTYPE_ONEHANDSWORD:		return eSTYLE_ONEHANDSWORD_NORMAL;		// 茄颊 八 扁夯
	case eITEMTYPE_SPEAR:				return eSTYLE_SPEAR_NORMAL;				// 芒 扁夯
	case eITEMTYPE_STAFF:				return eSTYLE_STAFF_NORMAL;				// 瘤莆捞 扁夯
	case eITEMTYPE_ORB:					return eSTYLE_ORB_NORMAL;				// 坷宏 扁夯
	case eITEMTYPE_ONEHANDCROSSBOW:		return eSTYLE_ONEHANDCROSSBOW_NORMAL;	// 俊抛福 扁夯
	case eITEMTYPE_ETHERWEAPON:			return eSTYLE_ETHER_NORMAL;				// 茄颊 籍泵 扁夯
	default:							return GetPunchStyle();					// 舅荐绝绰 公扁老锭绰 林冈龙肺 函版
	}
}

SLOTCODE Player::GetPunchStyle()
{
	switch( GetCharType() )
	{
	case eCHAR_BERSERKER:		return eSTYLE_BERSERKER_PUNCH;
	case eCHAR_DRAGON:			return eSTYLE_DRAGON_PUNCH;
	case eCHAR_SHADOW:			return eSTYLE_SHADOW_PUNCH;
	case eCHAR_VALKYRIE:		return eSTYLE_VALKYRIE_PUNCH;
	case eCHAR_MAGICIAN:		return eSTYLE_MAGICIAN_PUNCH;
	default:					ASSERT( !"Player : [GetPunchStyle] Invalid CharType!" );	return eSTYLE_BERSERKER_PUNCH;
	}
}

BOOL Player::CheckClassDefine( BYTE byUserType, CODETYPE dwClassDefine )
{
	if( byUserType != eSKILL_USER_PLAYER )
		return FALSE;

	// 胶懦阑 荤侩且 荐 乐绰 某腐磐牢瘤 眉农茄促.
	if( GetCharType() != dwClassDefine )
		return FALSE;

	return TRUE;
}

















⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -