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

📄 physicalattack.cpp

📁 国内著名网络游戏dragon的服务端完整源码 内附完整数据库结构
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// PhysicalAttack.cpp: implementation of the CPhysicalAttack class.
//
//////////////////////////////////////////////////////////////////////

#include "..\stdafx.h"
#include "PhysicalAttack.h"

#include "Op_Battle.h"
#include "Op_Magic.h"
#include "CItem.h"
#include "NationSys.h"
#include "SealStoneGameServer.h"
#include "Npc_Pattern.h"
#include "AIManager.h"
#include "LogManager.h"

extern bool IsWar();
extern bool CanDestroyTarget(CHARLIST* pCaster,CHARLIST* pTarget);
extern void Send_CMD_SEALSTONE_STATUS(LPCHARLIST ch, int status);

///////////////////////////////////////////////////////////////////////////////
// Global Member
///////////////////////////////////////////////////////////////////////////////

static int RATE_BY_CLASS[5][4] = 
{ // 努贰胶狼 公扁喊 焊沥蔼
	{100, 100,  90,  90}, // 傈  荤 : 窜芭府, 吝芭府, 厘芭府(劝), 厘芭府(厚档)
	{ 90,  90, 100, 100}, // 档  利 : 窜芭府, 吝芭府, 厘芭府(劝), 厘芭府(厚档)
	{ 90,  90, 100, 100}, // 泵  荐 : 窜芭府, 吝芭府, 厘芭府(劝), 厘芭府(厚档)
	{ 90, 100,  90, 100}, // 付过荤 : 窜芭府, 吝芭府, 厘芭府(劝), 厘芭府(厚档)
	{ 90, 100,  90, 100}  // 己流磊 : 窜芭府, 吝芭府, 厘芭府(劝), 厘芭府(厚档)
};

///////////////////////////////////////////////////////////////////////////////
// Construction/Destruction
///////////////////////////////////////////////////////////////////////////////

CPhysicalAttack::CPhysicalAttack()
{
	
}

CPhysicalAttack::~CPhysicalAttack()
{
	
}

///////////////////////////////////////////////////////////////////////////////
// Public Method
///////////////////////////////////////////////////////////////////////////////

bool CPhysicalAttack::Bind() 
{	//< CSD-030723
	Resist(WR_SHORT,  &CPhysicalAttack::AttackShort);  // 窜芭府
	Resist(WR_MIDDLE, &CPhysicalAttack::AttackMiddle); // 吝芭府
	Resist(WR_LONG1,  &CPhysicalAttack::AttackLong);   // 厘芭府(劝)
	Resist(WR_LONG2,  &CPhysicalAttack::AttackLong);   // 厘芭府(厚档)
	Resist(WR_LONG3,  &CPhysicalAttack::AttackEvent);  // 厘芭府(捞亥飘)
	Resist(WR_EFFECT, &CPhysicalAttack::AttackEffect); // 酒捞袍 瓤苞
	return true; 
}	//> CSD-030723

bool CPhysicalAttack::AttackShort()
{
	switch (m_pTarget->SprNo)
	{
    case 94 :	case 95 :	return false;
	}
	
	const int nAttack = CalcAttack(m_nIndex);
	const int nDefense = CalcDefense(nAttack);
	// 窜芭府 公扁俊 狼茄 单固瘤 拌魂
	int nDamage = CalcDamage(m_nIndex, nAttack - nDefense);
	Correct(nDamage); 
	// 芭府 八荤
	switch (m_pCaster->GetActiveCombat())
	{
    case CHARGING:
		{
			break;
		}
    default:
		{
			if (!IsRange())  nDamage = 0;
			break;
		}
	}
	
	// 荤侩 公扁狼 郴备档 皑家
	::DecreaseEquipDuration(m_pCaster, nDamage, WT_WEAPON, m_pTarget->SprNo);
	return Result(nDamage);
}

bool CPhysicalAttack::AttackMiddle()
{
	switch (m_pTarget->SprNo)
	{					
	case 92:	case 93:	case 94:	return false;
	}
	
	const int nAttack = CalcAttack(m_nIndex);
	const int nDefense = CalcDefense(nAttack);
	// 吝芭府 公扁俊 狼茄 单固瘤 拌魂
	int nDamage = CalcDamage(m_nIndex, nAttack - nDefense);
	Correct(nDamage); 
	// 芭府 八荤
	if (!IsRange())  nDamage = 0;
	// 荤侩 公扁狼 郴备档 皑家
	::DecreaseEquipDuration(m_pCaster, nDamage, WT_WEAPON, m_pTarget->SprNo);
	return Result(nDamage);
}

bool CPhysicalAttack::AttackLong()
{
	switch (m_pTarget->SprNo)
	{
	case 92 :	case 93 :	case 95 :	return false;
	}
	
	const int nAttack = CalcAttack(m_nIndex);
	const int nDefense = CalcDefense(nAttack);
	// 厘芭府 公扁俊 狼茄 单固瘤 拌魂
	int nDamage = CalcDamage(m_nIndex, nAttack - nDefense);
	Correct(nDamage); 
	// 荤侩 公扁狼 郴备档 皑家
	switch (m_nIndex)
	{	//< CSD-030723
    case WR_LONG1: // 劝
		{
			::DecreaseEquipDuration(m_pCaster, nDamage, WT_WEAPON, m_pTarget->SprNo);
			::DecreaseEquipDuration(m_pCaster, 1, WT_SHIELD, m_pTarget->SprNo);
			break;
		}
    case WR_LONG2: // 厚档
		{
			::DecreaseEquipDuration(m_pCaster, 1, WT_WEAPON, m_pTarget->SprNo);
			break;
		}
	}	//> CSD-030723
	
	if (m_pTarget->IsNpc()) // LTS AI
	{
		if (m_pTarget->ChairNum)		// 辑滚 AI捞搁 	// LTS AI2	
		{
			if (m_pTarget->patterntype>=NPC_PATTERN_WANDER&&m_pTarget->patterntype<NPC_PATTERN_BOSS_WANDER)  // LTS DRAGON MODIFY
			{
				if (rand()%10>5)							// LTS AI2
				{	//< CSD-030417
					g_pAIManager->SetAI(m_pTarget,NPC_PATTERN_ATTACKED);
					g_pAIManager->SetTarget(m_pTarget,m_pCaster->GetServerID());
				}	//> CSD-030417
			}
		}
	}
	
	return Result(nDamage);
}

