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

📄 heromagic.cpp

📁 网络游戏魔域源代码 测试可以完整变异
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//------------------------------------------------------------------
// HeroMagic.cpp
//------------------------------------------------------------------

#include "Hero.h"
#include "MsgInteract.h"
#include "GamePlayerSet.h"
#include "GameMsg.h"
#include "GameDataSet.h"
#include "3dGameMap.h"
#include "AllMsg.h"
//------------------------------------------------------------------
void CHero::DestroyMagicSet()
{
	int nAmount = m_setMagic.size();
	for(int i = 0; i < nAmount; i ++)
	{
		CMagic* pMagic = m_setMagic[i];
		SAFE_DELETE(pMagic);
	}

	m_setMagic.clear();
}
//------------------------------------------------------------------
void CHero::AddMagic(OBJID idMagic, DWORD dwLevel, DWORD dwExp)
{
	int nAmount = m_setMagic.size();
	
	int nInsertIndexAt = 0;	//主动
	int nInsertIndexPs = 0; //被动
	int nInsertIndexXp = 0; //XP
	int nInsertIndexTm = 0; //TEAM
	for(int i = 0; i < nAmount; i ++)
	{
		CMagic* pMagic = m_setMagic[i];
		if(pMagic && (pMagic->m_infoMagicType.idMagicType == idMagic))
		{
			MagicTypeInfo infoMagicType;
			if(CMagic::s_objMagicData.GetMagicTypeInfo(idMagic, dwLevel, infoMagicType))
			{
				if (pMagic->m_infoMagicType.dwLevel < infoMagicType.dwLevel ) 
				{
					char szMsg[128] ="";
					sprintf(szMsg, g_objGameDataSet.GetStr(100203), infoMagicType.szName);
					g_objGameMsg.AddMsg(szMsg);		//恭喜阁下***技能升级
					m_objEffect.Add("magicup",false,0,this->GetLook()); //技能升级!
				}
				pMagic->m_infoMagicType = infoMagicType;
				pMagic->m_dwExp = dwExp;
				pMagic->m_idOwner = this->GetID();
			}
			
			return;
		}
		else
		{
			if (pMagic->m_infoMagicType.dwActionSort == MAGICSORT_TEAM_MAGIC)
				{
					nInsertIndexTm++;
				}
				else if (pMagic->TestTarget(MAGIC_PASSIVE))
				{
					nInsertIndexPs++;
				}
				else if (pMagic->m_infoMagicType.dwXp == TYPE_XPSKILL)
				{
					nInsertIndexXp++;
				}
				else
					nInsertIndexAt++;
//				nInsertIndex++;
		}
	}

	CMagic* pMagic = CMagic::CreateNew(idMagic, dwLevel, dwExp);	
	// Magic 依照type排序
	if(pMagic)
	{
			pMagic->m_idOwner = this->GetID();
			if (pMagic->m_infoMagicType.dwActionSort == MAGICSORT_TEAM_MAGIC)
			{
				m_setMagic.insert(m_setMagic.begin() + nInsertIndexTm, pMagic);
			}
			else if (pMagic->TestTarget(MAGIC_PASSIVE))
			{
				m_setMagic.insert(m_setMagic.begin() + nInsertIndexTm+nInsertIndexAt+nInsertIndexPs, pMagic);				
			}
			else if (pMagic->m_infoMagicType.dwXp == TYPE_XPSKILL)
			{
				if (!this->m_bXpSkillEnable) 
					m_bXpSkillEnable = TRUE;
				m_setMagic.insert(m_setMagic.begin() + nInsertIndexTm+nInsertIndexAt+nInsertIndexPs+nInsertIndexXp, pMagic);				
			}
			else
				m_setMagic.insert(m_setMagic.begin() + nInsertIndexTm+nInsertIndexAt, pMagic);				
//		m_setMagic.insert(m_setMagic.begin() + nInsertIndex, pMagic);
	}
	else
	{
		char szTemp[256];
		sprintf(szTemp, "Not found magic: id=%d, Lev=%d", idMagic, dwLevel);
		g_objGameMsg.AddMsg(szTemp);
	}
}
//------------------------------------------------------------------
int CHero::GetMagicAmount()
{
	int nMagicAmount = 0;
	int nAmount = m_setMagic.size();
	for(int i = 0; i < nAmount; i ++)
	{
		CMagic* pMagic = m_setMagic[i];
		if(pMagic 
//			&& pMagic->m_infoMagicType.dwXp == TYPE_MAGIC 
			&& pMagic->m_infoMagicType.dwActionSort != MAGICSORT_TEAM_MAGIC)
		{
			nMagicAmount ++;
		}
	}
	return nMagicAmount;
}
//------------------------------------------------------------------
int CHero::GetTeamMagicAmount()
{
	int nTMagicAmount = 0;
	int nAmount = m_setMagic.size();
	for(int i=0; i< nAmount; i++)
	{
		CMagic* pMagic = m_setMagic[i];
		if(pMagic && pMagic->m_infoMagicType.dwXp == TYPE_MAGIC 
			&& pMagic->m_infoMagicType.dwActionSort == MAGICSORT_TEAM_MAGIC)
		{
			nTMagicAmount ++;
		}
	}
	return nTMagicAmount;
}
//------------------------------------------------------------------
CMagic*	CHero::GetTeamMagicByIndex(int nIndex)
{
	if(nIndex < 0)
		return NULL;
	
	int nMagicAmount = 0;
	int nAmount = m_setMagic.size();
	for(int i = 0; i < nAmount; i ++)
	{
		CMagic* pMagic = m_setMagic[i];
		if(pMagic && pMagic->m_infoMagicType.dwXp == TYPE_MAGIC 
			&& pMagic->m_infoMagicType.dwActionSort == MAGICSORT_TEAM_MAGIC)
		{
			if(nMagicAmount == nIndex)
				return pMagic;
			
			nMagicAmount ++;
		}
	}
	return NULL;
}
//------------------------------------------------------------------
CMagic*	CHero::GetMagicByIndex(int nIndex)
{
	if(nIndex < 0)
		return NULL;

	int nMagicAmount = 0;
	int nAmount = m_setMagic.size();
	for(int i = 0; i < nAmount; i ++)
	{
		CMagic* pMagic = m_setMagic[i];
		if(pMagic 
//		&& pMagic->m_infoMagicType.dwXp == TYPE_MAGIC
		&& pMagic->m_infoMagicType.dwActionSort != MAGICSORT_TEAM_MAGIC)
		{
			if(nMagicAmount == nIndex)
				return pMagic;

			nMagicAmount ++;
		}
	}

	return NULL;
}

