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

📄 attackmanager.cpp

📁 墨香最新私服
💻 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 + -