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

📄 physicalattack.cpp

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

bool CPhysicalAttack::IsMiss() const
{	// 拱府利 傍拜 己傍 咯何 魄窜
	if( m_pTarget && m_pTarget->IsDead() ) return true;
	const int nStatic = RareEM.GetStaticRareSmart(m_pTarget->StaticRare);
	const int nDynamic = RareEM.GetDynamicRareValue(FITEM_AGILITY, m_pTarget->DynamicRare);
	// 雀乔啦 拌魂
	const int nRate = m_pCaster->CalcAttackSuccessRate(nStatic, nDynamic);
	return (nRate < rand()%101) ? true:false;
}

///////////////////////////////////////////////////////////////////////////////
// Private Method
///////////////////////////////////////////////////////////////////////////////

void CPhysicalAttack::Correct(int& rDamage)
{ 	// 酒捞袍 加己俊 狼茄 焊沥
	RareEM.CorrectByStaticRare(m_pCaster, m_pTarget, rDamage);
	// 努贰胶俊 措茄 焊沥
	if (m_pCaster->IsPlayer())
	{ 
		rDamage = rDamage*RATE_BY_CLASS[m_pCaster->Class][m_nIndex]/100;
	} 
	// 芭府俊 措茄 焊沥
	const int nDistance = ::getDistance(m_pCaster, m_pTarget);
	m_pCaster->CorrectStrikeRange(nDistance, rDamage);
	// 臭撤捞俊 蝶弗 焊沥
	const int nX = m_pTarget->MoveSx; 
	const int nY = m_pTarget->MoveSy;
	m_pCaster->CorrectRiseFall(0, nX, nY, rDamage);
	// 空捞唱 墨款伎矾俊 措茄 焊沥
	if (m_pCaster->name_status.nation == m_pTarget->name_status.nation)
	{	
		if (m_pTarget->name_status.king || m_pTarget->IsCounselor())  
		{
			rDamage /= 30;
		}
	}
	else 
	{
		if (m_pTarget->IsCounselor())
		{
			rDamage /= 30;
		}
	}
}

