📄 styleskill.cpp
字号:
#include "stdafx.h"
#include "SkillInfoParser.h"
#include "NPC.h"
#include "Field.h"
#include "Character.h"
#include "Player.h"
#include "StyleSkill.h"
#include "AITypes.h"
#include "CharacterFormula.h"
#include <PacketStruct_CG.h>
#include <Battle.h>
#include <Global.h>
#include "StatusManager.h"
#include "AIParamParser.h"
#include "EtcStatus.h"
VOID StyleSkill::SetExecuteInterval()
{
Player *pPlayer = static_cast<Player*>( m_pOwnerChar );
m_wInterval = (WORD)( pPlayer->GetActionDelay() * m_pBaseStyleInfo->m_fThirdDelay );
// 菩哦 混~娄 老嘛 林磊
if( m_wInterval > 100 )
{
m_wInterval -= 100;
}
}
VOID StyleSkill::Init( Character* pOwnerChar, SkillInfo* pSkillInfo, void* pBaseStyleInfo )
{
m_pOwnerChar = pOwnerChar;
m_bEndExecute = TRUE;
memcpy( &m_SkillInfo, pSkillInfo, sizeof(SkillInfo) );
m_pBaseStyleInfo = (BASE_STYLEINFO*)pBaseStyleInfo;
// ExecuteInterval 悸泼
SetExecuteInterval();
// ExecuteTick 悸泼
m_dwExecuteTick = GetTickCount() + GetExecuteInterval();
}
VOID StyleSkill::StartExecute()
{
// 颇扼固磐甫 檬扁拳茄促.
if( !ParamInitialize() )
{
m_bEndExecute = FALSE;
return;
}
// MainTarget捞 蜡瓤茄瘤 眉农茄促.(胶懦 荤芭府 眉农)
if( !CheckMainTarget() )
{
m_bEndExecute = FALSE;
}
// 傍烹栏肺 贸府秦具 窍绰 荤亲阑 贸府茄促.
CommonExecute();
// 胶鸥老 傍拜 矫累俊 措茄 宏肺靛 某胶泼篮 秦霖促.
MSG_CG_STYLE_PLAYER_ATTACK_BRD brdMsg;
brdMsg.dwAttackerKey = m_pOwnerChar->GetObjectKey();
brdMsg.byAttackType = m_SkillInfo.m_byAttackType;
brdMsg.StyleCode = m_SkillInfo.m_SkillCode;
brdMsg.dwClientSerial = m_SkillInfo.m_dwClientSerial;
brdMsg.dwPrimaryTargetKey = m_SkillInfo.m_dwMainTargetKey;
brdMsg.wvCurPos = m_SkillInfo.m_wvCurPos;
brdMsg.wvDestPos = m_SkillInfo.m_wvDestPos;
m_pOwnerChar->SendPacketAround( (MSG_BASE_FORWARD*)&brdMsg, (WORD)brdMsg.GetSize() );
}
VOID StyleSkill::EndExecute()
{
if( !m_bEndExecute )
{
CommonRelease();
// Miss 贸府甫 窍扁 困秦辑 搬苞 菩哦篮 焊辰促.
Broadcast_Style_Result();
return;
}
// 宏肺靛 某胶泼 菩哦 霖厚
MSG_CG_STYLE_PLAYER_ATTACK_RESULT_BRD brdMsg;
brdMsg.dwClientSerial = m_SkillInfo.m_dwClientSerial;
brdMsg.dwAttackerKey = m_pOwnerChar->GetObjectKey();
// 敲饭捞绢 困摹 悸泼
m_pOwnerChar->GetPos( &m_vPlayerPos );
// 鸥百府胶飘甫 备茄促.
m_byNumberOfTargets = FindTargets( m_pTarget );
// 鸥百喊肺 单固瘤客 捞棋飘甫 利侩茄促.
Character *pMainTarget = NULL;
for( int i = 0; i < m_byNumberOfTargets; ++i )
{
if( !m_pTarget[i] ) continue;
if( m_SkillInfo.m_dwMainTargetKey == m_pTarget[i]->GetObjectKey() )
pMainTarget = m_pTarget[i];
// 胶鸥老 捞棋飘 棺 鸥百困摹 悸泼
m_SkillInfo.m_bySkillEffect = m_byCommonEffect;
m_pTarget[i]->GetPos( &m_vTargetPos );
m_vThrustPos = m_vTargetPos;
// 利焙牢瘤 眉农茄促.
if( m_pOwnerChar->IsFriend( m_pTarget[i] ) ) continue;
if( !m_pTarget[i]->CanBeAttacked() ) continue;
// 单固瘤甫 拌魂茄促.
if( CalcDamage( m_pTarget[i] ) )
{
// 傍拜捞 己傍沁阑 版快
m_pTarget[i]->Attacked();
SendAIMessage( m_pTarget[i], m_wDamage );
// 捞棋飘 瓤苞 利侩
ApplyEffect( m_pTarget[i] );
}
// 菩哦俊 眠啊
brdMsg.AttackInfo[m_byHitTargetCount].dwTargetKey = m_pTarget[i]->GetObjectKey();
brdMsg.AttackInfo[m_byHitTargetCount].wDamage = m_wDamage;
brdMsg.AttackInfo[m_byHitTargetCount].dwTargetHP = m_pTarget[i]->GetHP();
brdMsg.AttackInfo[m_byHitTargetCount].wvCurPos = m_vTargetPos;
brdMsg.AttackInfo[m_byHitTargetCount].wvDestPos = m_vThrustPos;
brdMsg.AttackInfo[m_byHitTargetCount].byEffect = m_SkillInfo.m_bySkillEffect;
m_byHitTargetCount++;
}
// 傍拜窍搁 MP, HP啊 雀汗登绰 某腐磐啊 乐促.
m_pOwnerChar->OnAttack( pMainTarget, m_SkillInfo.m_SkillCode, m_wMainTargetDamage );
brdMsg.byNumberOfTargets = m_byHitTargetCount;
m_pOwnerChar->SendPacketAround( (MSG_BASE_FORWARD*)&brdMsg, (WORD)brdMsg.GetSize() );
}
SLOTCODE StyleSkill::GetSkillCode()
{
return m_pBaseStyleInfo->m_SkillCode;
}
eSKILL StyleSkill::GetSkillClassCode()
{
return (eSKILL)m_pBaseStyleInfo->m_SkillClassCode;
}
BOOL StyleSkill::CheckMainTarget()
{
if( !m_pField )
{
SUNLOG( eCRITICAL_LOG, "[StyleSkill::CheckMainTarget] Field is NULL!" );
return FALSE;
}
Character *pMainTarget = m_pField->FindCharacter( m_SkillInfo.m_dwMainTargetKey );
if( !pMainTarget ) return FALSE;
// 皋牢鸥百 谅钎甫 汲沥茄促.
pMainTarget->GetPos( &m_SkillInfo.m_wvMainTargetPos );
// 包烹 胶鸥老牢 版快 皋牢鸥百 谅钎甫 皋牢鸥百阑 包烹茄 第祈 谅钎肺 促矫 备茄促.
if( m_pBaseStyleInfo->m_byAttRangeform == SRF_PIERCE )
{
WzVector vDiff = m_SkillInfo.m_wvMainTargetPos - m_SkillInfo.m_wvCurPos;
VectorNormalize( &vDiff, &vDiff );
m_SkillInfo.m_wvMainTargetPos += vDiff * m_pBaseStyleInfo->m_fStyleArea;
}
else
{
// 皋牢鸥百俊 措秦 胶懦 荤芭府甫 眉农茄促.
BOOL bSkillRangeCheck = m_pOwnerChar->CheckSkillRange( m_SkillInfo.m_wvMainTargetPos, m_pBaseStyleInfo->m_fAttRange );
if( !bSkillRangeCheck ) return FALSE;
}
return TRUE;
}
BOOL StyleSkill::ParamInitialize()
{
m_byCommonEffect = 0;
m_wDamage = 0;
m_wMainTargetDamage = 0;
return Skill::ParamInitialize();
}
VOID StyleSkill::CommonExecute()
{
// 胶懦 备荤吝 嘎瘤 臼档废 秦具 窍绰 版快 厚怜阑 波霖促.
if( GetAttribution() & SKILL_ATTRIBUTION_INVISIBLE )
{
m_pOwnerChar->GetStatusManager()->AllocStatus( eCHAR_STATE_ETC_DISABLE_VISION );
}
// 老窜 踌归篮 鸥百 NPC 傈眉俊 鞍篮 犬伏肺 利侩窍扁 困秦 固府 拌魂
if( m_pBaseStyleInfo->m_fKnockBackRate && GetRandProb() <= m_pBaseStyleInfo->m_fKnockBackRate * 100 )
{
m_byCommonEffect |= SKILL_EFFECT_KNOCKBACK;
}
}
VOID StyleSkill::CommonRelease()
{
// 敲饭捞绢啊 胶懦 备荤吝 阁胶磐狼 矫具俊辑 荤扼瘤绰 胶懦老 版快 Vision 加己阑 难霖促.
if( GetAttribution() & SKILL_ATTRIBUTION_INVISIBLE )
{
m_pOwnerChar->GetStatusManager()->Remove( eCHAR_STATE_ETC_DISABLE_VISION );
}
}
BYTE StyleSkill::FindTargets( Character **pTargetArray )
{
if( !m_pField )
{
SUNLOG( eCRITICAL_LOG, "[StyleSkill::FindTargets] Field is NULL!" );
return 0;
}
BYTE byNumberOfTargets = 0;
// 窜老 鸥百俊霸 荤侩窍绰 胶懦牢 版快 鸥百阑 八祸窍瘤 臼绊 皋牢鸥百栏肺 悸泼茄促.
if( m_pBaseStyleInfo->m_byAttRangeform == SRF_FOWARD_ONE )
{
Character *pMainTarget = m_pField->FindCharacter( m_SkillInfo.m_dwMainTargetKey );
if( pMainTarget )
{
byNumberOfTargets = 1;
pTargetArray[0] = pMainTarget;
}
}
else
{
// 鸥百府胶飘甫 备茄促.
byNumberOfTargets += m_pField->FindTargetsByAttacker( SKILL_TARGET_ENEMY, m_pOwnerChar, &pTargetArray[byNumberOfTargets], m_SkillInfo.m_wvMainTargetPos,
0, m_pBaseStyleInfo->m_byAttRangeform, m_pBaseStyleInfo->m_fStyleArea );
}
return byNumberOfTargets;
}
BOOL StyleSkill::CalcDamage( Character *pTarget )
{
// 单固瘤甫 利侩茄促.
BOOL bCritical = FALSE;
m_wDamage = CalcNormalDamage( m_pOwnerChar, pTarget, eATTACK_TYPE_MELEE, m_pBaseStyleInfo->m_wCriticalBonus, &bCritical, m_pBaseStyleInfo->m_fDefenseIgnore );
// 农府萍拿捞 磐瘤搁
if (bCritical)
{
m_SkillInfo.m_bySkillEffect |= SKILL_EFFECT_CRITICAL;
}
m_wDamage = (DAMAGETYPE) ( m_wDamage * ( 1 + m_pBaseStyleInfo->m_fDamagePercent[2] ) ) + m_pBaseStyleInfo->m_iAddDamage[2];
// 惯虐府 俊抛福 胶鸥老牢 版快 胶敲贰浆 单固瘤 30%父 利侩
AIParamInfo& stAIParamInfo = AIParamParser::Instance()->GetInfo();
if( m_pBaseStyleInfo->m_SkillClassCode == eSTYLE_ETHER_NORMAL )
{
if( m_SkillInfo.m_dwMainTargetKey != pTarget->GetObjectKey() )
{
m_wDamage = (DAMAGETYPE)(m_wDamage * stAIParamInfo.m_fETHER_SPLASH_DAMAGE_RATIO);
}
}
// 老馆 胶鸥老 胶敲贰浆 单固瘤 50% 利侩
else
{
if( m_SkillInfo.m_dwMainTargetKey != pTarget->GetObjectKey() )
{
m_wDamage = (DAMAGETYPE)(m_wDamage * stAIParamInfo.m_fSTYLE_SPLASH_DAMAGE_RATIO);
}
}
DAMAGETYPE wResultDamage = pTarget->Damaged( m_pOwnerChar, eATTACK_TYPE_MELEE, m_wDamage );
// MainTarget牢 版快
if( m_SkillInfo.m_dwMainTargetKey == pTarget->GetObjectKey() )
{
m_wMainTargetDamage = wResultDamage;
}
if( m_wDamage ) return TRUE;
else return FALSE;
}
VOID StyleSkill::ApplyEffect( Character *pTarget )
{
// 包烹
if( m_pBaseStyleInfo->m_fPierceRate && GetRandProb() <= m_pBaseStyleInfo->m_fPierceRate * 100 )
{
m_SkillInfo.m_bySkillEffect |= SKILL_EFFECT_PIERCE;
}
BOOL bKnockDownExcecute = FALSE;
if( pTarget->GetStatusManager()->CanThrustDown() )
{
// 胶畔
if( m_pBaseStyleInfo->m_fStunRate && GetRandProb() <= m_pBaseStyleInfo->m_fStunRate * 100 )
{
m_SkillInfo.m_bySkillEffect |= SKILL_EFFECT_STUN;
pTarget->GetStatusManager()->AllocStatus( eCHAR_STATE_STYLE_STUN, m_pBaseStyleInfo->m_wStunTime, 0 );
}
// 促款
if( m_pBaseStyleInfo->m_fDownRate && GetRandProb() <= m_pBaseStyleInfo->m_fDownRate * 100 )
{
m_SkillInfo.m_bySkillEffect |= SKILL_EFFECT_KNOCKDOWN;
bKnockDownExcecute = TRUE;
}
}
AIParamInfo& stAIParamInfo = AIParamParser::Instance()->GetInfo();
// 剐妨具 窍绰 版快狼 贸府(剐赴 饶 促款 瞪 巴牢啊狼 沥焊档 器窃)
if( m_SkillInfo.m_bySkillEffect & SKILL_EFFECT_KNOCKBACK )
{
WzVector wvNormalVectorP2M;
WzVector diffVec = m_vTargetPos - m_vPlayerPos;
VectorNormalize( &wvNormalVectorP2M, &diffVec );
wvNormalVectorP2M = wvNormalVectorP2M * m_pBaseStyleInfo->m_fKnockBackRange;
if( pTarget->ExecuteThrust( TRUE, &wvNormalVectorP2M, m_vThrustPos, m_pBaseStyleInfo->m_fKnockBackRange, bKnockDownExcecute ) )
{
EtcStatus *pBaseStatus = (EtcStatus*)pTarget->GetStatusManager()->AllocStatus( eCHAR_STATE_STYLE_THRUST, stAIParamInfo.m_wTHRUST_TIME, 0 );
// 促款篮 Thrust 惑怕 郴何俊辑 贸府窍档废 茄促.
if( pBaseStatus ) pBaseStatus->SetDownTime( stAIParamInfo.m_wKNOCKDOWN_TIME );
bKnockDownExcecute = FALSE;
}
else
{
// 瘤屈 剐府扁啊 角菩茄 版快!!
m_SkillInfo.m_bySkillEffect &= ~SKILL_EFFECT_KNOCKBACK;
}
}
// 剐府瘤绰 臼绊 促款父 登绰 版快
if( bKnockDownExcecute )
{
pTarget->GetStatusManager()->AllocStatus( eCHAR_STATE_STYLE_DOWN, stAIParamInfo.m_wKNOCKDOWN_TIME, 0 );
}
}
VOID StyleSkill::Broadcast_Style_Result()
{
MSG_CG_STYLE_PLAYER_ATTACK_RESULT_BRD brdMsg;
brdMsg.dwClientSerial = m_SkillInfo.m_dwClientSerial;
brdMsg.dwAttackerKey = m_pOwnerChar->GetObjectKey();
brdMsg.byNumberOfTargets = m_byHitTargetCount;
m_pOwnerChar->SendPacketAround( (MSG_BASE_FORWARD*)&brdMsg, (WORD)brdMsg.GetSize() );
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -