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

📄 handler_cg_battle.cpp

📁 奇迹世界 部分源代码奇迹世界 部分源代码奇迹世界 部分源代码
💻 CPP
字号:
#include "stdafx.h"
#include <Protocol_CG.h>
#include <PacketStruct_CG.h>
#include <ProgramCommon/WzDataType.h>
#include <SCSkillSlotContainer.h>
#include ".\Handler_CG_BATTLE.h"
#include "PlayerManager.h"
#include "Player.h"
#include "CharacterFormula.h"
#include "TriggerManager.h"
#include "TriggerMsg.h"
#include "MapObject.h"
#include "PublicMath.h"
#include "SkillInfoParser.h"
#include "SkillFactory.h"
#include "Skill.h"
#include "AIParamParser.h"


Handler_CG_BATTLE::Handler_CG_BATTLE()
{
}

Handler_CG_BATTLE::~Handler_CG_BATTLE()
{
}

// 角菩矫 立加阑 谗芭唱 NAK 皋技瘤甫 焊郴拎具 茄促.
VOID Handler_CG_BATTLE::OnCG_BATTLE_PLAYER_ATTACK_SYN( ServerSession * pServerSession, MSG_BASE* pMsg, WORD wSize)
{
	MSG_CG_BATTLE_PLAYER_ATTACK_SYN* pRecvMsg = (MSG_CG_BATTLE_PLAYER_ATTACK_SYN*)pMsg;

	// 敲饭捞绢狼 立加捞 谗绢脸栏搁 府畔
	Player *pPlayer = PlayerManager::Instance()->FindPlayer( pRecvMsg->m_dwKey );
	if( !pPlayer ) return ;

	RC::eBATTLE_RESULT rcResult = pPlayer->CanStyleAttack( pRecvMsg->byAttackType, pRecvMsg->StyleCode, pRecvMsg->wvCurPos, pRecvMsg->wvDestPos );

	if( rcResult != RC::RC_BATTLE_SUCCESS )
	{
		MSG_CG_BATTLE_PLAYER_ATTACK_NAK msg;
		msg.m_byErrorCode = rcResult;
		pPlayer->SendPacket( &msg, sizeof(msg) );
		return;
	}

	// 咀记 掉饭捞 汲沥
	pPlayer->SetAttackDelay( pRecvMsg->byAttackType, pRecvMsg->StyleCode );

	// 努扼客 辑滚埃俊 困摹 焊沥
	WzVector wvResultCurPos, wvResultDestPos;
	pPlayer->ModifyPosition( pRecvMsg->wvCurPos, pRecvMsg->wvDestPos, wvResultCurPos, wvResultDestPos );

	//----------------------------------------------------------------------------
	// 1, 2鸥客 3鸥 备盒秦辑 贸府
	//----------------------------------------------------------------------------
	eSKILL_TYPE eSkillType;
	BASE_STYLEINFO *pBaseStyleInfo = SkillInfoParser::Instance()->GetStyleInfo( pRecvMsg->StyleCode );
	if( pRecvMsg->byAttackType < eATTACK_SEQUENCE_THIRD && pBaseStyleInfo->m_SkillClassCode != eSTYLE_ETHER_NORMAL )
	{
		eSkillType = SKILL_TYPE_NORMAL;
	}
	else
	{
		eSkillType = SKILL_TYPE_STYLE;
	}

	// 货肺款 胶鸥老俊 措秦 皋葛府甫 且寸罐绊 胶鸥老沥焊甫 悸泼茄促.(胶鸥老档 胶懦苞 悼老窍霸 秒鞭茄促.)
	Skill* pNewSkill = (Skill*)SkillFactory::Instance()->AllocSkill( eSkillType );
	if( !pNewSkill )	
	{
		SUNLOG( eCRITICAL_LOG, "[OnCG_BATTLE_P2M_ATTACK_SYN]Can't Alloc Skill!" );
		return;
	}

	SkillInfo SkillInfoData;
	SkillInfoData.m_SkillCode			= pRecvMsg->StyleCode;
	SkillInfoData.m_dwClientSerial		= pRecvMsg->dwClientSerial;
	SkillInfoData.m_wvCurPos			= wvResultCurPos;
	SkillInfoData.m_wvDestPos			= wvResultDestPos;
	SkillInfoData.m_byAttackType		= pRecvMsg->byAttackType;
	SkillInfoData.m_dwMainTargetKey		= pRecvMsg->dwTargetKey;
	SkillInfoData.m_bySkillEffect		= 0; // 捞 蔼阑 檬扁拳窍瘤 臼酒辑 努扼捞攫飘俊 静饭扁蔼捞 傈价登菌澜!! ぱ_ぱ

	pNewSkill->Init( pPlayer, &SkillInfoData, pBaseStyleInfo );

	// 胶鸥老阑 敲饭捞绢狼 胶懦府胶飘俊 殿废茄促.
	pPlayer->AddSkill( pNewSkill );
}


