📄 playerstyle.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 "CharacterFormula.h"
#include <PacketStruct_CG.h>
#include <Battle.h>
#include <Global.h>
VOID Skill::Broadcast_PlayerStyleAttack()
{
// 鸥百捞 鞘靛俊 乐绰瘤 眉农
NPC *pNPC = m_pOwnerChar->GetField()->FindNPC( m_SkillInfo.dwPrimaryTargetKey );
if( !pNPC ) return;
Field *pField = m_pOwnerChar->GetField();
if( !pField ) return;
// 胶鸥老 傍拜 矫累俊 措茄 宏肺靛 某胶泼篮 秦霖促.
MSG_CG_STYLE_P2M_ATTACK_BRD brdMsg;
brdMsg.m_byCategory = CG_STYLE;
brdMsg.m_byProtocol = CG_STYLE_P2M_ATTACK_BRD;
brdMsg.dwAttackerKey = m_pOwnerChar->GetObjectKey();
brdMsg.byAttackType = m_SkillInfo.byAttackType;
brdMsg.dwStyleCode = m_SkillInfo.dwSkillCode;
brdMsg.dwClientSerial = m_SkillInfo.dwClientSerial;
brdMsg.dwPrimaryTargetKey = m_SkillInfo.dwTargetKey[0];
brdMsg.wvCurPos = m_SkillInfo.wvCurPos;
brdMsg.wvDestPos = m_SkillInfo.wvDestPos;
//DISPMSG("Broadcast_PlayerStyleAttack: %s --> %s\n", ToString(brdMsg.wvCurPos).c_str(), ToString(brdMsg.wvDestPos).c_str());
pField->SendPacketAround( m_pOwnerChar, (MSG_BASE_FORWARD*)&brdMsg, (WORD)brdMsg.GetSize() );
}
VOID Skill::Execute_PlayerStyleAttack()
{
Field *pField = m_pOwnerChar->GetField();
if( !pField ) return;
// 宏肺靛 某胶泼 菩哦 霖厚
MSG_CG_STYLE_P2M_ATTACK_RESULT_BRD brdMsg;
brdMsg.m_byCategory = CG_STYLE;
brdMsg.m_byProtocol = CG_STYLE_P2M_ATTACK_RESULT_BRD;
brdMsg.dwClientSerial = m_SkillInfo.dwClientSerial;
brdMsg.dwAttackerKey = m_pOwnerChar->GetObjectKey();
WzVector vPlayerPos, vNPCPos;
m_pOwnerChar->GetPos( &vPlayerPos );
// TODO: StyleAttack俊辑狼 鸥拜拌 MP雀汗贸府啊 鞘夸窍促? StyleInfo俊 MP家葛樊捞 绝促.;
// m_pOwnerChar->OnAttack( m_SkillInfo.dwSkillCode );
// 罐篮 府胶飘 吝俊辑 傍拜俊 蜡瓤茄 阁胶磐甸父 单固瘤 贸府 饶 宏肺靛 某胶飘 菩哦俊 眠啊
NPC *pNPC;
BOOL bMainTargetFound = FALSE;
BYTE byHitObjectCount = 0;
WzVector wvNormalVectorP2M, wvPosAfterThrust, vMainTargetPos;
DWORD dwDamage = 0;
///////////////////////////////////////////////////////////////////////////////////////////
// 老窜 踌归苞 促款篮 鸥百 NPC 傈眉俊 鞍篮 犬伏肺 利侩窍扁 困秦 固府 拌魂
///////////////////////////////////////////////////////////////////////////////////////////
BYTE byCommonEffect = 0;
// 剐府霸 且 巴牢啊?
BOOL bKnockBack = FALSE;
if( m_pBaseStyleInfo->m_fKnockBackRate && GetRandProp() <= m_pBaseStyleInfo->m_fKnockBackRate * 100 )
{
bKnockBack = TRUE;
byCommonEffect |= SKILL_EFFECT_KNOCKBACK;
}
// 鸥百 NPC 俺喊利 贸府
for( DWORD i = 0; i < m_SkillInfo.byNumberOfTargets; ++i )
{
BYTE bySkillEffect = 0;
bySkillEffect |= byCommonEffect;
// 傍拜 措惑 茫扁
pNPC = pField->FindNPC( m_SkillInfo.dwTargetKey[i] );
if( !pNPC )
{
DISPMSG( "Skill : [ExecuteStyleAttack] Can't Find NPC!\n" );
continue;
}
pNPC->GetPos( &vNPCPos );
wvPosAfterThrust = vNPCPos;
// 皋牢 鸥百捞 酒流 绝促搁 捞 NPC肺 汲沥
if( !bMainTargetFound )
{
vMainTargetPos = vNPCPos;
bMainTargetFound = TRUE;
}
// 胶鸥老 傍拜裹困俊 甸绢啊绰瘤 眉农
BOOL bAreaCheckFlag = pNPC->IsWithinRange( m_pOwnerChar, vMainTargetPos, m_pBaseStyleInfo->m_uiAttRangeform,
m_pBaseStyleInfo->m_fAttRange, 0 );
if( !bAreaCheckFlag )
{
// DISPMSG( "Skill : [ExecuteStyleAttack] Out Of StyleArea!\n" );
continue;
}
// 单固瘤甫 利侩茄促.
DWORD dwDamage = 0;
if (pNPC->CanBeAttacked())
{
BOOL bSkillAttack = FALSE;
BOOL bRangeAttack = FALSE;
WORD wCriticalBonus = m_pBaseStyleInfo->m_wCriticalBonus;
float fCriticalRatioBonus = 0;
BOOL bCritical = FALSE;
dwDamage = CalcPhysicalDamage( m_pOwnerChar, pNPC, bSkillAttack, bRangeAttack, wCriticalBonus, fCriticalRatioBonus, &bCritical);
// 农府萍拿捞 磐瘤搁
if (bCritical)
{
bySkillEffect |= SKILL_EFFECT_CRITICAL;
}
dwDamage = (DWORD) ( dwDamage * ( 1 + m_pBaseStyleInfo->m_fDamagePercent3 ) ) + m_pBaseStyleInfo->m_uiAddDamage3;
}
pNPC->DecreaseHP( dwDamage );
pNPC->OnDamaged( dwDamage );
// NPC俊霸 傍拜罐疽促绊 舅妨霖促.
{
// 傍拜寸茄 NPC俊霸 AIMessage甫 朝赴促.
AI_MSG_ATTACK AIAttackMsg;
AIAttackMsg.dwAttackerKey = m_pOwnerChar->GetObjectKey();
AIAttackMsg.dwTargetKey = pNPC->GetObjectKey();
AIAttackMsg.dwDamage = dwDamage;
AIAttackMsg.dwTargetHP = pNPC->GetHP();
pNPC->SendAIMessage( &AIAttackMsg, sizeof(AI_MSG_ATTACK) );
}
///////////////////////////////////////////////////////////////////////////////////////////
// 己傍 犬伏俊 蝶扼 捞棋飘 瓤苞啊 利侩等促.
///////////////////////////////////////////////////////////////////////////////////////////
// 包烹瞪 巴牢啊?
BOOL bPierce = FALSE;
if( m_pBaseStyleInfo->m_fPierceRate && GetRandProp() <= m_pBaseStyleInfo->m_fPierceRate * 100 )
{
bPierce = TRUE;
bySkillEffect |= SKILL_EFFECT_PIERCE;
}
// 胶畔阑 冈老 巴牢啊?
BOOL bStun = FALSE;
if( m_pBaseStyleInfo->m_fStunRate && GetRandProp() <= m_pBaseStyleInfo->m_fStunRate * 100 )
{
bStun = TRUE;
bySkillEffect |= SKILL_EFFECT_STUN;
}
// 促款矫懦 巴牢啊?
BOOL bKnockDown = FALSE;
if( m_pBaseStyleInfo->m_fDownRate && GetRandProp() <= m_pBaseStyleInfo->m_fDownRate * 100 )
{
bKnockDown = TRUE;
bySkillEffect |= SKILL_EFFECT_KNOCKDOWN;
}
///////////////////////////////////////////////////////////////////////////////////////////
// 犬伏 拌魂捞 场车栏搁 贸府
///////////////////////////////////////////////////////////////////////////////////////////
// 剐妨具 窍绰 版快狼 贸府(剐赴 饶 促款 瞪 巴牢啊狼 沥焊档 器窃)
if( bKnockBack )
{
WzVector diffVec = vNPCPos - vPlayerPos;
VectorNormalize( &wvNormalVectorP2M, &diffVec );
wvNormalVectorP2M = wvNormalVectorP2M * m_pBaseStyleInfo->m_fKnockBackRange;
pNPC->ExecuteThrust( &wvNormalVectorP2M, wvPosAfterThrust, bKnockDown ); // 皋技瘤鳖瘤 焊晨
}
// 剐府瘤绰 臼绊 促款父 登绰 版快
else if( bKnockDown )
{
// NPC俊霸 促款 皋技瘤甫 焊晨
AI_MSG_KNOCKDOWN downMsg;
pNPC->SendAIMessage( &downMsg, sizeof(downMsg) );
}
// 包烹矫难具 窍绰 版快狼 贸府
if( bPierce )
{
}
// 胶畔 捞棋飘甫 利侩秦具 窍绰 版快狼 贸府
if( bStun )
{
// NPC俊霸 胶畔 皋技瘤甫 焊晨
AI_MSG_STUN stunMsg;
stunMsg.dwStunTick = 1500;
pNPC->SendAIMessage( &stunMsg, sizeof(stunMsg) );
}
// 菩哦俊 眠啊
brdMsg.AttackInfo[byHitObjectCount].dwTargetKey = pNPC->GetObjectKey();
brdMsg.AttackInfo[byHitObjectCount].dwDamage = dwDamage;
brdMsg.AttackInfo[byHitObjectCount].dwTargetHP = pNPC->GetHP();
brdMsg.AttackInfo[byHitObjectCount].wvCurPos = vNPCPos;
brdMsg.AttackInfo[byHitObjectCount].wvDestPos = wvPosAfterThrust;
brdMsg.AttackInfo[byHitObjectCount].byEffect = bySkillEffect;
//DISPMSG("Execute_PlayerStyleAttack: %s --> %s\n", ToString(vNPCPos).c_str(), ToString(wvPosAfterThrust).c_str());
byHitObjectCount++;
}
brdMsg.byNumberOfTargets = byHitObjectCount;
if( byHitObjectCount == 0 )
{
DISPMSG( "byHitObjectCount==0\n" );
}
pField->SendPacketAround( m_pOwnerChar, (MSG_BASE_FORWARD*)&brdMsg, (WORD)brdMsg.GetSize() );
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -