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

📄 playerstyle.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 "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 + -