VOID Handler_CG_BATTLE::OnCG_BATTLE_VKR_ATTACK_SYN( ServerSession * pServerSession, MSG_BASE* pMsg, WORD wSize)
{
	MSG_CG_BATTLE_VKR_ATTACK_SYN* pRecvMsg = (MSG_CG_BATTLE_VKR_ATTACK_SYN*)pMsg;

	Player *pPlayer = PlayerManager::Instance()->FindPlayer( pRecvMsg->m_dwKey );
	if( !pPlayer ) return ;

	// 蜡瓤茄 菩哦牢瘤 魄喊
	Field *pField = pPlayer->GetField();
	if( !pField )	return;

	Character *pTarget = pField->FindCharacter( pRecvMsg->dwTargetKey );
	if( !pTarget )		return;

	WzVector vPlayerPos, vTargetPos;
	pPlayer->GetPos( &vPlayerPos );
	pTarget->GetPos( &vTargetPos );

	// 芭府眉农(敲饭捞绢 泅犁 困摹客 NPC客狼 芭府)
	float fDistance = Math_Vector2DLength( vPlayerPos, vTargetPos );

	// 傍拜且 荐 绝绰 惑炔捞扼搁?
	if (!pPlayer->CanAttack())
	{
		return;
	}

	// 鸥百捞 利焙牢瘤 眉农
	if( pPlayer->IsFriend( pTarget ) )	return;

	// 公扁厘傈荐甫 眉农茄促.
	if( pPlayer->GetVkrReloadCount() <= 0 )	return;
	pPlayer->SetVkrReloadCount( pPlayer->GetVkrReloadCount() - 1 );

	DAMAGETYPE wDamage = 0;
	BYTE byEffect = 0;

	// 单固瘤 拌魂..烙矫!!!!
	AIParamInfo& stAIParamInfo = AIParamParser::Instance()->GetInfo();
	if( fDistance <= pPlayer->GetAttackRange()+ stAIParamInfo.m_fRANGE_TOLERANCE 
		&& pTarget->CanBeAttacked())
	{
		WORD wCriticalRatioBonus = 0;
		BOOL bCritical = FALSE;
		wDamage = CalcNormalDamage( pPlayer, pTarget, eATTACK_TYPE_RANGE, wCriticalRatioBonus, &bCritical);

		// 农府萍拿捞 磐瘤搁
		if (bCritical)
		{
			byEffect |= SKILL_EFFECT_CRITICAL;
		}
	}

	// 单固瘤 贸府
	DAMAGETYPE wResultDamage = pTarget->Damaged( pPlayer, eATTACK_TYPE_RANGE, wDamage );
	pPlayer->OnAttack( pTarget, SKILLCODE_NORMAL_ATTACK, wResultDamage );

	// 磊脚阑 器窃茄 牢立 敲饭捞绢俊霸 宏肺靛 某胶飘
	MSG_CG_BATTLE_VKR_ATTACK_BRD sendMsg;
	sendMsg.dwClientSerial			= pRecvMsg->dwClientSerial;
	sendMsg.dwAttackerKey			= pPlayer->GetObjectKey();
	sendMsg.dwTargetKey				= pRecvMsg->dwTargetKey;
	sendMsg.wDamage					= wDamage;
	sendMsg.dwTargetHP				= pTarget->GetHP();
	sendMsg.byEffect				= byEffect;
	pPlayer->SendPacketAround( (MSG_BASE_FORWARD*)&sendMsg, sizeof(sendMsg) );

	// 傍拜寸茄 NPC俊霸 AIMessage甫 朝赴促.
	AI_MSG_ATTACKED AIAttackedMsg;
	AIAttackedMsg.dwAttackerKey = pPlayer->GetObjectKey();
	AIAttackedMsg.wDamage = wDamage;
	pTarget->SendAIMessage( &AIAttackedMsg, sizeof(AIAttackedMsg) );
}


VOID Handler_CG_BATTLE::OnCG_BATTLE_P2O_ATTACK_SYN( ServerSession * pServerSession, MSG_BASE* pMsg, WORD wSize)
{
	MSG_CG_BATTLE_P2O_ATTACK_SYN * pRecvMsg = (MSG_CG_BATTLE_P2O_ATTACK_SYN *)pMsg;

	Player *pPlayer = PlayerManager::Instance()->FindPlayer( pRecvMsg->m_dwKey );
	if( !pPlayer ) return ;	//< 敲饭捞绢 技记捞 谗绢脸阑 锭

	Field *pField = pPlayer->GetField();
	if( !pField )	return;

	MapObject * pMapObject = pField->FindMapObject( pRecvMsg->dwTargetKey );
	if( !pMapObject ) return;

	pMapObject->DescreasingHP( 15 );


	// 林困俊 宏肺靛
	MSG_CG_BATTLE_P2O_ATTACK_BRD sendMsg;
	sendMsg.m_byCategory			= CG_BATTLE;
	sendMsg.m_byProtocol			= CG_BATTLE_P2O_ATTACK_BRD;
	sendMsg.m_wDamage				= 15;
	sendMsg.m_dwTargetHP			= pMapObject->GetHP();
	pPlayer->SendPacketAround( (MSG_BASE_FORWARD*)&sendMsg, sizeof(sendMsg) );


	TRIGGER_DAMAGE_OBJECT msg;
	msg.m_dwObjectKey = pRecvMsg->dwTargetKey;	//< 甘 坷宏璃飘
	pField->GetTriggerManager()->OnMsg( &msg );

}

VOID Handler_CG_BATTLE::OnCG_BATTLE_VKR_RELOAD_SYN( ServerSession * pServerSession, MSG_BASE* pMsg, WORD wSize)
{	
	MSG_CG_BATTLE_VKR_RELOAD_SYN* pRecvMsg = (MSG_CG_BATTLE_VKR_RELOAD_SYN *)pMsg;

	Player *pPlayer = PlayerManager::Instance()->FindPlayer( pRecvMsg->m_dwKey );
	if( !pPlayer ) return;

	pPlayer->SetVkrReloadCount( MAX_VALKYRIE_RELOAD_COUNT );

	MSG_CG_BATTLE_VKR_RELOAD_BRD brdMsg;
	brdMsg.m_dwObjKey = pPlayer->GetObjectKey();
	pPlayer->SendPacketAround( (MSG_BASE_FORWARD*)&brdMsg, sizeof(brdMsg) );
}



























⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -