📄 instantskillattack.cpp
字号:
#include "stdafx.h"
#include "SkillInfoParser.h"
#include "NPC.h"
#include "Field.h"
#include "Character.h"
#include "Player.h"
#include "Skill.h"
#include "AITypes.h"
#include <PacketStruct_CG.h>
#include <battle.h>
#include "CharacterFormula.h"
VOID Skill::BroadcastInstantSkill()
{
Field *pField = m_pOwnerChar->GetField();
if( !pField ) return;
// 胶懦 备荤吝 嘎瘤 臼档废 秦具 窍绰 版快 厚怜阑 波霖促.
if( IsInvisibleSkill() )
{
m_pOwnerChar->SetVision( FALSE );
}
// 敲饭捞绢 困摹甫 努扼啊 焊郴霖 绢琶 矫累痢栏肺 颗变促.
WzVector vPlayerPos, vNPCPos;
vPlayerPos = m_SkillInfo.wvCurPos;
m_pOwnerChar->SetPos( &vPlayerPos );
// 敲饭捞绢甫 DestPos栏肺 捞悼矫挪促.
WzVector wvPosAfterThrust;
m_pOwnerChar->ExecuteThrust( &( m_SkillInfo.wvDestPos - m_SkillInfo.wvCurPos ), wvPosAfterThrust );
m_pOwnerChar->OnAttack( m_SkillInfo.dwSkillCode );
// 傍拜裹困俊 甸绢啊绰 NPC甸阑 茫酒辑 Result 贸府甫 茄促.
NPC *pNPC; WORD wDamage = 0; BOOL bMainTargetFound = FALSE; BYTE byHitObjectCount = 0;
WzVector wvNormalVectorP2M, vMainTargetPos;
SKILL_RESULT_POS_INFO PosResultMsg[MAX_TARGET_NUM];
SKILL_RESULT_NPOS_INFO NPosResultMsg[MAX_TARGET_NUM];
// Player谅钎甫 MainTarget栏肺 瘤沥窍绰 胶懦老 版快 vMainTargetPos阑 PlayerPos栏肺 瘤沥茄促. ( [m_uiTarget] 1:利, 2:酒焙, 3:磊脚, 4:裹困, 5:矫眉)
if( m_pBaseSkillInfo->m_uiTarget == 3 )
{
vMainTargetPos = vPlayerPos;
bMainTargetFound = TRUE;
}
///////////////////////////////////////////////////////////////////////////////////////////
// 傈眉 NPC俊霸 利侩登绰 犬伏 拌魂!
///////////////////////////////////////////////////////////////////////////////////////////
BYTE byCommonEffect = 0;
// 剐府霸 且 巴牢啊?
BOOL bKnockBack = FALSE;
if( m_pBaseSkillInfo->m_fKnockBackRate && GetRandProp() <= m_pBaseSkillInfo->m_fKnockBackRate * 100 )
{
bKnockBack = TRUE;
byCommonEffect |= SKILL_EFFECT_KNOCKBACK;
}
///////////////////////////////////////////////////////////////////////////////////////////
// 犬伏 拌魂捞 场车栏搁 贸府
///////////////////////////////////////////////////////////////////////////////////////////
for( DWORD i = 0; i < m_SkillInfo.byNumberOfTargets; ++i )
{
// 傍拜 措惑 茫扁
pNPC = pField->FindNPC( m_SkillInfo.dwTargetKey[i] );
if( !pNPC ) continue;
pNPC->GetPos( &vNPCPos );
wvPosAfterThrust = vNPCPos;
// 皋牢 鸥百捞 酒流 绝促搁 捞 NPC肺 汲沥
if( !bMainTargetFound )
{
vMainTargetPos = vNPCPos;
bMainTargetFound = TRUE;
}
// 胶懦 傍拜裹困俊 甸绢啊绰瘤 眉农
if( !SkillAreaCheck( pNPC, vMainTargetPos ) )
{
// DISPMSG( "Skill : [BroadcastInstantSkill] Out Of SkillArea! \n" );
continue;
}
// 单固瘤甫 利侩茄促.
if (pNPC->CanBeAttacked())
{
WORD armorDamageRatio = 100; // TODO: 蔼渴 辆幅喊肺 搬沥
BOOL bRangeAttack = FALSE;
wDamage = (WORD)CalcPhysicalDamage(m_pOwnerChar, pNPC, armorDamageRatio, bRangeAttack);
wDamage += m_pBaseSkillInfo->m_uiDamageValue1;
wDamage = (WORD) ( wDamage * ( 1 + m_pBaseSkillInfo->m_fDamagePercent1 ) );
}
pNPC->DecreaseHP( wDamage );
pNPC->OnDamaged( wDamage );
// NPC俊霸 傍拜罐疽促绊 舅妨霖促.
{
// 傍拜寸茄 NPC俊霸 AIMessage甫 朝赴促.
AI_MSG_ATTACK AIAttackMsg;
AIAttackMsg.dwAttackerKey = m_pOwnerChar->GetObjectKey();
AIAttackMsg.dwTargetKey = pNPC->GetObjectKey();
AIAttackMsg.wDamage = wDamage;
AIAttackMsg.dwTargetHP = pNPC->GetHP();
pNPC->SendAIMessage( &AIAttackMsg, sizeof(AI_MSG_ATTACK) );
}
// NPC啊 傍吝栏肺 哆绰 胶懦老 版快 Flying Message甫 朝赴促.
if( IsTargetFlyingSkill() )
{
AI_MSG_FLYING flyMsg;
flyMsg.dwFlyingTick = GetExecuteInterval();
pNPC->SendAIMessage( &flyMsg, sizeof(flyMsg) );
}
// 鸥百阑 肛苗初绰 胶懦老 版快
if( IsTargetStopSkill() )
{
AI_MSG_KNOCKDOWN downMsg;
downMsg.dwKnockDownTick = GetExecuteInterval();
pNPC->SendAIMessage( &downMsg, sizeof(downMsg) );
}
///////////////////////////////////////////////////////////////////////////////////////////
// NPC 付促 犬伏捞 利侩登绰 版快
///////////////////////////////////////////////////////////////////////////////////////////
BYTE bySkillEffect = 0;
bySkillEffect |= byCommonEffect;
// 胶畔阑 冈老 巴牢啊?
BOOL bStun = FALSE;
if( m_pBaseSkillInfo->m_fStunRate && GetRandProp() <= m_pBaseSkillInfo->m_fStunRate * 100 )
{
bStun = TRUE;
bySkillEffect |= SKILL_EFFECT_STUN;
}
// 促款矫懦 巴牢啊?
BOOL bKnockDown = FALSE;
if( m_pBaseSkillInfo->m_fDownRate && GetRandProp() <= m_pBaseSkillInfo->m_fDownRate * 100 )
{
bKnockDown = TRUE;
bySkillEffect |= SKILL_EFFECT_KNOCKDOWN;
}
///////////////////////////////////////////////////////////////////////////////////////////
// 犬伏 拌魂捞 场车栏搁 贸府
///////////////////////////////////////////////////////////////////////////////////////////
// 剐妨具 窍绰 版快狼 贸府(弊成 剐府扁客 促款登绰 剐府扁绰 加档啊 促福骨肺 促款 咯何档 持绢辑 鞍捞 贸府)
if( bKnockBack )
{
VectorNormalize( &wvNormalVectorP2M, &(vNPCPos - vPlayerPos) );
wvNormalVectorP2M = wvNormalVectorP2M * m_pBaseSkillInfo->m_fKnockBackRange;
pNPC->ExecuteThrust( &wvNormalVectorP2M, wvPosAfterThrust, bKnockDown );
}
// 剐府瘤绰 臼绊 促款父 登绰 版快
else if( bKnockDown )
{
// NPC俊霸 促款 皋技瘤甫 焊晨
AI_MSG_KNOCKDOWN downMsg;
pNPC->SendAIMessage( &downMsg, sizeof(downMsg) );
}
// 胶畔 贸府
if( bStun )
{
// NPC俊霸 胶畔 皋技瘤甫 焊晨
AI_MSG_STUN stunMsg;
pNPC->SendAIMessage( &stunMsg, sizeof(stunMsg) );
}
// Result Packet 沥焊甫 汲沥茄促.
if( m_pBaseSkillInfo->m_fKnockBackRate )
{
PosResultMsg[byHitObjectCount].dwTargetKey = pNPC->GetObjectKey();
PosResultMsg[byHitObjectCount].dwDamage = wDamage;
PosResultMsg[byHitObjectCount].dwTargetHP = pNPC->GetHP();
PosResultMsg[byHitObjectCount].bySkillEffect = bySkillEffect;
PosResultMsg[byHitObjectCount].wvCurPos = vNPCPos;
PosResultMsg[byHitObjectCount].wvDestPos = wvPosAfterThrust;
}
else
{
NPosResultMsg[byHitObjectCount].dwTargetKey = pNPC->GetObjectKey();
NPosResultMsg[byHitObjectCount].dwDamage = wDamage;
NPosResultMsg[byHitObjectCount].dwTargetHP = pNPC->GetHP();
NPosResultMsg[byHitObjectCount].bySkillEffect = bySkillEffect;
}
byHitObjectCount++;
}
///////////////////////////////////////////
// 扁夯 沥焊
MSG_BASE_FORWARD baseMsg;
baseMsg.m_byCategory = CG_SKILL;
baseMsg.m_byProtocol = CG_SKILL_P2M_INSTANT_BRD;
// 咀记 沥焊
SKILL_ACTION_POS_INFO actionMsg;
actionMsg.dwSkillCode = m_SkillInfo.dwSkillCode;
actionMsg.dwClientSerial = m_SkillInfo.dwClientSerial;
actionMsg.dwAttackerKey = m_pOwnerChar->GetObjectKey();
actionMsg.dwPrimaryTargetKey = m_SkillInfo.dwPrimaryTargetKey;
actionMsg.wvCurPos = m_SkillInfo.wvCurPos;
actionMsg.wvDestPos = m_SkillInfo.wvDestPos;
actionMsg.byNumberOfTargets = byHitObjectCount;
// 沥焊甸阑 窍唱肺 钦媚辑 焊辰促.
BYTE *pMsg[ 2 + MAX_TARGET_NUM ];
WORD wSize[ 2 + MAX_TARGET_NUM ];
for( i = 0; i < byHitObjectCount; i++ )
{
if( m_pBaseSkillInfo->m_fKnockBackRate )
{
pMsg[2+i] = (BYTE*)&PosResultMsg[i];
wSize[2+i] = PosResultMsg[i].GetSize();
}
else
{
pMsg[2+i] = (BYTE*)&NPosResultMsg[i];
wSize[2+i] = NPosResultMsg[i].GetSize();
}
}
pMsg[0] = (BYTE*)&baseMsg; pMsg[1] = (BYTE*)&actionMsg;
wSize[0] = sizeof(MSG_BASE_FORWARD);
wSize[1] = actionMsg.GetSize();
pField->SendExPacketAround( m_pOwnerChar, 2 + byHitObjectCount, pMsg, wSize );
}
VOID Skill::ExecuteInstantSkill()
{
// 敲饭捞绢啊 胶懦 备荤吝 阁胶磐狼 矫具俊辑 荤扼瘤绰 胶懦老 版快 Vision 加己阑 难霖促.
if( IsInvisibleSkill() )
{
m_pOwnerChar->SetVision( TRUE ); // 难拎具 登绰芭 酒囱啊? --; 淬傣\了价窃促 ^^;;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -