📄 attackmanager.cpp
字号:
// AttackManager.cpp: implementation of the CAttackManager class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "AttackManager.h"
#include "Network.h"
#include "PackedData.h"
#include "ServerSystem.h"
#include "CharMove.h"
#include "RegenNPC.h"
#include "UserTable.h"
#include "ObjectStateManager.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
#define SHIELD_COMBO_DAMAGE 0.5f
#define SHIELD_OUT_MUGONG_DAMAGE 0.4f
#define SHIELD_IN_MUGONG_DAMAGE 0.7f
CAttackManager::CAttackManager()
{
}
CAttackManager::~CAttackManager()
{
}
void CAttackManager::sendDieMsg(CObject * pAttacker,CObject* pTarget)
{
MSG_DWORD2 m2c;
m2c.Category = MP_USERCONN;
if(pTarget->GetObjectKind() & eObjectKind_Monster)
m2c.Protocol = MP_USERCONN_MONSTER_DIE;
else if(pTarget->GetObjectKind() == eObjectKind_Player)
m2c.Protocol = MP_USERCONN_CHARACTER_DIE;
m2c.dwObjectID = pAttacker->GetID();
m2c.dwData1 = pAttacker->GetID();
m2c.dwData2 = pTarget->GetID();
PACKEDDATA_OBJ->QuickSend(pTarget,&m2c,sizeof(m2c));
}
WORD CAttackManager::GetComboPhyDamage(CObject* pAttacker,CObject* pTargetObject,float PhyAttackRate,float fCriticalRate,
RESULTINFO* pDamageInfo,DWORD AmplifiedPower,float fDecreaseDamageRate)
{
pDamageInfo->bCritical = m_ATTACKCALC.getCritical(pAttacker,pTargetObject,fCriticalRate);
double attackPhyDamage = m_ATTACKCALC.getPhysicalAttackPower(pAttacker,PhyAttackRate,pDamageInfo->bCritical);
if(pDamageInfo->bCritical)
attackPhyDamage *= 1.5;
attackPhyDamage += AmplifiedPower;
//041213 KES
attackPhyDamage *= fDecreaseDamageRate;
//
//PvP 老锭绰 傍拜仿狼 50%父
if( pAttacker->GetObjectKind() == eObjectKind_Player &&
pTargetObject->GetObjectKind() == eObjectKind_Player )
attackPhyDamage *= 0.5;
DWORD ShieldDamage = pTargetObject->CalcShieldDamage((DWORD)(attackPhyDamage * SHIELD_COMBO_DAMAGE));
attackPhyDamage -= ShieldDamage;
pDamageInfo->ShieldDamage += (TARGETDATA)ShieldDamage;
double defencePhyLevel = m_ATTACKCALC.getPhyDefenceLevel(pTargetObject,pAttacker);
attackPhyDamage *= (1-defencePhyLevel);
// RaMa - 04.11.24 ->单固瘤厚啦
if(pAttacker->GetObjectKind() == eObjectKind_Player && pTargetObject->GetObjectKind() == eObjectKind_Monster)
attackPhyDamage *= gDamageRate;
if(pAttacker->GetObjectKind() == eObjectKind_Monster && pTargetObject->GetObjectKind() == eObjectKind_Player)
attackPhyDamage *= gDamageReciveRate;
if(attackPhyDamage < 1)
attackPhyDamage = 1;
return (WORD)attackPhyDamage;
}
WORD CAttackManager::GetMugongPhyDamage(CObject* pAttacker,CObject* pTargetObject,float PhyAttackRate,float fCriticalRate,
RESULTINFO* pDamageInfo,DWORD AmplifiedPower,float fDecreaseDamageRate)
{
pDamageInfo->bCritical = m_ATTACKCALC.getCritical(pAttacker,pTargetObject,fCriticalRate);
double attackPhyDamage = m_ATTACKCALC.getPhysicalAttackPower(pAttacker,PhyAttackRate,pDamageInfo->bCritical);
if(pDamageInfo->bCritical)
attackPhyDamage *= 1.5;
attackPhyDamage += AmplifiedPower;
//041213 KES
attackPhyDamage *= fDecreaseDamageRate;
//
//PvP 老锭绰 傍拜仿狼 50%父
if( pAttacker->GetObjectKind() == eObjectKind_Player &&
pTargetObject->GetObjectKind() == eObjectKind_Player )
attackPhyDamage *= 0.5;
DWORD ShieldDamage = pTargetObject->CalcShieldDamage((DWORD)(attackPhyDamage * SHIELD_OUT_MUGONG_DAMAGE));
attackPhyDamage -= ShieldDamage;
pDamageInfo->ShieldDamage += (TARGETDATA)ShieldDamage;
double defencePhyLevel = m_ATTACKCALC.getPhyDefenceLevel(pTargetObject,pAttacker);
attackPhyDamage *= (1-defencePhyLevel);
// RaMa - 04.11.24 ->单固瘤厚啦
if(pAttacker->GetObjectKind() == eObjectKind_Player && pTargetObject->GetObjectKind() == eObjectKind_Monster)
attackPhyDamage *= gDamageRate;
if(pAttacker->GetObjectKind() == eObjectKind_Monster && pTargetObject->GetObjectKind() == eObjectKind_Player)
attackPhyDamage *= gDamageReciveRate;
if(attackPhyDamage < 1)
attackPhyDamage = 1;
return (WORD)attackPhyDamage;
}
WORD CAttackManager::GetMugongAttrDamage(CObject* pAttacker,CObject* pTargetObject,
WORD Attrib,DWORD AttAttackMin,DWORD AttAttackMax,float AttAttackRate,RESULTINFO* pDamageInfo,float fDecreaseDamageRate)
{
double attackAttrDamage = m_ATTACKCALC.getAttributeAttackPower(pAttacker,Attrib,AttAttackMin,AttAttackMax,AttAttackRate);
//041213 KES
attackAttrDamage *= fDecreaseDamageRate;
//
//PvP 老锭绰 傍拜仿狼 50%父
if( pAttacker->GetObjectKind() == eObjectKind_Player &&
pTargetObject->GetObjectKind() == eObjectKind_Player )
attackAttrDamage *= 0.5;
DWORD ShieldDamage = pTargetObject->CalcShieldDamage((DWORD)(attackAttrDamage * SHIELD_IN_MUGONG_DAMAGE));
attackAttrDamage -= ShieldDamage;
pDamageInfo->ShieldDamage += (TARGETDATA)ShieldDamage;
float RegVal = pTargetObject->GetAttDefense(Attrib);
// 历亲仿篮 弥措 70% 鳖瘤父
if(RegVal > 1) RegVal = 1;
else if(RegVal < 0) RegVal = 0;
RegVal *= 0.7f;
// if( g_pServerSystem->GetNation() == eNATION_KOREA ) //惫郴 抛挤俊 利侩吝
// {
// int attackerLv = pAttacker->GetLevel();
// int targetLv = pTargetObject->GetLevel();
// RegVal += ((targetLv-attackerLv)*0.5f) * 0.01f;
// }
// if(RegVal > 1) RegVal = 1;
// else if(RegVal < 0) RegVal = 0;
DWORD resAttrDamage = (DWORD)(attackAttrDamage * (1 - RegVal) );
// RaMa - 04.11.24 ->单固瘤厚啦
if(pAttacker->GetObjectKind() == eObjectKind_Player && pTargetObject->GetObjectKind() == eObjectKind_Monster)
resAttrDamage *= gDamageRate;
if(pAttacker->GetObjectKind() == eObjectKind_Monster && pTargetObject->GetObjectKind() == eObjectKind_Player)
resAttrDamage *= gDamageReciveRate;
return (WORD)resAttrDamage;
}
void CAttackManager::Attack(BOOL bMugong, CObject* pAttacker,CObject* pTarget,DWORD AmplifiedPower,
float PhyAttackRate,
WORD Attrib,DWORD AttAttackMin,DWORD AttAttackMax,float AttAttackRate,
float fCriticalRate,
RESULTINFO* pDamageInfo,BOOL bCounter, float fDecreaseDamageRate )
{
pDamageInfo->Clear();
if(pTarget->GetInited() == FALSE)
return;
//咯扁啊 嘎唱? KES confirm //厚公绰 绢痘霸 窍瘤?
if( pAttacker->GetObjectKind() == eObjectKind_Player )
if( ((CPlayer*)pAttacker)->IsPKMode() && ((CPlayer*)pAttacker)->IsVimuing() == FALSE )
{
if( pTarget )
if( pTarget->GetObjectKind() == eObjectKind_Player )
if( ((CPlayer*)pTarget)->IsPKMode() == FALSE )
((CPlayer*)pAttacker)->SetPKStartTimeReset();
}
WORD AttrDamage =0,PhyDamage =0;
if(pTarget->GetState() == eObjectState_Die || pTarget->GetState() == eObjectState_Immortal)
{
return;
}
if( pAttacker->GetGridID() != pTarget->GetGridID() )
{
// ASSERT(0);
return;
}
if(PhyAttackRate > 0.000001f)
{
if(bMugong)
{
PhyDamage = GetMugongPhyDamage(pAttacker,pTarget,PhyAttackRate,fCriticalRate,pDamageInfo,AmplifiedPower,fDecreaseDamageRate);
}
else
{
PhyDamage = GetComboPhyDamage(pAttacker,pTarget,PhyAttackRate,fCriticalRate,pDamageInfo,AmplifiedPower,fDecreaseDamageRate);
}
}
if(AttAttackMax != 0)
{
AttrDamage = GetMugongAttrDamage(pAttacker,pTarget,Attrib,AttAttackMin,AttAttackMax,AttAttackRate,pDamageInfo,fDecreaseDamageRate);
}
pTarget->CalcRealDamage(pAttacker,PhyDamage,AttrDamage,pDamageInfo);
if(bCounter)
pTarget->CalcCounterDamage(Attrib,AttrDamage,PhyDamage,pDamageInfo);
else
pDamageInfo->CounterDamage = 0;
BOOL bVampiric = TRUE;
if(bVampiric)
{
pAttacker->CalcVampiric(pDamageInfo);
}
DWORD newLife = pTarget->Damage(pAttacker,pDamageInfo);
if(pDamageInfo->CounterDamage != 0)
{
// 馆拜篮 公加己 单固瘤捞促. (cf: 公加己篮 馆拜寸窍瘤 臼栏骨肺 馆拜狼 馆拜篮 乐阑荐 绝促.)
RESULTINFO counterdmginfo;
PhyDamage = 0;
AttrDamage = pDamageInfo->CounterDamage;
counterdmginfo.CounterDamage = 0;
pAttacker->CalcRealDamage(pAttacker,PhyDamage,AttrDamage,&counterdmginfo);
DWORD attackerlife = pAttacker->Damage(pTarget,&counterdmginfo);
if(attackerlife == 0)
{
ATTACKMGR->sendDieMsg(pTarget,pAttacker);
pAttacker->Die(pTarget);
}
}
if(newLife == 0)
{
ATTACKMGR->sendDieMsg(pAttacker,pTarget);
pTarget->Die(pAttacker);
}
}
void CAttackManager::RecoverLife(CObject* pOperator,CObject* pObject,WORD m_Attrib,DWORD RecoverLifeVal,RESULTINFO* pResultInfo)
{
float fPlus = pOperator->GetAttribPlusPercent(m_Attrib);
DWORD val = (DWORD)(RecoverLifeVal * (1 + fPlus));
DWORD realAddVal;
pObject->AddLife(val,&realAddVal,FALSE);
pResultInfo->HealLife = (WORD)realAddVal;
}
void CAttackManager::RecoverNaeRyuk(CObject* pOperator,CObject* pObject,WORD m_Attrib,DWORD RecoverNaeRyukVal,RESULTINFO* pResultInfo)
{
float fPlus = pOperator->GetAttribPlusPercent(m_Attrib);
DWORD val = (DWORD)(RecoverNaeRyukVal * (1 + fPlus));
DWORD realAddVal;
pObject->AddNaeRyuk(val,&realAddVal);
pResultInfo->RechargeNaeryuk = (WORD)realAddVal;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -