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

📄 magiceffect.cpp

📁 网络游戏魔域源代码 测试可以完整变异
💻 CPP
📖 第 1 页 / 共 3 页
字号:
					pPlayer->ResetStepDir();
					
					if(infoMagicType.dwSenderAction == _ACTION_INTONE_DURATION)
						infoMagicType.dwSenderAction = _ACTION_INTONE_LAUNCH;
					CPlayer* pTarget = g_objPlayerSet.GetPlayer(m_idTarget);
					if(infoMagicType.dwSenderAction != 0)
					{
						if(infoMagicType.idNextMagic != ID_NONE)
							pPlayer->SetIntoneCmd(infoMagicType.dwSenderAction, pTarget? pPlayer->GetDir(pTarget) : pPlayer->GetDir(), 0, true);
						else
							pPlayer->SetIntoneCmd(infoMagicType.dwSenderAction, pTarget? pPlayer->GetDir(pTarget) : pPlayer->GetDir(), 0, false);
					}
				}
				
			if(strcmp(infoMagicType.szSenderSound, "NULL") != 0)
			{
				CMyPos posWorld;
				pPlayer->GetWorldPos(posWorld);
				::DXPlaySound(infoMagicType.szSenderSound, posWorld.x, posWorld.y, nRange);	
			}
		}
		this->BeginScreenEffect(infoMagicType.dwScreenRepresent);
		m_bBegin = true;
		m_dwMoment = 0;
	}

	if(::TimeGet() - m_dwBegin >= infoMagicType.dwTargetDelay && m_dwMoment == 0)
	{
		for(int i = 0; i < m_setRoleInfo.size(); i++)
		{
			MagicEffectRoleInfo* pRoleInfo = m_setRoleInfo[i];
			if(!pRoleInfo)
				continue;

			CPlayer* pPlayer= g_objPlayerSet.GetPlayer(pRoleInfo->idRole, true);
			if(pPlayer)
			{
				if(strcmp(infoMagicType.szTargetEffect, "NULL") != 0)
				{
					pPlayer->m_objEffect.Add(infoMagicType.szTargetEffect,false,0,pPlayer->GetLook());
				}
			}
		}
		m_dwMoment = 1;
	}

	if(::TimeGet() - m_dwBegin >= infoMagicType.dwTargetDelay + infoMagicType.dwTargetWoundDelay)
	{
		for(int i = 0; i < m_setRoleInfo.size(); i++)
		{
			MagicEffectRoleInfo* pRoleInfo = m_setRoleInfo[i];
			if(!pRoleInfo)
				continue;

			CPlayer* pPlayer= g_objPlayerSet.GetPlayer(pRoleInfo->idRole, true);
			if(pPlayer)
			{
				if((infoMagicType.dwActionSort == MAGIC_SORT_ATTACK_SINGLE_HP) ||
					(infoMagicType.dwActionSort == MAGIC_SORT_ATTACK_CROSS_HP) ||
					(infoMagicType.dwActionSort == MAGIC_SORT_ATTACK_SECTOR_HP) ||
					(infoMagicType.dwActionSort == MAGIC_SORT_ATTACK_ROUND_HP))
				if(!pPlayer->TestStatus(USERSTATUS_DIE) && !pPlayer->IsMoving() && infoMagicType.dwSenderAction != 0)
				{
					pPlayer->ResetStepDir();
					pPlayer->SetIntoneCmd(_ACTION_BRUISE0, pPlayer->GetDir());
				}

				DWORD dwColor = _COLOR_YELLOW;
				if (pPlayer->GetID() == g_objHero.GetID())
					dwColor = _COLOR_RED;
				if(infoMagicType.dwActionSort == MAGIC_SORT_RECOVER_SINGLE_HP)
					dwColor = 0xff33ff33;
				// 万箭穿心
				if(infoMagicType.idMagicType/10 == 1006 
					||	infoMagicType.idMagicType/10 == 1005 
					||	infoMagicType.idMagicType/10 == 1007)
				{
					int nAmount = infoMagicType.idMagicType%10+2;
					for(int j = 0; j < nAmount; j ++)
					{
						if(j != nAmount-1)
						{
							if (pPlayer->IsGuard())
								dwColor = _COLOR_BLUE;
							
							pPlayer->AddZoomNum(pRoleInfo->dwData/nAmount, dwColor, 300*j);	
						}
						else
						{
							if (pPlayer->IsGuard())
								dwColor = _COLOR_BLUE;
							
							pPlayer->AddZoomNum(pRoleInfo->dwData-
								(nAmount-1)*(pRoleInfo->dwData/nAmount), 
								dwColor, 100*i);	
						}
					}
				}
				else
				{
					if(infoMagicType.dwActionSort == MAGIC_SORT_ATTACK_SINGLE_STATUS ||
						infoMagicType.dwActionSort == MAGIC_SORT_RECOVER_SINGLE_STATUS ||
						infoMagicType.dwActionSort == MAGICSORT_ATTRACK_MONSTER)
					{
					}
					else
					{
						if (pPlayer->IsGuard())
							dwColor = _COLOR_BLUE;
						pPlayer->AddZoomNum(pRoleInfo->dwData, dwColor, 100);
					}
				}
				BOOL bAddLife = false;
				if(infoMagicType.dwActionSort == MAGIC_SORT_RECOVER_SINGLE_HP)
					bAddLife = true;
				if(pPlayer->GetID() != g_objHero.GetID())
				{
					if(!bAddLife)
						pPlayer->SetData(CPlayer::_PLAYER_LIFE, __max(0, (int)pPlayer->GetData(CPlayer::_PLAYER_LIFE)-(int)pRoleInfo->dwData));
					else
						pPlayer->SetData(CPlayer::_PLAYER_LIFE, __min((int)pPlayer->GetMaxLife(), (int)pPlayer->GetData(CPlayer::_PLAYER_LIFE)+(int)pRoleInfo->dwData));
				}

				if (strcmp(infoMagicType.szTargetSound, "NULL") != 0)
				{
					CMyPos posWorld;
					pPlayer->GetWorldPos(posWorld);
					::DXPlaySound(infoMagicType.szTargetSound, posWorld.x, posWorld.y, nRange);	
				}
			}
		}
		return true;
	}

	return false;
}

//----------------------------------------------------------------------------------------

BOOL  CMagicEffect::CreateTerrain(OBJID idSender, CMyPos posTarget, DWORD dwMagicType, DWORD dwLevel)
{
	m_idSender = idSender;
	m_posTarget = posTarget;
	m_dwMagicType = dwMagicType;
	m_dwLevel = dwLevel;
	m_nType = MAGICEFFECT_BODY_TERRAIN_BODY;
	return true;
}
//----------------------------------------------------------------------------------------
CMagicEffect* CMagicEffect::CreateNewTerrain(OBJID idSender, CMyPos posTarget, DWORD dwMagicType, DWORD dwLevel)
{
	CMagicEffect* pEffect = new CMagicEffect;
	MYASSERT(pEffect);
	if(!pEffect->CreateTerrain(idSender, posTarget, dwMagicType, dwLevel))
	{
		SAFE_DELETE(pEffect);
		return NULL;
	}
	return pEffect;
}
//----------------------------------------------------------------------------------------
BOOL CMagicEffect::ProcessBodyTerrainBody()
{
	MagicTypeInfo infoMagicType; 
	if(!CMagic::s_objMagicData.GetMagicTypeInfo(m_dwMagicType, m_dwLevel, infoMagicType))
		return true;

	const int nRange = 3000;
	if(!m_bBegin)
	{

		m_dwBegin = ::TimeGet();

		CPlayer* pPlayer= g_objPlayerSet.GetPlayer(m_idSender, true);
		if(pPlayer)
		{
			if(strcmp(infoMagicType.szSenderEffect, "NULL") != 0)
			{
				pPlayer->m_objEffect.Add(infoMagicType.szSenderEffect,false,0,pPlayer->GetLook());
			}
			if(infoMagicType.dwSenderAction != 0)
				if(!pPlayer->IsDead() )
				{
					if(infoMagicType.dwSenderAction == _ACTION_INTONE_DURATION)
						infoMagicType.dwSenderAction = _ACTION_INTONE_LAUNCH;
					pPlayer->ResetStepDir();

					CPlayer* pTarget = g_objPlayerSet.GetPlayer(m_idTarget);
					if(infoMagicType.idNextMagic != ID_NONE)
						pPlayer->SetIntoneCmd(infoMagicType.dwSenderAction, pPlayer->GetDir(), 0, true);
					else
						pPlayer->SetIntoneCmd(infoMagicType.dwSenderAction, pPlayer->GetDir(), 0, false);
				}

			if(strcmp(infoMagicType.szSenderSound, "NULL") != 0)
			{
				CMyPos posWorld;
				pPlayer->GetWorldPos(posWorld);
				::DXPlaySound(infoMagicType.szSenderSound, posWorld.x, posWorld.y, nRange);	
			}

			// transport
			CONST MAGICTYPE_TRASNPORT = 1080;
			if (MAGICTYPE_TRASNPORT == infoMagicType.idMagicType)
			{
				pPlayer->SetPos(m_posTarget);
				if (pPlayer->GetID() == g_objHero.GetID())
					g_objHero.SetAlignPos(m_posTarget.x, m_posTarget.y);
			}
		}
		// 直线攻击不走地效魔法
		if(infoMagicType.dwActionSort == MAGICSORT_LINE)
		{
			CInteractiveLayer* pLayer = g_objGameMap.GetInteractiveLayer();
			if (!pLayer)
				return true;
			CMyPos posBegin;
			pPlayer->GetWorldPos(posBegin);
			CMyPos posWorld;
			g_objGameMap.Cell2World(m_posTarget.x, m_posTarget.y, posWorld.x, posWorld.y);
			C3DMapEffect* pObj = C3DMapEffect::CreateNew(posBegin, infoMagicType.szGroundEffect);
			if(pObj)
			{
				pLayer->AddMapObj(pObj);
				CMy3DPos posMyBegin, posMyEnd;
				CMy3DDir dir3D;
				posMyBegin.x = posBegin.x;
				posMyBegin.y = posBegin.y;
				posMyBegin.z = 0;
				
				posMyEnd.x = posWorld.x;
				posMyEnd.y = posWorld.y;
				posMyEnd.z = 0;
				
				CPhysics::S3Get3DDir(posMyBegin, posMyEnd, dir3D);
				pObj->SetRotate(dir3D.fHorizontal+1.57, dir3D.fVertical);
			}		
		}
		else
		{
			// 添加地效魔法对象
			char szDir[]="ini/tme/";
			char szFile[_MAX_PATH];
			sprintf(szFile, "%s%s", szDir, infoMagicType.szGroundEffect);
			CTerainEffectUnit* pUnit = CTerainEffectUnit::CreateNew(szFile);
			if(pUnit)
			{
				CMyPos posWorld;
				g_objGameMap.Cell2World(m_posTarget.x, m_posTarget.y, posWorld.x, posWorld.y);
				pUnit->SetPos(posWorld);
				// 判断是不是方向魔法
				if(infoMagicType.dwActionSort == MAGICSORT_LINE || 
					MAGIC_SORT_ATTACK_CROSS_HP ==  infoMagicType.dwActionSort || 
					MAGIC_SORT_ATTACK_SECTOR_HP	== infoMagicType.dwActionSort)
				{
					CMyPos posSender;
					CPlayer* pPlayer= g_objPlayerSet.GetPlayer(m_idSender);
					if(!pPlayer && (m_idSender == g_objHero.GetID()))
						pPlayer = &g_objHero;
					if(pPlayer)
						pPlayer->GetWorldPos(posSender);
					pUnit->SetPos(posSender);
					pUnit->Rotate(posSender, posWorld);	
					if(pPlayer)
					{	
						CMyPos posPlayer;
						pPlayer->GetPos(posPlayer);
						//int nDir = g_objGameMap.GetDirection(posPlayer.x, posPlayer.y,	m_posTarget.x, m_posTarget.y);
						pUnit->SetDir(m_nDir);
					}
				}
				g_objGameMap.AddTerrainMagicUnit(pUnit);
			}
		}
		this->BeginScreenEffect(infoMagicType.dwScreenRepresent);
		m_bBegin = true;
	}

	if(::TimeGet() - m_dwBegin >= infoMagicType.dwTargetDelay)
	{
		for(int i = 0; i < m_setRoleInfo.size(); i++)
		{
			MagicEffectRoleInfo* pRoleInfo = m_setRoleInfo[i];
			if(!pRoleInfo)
				continue;

			CPlayer* pPlayer= g_objPlayerSet.GetPlayer(pRoleInfo->idRole);
			if(!pPlayer && (pRoleInfo->idRole == g_objHero.GetID()))
				pPlayer = &g_objHero;

			if(pPlayer)
			{
				if((infoMagicType.dwActionSort == MAGIC_SORT_ATTACK_SINGLE_HP) ||
					(infoMagicType.dwActionSort == MAGIC_SORT_ATTACK_CROSS_HP) ||
					(infoMagicType.dwActionSort == MAGIC_SORT_ATTACK_SECTOR_HP) ||
					(infoMagicType.dwActionSort == MAGIC_SORT_ATTACK_ROUND_HP))
				if(!pPlayer->TestStatus(USERSTATUS_DIE) && !pPlayer->IsMoving() && infoMagicType.dwSenderAction != 0)
				{
					pPlayer->ResetStepDir();
					pPlayer->SetIntoneCmd(_ACTION_BRUISE0, pPlayer->GetDir());
				}

				if(strcmp(infoMagicType.szTargetEffect, "NULL") != 0)
				{
					pPlayer->m_objEffect.Add(infoMagicType.szTargetEffect,false,0,pPlayer->GetLook());
				}

				DWORD dwColor = _COLOR_YELLOW;
				if (pPlayer->GetID() == g_objHero.GetID())
					dwColor = _COLOR_RED;
				if(infoMagicType.dwActionSort == MAGIC_SORT_RECOVER_SINGLE_HP)
					dwColor = 0xff33ff33;

				if(infoMagicType.dwActionSort == MAGIC_SORT_ATTACK_SINGLE_STATUS ||
					infoMagicType.dwActionSort == MAGIC_SORT_RECOVER_SINGLE_STATUS)
				{
				}
				else
				{
					if (pPlayer->IsGuard())
						dwColor = _COLOR_BLUE;					
					pPlayer->AddZoomNum(pRoleInfo->dwData, dwColor, 100);
				}

				BOOL bAddLife = false;
				if(infoMagicType.dwActionSort == MAGIC_SORT_RECOVER_SINGLE_HP)
					bAddLife = true;
				if(pPlayer->GetID() != g_objHero.GetID())
				{
					if(!bAddLife)
						pPlayer->SetData(CPlayer::_PLAYER_LIFE, __max(0, (int)pPlayer->GetData(CPlayer::_PLAYER_LIFE)-(int)pRoleInfo->dwData));
					else
						pPlayer->SetData(CPlayer::_PLAYER_LIFE, __min((int)pPlayer->GetMaxLife(), (int)pPlayer->GetData(CPlayer::_PLAYER_LIFE)+(int)pRoleInfo->dwData));
				}


				if (strcmp(infoMagicType.szTargetSound, "NULL") != 0)
				{
					CMyPos posWorld;
					pPlayer->GetWorldPos(posWorld);
					::DXPlaySound(infoMagicType.szTargetSound, posWorld.x, posWorld.y, nRange);	
				}
			}
		}
		return true;
	}
	return false;
}
//----------------------------------------------------------------------------------------

