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

📄 attackmagic.cpp

📁 国内著名网络游戏dragon的服务端完整源码 内附完整数据库结构
💻 CPP
📖 第 1 页 / 共 2 页
字号:
{	// [191]拳脚狼 盒畴
	const int nHD = CalcHitDice();
	return AttackMagic(nHD);
}

bool CAttackMagic::RageLightBall()
{	// [192]己飞狼 盒畴
	const int nHD = CalcHitDice();
	return AttackMagic(nHD);
}

bool CAttackMagic::ShadowOfEvil()
{	// [98]厩狼 弊覆磊
	const int nHD = CalcHitDice();
	return AttackMagic(nHD);
}

bool CAttackMagic::BooldSprinkle()
{	// [108]乔谎府扁
	const int nHD = CalcHitDice();
	return AttackMagic(nHD);
}

bool CAttackMagic::FlameArrow()
{	// [110] 拳堪拳混
	//< CSD-031020
	const int nHD = CalcHitDice();
	return AttackMagic(nHD);
}	//> CSD-031020

bool CAttackMagic::AreaBatAttack()
{	// [114]瘤开 冠零傍拜
	const int nHD = CalcHitDice();
	return AttackMagic(nHD);
}

bool CAttackMagic::SnowStorm() // 030415 kyo
{	// [59]传焊扼狼 气浅
	const int nHD =  CalcHitDice();
	
	if (rand()%100 < g_CSymbolMgr.GetSymbolGrade(m_pCaster))
	{	//< CSD-030519
		SetFrozen(5);
	}	//> CSD-030519

	return AttackMagic(nHD);
}

bool CAttackMagic::IceBreath2()// 030415 kyo
{	// [60]酒捞胶宏饭胶2
	const int nHD =  CalcHitDice();

	if (rand()%100 < g_CSymbolMgr.GetSymbolGrade(m_pCaster))
	{
		SetFrozen(5);
	}

	return AttackMagic(nHD);
}

bool CAttackMagic::BloodLightning()// 030415 kyo
{	// [60]喉矾靛扼捞飘醋
	const int nHD =  CalcHitDice();
	return AttackMagic(nHD);
}

bool CAttackMagic::AuthorityOfWhoarencha() // 030415 kyo
{	// [187]拳罚鸥狼 鼻瓷
	const int nHD =  CalcHitDice();
	return AttackMagic(nHD);
}

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

void CAttackMagic::SetFrozen(int nPeriod)
{
	if (m_pTarget->IsNpc())
	{ 
		switch (m_pTarget->Race)
		{
		case DUMMY:
		case HUMAN:
		case GUARD:
		case GUARDSTONE:
		case SEALSTONE:  return;
		}
	}
	
	m_pTarget->speedDown.SetState(m_dwNow + nPeriod, 70);
	m_pTarget->ApplyCurse(6, CON_FROZEN, m_dwNow + nPeriod);
}

bool CAttackMagic::AttackMagic(int nHD)
{
	const int nAttack = CalcAttack(nHD);
	const int nDefense = CalcDefense(nAttack);
	int nDamage = nAttack - nDefense;
	
	switch (m_nIndex)
	{
    case FIRE_ARROW:
    case ICE_ARROW:
		{
			const int nStrike = ((m_pTarget->IsIgnorePhysicalAttack()) ? 0:m_pCaster->GetLongAttack());
			const int nAmplify = m_pCaster->GetMagicAmplify(); 
			const int nAttack = m_pCaster->CalcPhysicalStrikingPower(nStrike + nAmplify);
			const int nDefence = m_pTarget->CalcPhysicalDefensivePower(nAttack);
			// 醚 单固瘤 拌魂(荐沥夸噶 - 1.4硅 力芭)
			int nPhysical = (nAttack - nDefence)*1.4;
			// 付过俊 狼茄 厘芭府 公扁俊 狼茄 规绢仿 焊沥
			if (!m_pCaster->IsIgnorePhysicalDefence())
			{
				m_pTarget->CorrectLongDamage(nPhysical);
			}
			// 付过俊 狼茄 单固瘤 + 劝狼 拱府利 单固瘤
			nDamage = (nDamage>>1) + nPhysical;
			break;
		}
	}
	// 傍拜 付过俊 狼茄 单固瘤 拌魂
	const int nType = GetResistType(m_nIndex);
	nDamage = CalcDamage(nType, nDamage);
	// 阿辆焊沥
	Correct(nDamage); 
	// 规绢备狼 郴备档 皑家
	::DecreaseEquipDuration(m_pTarget, nDamage, ::getEquipRandomPos(), m_pTarget->SprNo, false);
	
	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
				{
					g_pAIManager->SetAI(m_pTarget,NPC_PATTERN_ATTACKED);
					g_pAIManager->SetTarget(m_pTarget,m_pCaster->GetServerID());
				}
			}
		}
	}
	
	return Result(nDamage);
}

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

void CAttackMagic::Correct(int& rDamage)
{
	// 酒捞袍 加己俊 狼茄 焊沥
	if (RareEM.GetDynamicRareValue(FITEM_INVALID_OFFENCE, m_pTarget->DynamicRare))
	{
		rDamage = 0;
		return;
	}
	// 加己 汲沥
	if (m_pCaster->IsPlayer())
	{
		m_pCaster->AutoAttribute();
	}
	// 臭撤捞俊 蝶弗 焊沥
	const BYTE nRiseFall = GetRiseFall(m_nIndex);
	const int nX = m_pTarget->MoveSx; 
	const int nY = m_pTarget->MoveSy;
	m_pCaster->CorrectRiseFall(nRiseFall, nX, nY, rDamage);
	// 芭府俊 蝶弗 焊沥
	const int nDistance = ::getDistance(m_pCaster, m_pTarget);
	m_pCaster->CorrectMagicRange(nDistance, rDamage);
	// 空捞唱 款康磊俊 措茄 焊沥
	if (m_pCaster->name_status.nation == m_pTarget->name_status.nation )
	{	
		if (m_pCaster->name_status.king || m_pTarget->IsCounselor())	
		{
			rDamage /= 30;
		}
	}	
	else 
	{	
		if (m_pCaster->IsCounselor())	 
		{
			rDamage /= 30;
		}
	}
}

bool CAttackMagic::Result(int nDamage)
{
	BYTE nResult = HIT_FAILED, nState = CON_NORMAL;
	int nMana = 0;
	
	if (nDamage <= 0 || IsMiss())
	{
		nDamage = 0;
		nState = m_pTarget->GetState();
		nResult = HIT_FAILED;
		goto SEND;
	}
	// 籍拳俊 吧妨乐栏搁 绢栋茄 傍拜 付过狼 单固瘤甫 罐瘤 给窃
	if (m_pTarget->IsStone())
	{		
		nDamage = 0;
		nState = m_pTarget->GetState();
		nResult = HIT_FAILED;
		goto SEND;
	}
	// 付过 公瓤拳俊 措茄 焊沥
	if (!m_pCaster->IsMagicPiercing() && m_pTarget->dwMagicDamageToMana > 0)
	{
		const int	nMinus = GetExhaustMana(m_nIndex);
		
		if (m_pTarget->Mana - nMinus >= 0)
		{	
			m_pTarget->DecMana(nMinus);
			nDamage	= 0;
			nMana	= nMinus;
			nState = m_pTarget->GetState();
			nResult = HIT_AND_NOTDEAD;
			goto SEND;
		}							
		else
		{	
			m_pTarget->dwMagicDamageToMana = 0;
			nMana = 0;
		}
	}
	// NPC 辆幅俊 蝶弗 焊沥
	if (m_pTarget->IsNpc())
	{
		nDamage /= 1.4;
		
		switch (m_pTarget->Race)
		{
		case DUMMY:
			{
				break;
			}
		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;
					nState = m_pTarget->GetState();
					nResult = HIT_AND_NOTDEAD;
					goto SEND;
				}
				
				break;
			}
		case ORC_DUMMY:
			{
				::AddCasterEXP(m_pCaster, m_pTarget, 2, 1, m_nIndex, abs(nDamage));
				nState = m_pTarget->GetState();
				nResult = HIT_AND_NOTDEAD;
				goto SEND;
			}
		case LIFELESS:
			{
				nDamage = 0;
				nState = m_pTarget->GetState();
				nResult = HIT_AND_NOTDEAD;
				goto SEND;
			}
		default:
			{ 
				m_pTarget->DecLife(nDamage);
				break;
			} 
		}
	}
	else
	{
		m_pTarget->DecLife(nDamage);
	}
	// 磷菌绰瘤 八荤
	if (m_pTarget->IsDead())
	{
		::AddCasterEXP(m_pCaster, m_pTarget, 1, 1, m_nIndex, abs(nDamage));
		::KillWho(m_pTarget, m_pCaster);
		// NK俊 拌魂 
		if(LocalMgr.IsAbleNation(TAIWAN))//030102 lsw Local
		{
			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);
		}
		// 020813 YGI 
		::killCharacter(m_pCaster, m_pTarget);
		nState = CON_DEATH;
		nResult = HIT_AND_DEAD;
	}
	else
	{		
		if (m_pTarget->Race == SEALSTONE)
		{
			if (++m_pTarget->sealstone%50 == 0)
			{
				::Send_CMD_SEALSTONE_STATUS(m_pTarget, 2);
			}
		}
		
		if (!m_pCaster->IsTamedNpc())
		{
			::AddCasterEXP(m_pCaster, m_pTarget, 2, 1, m_nIndex, abs(nDamage));
			::CheckNK(m_idCaster, m_idTarget, NK_TYPE_NO_KILL_);
		}
		
		nState = m_pTarget->GetState();
		nResult = HIT_AND_NOTDEAD;
	}
	
SEND:  
	// 搬苞蔼阑 措惑磊俊霸 Packet栏肺 焊郴扁
	InitMagicResult(CMD_MAGIC_RESULT_M);
	m_packet.u.magic.server_magic_result_m.nMagic = m_nIndex;
	m_packet.u.magic.server_magic_result_m.idTarget = m_idTarget;
	m_packet.u.magic.server_magic_result_m.nLife = -nDamage;
	m_packet.u.magic.server_magic_result_m.nMana = -nMana;
	m_packet.u.magic.server_magic_result_m.nState = nState;
	m_packet.u.magic.server_magic_result_m.nResult = nResult;
	SendMagicResult();
	
	if (!m_pCaster->IsNpc() && m_pTarget->IsMagicReflect())
	{
		if (rand()%101 <= 20)
		{
			const int nReal = m_pCaster->DecLife(nDamage*0.3, 10);
			
			if (nReal > 0)
			{
				SendBattleDamage(m_idCaster, 0, -nReal);
			}
		}
	}
	
	return true;
}

⌨️ 快捷键说明

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