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

📄 instantskillattack.cpp

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