BOOL CMagicEffect::ProcessBodyTraceBody()
{
	MagicTypeInfo infoMagicType; 
	if(!CMagic::s_objMagicData.GetMagicTypeInfo(m_dwMagicType, m_dwLevel, infoMagicType))
		return true;

	const int nRange = 3000;
	if(!m_bBegin)
	{

		m_dwBegin = ::TimeGet();

		CPlayer* pPlayer= g_objPlayerSet.GetPlayer(m_idSender);
		if(!pPlayer && (m_idSender == g_objHero.GetID()))
			pPlayer = &g_objHero;

		 
		if(pPlayer)
		{
			if(strcmp(infoMagicType.szSenderEffect, "NULL") != 0)
			{
				pPlayer->m_objEffect.Add(infoMagicType.szSenderEffect,false,0,pPlayer->GetLook());
			}
			
			if(infoMagicType.dwSenderAction != 0)
				if(!pPlayer->IsDead())
				{
					pPlayer->ResetStepDir();
					
					CPlayer* pTarget = g_objPlayerSet.GetPlayer(m_idTarget);
					
					if(infoMagicType.dwSenderAction == _ACTION_INTONE_DURATION)
						infoMagicType.dwSenderAction = _ACTION_INTONE_LAUNCH;
					if(infoMagicType.idNextMagic != ID_NONE)
						pPlayer->SetIntoneCmd(infoMagicType.dwSenderAction, pTarget? pPlayer->GetDir(pTarget) : pPlayer->GetDir(), 0, true);
					else
						pPlayer->SetIntoneCmd(infoMagicType.dwSenderAction, pTarget? pPlayer->GetDir(pTarget) : pPlayer->GetDir(), 0, false);
					
				}

			if(strcmp(infoMagicType.szSenderSound, "NULL") != 0)
			{
				CMyPos posWorld;
				pPlayer->GetWorldPos(posWorld);
				::DXPlaySound(infoMagicType.szSenderSound, posWorld.x, posWorld.y, nRange);	
			}
		}
		// 添加3DMapEffect
		CMyPos posWorld, posCell;
		pPlayer->GetPos(posCell);
		g_objGameMap.Cell2World(posCell.x, posCell.y, posWorld.x, posWorld.y);
		m_posBegin = posWorld;	

		CInteractiveLayer* pLayer = g_objGameMap.GetInteractiveLayer();
		if (!pLayer)
			return true;

		C3DMapEffect* pObj = C3DMapEffect::CreateNew(m_posBegin, infoMagicType.szTraceEffect, false);
		if(pObj)
		{
			pLayer->AddMapObj(pObj);
		}
		m_pData = pObj;
		m_bBegin = true;
		this->BeginScreenEffect(infoMagicType.dwScreenRepresent);
		pPlayer = g_objPlayerSet.GetPlayer(m_idTarget, true);
		if(!pPlayer)
		{
			pObj->Die();
			pObj = NULL;
			return true;
		}
		CMyPos posEnd;
		CMy3DPos posMyBegin, posMyEnd;
		CMy3DDir dir3D;
		posMyBegin.x = m_posBegin.x;
		posMyBegin.y = m_posBegin.y;
		posMyBegin.z = 0;
		
		pPlayer->GetPos(posCell);
		g_objGameMap.Cell2World(posCell.x, posCell.y, posEnd.x, posEnd.y);
		posEnd.y += 50;
		posMyEnd.x = posEnd.x;
		posMyEnd.y = posEnd.y;
		posMyEnd.z = 0;
		
		CPhysics::S3Get3DDir(posMyBegin, posMyEnd, dir3D);
		pObj->SetRotate(dir3D.fHorizontal+1.57, dir3D.fVertical);
		return false;
	}
	C3DMapEffect* pObj = (C3DMapEffect*)m_pData;
	if(!pObj)
		return false;

	CPlayer* pPlayer = g_objPlayerSet.GetPlayer(m_idTarget, true);
	if(!pPlayer)
	{
		pObj->Die();
		pObj = NULL;
		return true;
	}

	// 加速画线到人身上 // 初速度 0 // 加速度 300 象素/秒
	CMyPos posEnd, posCurrent, posCell;
	int nV = 100;
	float fA = (float)300;
	
	DWORD dwTime = ::TimeGet() - m_dwBegin;
	float fTime = dwTime*1.0/1000;
	
	int nCurrentV = nV + fTime * fA;
	float fCurrentTime = (::TimeGet() - m_dwBegin)*1.0/1000;;
	
	pPlayer->GetPos(posCell);
	g_objGameMap.Cell2World(posCell.x, posCell.y, posEnd.x, posEnd.y);
	posEnd.y += 50;
	
	CMy3DPos posMyBegin, posMyEnd;
	CMy3DDir dir3D;
	posMyBegin.x = m_posBegin.x;
	posMyBegin.y = m_posBegin.y;
	posMyBegin.z = 0;
	

⌨️ 快捷键说明

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