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

📄 magiceffect.cpp

📁 网络游戏魔域源代码 测试可以完整变异
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	posMyEnd.x = posEnd.x;
	posMyEnd.y = posEnd.y;
	posMyEnd.z = 0;
	
	CPhysics::S3Get3DDir(posMyBegin, posMyEnd, dir3D);
	pObj->SetRotate(dir3D.fHorizontal+1.57, dir3D.fVertical);

	BOOL bOk = CPhysics::S2DBMGetPos(nCurrentV, 0, fCurrentTime, m_posBegin, posEnd, posCurrent);
	
	m_posBegin = posCurrent;
	posCurrent.y -= 50;
	pObj->SetWorldPos(posCurrent);
	
//	g_objGameMap.World2Cell(posCurrent.x, posCurrent.y, posCell.x, posCell.y);
//	pEffect->SetPos(posCell);
	
	if(bOk)
	{
		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));
				}
					//pPlayer->SetLife(__max(0, (int)pPlayer->GetLife()-(int)pRoleInfo->dwData));

				if (strcmp(infoMagicType.szTargetSound, "NULL") != 0)
				{
					CMyPos posWorld;
					pPlayer->GetWorldPos(posWorld);
					::DXPlaySound(infoMagicType.szTargetSound, posWorld.x, posWorld.y, nRange);	
				}
			}
		}
		pObj->Die();
		m_pData = NULL;
	}
	return bOk;
}
//----------------------------------------------------------------------------------------
void CMagicEffect::BeginScreenEffect(DWORD dwScreenRepresent)
{
	if(dwScreenRepresent & MAGIC_SHAKENORMAL)
		g_objGameMap.BeginShakeEffect();
	if(dwScreenRepresent & MAGIC_COLORNORMAL)
		g_objGameMap.BeginColorEffect();
	if(dwScreenRepresent & MAGIC_SCALENORMAL)
		g_objGameMap.BeginScaleEffect();
}
//----------------------------------------------------------------------------------------
BOOL CMagicEffect::ProcessBodyTracePos()
{
	MagicTypeInfo infoMagicType; 
	if(!CMagic::s_objMagicData.GetMagicTypeInfo(m_dwMagicType, m_dwLevel, infoMagicType))
		return true;
	const int nRange = 3000;
	if(!m_bBegin)
	{
		m_dwBegin = ::TimeGet();
		m_bBegin = true;
		CPlayer* pPlayer= g_objPlayerSet.GetPlayer(m_idSender);
		if(!pPlayer && (m_idSender == g_objHero.GetID()))
			pPlayer = &g_objHero;
		if(infoMagicType.dwSenderAction != 0)
			if(!pPlayer->IsDead())
			{
				if(infoMagicType.dwSenderAction != 0)
				{
					pPlayer->ResetStepDir();
					
					CPlayer* pTarget = g_objPlayerSet.GetPlayer(m_idTarget);
					
					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);
				}
			}

		return false;
	}
	if(!m_bDelayOk)
	{
		DWORD dwDelay = 200;
		if(infoMagicType.dwSenderAction != 0)
			dwDelay = 600;
		if(::TimeGet() - m_dwBegin < dwDelay)
		{
			return false;
		}
		else
		{
			m_bDelayOk = true;
			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(!pPlayer->IsDead())
				{
					if(infoMagicType.dwSenderAction != 0)
					{
						pPlayer->ResetStepDir();
						
						CPlayer* pTarget = g_objPlayerSet.GetPlayer(m_idTarget);
						
						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;
			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 += 10;
			posMyEnd.x = posEnd.x;
			posMyEnd.y = posEnd.y;
			posMyEnd.z = 0;
			m_posEnd.x = posEnd.x;
			m_posEnd.y = posEnd.y;
			CMyPos posCurrent;
			BOOL bOk = CPhysics::S2DBMGetPos(0, 0, 0, m_posBegin, posEnd, posCurrent);

			CPhysics::S3Get3DDir(posMyBegin, posMyEnd, m_dir3D);
			pObj->SetRotate(m_dir3D.fHorizontal+1.57, m_dir3D.fVertical);
			posCurrent.y -= 50;
			pObj->SetWorldPos(posCurrent);
			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;
	int nV = 1000;
//	int nV = 10;
	float fA = (float)0.0;
	
	DWORD dwTime = ::TimeGet() - m_dwBegin;
	float fTime = dwTime*1.0/1000;
	
	int nCurrentV = nV + fTime * fA;
	float fCurrentTime = (::TimeGet() - m_dwBegin)*1.0/1000;;
	
	
	CMy3DPos posMyBegin, posMyEnd;
//	CMy3DDir dir3D;
	posEnd.x = m_posEnd.x;
	posEnd.y = m_posEnd.y;
	posMyBegin.x = m_posBegin.x;
	posMyBegin.y = m_posBegin.y;
	posMyBegin.z = 0;
	
	posMyEnd.x = posEnd.x;
	posMyEnd.y = posEnd.y;
	posMyEnd.z = 0;
	
	//CPhysics::S3Get3DDir(posMyBegin, posMyEnd, m_dir3D);
	pObj->SetRotate(m_dir3D.fHorizontal+1.57, m_dir3D.fVertical); 

	BOOL bOk = CPhysics::S2DBMGetPos(nCurrentV, 0, fCurrentTime, m_posBegin, posEnd, posCurrent);
	m_posEnd.x = posEnd.x;
	m_posEnd.y = posEnd.y;

	//m_posBegin = posCurrent;
	posCurrent.y -= 50;
	pObj->SetWorldPos(posCurrent);
//	g_objGameMap.World2Cell(posCurrent.x, posCurrent.y, posCell.x, posCell.y);
//	pEffect->SetPos(posCell);
	
	if(bOk)
	{
		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);	
				}
			}
		}
		pObj->Die();
		m_pData = NULL;
	}
	return bOk;
}
//----------------------------------------------------------------------------------------
void CMagicEffect::GetSoulDirectPos(int nIndex, int nDir, int &x, int &y)
{
	int nOptX,nOptY;
	nOptY = 1;
	nOptX = 1;
	switch(nDir) 
	{
	case 0:
	case 1:
	case 2:
	case 3:
		nOptX = 1;
		nOptY = 1;
		break;
	case 4:
	case 5:
	case 6:
	case 7:
		nOptX = -1;
		nOptY = -1;
		break;
	default:
		break;
	}
	if (nDir == 0 || nDir == 4 ) 
	{
		switch(nIndex) 
		{
		case 0:
			x = -80;	y = 80;
			break;
		case 1:
			x = -60;	y = 80;
			break;
		case 2:
			x = -72;	y = 60;
			break;
		case 3:
			x = -32;	y = 72;
			break;
		case 4:
			x = -72;	y = 32;
			break;
		default:
			x = 0;		y = 80;
			break;
		}
	}
	else if (nDir ==2 || nDir == 6) 
	{
		switch(nIndex) 
		{
		case 0:
			x = -80;	y = -80;
			break;
		case 1:
			x = -60;	y = -80;
			break;
		case 2:
			x = -72;	y = -60;
			break;
		case 3:
			x = -32;	y = -72;
			break;
		case 4:
			x = -72;	y = -32;
			break;
		default:
			x = 0;		y = -80;
			break;
		}			
	}
	else if (nDir == 1 ||  nDir ==5 ) 
	{
		switch(nIndex) 
		{
		case 0:
			x = -80;		y = 0;
			break;
		case 1:
			x = -60;		y = 40;
			break;
		case 2:
			x = -60;		y = -40;
			break;
		case 3:
			x = -75;		y = 24;
			break;
		case 4:
			x = -75;		y = -24;
			break;
		default:
			x = -80;		y = 0;
			break;
		}	
	}
	else if (nDir == 3 ||nDir ==7) 
	{
		switch(nIndex) 
		{
		case 0:
			x = 0;		y = -80;
			break;
		case 1:
			x = 40;		y = -60;
			break;
		case 2:
			x = -40;	y = -60;
			break;
		case 3:
			x = 24;		y = -75;
			break;
		case 4:
			x = -24;	y = -75;
			break;
		default:
			x = 0;		y = -80;
			break;
		}	
	}
	x = nOptX*x;
	y = nOptY*y;
}
//--------------------------------------------------------------------

⌨️ 快捷键说明

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