📄 handler_cg_battle.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 + -