📄 player_skill.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 + -