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

📄 heromagic.cpp

📁 网络游戏魔域源代码 测试可以完整变异
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	if (!pMagic)
	{
		const OBJID idMagicTypeError = 100056;
		g_objGameMsg.AddMsg(g_objGameDataSet.GetStr(idMagicTypeError));
		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;
	}
	if(g_objGameMap.GetType() & MAPTYPE_BOOTH_ENABLE)
	{
		if(!pMagic->m_infoMagicType.dwCanBeusedInMarket)
			return;
	}

	CMyPos posTarget;
	CPlayer* pTarget = g_objPlayerSet.GetPlayer(idPlayer);
	if (!pTarget && idPlayer == this->GetID())
		pTarget = this;
	if(!pTarget)
		return;
	if(pTarget->TestStatus(USERSTATUS_PK_PROTECT))
		return;
	if(pMagic->m_infoMagicType.dwActionSort == MAGIC_SORT_RECOVER_SINGLE_HP || 
		(pMagic->m_infoMagicType.dwActionSort == MAGIC_SORT_RECOVER_SINGLE_STATUS &&
		 !pMagic->m_infoMagicType.dwCrime))
	{
		if(!pTarget->IsPlayer() && !(pTarget->GetID() == g_objHero.GetID()) )
			return;
	}
	pTarget->GetPos(posTarget.x, posTarget.y);
	this->Direction(posTarget.x, posTarget.y);
	CMyPos posHero; 
	this->GetPos(posHero);

	if(!g_objGameMap.IsPkRegion(posHero) && pMagic->m_infoMagicType.dwCrime && pTarget->IsPlayer()) //禁止pk区域检测
	{
		const OBJID idStr = 100157;
		g_objGameMsg.AddMsg(g_objGameDataSet.GetStr(100157));
		return;
	}

	this->BeginChangeUp(pMagic->GetIDType(), pMagic->GetLevel());

	if(pMagic->m_infoMagicType.dwActionSort == MAGICSORT_DANCE)
	{
		const OBJID idDance = 100030;
		if(this->GetLWeapon() == ID_NONE && this->GetRWeapon() == ID_NONE)
			this->Emotion(pMagic->m_infoMagicType.dwSenderAction);
		else
			g_objGameMsg.AddMsg(g_objGameDataSet.GetStr(100030));
		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;
	}
	if(pMagic->m_infoMagicType.dwActionSort == MAGICSORT_TRANSFORM)
	{
		m_dwBeginUseTransformMagicTime = ::TimeGet();
	}
	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;
	}
	int nPhysicalForceCost = pMagic->m_infoMagicType.dwUsePP;
	if (this->GetPhysicalForce() < nPhysicalForceCost)
	{
		OBJID idLowPP = 100118;
		g_objGameMsg.AddMsg(g_objGameDataSet.GetStr(idLowPP));
		return;
	}
	if(!pMagic->IsEnable())
	{
		OBJID idMagicAttackToFast = 100055;
		g_objGameMsg.AddMsg(g_objGameDataSet.GetStr(idMagicAttackToFast));
		return;
	}

	CPlayer* pPlayer = g_objPlayerSet.GetPlayer(idPlayer);
	if (!pPlayer)
	{
		if (pMagic->TestTarget(MAGIC_TARGET_SELF)
				|| pMagic->TestTarget(MAGIC_TARGET_NONE)
				|| pMagic->m_infoMagicType.dwActionSort == MAGICSORT_TEAM_MAGIC)
		{
			if (this->GetID() == idPlayer)
				pPlayer = this;
		}

		if (!pPlayer)
		{
			OBJID idErrorTarget = 100059;
			g_objGameMsg.AddMsg(g_objGameDataSet.GetStr(idErrorTarget));
			return;
		}
	}
	const OBJID idGuard = 100028;
	if (pPlayer->IsNpc() && strstr(pPlayer->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;
		}
	}

	// target check
	CONST MAGIC_REBORN	= 2009;
	CONST XP_GETSOUL  = 3012; //收魂技能
	
	if (pPlayer->IsDead() && XP_GETSOUL != idMagicType && MAGIC_REBORN != idMagicType && 
		!(pMagic->m_infoMagicType.dwTarget&PLAYER_INCLUDEDEADMONSTER))
	{
		OBJID idErrorTarget = 100060;
		g_objGameMsg.AddMsg(g_objGameDataSet.GetStr(idErrorTarget));
		return;
	}

	if (pPlayer->IsNpc() &&  MAGIC_REBORN == idMagicType)
	{
		OBJID idErrorTarget = 100060;
		g_objGameMsg.AddMsg(g_objGameDataSet.GetStr(idErrorTarget));
		return;
	}
	if (pPlayer->IsPlayer() && (pMagic->m_infoMagicType.dwTarget&PLAYER_INCLUDEDEADMONSTER))
	{
		OBJID idErrorTarget = 100060;
		g_objGameMsg.AddMsg(g_objGameDataSet.GetStr(idErrorTarget));
		return;
	}
	if ((pPlayer->TestStatus(USERSTATUS_DISAPPEARING)|| !pPlayer->TestStatus(USERSTATUS_DIE)) && (pMagic->m_infoMagicType.dwTarget&PLAYER_INCLUDEDEADMONSTER))
	{
		OBJID idErrorTarget = 100060;
		g_objGameMsg.AddMsg(g_objGameDataSet.GetStr(idErrorTarget));
		return;
	}
	// ....
	if (pMagic->m_infoMagicType.dwCrime
			&& !this->CanPk(pPlayer)
				&& (!bForce || this->GetPkMode() != PKMODE_FREE) && pPlayer->GetID() != g_objHero.GetID())
	{
		OBJID idCanNotPk = 100061;
		g_objGameMsg.AddMsg(g_objGameDataSet.GetStr(idCanNotPk));
		return;
	}

	posHero = this->GetAlignPos();

	pPlayer->GetPos(posTarget);
	
	int	nRange	= pMagic->m_infoMagicType.dwDistance;
	//nRange += g_objHero.GetAddSize() + g_objHero.GetAtkRange() + (pPlayer->GetAddSize() + 1)/2;
	if (abs(posTarget.x - posHero.x) > nRange || abs(posTarget.y - posHero.y) > nRange)
	{
		OBJID idNoTarget = 100058;
		g_objGameMsg.AddMsg(g_objGameDataSet.GetStr(idNoTarget));
		return;
	}

	switch(idMagicType)
	{
	case 1015:
		{
			//const OBJID idMagicNote = 100063;
			//g_objGameMsg.AddMsg(g_objGameDataSet.GetStr(idMagicNote));
		}
		break;

	case 1020:
		{
			//const OBJID idMagicNote = 100064;
			//g_objGameMsg.AddMsg(g_objGameDataSet.GetStr(idMagicNote));
		}
		break;

	default:
		this->Stop();
		break;
	}

	int nPosX, nPosY;
	this->GetPos(nPosX, nPosY);

	/*
	if (this->IsMoving())
		nPosX = nPosY = 0;
	*/

	if(pMagic->m_infoMagicType.dwActionSort == MAGIC_SORT_ATTACK_SINGLE_HP || 
			pMagic->m_infoMagicType.dwActionSort == MAGIC_SORT_ATTACK_SINGLE_STATUS ||
			pMagic->m_infoMagicType.dwActionSort == MAGICSORT_LINE_PENETRABLE)
	{
		nPosX = posTarget.x;
		nPosY = posTarget.y;
	}
	int nLevel	= pMagic->m_infoMagicType.dwLevel;
	CMsgInteract msg;
	OBJID idUser = this->GetID();
	unsigned short usMagicType = (unsigned short)idMagicType;
	OBJID idTarget = idPlayer;
	int nMyPosX = nPosX;
	int nMyPosY = nPosY;
	ENCODE_MAGICATTACK(idUser, usMagicType, idTarget, nMyPosX, nMyPosY)	
	if (msg.Create( INTERACT_MAGICATTACK, 
					idUser, idTarget, 
					nMyPosX, nMyPosY,
					usMagicType, (unsigned short)nLevel, idPlayer))
		msg.Send();

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

	this->StartMagicBusy(pMagic->m_infoMagicType.dwIntoneDuration+pMagic->m_infoMagicType.dwMagicBreak + 3000);
	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;
		if(pTarget)
		{
			CMyPos posSender, posTarget;
			g_objHero.GetPos(posSender);
			pTarget->GetPos(posTarget);
			cmd.nDir = (g_objGameMap.GetDirection(posSender.x, posSender.y, posTarget.x, posTarget.y)+1)%7;
		}
		g_objHero.SetCommand(&cmd);
	}
}

//------------------------------------------------------------------
void CHero::ProcessMagicBusy()
{
	if(!m_bMagicAttackBusy)
		return;	

	if(::TimeGet() >= m_dwMagicAttackBegin + m_dwMagicAttackBusy)
		this->EndMagicBusy();
}
//------------------------------------------------------------------
CMagic* CHero::GetMagic(OBJID idType)
{
	int nAmount = m_setMagic.size();
	for(int i = 0; i < nAmount; i ++)
	{
		CMagic* pMagic = m_setMagic[i];
		if(pMagic && (pMagic->m_infoMagicType.idMagicType == idType))
		{
			return pMagic;
		}
	}
	return NULL;
}
//------------------------------------------------------------------
int CHero::GetXpSkillAmount()
{
	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_XPSKILL)
		{
			nMagicAmount ++;
		}
	}
	return nMagicAmount;
}
//------------------------------------------------------------------
CMagic* CHero::GetXpSkillByIndex(int nIndex)
{
	if(nIndex < 0)
		return NULL;

	int nXpAmount = 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_XPSKILL)
		{
			if(nXpAmount == nIndex)
				return pMagic;

			nXpAmount ++;
		}
	}
	return NULL;
}
//------------------------------------------------------------------
int CHero::GetKongfuAmount()
{
	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_KONGFU)
		{
			nMagicAmount ++;
		}
	}
	return nMagicAmount;
}
//------------------------------------------------------------------
CMagic* CHero::GetKongfuByIndex(int nIndex)
{
	if(nIndex < 0)
		return NULL;

	int nKongfuAmount = 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_KONGFU)
		{
			if (nKongfuAmount == nIndex)
				return pMagic;

			nKongfuAmount++;
		}
	}
	return NULL;
}

//------------------------------------------------------------------
void CHero::ProcessMagic()
{
	BOOL bFlash = false;
	const _SHIELD_SUBTYPE = 900;
	int nAmount, i;
	nAmount = this->GetMagicAmount();
	for(i = 0; i < nAmount; i ++)
	{
		CMagic* pMagic = this->GetMagicByIndex(i);
		if(!pMagic)
			continue;
		if(pMagic->Process())
		{
			bFlash = true;
		}
	}
	nAmount = this->GetXpSkillAmount();
	for(i = 0; i < nAmount; i ++)
	{
		CMagic* pMagic = this->GetXpSkillByIndex(i);
		if(!pMagic)
			continue;
		if(pMagic->Process())
		{
			bFlash = true;
		}
	}
	nAmount = this->GetKongfuAmount();
	for(i = 0; i < nAmount; i ++)
	{
		CMagic* pMagic = this->GetKongfuByIndex(i);
		if(!pMagic)
			continue;
		if(pMagic->Process())
		{
			bFlash = true;
		}
	}
	if(bFlash)
		::PostCmd(CMD_FLASH_MAGIC_STATUS);
}
//------------------------------------------------------------------
void CHero::AbortTransform()
{
	CMsgAction msg;
	if(msg.Create(this->GetID(), 0, 0, 0, actionAbortTransform))
		msg.Send();
}
//------------------------------------------------------------------
void CHero::BeginChangeUp(OBJID idMagicType, DWORD dwDelay)
{
	// todo ...
//	MagicTypeInfo info;
//	if(!CMagic::s_objMagicData.GetMagicTypeInfo(idMagicType, dwDelay, info))
//	{
//		m_bChargeUp = false;
//		return;
//	}
//	if(!(info.dwStatus & USERSTATUS_CHARGEUP))
////	{
////		m_bChargeUp = false;
////		return;
////	}
//	m_bChargeUp = true;
//	m_dwTimeChargeUp = ::TimeGet();
//	const DWORD dwNatworkDelay = 500;
//	m_dwChargeUpTotalTime = info.dwIntoneDuration+dwNatworkDelay;

}
//------------------------------------------------------------------
void CHero::AbortChargeUp()
{
	CMsgAction  msg;
	if(msg.Create(g_objHero.GetID(), 0, 0, this->GetDir(), actionDischarge))
		msg.Send();
}
//------------------------------------------------------------------
void CHero::ShowChargeUp()
{
	const int nBgSize		= 64;
	const int nBarLength	= 49;
	const int nBarHeight	= 9;
	const int nBarOffsetX	= 7;
	const int nBarOffsetY	= 27;
	const DWORD dwBarColor	= 0xff31A2FF;
	if(m_bChargeUp)
	{
		// get ani 
		CAni* pAni = g_objGameDataSet.GetDataAni("ani/common.ani", "ChargeUp");
		if(!pAni)
			return;
		// get the current length of bar
		if(m_dwChargeUpTotalTime == 0) 
			m_dwChargeUpTotalTime = 1;
		int nCurrentLength = nBarLength * (::TimeGet() - m_dwTimeChargeUp)/m_dwChargeUpTotalTime;
		if(nCurrentLength > nBarLength)
			nCurrentLength = nBarLength;
		// get ani show pos
		CMyPos posShow;
		int nNameShowOffset = (OFFSET_NAMESHOW+80)*g_objGameMap.GetScale()/_NORMAL_SCALE;
		int nShowX	=m_Info.posScr.x-nBgSize/2;
		int nShowY	=m_Info.posScr.y-nNameShowOffset;
		posShow.x = nShowX;
		posShow.y = nShowY-this->GetOffsetY();
		// set frame
		int nFrame = 0;
//		if(this->TestStatus(USERSTATUS_CHARGEUP))
//		{
//			nFrame = 1;
//			nCurrentLength = nBarLength;
//		}

		pAni->Show(nFrame, posShow.x, posShow.y);
		CMyBitmap::ShowBlock(posShow.x+nBarOffsetX, posShow.y+nBarOffsetY, 
					posShow.x+nBarOffsetX+nCurrentLength, posShow.y+nBarOffsetY+nBarHeight, dwBarColor);
	}
}
//------------------------------------------------------------------
void  CHero::StopChargeUp()
{
	m_bChargeUp = false;
}
//--------------------------------------------------------------------------------------

⌨️ 快捷键说明

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