⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 normalattack.cpp

📁 奇迹世界 部分源代码奇迹世界 部分源代码奇迹世界 部分源代码
💻 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 + -