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

📄 styleskill.cpp

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