bool CPhysicalAttack::Result(int nDamage)
{	//< CSD-031007
	BYTE nResult = HIT_FAILED;
	
	if (nDamage <= 0 || IsMiss())
	{ 
		nDamage = 0;
		nResult = HIT_FAILED;
		goto SEND;
	}
	// 籍拳俊 吧妨乐栏搁 绢栋茄 拱府利 单捞瘤档 罐瘤 给窃
	if (m_pTarget->IsStone())
	{		
		nDamage = 0;
		nResult = HIT_FAILED;
		goto SEND;
	}
	// 父距 傍拜阑 罐栏搁 磊府俊 肛眠霸 窃
	if (m_pTarget->IsNpc())
	{ 
		m_pTarget->MoveLength = m_pTarget->MovePathCount = 0;
	}
	// 父距 ROOKIE_LEVEL 捞窍捞搁 捣捞 唱坷霸 窃
	if (m_pCaster->IsPlayer() && m_pTarget->IsNpc())
	{
		if (m_pCaster->GetLevel() <= ROOKIE_LEVEL && m_pTarget->Race == DUMMY)
		{
			if(!(rand()%10))
			{
				ItemAttr item = {0,};

				if (LocalMgr.IsChangeMoney())
				{
					item = ::GenerateItem(IN_NEW_COINS, IATTR_MUCH, rand()%6 +10);
				}
				else
				{
					item = ::GenerateItem(IN_COINS, IATTR_MUCH , rand()%6 + 10);
				}
				
				::AddItemList(item.item_no, item.attr, 0, 
					m_pCaster->X + rand()%TILE_SIZE, m_pCaster->Y + rand()%TILE_SIZE, 0, 0);
			}
		}
	}
	// 规绢备狼 郴备档 皑家
	::DecreaseEquipDuration(m_pTarget, nDamage, ::getEquipRandomPos(), m_pTarget->SprNo, false);
	::HungryMuchAdd(m_pCaster, HT_ATTACK);
	// NPC 辆幅俊 蝶弗 焊沥  
	if (m_pTarget->IsNpc())
	{
		switch (m_pTarget->Race)
		{
		case DUMMY:
			{
				if (m_pCaster->GetLevel() <= ENABLE_DUMMY_LEVEL)
				{	// 版氰摹啊 10 捞窍搁辑 歹固甫 傍拜茄 版快父 版氰摹 惑铰  
					const int nExp = ::addEXP(m_pCaster, m_pTarget, HIT_AND_NOTDEAD, nDamage);
					const int nTemp = (rand()%10 < 3) ? 3:4; // 老馆 版氰摹俊辑 琶平 版氰摹肺 函券惑荐
					m_pCaster->ChangeUpTacExp(0, nExp*nTemp);
				}
				
				nResult = HIT_AND_NOTDEAD;
				goto SEND;
			}
		case SEALSTONE:
			{
				m_pTarget->DecLife(nDamage);
				g_pLogManager->SaveSealStoneInfo(m_pCaster, m_pTarget, nDamage); // CSD-040316
				break;
			}
		case GUARDSTONE:
		//case CASTLEGATEWAY: 固搬沥
		//case WARARMS: 固搬沥
			{
				if (::IsWar() && ::CanDestroyTarget(m_pCaster, m_pTarget))
				{ // 傈里牢 版快 焊炼 荐龋籍捞 促 颇鲍登菌促搁
					m_pTarget->DecLife(nDamage);
				}
				else
				{ // 傈里捞 酒囱 版快唱 傈里 吝 焊炼 荐龋籍捞 促 颇鲍登瘤 臼疽促搁
					nDamage = 0;
					nResult = HIT_AND_NOTDEAD;
					goto SEND;
				}
				
				break;
			}
		case ORC_DUMMY:
			{
				m_pCaster->ChangeUpTacExp(1, nDamage*3);
				nResult = HIT_AND_NOTDEAD;
				goto SEND;
			}
		case LIFELESS:
			{
				nDamage = 0;
				nResult = HIT_AND_NOTDEAD;
				goto SEND;
			}
		default:
			{
				m_pTarget->DecLife(nDamage);
				break;
			}
		}
	}
	else
	{
		m_pTarget->DecLife(nDamage);
	}
	
	if (m_pTarget->IsDead())
	{					
		const int nExp = ::addEXP(m_pCaster, m_pTarget, HIT_AND_DEAD, nDamage);
		m_pCaster->ChangeUpTacExp(0, nExp*3);
		
		::KillWho(m_pTarget, m_pCaster);
		// NK俊 拌魂
		if (LocalMgr.IsAbleNation(TAIWAN))
		{
			if (m_pCaster->IsTamedNpc())
			{
				::CheckNK(m_pCaster->GetMaster(), m_idTarget, NK_TYPE_KILL_);
			}
			else
			{
				::CheckNK(m_idCaster, m_idTarget, NK_TYPE_KILL_);		
			}
		}
		else
		{
			::CheckNK(m_idCaster, m_idTarget, NK_TYPE_KILL_);
		}
		
		if (m_pTarget->IsNpc())
		{
			m_pTarget->m_xSummon.Remove(KillMonster);
		}
		
		::killCharacter(m_pCaster, m_pTarget);
		nResult = HIT_AND_DEAD;				
		
		goto SEND;
	}				
	else // 磷瘤 臼篮 版快
	{		
		const int nExp = ::addEXP(m_pCaster, m_pTarget, HIT_AND_NOTDEAD, nDamage);
		m_pCaster->ChangeUpTacExp(0, nExp*3);
		
		if (m_pTarget->Race == SEALSTONE)
		{
			if (++m_pTarget->sealstone%50 == 0)
			{
				::Send_CMD_SEALSTONE_STATUS(m_pTarget, 2);
			}
		}
		
		if (!m_pCaster->IsTamedNpc())
		{
			m_pTarget->ChangeUpTacExp(4, m_pCaster->GetLevel()*2);
			::CheckNK(m_idCaster, m_idTarget, NK_TYPE_NO_KILL_);
		}
		
		nResult = HIT_AND_NOTDEAD;
		goto SEND;
	}
	
SEND:
	if (m_pCaster->IsPlayer() == true)  
	{
		::SaveBallancing(m_pCaster, m_pTarget, 0, nDamage, 0, 0, 0, 0);
	}
	
	const int nTactics = m_pCaster->cur_tac_skill;
	const WORD wdEffect = (m_pCaster->GetActiveCombat() > 0) ? 0:m_pCaster->GetItemEffectNumber();
	
	switch (m_nIndex)
	{
    case WR_SHORT:
    case WR_MIDDLE:
		{
			if (m_pCaster->IsPlayer())
			{
				memset(&m_packet, 0, sizeof(t_packet));
				m_packet.h.header.type = CMD_ATTACK_RESULT;
				m_packet.h.header.size = sizeof(t_attack_result);
				m_packet.u.strike.attack_result.idTarget = m_idTarget;
				m_packet.u.strike.attack_result.nDamage = -nDamage;
				m_packet.u.strike.attack_result.nX = m_pTarget->Tox;
				m_packet.u.strike.attack_result.nY = m_pTarget->Toy;
				m_packet.u.strike.attack_result.wdEffect = wdEffect; // CSD-031001
				m_packet.u.strike.attack_result.nCombat =  m_pCaster->GetActiveCombat();
				m_packet.u.strike.attack_result.nResult	= nResult;
				::QueuePacket(connections, m_idCaster, &m_packet, 1);
				
				memset(&m_packet, 0, sizeof(t_packet));
				m_packet.h.header.type = CMD_ATTACK_RESULT_D;
				m_packet.h.header.size = sizeof(t_attack_result_d);
				m_packet.u.strike.attack_result_d.idCaster = m_idCaster;
				m_packet.u.strike.attack_result_d.idTarget = m_idTarget;
				m_packet.u.strike.attack_result_d.nDamage = -nDamage;
				m_packet.u.strike.attack_result_d.nX = m_pTarget->Tox;
				m_packet.u.strike.attack_result_d.nY = m_pTarget->Toy;
				m_packet.u.strike.attack_result_d.wdEffect = wdEffect; // CSD-031001
				m_packet.u.strike.attack_result_d.nCombat = m_pCaster->GetActiveCombat();
				m_packet.u.strike.attack_result_d.nResult = nResult;
				::CastMe2Other(m_idCaster, &m_packet);
			}
			else
			{
				memset(&m_packet, 0, sizeof(t_packet));
				m_packet.h.header.type = CMD_ATTACK_RESULT_D;
				m_packet.h.header.size = sizeof(t_attack_result_d);
				m_packet.u.strike.attack_result_d.idCaster = m_idCaster;
				m_packet.u.strike.attack_result_d.idTarget = m_idTarget;
				m_packet.u.strike.attack_result_d.nDamage = -nDamage;
				m_packet.u.strike.attack_result_d.nX = m_pTarget->Tox;
				m_packet.u.strike.attack_result_d.nY = m_pTarget->Toy;
				m_packet.u.strike.attack_result_d.wdEffect = wdEffect; // CSD-031001
				m_packet.u.strike.attack_result_d.nCombat = m_pCaster->GetActiveCombat();
				m_packet.u.strike.attack_result_d.nResult = nResult;
				::CastNPC2Other(m_idCaster - 10000, &m_packet);
			}
			
			break;
		}
    case WR_LONG1:
    case WR_LONG2:
		{
			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.wdEffect = wdEffect; // CSD-031001
				m_packet.u.strike.server_throw_result.nCombat = m_pCaster->GetActiveCombat();
				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.wdEffect = wdEffect; // CSD-031001
				m_packet.u.strike.throw_result_d.nCombat = m_pCaster->GetActiveCombat();
				m_packet.u.strike.throw_result_d.nResult = nResult;
				::CastMe2Other(m_idCaster, &m_packet);
			}
			
			break;
		}
	case WR_EFFECT:
		{
			memset(&m_packet, 0, sizeof(t_packet)); 
			m_packet.h.header.type = CMD_EFFECT_RESULT;
			m_packet.h.header.size = sizeof(t_server_effect_result); 
			m_packet.u.strike.server_effect_result.idTarget = m_idTarget;
			m_packet.u.strike.server_effect_result.nDamage = -nDamage;
			m_packet.u.strike.server_effect_result.nResult = nResult;
			CBattle::SendPacket(m_idCaster);
			break;
		}
	}
	
	if (!m_pCaster->IsNpc() && m_pTarget->IsStrikeReflect())
	{
		if (rand()%101 <= 20)
		{
			const int nReal = m_pCaster->DecLife(nDamage, 10);
			
			if (nReal > 0)
			{
				SendBattleDamage(m_idCaster, 0, -nReal);
			}
		}
	}
	
	return true;
}	//> CSD-031007

⌨️ 快捷键说明

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