📄 normalattack.cpp
字号:
#include "stdafx.h"
#include "SkillInfoParser.h"
#include "NPC.h"
#include "Field.h"
#include "Character.h"
#include "Player.h"
#include "NormalAttack.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 NormalAttack::SetExecuteInterval()
{
m_wInterval = 0;
}
VOID NormalAttack::Init( Character* pOwnerChar, SkillInfo* pSkillInfo, void* pBaseStyleInfo )
{
m_byAttackSequence = pSkillInfo->m_byAttackType;
m_pOwnerChar = pOwnerChar;
memset( &m_SkillInfo, 0x00, sizeof(SkillInfo) );
memcpy( &m_SkillInfo, pSkillInfo, sizeof(SkillInfo) );
m_pBaseStyleInfo = (BASE_STYLEINFO*)pBaseStyleInfo;
// ExecuteInterval 悸泼
SetExecuteInterval();
// ExecuteTick 悸泼
m_dwExecuteTick = GetTickCount() + GetExecuteInterval();
}
VOID NormalAttack::StartExecute()
{
// 颇扼固磐甫 檬扁拳茄促.
if( !ParamInitialize() )
{
return;
}
// MainTarget捞 蜡瓤茄瘤 眉农茄促.(傍拜 荤芭府 眉农)
if( !CheckMainTarget() )
{
// Nak 菩哦阑 焊辰促.
MSG_CG_BATTLE_PLAYER_ATTACK_NAK msg;
msg.m_byErrorCode = RC::RC_BATTLE_INVALID_MAINTARGET;
m_pOwnerChar->SendPacket( &msg, sizeof(msg) );
return;
}
// 利焙牢瘤 眉农茄促.
if( !m_pOwnerChar->IsFriend( m_pMainTarget ) && m_pMainTarget->CanBeAttacked() )
{
// 单固瘤甫 拌魂茄促.
if( CalcDamage( m_pMainTarget ) )
{
// 傍拜捞 己傍沁阑 版快
m_pMainTarget->Damaged( m_pOwnerChar, eATTACK_TYPE_MELEE, m_wDamage );
SendAIMessage( m_pMainTarget, m_wDamage );
}
}
// 傍拜窍搁 MP, HP啊 雀汗登绰 某腐磐啊 乐促.
m_pOwnerChar->OnAttack( m_pMainTarget, SKILLCODE_NORMAL_ATTACK, m_wDamage );
// 搬苞 菩哦阑 焊辰促.
Broadcast_Normal_Result();
}
SLOTCODE NormalAttack::GetSkillCode()
{
return m_pBaseStyleInfo->m_SkillCode;
}
eSKILL NormalAttack::GetSkillClassCode()
{
return (eSKILL)m_pBaseStyleInfo->m_SkillClassCode;
}
BOOL NormalAttack::CheckMainTarget()
{
if( !m_pField )
{
SUNLOG( eCRITICAL_LOG, "[NormalAttack::CheckMainTarget] Field is NULL!" );
return FALSE;
}
// 皋牢鸥百 谅钎甫 汲沥茄促.
m_pMainTarget = m_pField->FindCharacter( m_SkillInfo.m_dwMainTargetKey );
if( !m_pMainTarget ) return FALSE;
m_pMainTarget->GetPos( &m_SkillInfo.m_wvMainTargetPos );
// 皋牢鸥百俊 措秦 胶懦 荤芭府甫 眉农茄促.
BOOL bSkillRangeCheck = m_pOwnerChar->CheckSkillRange( m_SkillInfo.m_wvMainTargetPos, m_pBaseStyleInfo->m_fAttRange );
if( !bSkillRangeCheck ) return FALSE;
return TRUE;
}
BOOL NormalAttack::ParamInitialize()
{
m_pMainTarget = NULL;
m_wDamage = 0;
return Skill::ParamInitialize();
}
BOOL NormalAttack::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[m_byAttackSequence] ) ) + m_pBaseStyleInfo->m_iAddDamage[m_byAttackSequence];
DAMAGETYPE wResultDamage = pTarget->Damaged( m_pOwnerChar, eATTACK_TYPE_MELEE, m_wDamage );
if( m_wDamage ) return TRUE;
else return FALSE;
}
VOID NormalAttack::Broadcast_Normal_Result()
{
MSG_CG_BATTLE_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.dwTargetKey = m_SkillInfo.m_dwMainTargetKey;
brdMsg.wvCurPos = m_SkillInfo.m_wvCurPos;
brdMsg.wvDestPos = m_SkillInfo.m_wvDestPos;
brdMsg.wDamage = m_wDamage;
brdMsg.dwTargetHP = m_pMainTarget->GetHP();
brdMsg.byEffect = m_SkillInfo.m_bySkillEffect;
m_pOwnerChar->SendPacketAround( (MSG_BASE_FORWARD*)&brdMsg, sizeof(brdMsg) );
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -