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

📄 magiceffect.cpp

📁 网络游戏魔域源代码 测试可以完整变异
💻 CPP
📖 第 1 页 / 共 3 页
字号:
// MagicEffect.cpp: implementation of the CMagicEffect class.
//
//////////////////////////////////////////////////////////////////////

#include "MagicEffect.h"
#include "Magic.h"
#include "GamePlayerSet.h"
#include "Player.h"
#include "Hero.h"
#include "3DMapEffect.h"
#include "3DGameMap.h"
#include "../NdSound/Ndsound.h"
#include "Physics.h"
#include "3DMapSimpleObj.h"
#include "TerrainEffectManager.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CMagicEffect::CMagicEffect()
{
	m_nType = MAGICEFFECT_NONE;
	m_pData = NULL;
	m_bBegin = false;
	m_bDelayOk = false;
	m_dwBegin = ::TimeGet();
	m_dwBegin = 0;
	m_dwDelay = 0;	
}

CMagicEffect::~CMagicEffect()
{
	this->Destroy();
}
//--------------------------------------------------------------------
void CMagicEffect::Destroy()
{
	int nAmount = m_setRoleInfo.size();
	for(int i = 0; i < nAmount; i ++)
	{
		MagicEffectRoleInfo* pInfo = m_setRoleInfo[i];
		SAFE_DELETE(pInfo);
	}
	m_setRoleInfo.clear();

}
//--------------------------------------------------------------------
CMagicEffect* CMagicEffect::CreateNew(OBJID idSender, OBJID idTarget, DWORD dwMagicType, DWORD dwLevel, int nType,int nIndex)
{
	CMagicEffect* pEffect = new CMagicEffect;
	MYASSERT(pEffect);
	if(!pEffect->Create(idSender, idTarget, dwMagicType, dwLevel, nType,nIndex))
	{
		SAFE_DELETE(pEffect);
		return NULL;
	}
	return pEffect;
}
//--------------------------------------------------------------------
BOOL CMagicEffect::Create(OBJID idSender, OBJID idTarget, DWORD dwMagicType, DWORD dwLevel, int nType, int nIndex)
{
	m_idSender = idSender;
	m_idTarget = idTarget;
	m_dwMagicType = dwMagicType;
	m_dwLevel = dwLevel;
	m_nType = nType;
	m_dwBegin = 0;	
	if (nType == MAGICEFFECT_SOUL)
	{
		m_dwDelay = ::RandGet(5)*300 + 1000;	
		m_fSpeedA = ::RandGet(300) + 50;
		m_nIndex = nIndex;
	}
	return true;
}
//--------------------------------------------------------------------
void CMagicEffect::AddRoleInfo(OBJID idRole, DWORD dwData)
{
	MagicEffectRoleInfo* pInfo = new MagicEffectRoleInfo;
	pInfo->dwData = dwData;
	pInfo->idRole = idRole;
	m_setRoleInfo.push_back(pInfo);
}
//--------------------------------------------------------------------
BOOL CMagicEffect::Process()
{
	// return true if this effect is end
	if(m_nType == MAGICEFFECT_NONE) 
	{
		MagicTypeInfo infoMagicType; 
		if(!CMagic::s_objMagicData.GetMagicTypeInfo(m_dwMagicType, m_dwLevel, infoMagicType))
			return true;
		// get type ...
		m_nType = infoMagicType.dwClientRepresent;
	}
	switch(m_nType)
	{
	case MAGICEFFECT_BODY_BODY:
		return this->ProcessBodyBody();
		break;
	case MAGICEFFECT_SOUL:
		return this->ProcessSoul();
		break;
	case MAGICEFFECT_ARROW:
		return this->ProcessArrow();
		break;
	case MAGICEFFECT_BODY_TERRAIN_BODY:
		return this->ProcessBodyTerrainBody();
		break;
	case MAGICEFFECT_BODY_TRACE_BODY:
		return this->ProcessBodyTraceBody();
		break;
	case MAGICEFFECT_BODY_TRACE_POS:
		return this->ProcessBodyTracePos();
		break;
		
	default:
		return true;
	}
}


//--------------------------------------------------------------------
BOOL CMagicEffect::ProcessSoul()
{
	if(!m_bBegin)
	{
		// 创建 3dmapeffect
		if (m_dwBegin == 0)
			m_dwBegin = ::TimeGet();
		if (::TimeGet() - m_dwBegin < m_dwDelay) 
			return false;
		CPlayer* pPlayer = g_objPlayerSet.GetPlayer(m_idSender, true);
		if(!pPlayer)
			return true;
		CMyPos posWorld, posCell;
		pPlayer->GetPos(posCell);
		g_objGameMap.Cell2World(posCell.x, posCell.y, posWorld.x, posWorld.y);

		m_nIndex = max(::RandGet(12)*6,40);
		
		m_posBegin.x = posWorld.x + ::RandGet(10)*10 - 85;	
		m_posBegin.y = posWorld.y;

		g_objGameMap.World2Cell(m_posBegin.x, m_posBegin.y, posCell.x, posCell.y);

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

		
		if(!m_pData)
			return true;
		
		MagicEffectSoulInfo* pInfo = (MagicEffectSoulInfo*)m_pData;

		for(int i = 0; i < 1; i ++)
		{
			C3DMapEffect*  pEffect= C3DMapEffect::CreateNew(m_posBegin, "pet53", false);
			pLayer->AddMapObj(pEffect);
			pEffect->SetPos(posCell);
			pInfo->pEffect[i] = pEffect;
		}

		m_bBegin = true;
		m_dwMoment = 0;
		m_dwBegin = ::TimeGet();
		return false;
	}
	if(m_dwMoment == 0)
	{
		if(!m_pData)
			return true;
		MagicEffectSoulInfo* pInfo = (MagicEffectSoulInfo*)m_pData;
		// 开始缓缓上升 1 秒上升到高度 150 // 匀速 // 只改变世界坐标
		if(::TimeGet() - m_dwBegin >= m_dwDelay)
		{
			m_dwMoment = 1;
			m_dwData = ::TimeGet();
			CMyPos posBg,posWorld;
			pInfo->pEffect[0]->GetWorldPos(posBg); //BG POS
			g_objGameMap.Bg2World(posBg.x, posBg.y, posWorld.x, posWorld.y);
			m_posBegin = posWorld;
		}
		else
		{
			int nOffsetY = m_nIndex* (::TimeGet() - m_dwBegin) / m_dwDelay;
			CMyPos posCurrent = m_posBegin;
			
			CPlayer* pPlayer = g_objPlayerSet.GetPlayer(m_idSender, true);
			if(!pPlayer)
			for(int i = 0; i < 1; i ++)
			{
				pInfo->pEffect[i]->Die();
				return true;
			}
			
			{
				pInfo->pEffect[0]->SetWorldPos(posCurrent);
				pInfo->pEffect[0]->SetOffsetY(-nOffsetY);
				CMyPos posCell;
				g_objGameMap.World2Cell(posCurrent.x, posCurrent.y, posCell.x, posCell.y);
				pInfo->pEffect[0]->SetPos(posCell);
				return false;
			}
		}
	}
	if (m_dwMoment == 1)
	{
		if(::TimeGet() - m_dwData >= 800) 
		{
			m_dwMoment = 2;
			m_dwData = ::TimeGet();
		}
		else
			return false;
	}
	if(m_dwMoment == 2)
	{
		if(!m_pData)
			return true;
		MagicEffectSoulInfo* pInfo = (MagicEffectSoulInfo*)m_pData;		
				
		CPlayer* pPlayer = g_objPlayerSet.GetPlayer(m_idTarget, true);
		if(!pPlayer)
		{
			for(int i = 0; i < 1; i ++)
			{
				pInfo->pEffect[i]->Die();
			}
			return true;
		}

		// 加速画线到人身上 // 初速度 0 // 加速度 300 象素/秒
		CMyPos posEnd, posCurrent, posCell;
		int nV = 400;
		float fA = (float)m_fSpeedA;
		
		DWORD dwTime = ::TimeGet() - m_dwBegin - m_dwDelay - 800;
		
		float fTime = dwTime*1.0/1000;

		int nCurrentV = nV + fTime * fA;
		float fCurrentTime = (::TimeGet() - m_dwData)*1.0/1000;;
		
		pPlayer->GetPos(posCell);
		g_objGameMap.Cell2World(posCell.x, posCell.y, posEnd.x, posEnd.y);
		posEnd.y += 50;
		

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

		m_posBegin = posCurrent;
		m_dwData = ::TimeGet();

		{
			pInfo->pEffect[0]->SetWorldPos(posCurrent);
		}

		g_objGameMap.World2Cell(posCurrent.x, posCurrent.y, posCell.x, posCell.y);
		for(int i = 0; i < 1; i ++)
		{
			pInfo->pEffect[i]->SetPos(posCell);
		}

		if(bOk)
		{
			for(int i = 0; i < 1; i ++)
			{
				pInfo->pEffect[i]->Die();
			}
			SAFE_DELETE(m_pData);
			
			CCommand cmd;
			cmd.iType		= _COMMAND_EMOTION;
			cmd.iStatus		= _CMDSTATUS_BEGIN;
			cmd.nData		= _ACTION_RELIVE;
			cmd.nDir		= pPlayer->GetDir();
			pPlayer->SetCommand(&cmd);			

			pPlayer->m_objEffect.Add("pet54");
		}
		return bOk;
	}
	return true;
}
//--------------------------------------------------------------------
BOOL CMagicEffect::ProcessSoulEx()
{
	if(!m_bBegin)
	{
		if (m_dwBegin == 0)
			m_dwBegin = ::TimeGet();
		if (m_dwDelay > 0 && ::TimeGet() - m_dwBegin < m_dwDelay) 
			return false;
		m_bBegin = true;
		m_dwMoment = 0;
		// 创建 3dmapeffect
		CPlayer* pPlayer = g_objPlayerSet.GetPlayer(m_idSender, true);
		if(!pPlayer)
			return true;
		CPlayer* pTarget = g_objPlayerSet.GetPlayer(m_idTarget, true);
		if (pTarget ) 
			m_nDir = pPlayer->GetDir(pTarget);
		else
			m_nDir = 0;
		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;
		m_pData = new MagicEffectSoulInfo;

		
		if(!m_pData)
			return true;
		
		MagicEffectSoulInfo* pInfo = (MagicEffectSoulInfo*)m_pData;

		for(int i = 0; i < 1; i ++)
		{
			C3DMapEffect*  pEffect= C3DMapEffect::CreateNew(posWorld, "soul", false);
			pLayer->AddMapObj(pEffect);
			pEffect->SetPos(posCell);
			pInfo->pEffect[i] = pEffect;
		}

		m_dwBegin = ::TimeGet();
		return false;
	}
	if(m_dwMoment == 0)
	{
		if(!m_pData)
			return true;
		MagicEffectSoulInfo* pInfo = (MagicEffectSoulInfo*)m_pData;
		// 从sender身上冲出500 秒
		if(::TimeGet() - m_dwBegin >= 200)
		{
			m_dwMoment = 1;	//进入悬停状态
			m_dwData = ::TimeGet();
			CMyPos posBg,posWorld;
			pInfo->pEffect[0]->GetWorldPos(posBg); //BG POS
			g_objGameMap.Bg2World(posBg.x, posBg.y, posWorld.x, posWorld.y);
			m_posBegin = posWorld;
		}
		else
		{
			CPlayer* pPlayer = g_objPlayerSet.GetPlayer(m_idSender, true);
			if(!pPlayer)
			for(int i = 0; i < 1; i ++)
			{
				pInfo->pEffect[i]->Die();
				return true;
			}
			
			CMyPos posCurrent ;
			int nX, nY;

			this->GetSoulDirectPos(m_nIndex, m_nDir, nX, nY);

			int nCurrentTime = ::TimeGet() - m_dwBegin;
			posCurrent.x = m_posBegin.x - nX*nCurrentTime/200;
			posCurrent.y = m_posBegin.y - nY*nCurrentTime/200;

			pInfo->pEffect[0]->SetWorldPos(posCurrent);
			CMyPos posCell;
			g_objGameMap.World2Cell(posCurrent.x, posCurrent.y, posCell.x, posCell.y);
			pInfo->pEffect[0]->SetPos(posCell);
			return false;
		}
	}
	if (m_dwMoment == 1)
	{
		if(::TimeGet() - m_dwData >= 1000) 
		{
			m_dwMoment = 2;
			m_dwData = ::TimeGet();
		}
		else
			return false;
	}
	if (m_dwMoment == 2)
	{
		if(!m_pData)
			return true;
		MagicEffectSoulInfo* pInfo = (MagicEffectSoulInfo*)m_pData;

		CPlayer* pPlayer = g_objPlayerSet.GetPlayer(m_idTarget, true);
		if(!pPlayer)
		{
			for(int i = 0; i < 1; i ++)
			{
				pInfo->pEffect[i]->Die();
			}
			return true;
		}

		// 加速画线到人身上 // 初速度 0 // 加速度 300 象素/秒
		CMyPos posEnd, posCurrent, posCell;
		int nV = 100;
		float fA = m_fSpeedA;
		
		DWORD dwTime = ::TimeGet() - m_dwBegin - 1200;
		float fTime = dwTime*1.0/1000;

		int nCurrentV = nV + fTime * fA;
		float fCurrentTime = (::TimeGet() - m_dwData)*1.0/1000;;

		pPlayer->GetPos(posCell);
		g_objGameMap.Cell2World(posCell.x, posCell.y, posEnd.x, posEnd.y);
		posEnd.y += 50;
		

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

		m_posBegin = posCurrent;
		m_dwData = ::TimeGet();

		{
			pInfo->pEffect[0]->SetWorldPos(posCurrent);
		}

		g_objGameMap.World2Cell(posCurrent.x, posCurrent.y, posCell.x, posCell.y);
		for(int i = 0; i < 1; i ++)
		{
			pInfo->pEffect[i]->SetPos(posCell);
		}

		if(bOk)
		{
			for(int i = 0; i < 1; i ++)
			{
				pInfo->pEffect[i]->Die();
			}
			SAFE_DELETE(m_pData);

			if (pPlayer->GetID() == g_objHero.GetID())
			{
				g_objHero.m_objEffect.Add("GreenGlow");
			}
		}
		return bOk;
	}
	return true;
}

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

BOOL CMagicEffect::ProcessBodyBody()
{
	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())
				{				

⌨️ 快捷键说明

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