bool CPhysicalAttack::AttackEvent()
{	//< CSD-030723
	switch (m_pTarget->SprNo)
	{
	case 92 :	case 93 :	case 95 :	return false;
	}
	
	switch (m_nIndex)
	{	
    case WR_LONG3: // 传轿框
		{
			::DecreaseEquipDuration(m_pCaster, 1, WT_WEAPON, m_pTarget->SprNo);
			break;
		}
	}
	
	BYTE nResult = HIT_AND_NOTDEAD;
	int nDamage = 1;
	// 籍拳俊 吧妨乐栏搁 绢栋茄 拱府利 单捞瘤档 罐瘤 给窃
	if (m_pTarget->IsStone())
	{		
		nDamage = 0;
		nResult = HIT_FAILED;
		goto SEND;
	}
	// 父距 傍拜阑 罐栏搁 磊府俊 肛眠霸 窃
	if (m_pTarget->IsNpc())
	{ 
		m_pTarget->MoveLength = m_pTarget->MovePathCount = 0;
	}
	// 规绢备狼 郴备档 皑家
	::DecreaseEquipDuration(m_pTarget, nDamage, ::getEquipRandomPos(), m_pTarget->SprNo, false);
	::HungryMuchAdd(m_pCaster, HT_ATTACK);
	
	switch (m_pTarget->Race)
	{
    case SEALSTONE:  // 搬拌籍牢 版快
		{
			m_pTarget->DecLife(nDamage);
			g_pLogManager->SaveSealStoneInfo(m_pCaster, m_pTarget, nDamage); // CSD-040316
			break;
		}
    case GUARDSTONE: // 荐龋籍牢 版快
		{
			if (::IsWar() && ::CanDestroyTarget(m_pCaster, m_pTarget))
			{ // 傈里牢 版快 焊炼 荐龋籍捞 促 颇鲍登菌促搁
				m_pTarget->DecLife(nDamage);
			}
			else
			{ // 傈里捞 酒囱 版快唱 傈里 吝 焊炼 荐龋籍捞 促 颇鲍登瘤 臼疽促搁
				nDamage = 0;
				nResult = HIT_AND_NOTDEAD;
				goto SEND;
			}
			
			break;
		}
		//case CASTLEGATEWAY: 固搬沥
		//case WARARMS: 固搬沥
	}
	
	switch (m_pTarget->SprNo)
	{
	case 92:	// 扁嫡..
	case 93:	// 扁嫡..
	case 94:	// 苞翅..
	case 95:	// 倾荐酒厚.
    case 96:	// 怕平荐访侩.
		{ 
			nResult = HIT_AND_NOTDEAD;
			goto SEND;
		}	
	case 97:	// 绵备傍
		{
			nDamage = 0;
			nResult = HIT_AND_NOTDEAD;
			goto SEND;
		}
	default :	
		{
			m_pTarget->DecLife(nDamage);
			break;
		}
	} 
	
	if (m_pTarget->IsDead() == true)
	{					
		m_pTarget->Hp = 1;
	}
    
	if (m_pTarget->Race == SEALSTONE)
	{
		if (++m_pTarget->sealstone%50 == 0)
		{
			::Send_CMD_SEALSTONE_STATUS(m_pTarget, 2);
		}
	}
	
	if (m_pCaster->IsPlayer() == true)
	{
		::SaveBallancing(m_pCaster, m_pTarget, 0, nDamage, 0, 0, 0, 0);
	}
	
SEND:
	const int nTactics = m_pCaster->cur_tac_skill;
	
	switch (m_nIndex)
	{
    case WR_LONG3:
		{
			if (m_pCaster->IsPlayer())
			{
				memset(&m_packet, 0, sizeof(t_packet));
				m_packet.h.header.type = CMD_THROW_RESULT;
				m_packet.h.header.size = sizeof(t_server_throw_result); 
				m_packet.u.strike.server_throw_result.idTarget = m_idTarget;
				m_packet.u.strike.server_throw_result.nX = m_pTarget->Tox;
				m_packet.u.strike.server_throw_result.nY = m_pTarget->Toy;
				m_packet.u.strike.server_throw_result.nDamage = -nDamage;
				m_packet.u.strike.server_throw_result.nResult = nResult;
				::QueuePacket(connections, m_idCaster, &m_packet, 1);
				
				memset(&m_packet, 0, sizeof(t_packet));
				m_packet.h.header.type = CMD_THROW_RESULT_D;
				m_packet.h.header.size = sizeof(t_throw_result_d);
				m_packet.u.strike.throw_result_d.idCaster = m_idCaster;
				m_packet.u.strike.throw_result_d.idTarget = m_idTarget;
				m_packet.u.strike.throw_result_d.nDamage = -nDamage;
				m_packet.u.strike.throw_result_d.nX = m_pTarget->Tox;
				m_packet.u.strike.throw_result_d.nY = m_pTarget->Toy;
				m_packet.u.strike.throw_result_d.nResult = nResult;
				::CastMe2Other(m_idCaster, &m_packet);
				return true;
			}
			
			break;
		}
	}
	
	return false;
}	//> CSD-030723

bool CPhysicalAttack::AttackEffect()
{	//< CSD-031007
	const int nAttack = CalcAttack(m_nIndex);
	const int nDefense = CalcDefense(nAttack);
	// 酒捞袍 瓤苞俊 狼茄 单固瘤 拌魂
	int nDamage = CalcDamage(m_nIndex, nAttack - nDefense)*m_pCaster->CorrectItemEffect()/100;
	Correct(nDamage);
	
	if (!IsRange())
	{	// 芭府 八荤
		nDamage = 0;
	}

	return Result(nDamage);
}	//> CSD-031007

///////////////////////////////////////////////////////////////////////////////
// Protected Method
///////////////////////////////////////////////////////////////////////////////

bool CPhysicalAttack::IsRange() const
{	// 利例茄 裹困牢瘤 八荤
	if (m_pCaster->IsPlayer() && m_pTarget->IsNpc())
	{
		const int nDistX = pow(m_pCaster->X - m_pTarget->X, 2.0);
		const int nDistY = pow(m_pCaster->Y - m_pTarget->Y, 2.0);
		
		if (nDistX + nDistY > 50000)
		{
			return false;
		}
	}
	
	return true;
}

⌨️ 快捷键说明

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