//------------------------------------------------------------------
void CHero::MagicAttack(OBJID idMagicType, CMyPos posTarget)
{
	if(idMagicType >= 30000)
		return;
	if(this->IsMagicLock())
		return;
	if(this->TestStatus(USERSTATUS_CANNOTMOVE))
		return;
	this->Direction(posTarget.x, posTarget.y);

	CONST MAGIC_CIRCLEATK = 1115;
	if (MAGIC_CIRCLEATK == idMagicType)
	{
		CItem* pWeaponR = this->GetEquipment(ITEMPOSITION_WEAPONR);
		CItem* pWeaponL = this->GetEquipment(ITEMPOSITION_WEAPONL);

		if (!(pWeaponR && pWeaponL 
				&& (pWeaponR->GetWeaponSkillType() == pWeaponL->GetWeaponSkillType())))
		{
			const OBJID idStr = 100117;
			g_objGameMsg.AddMsg(g_objGameDataSet.GetStr(idStr));//"此技能必须双手相同类型武器才能使用。"
			return;
		}
	}
	
	if(m_bMagicAttackBusy)
	{
		OBJID idMagicAttackToFast = 100055;
		g_objGameMsg.AddMsg(g_objGameDataSet.GetStr(idMagicAttackToFast));
		return;
	}

	CMagic* pMagic = this->GetMagic(idMagicType);
	if (!pMagic)
	{
		const OBJID idMagicTypeError = 100056;
		g_objGameMsg.AddMsg(g_objGameDataSet.GetStr(idMagicTypeError));
		return;
	}
	if(g_objGameMap.GetType() & MAPTYPE_BOOTH_ENABLE)
	{
		if(!pMagic->m_infoMagicType.dwCanBeusedInMarket)
			return;
	}
	if(pMagic->m_infoMagicType.dwActionSort == MAGICSORT_TEAM_MAGIC )
	{
		if (g_objHero.GetTeamMemberAmount() < 3) 
		{
			g_objGameMsg.AddMsg((char*)g_objGameDataSet.GetStr(100171)); //结界需要有3人以上的组队方可使用
			return;
		}
		if (!g_objHero.IsTeamLeader()) 
			return;
	}
	CMyPos posHero;	
	this->GetPos(posHero);
	if(!g_objGameMap.IsPkRegion(posHero) && pMagic->m_infoMagicType.dwCrime)//禁止pk区域检测
	{
		const OBJID idStr = 100157;
		g_objGameMsg.AddMsg(g_objGameDataSet.GetStr(100157));
		return;
	}
	this->BeginChangeUp(pMagic->GetIDType(), pMagic->GetLevel());

	if (g_objGameMap.GetType() & MAPTYPE_BOOTH_ENABLE)		
	{
		if(pMagic->m_infoMagicType.dwCrime)
			return;
	}
	int nManaCost	= pMagic->m_infoMagicType.dwMpCost;
	if (this->GetData(CPlayer::_PLAYER_MANA) < nManaCost)
	{
		OBJID idLowPower = 100057;
		g_objGameMsg.AddMsg(g_objGameDataSet.GetStr(idLowPower));
		return;
	}
	int nPotential	= pMagic->m_infoMagicType.dwPotential;
	if (this->GetPotential() < nPotential)
	{
		OBJID idLowPotential = 100166;
		g_objGameMsg.AddMsg(g_objGameDataSet.GetStr(idLowPotential));
		return;
	}
	
	if(pMagic->m_infoMagicType.dwActionSort == MAGICSORT_TRANSFORM)
	{
		m_dwBeginUseTransformMagicTime = ::TimeGet();
	}

	int nPhysicalForceCost = pMagic->m_infoMagicType.dwUsePP;
	if (this->GetPhysicalForce() < nPhysicalForceCost)
	{
		OBJID idLowPP = 100118;
		g_objGameMsg.AddMsg(g_objGameDataSet.GetStr(idLowPP));
		return;
	}
	int	nRange	= pMagic->m_infoMagicType.dwDistance;
	//nRange += g_objHero.GetAddSize() + g_objHero.GetAtkRange();

	posHero = this->GetAlignPos();
	if (abs(posTarget.x - posHero.x) > nRange || abs(posTarget.y - posHero.y) > nRange)
	{
		OBJID idNoTarget = 100058;
		g_objGameMsg.AddMsg(g_objGameDataSet.GetStr(idNoTarget));
		return;
	}
	if(!pMagic->IsEnable())
	{
		OBJID idMagicAttackToFast = 100055;
		g_objGameMsg.AddMsg(g_objGameDataSet.GetStr(idMagicAttackToFast));
		return;
	}

	if (pMagic->GetWeaponRequired() != 0)
	{
		CItem* pWeaponR = this->GetEquipment(ITEMPOSITION_WEAPONR);
		CItem* pWeaponL = this->GetEquipment(ITEMPOSITION_WEAPONL);
		
		BOOL bCanUse = FALSE;
		if ((pWeaponR && pWeaponR->GetWeaponSkillType() == pMagic->GetWeaponRequired())
			|| (pWeaponL && pWeaponL->GetWeaponSkillType() == pMagic->GetWeaponRequired()))
		{
			bCanUse = TRUE;
		}
		if (pMagic->GetWeaponRequired() == 400 
			&& ((pWeaponR &&  (pWeaponR->GetWeaponSkillType () == 410 || pWeaponR->GetWeaponSkillType () == 420) )
			|| ( pWeaponL &&  (pWeaponL->GetWeaponSkillType () == 410 || pWeaponL->GetWeaponSkillType () == 420))))
		{
			bCanUse = TRUE;
		}
		if (bCanUse == FALSE) 
			return;
	}
	
	int nLevel	= pMagic->m_infoMagicType.dwLevel;
	CMsgInteract msg;

	OBJID idUser = this->GetID();
	unsigned short usMagicType = (unsigned short)idMagicType;
	OBJID idTarget = ID_NONE;
	int nPosX = posTarget.x;
	int nPosY = posTarget.y;
	ENCODE_MAGICATTACK(idUser, usMagicType, idTarget, nPosX, nPosY)
	if(msg.Create(INTERACT_MAGICATTACK, idUser, idTarget, nPosX, nPosY, usMagicType, (unsigned short)nLevel, ID_NONE))
		msg.Send();

	m_objEffect.Add(pMagic->m_infoMagicType.szIntoneEffect,false,0,this->GetLook());

	this->StartMagicBusy(pMagic->m_infoMagicType.dwIntoneDuration+pMagic->m_infoMagicType.dwMagicBreak + 3000);
	this->SetDir(this->GetDir(posTarget));
	this->Stop();
	if(pMagic->m_infoMagicType.dwSenderAction  == _ACTION_INTONE_DURATION)
	{
		CCommand cmd;
		cmd.iType		=_COMMAND_EMOTION;
		cmd.iStatus		=_CMDSTATUS_BEGIN;
		cmd.nData		=_ACTION_INTONE;
		cmd.bHeroSendMsg=false;
		
		CMyPos posSender;
		this->GetPos(posSender);
		cmd.nDir = (g_objGameMap.GetDirection(posSender.x, posSender.y, posTarget.x, posTarget.y)+1)%7;
		g_objHero.SetCommand(&cmd);
	}
}

//------------------------------------------------------------------
void CHero::StartMagicBusy(DWORD dwDuration)
{
	if (m_bMagicAttackBusy)
		return;

	m_dwMagicAttackBegin	= ::TimeGet();
	m_dwMagicAttackBusy		= dwDuration;
	m_bMagicAttackBusy		= true;
	::PostCmd(CMD_START_MAGIC_BUSY);

	::DebugMsg("magic begin at:%06u --- end at:%06u\n", m_dwMagicAttackBegin, m_dwMagicAttackBegin+m_dwMagicAttackBusy);
}
//------------------------------------------------------------------
void CHero::EndMagicBusy()
{
	if(m_bMagicAttackBusy && !this->IsMoving() && !this->IsMagicLock())
		this->StandBy();
	m_bMagicAttackBusy		= false;
	::PostCmd(CMD_END_MAGIC_BUSY);
}

//------------------------------------------------------------------
void CHero::MagicAttack(OBJID idMagicType, OBJID idPlayer, BOOL bForce)
{
	if(idMagicType >= 30000)
		return;

	if(this->TestStatus(USERSTATUS_CANNOTMOVE))
		return;
	if(this->IsMagicLock())
		return;
	CONST MAGIC_BUMP = 1051;
	if (MAGIC_BUMP == idMagicType)
	{
		// in bumping
		if (_COMMAND_BUMP == this->GetCommandType())
			return;

		CMagic* pMagic = this->GetMagic(idMagicType);
		if (!pMagic)
		{
			const OBJID idMagicTypeError = 100056;
			g_objGameMsg.AddMsg(g_objGameDataSet.GetStr(idMagicTypeError));
			return;
		}
		// interval check
		DWORD dwTimeNow = ::TimeGet();
		if (dwTimeNow-m_dwLastBump < 1000)//pMagic->m_infoMagicType.dwIntoneDuration)
			return;
		else
			m_dwLastBump = dwTimeNow;
			

		CPlayer* pTarget = g_objPlayerSet.GetPlayer(idPlayer);
		if (!pTarget)
			return;

		if (!this->CanPk(pTarget))
			return;

		const OBJID idGuard = 100028;
		if(pTarget->GetRoleType() == _ROLE_TASK_NPC)
			return;
		CMyPos posTarget;
		pTarget->GetPos(posTarget.x, posTarget.y);
		CMyPos posHero;	////禁止pk区域检测
		this->GetPos(posHero);
		if(!g_objGameMap.IsPkRegion(posHero) && pMagic->m_infoMagicType.dwCrime && pTarget->IsPlayer())
		{
			const OBJID idStr = 100157;
			g_objGameMsg.AddMsg(g_objGameDataSet.GetStr(100157));
			return;
		}
		if (pTarget->IsNpc() && strstr(pTarget->GetName(), g_objGameDataSet.GetStr(idGuard)))
		{
			if (!(bForce && PKMODE_FREE == this->GetPkMode()))
			{
				const OBJID idCanNotPkGuard = 100029;
				g_objGameMsg.AddMsg(_TXTATR_SYSTEM, g_objGameDataSet.GetStr(idCanNotPkGuard));
				return;
			}
		}
		if (pMagic->GetWeaponRequired() != 0)
		{
			CItem* pWeaponR = this->GetEquipment(ITEMPOSITION_WEAPONR);
			CItem* pWeaponL = this->GetEquipment(ITEMPOSITION_WEAPONL);
			
			BOOL bCanUse = FALSE;
			if ((pWeaponR && pWeaponR->GetWeaponSkillType() == pMagic->GetWeaponRequired())
					|| (pWeaponL && pWeaponL->GetWeaponSkillType() == pMagic->GetWeaponRequired()))
			{
				bCanUse = TRUE;
			}
			if (pMagic->GetWeaponRequired() == 400 
				&& ((pWeaponR &&  (pWeaponR->GetWeaponSkillType () == 410 || pWeaponR->GetWeaponSkillType () == 420) )
				    || ( pWeaponL &&  (pWeaponL->GetWeaponSkillType () == 410 || pWeaponL->GetWeaponSkillType () == 420))))
			{
				bCanUse = TRUE;
			}
			if (bCanUse == FALSE) 
				return;
		}

		CCommand cmd;
		cmd.iType		=_COMMAND_BUMP;
		cmd.iStatus		=_CMDSTATUS_BEGIN;
		cmd.idTarget	=pTarget->GetID();
		
		this->SetCommand(&cmd);
		return;	// do not send msg here.
	}

	CONST MAGIC_CIRCLEATK = 1115;
	if (MAGIC_CIRCLEATK == idMagicType)
	{
		CItem* pWeaponR = this->GetEquipment(ITEMPOSITION_WEAPONR);
		CItem* pWeaponL = this->GetEquipment(ITEMPOSITION_WEAPONL);

		if (!(pWeaponR && pWeaponL 
				&& pWeaponR->GetWeaponSkillType() == pWeaponL->GetWeaponSkillType()))
		{
			const OBJID idStr = 100117;
			
			g_objGameMsg.AddMsg(g_objGameDataSet.GetStr(idStr));//"此技能必须双手相同类型武器才能使用。"
			return;
		}
	}

	if (m_bMagicAttackBusy) 
	{
		OBJID idMagicAttackToFast = 100055;
		g_objGameMsg.AddMsg(g_objGameDataSet.GetStr(idMagicAttackToFast));
		return;
	}
	
	CMagic* pMagic = this->GetMagic(idMagicType);

⌨️ 快捷键说明

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