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

📄 3drole.cpp

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

#include "3DRole.h"
#include "GameDataSet.h"
#include "3DRoleData.h"
#include "../ndsound/ndsound.h"
const char HAIR_INI[] = "ini/hair.ini";

//需要特殊处理的几种状态表现
const __int64	PLAYERTATUS_ATTACK			=0x00010000;			// 攻击提升
const __int64	PLAYERTATUS_ADJUST_XP		=0x0000010000000000;	// 调节每次增加XP值


#ifdef _ANALYSIS_ON
DWORD g_dw3DRoleDrawTime = 0;
DWORD g_dw3DRoleDrawAmount = 0;
DWORD g_dw3DRoleDrawTimeMax = 0;
DWORD g_dw3DRoleDrawTimeFrame = 0;
DWORD g_dw3DRoleDrawAmountFrame = 0;
#endif
//-------------------------------------------------------------
C3DRole::C3DRole ()
{
	m_nPosX = m_nPosY = 0;
	m_nRotateZ = 0;
	m_nRotateX = -37; 
	m_nRotateY = 0;
	m_fScale = 1.0f;
	
	m_LightOffset.x = 0;
	m_LightOffset.y = 0;
	m_LightOffset.z = -1000;
	
	m_nShadowType = 2;
	
	m_a = 1.0f;
	m_r = 0.3f;
	m_g = 0.3f;
	m_b = 0.3f;

	m_dwPlayerStatus = 0;

	m_pArmor	= NULL;	

	m_pLWeapon	= NULL;
	m_pRWeapon	= NULL;
	m_pLShield	= NULL;
	m_pRShield	= NULL;
	m_pMount	= NULL;
	m_pArmet	= NULL;
	m_pMantle	= NULL;
	m_pHead		= NULL;
	m_pArmorClone	= NULL;
	m_nLook		= 0;
	m_nHair		= 0;
	m_nLookClone = 0;
	m_usStatus  = 0;

	m_pMotionArmor	= NULL;
	m_pMotionArmet	= NULL;
	m_pMotionWeaponR= NULL;
	m_pMotionWeaponL= NULL;
	m_pMotionMount	= NULL;
	m_pMotionMantle	= NULL;
	m_min.x = 0;
	m_min.y = 0;
	m_min.z = 0;
	m_max.x = 0;
	m_max.y = 0;
	m_max.z = 0;
	m_pEffect = NULL;
}

C3DRole::~C3DRole ()
{
	SAFE_DELETE(m_pArmor);

	SAFE_DELETE(m_pLWeapon);
	SAFE_DELETE(m_pRWeapon);
	SAFE_DELETE(m_pLShield);
	SAFE_DELETE(m_pRShield);
	SAFE_DELETE(m_pMount);
	SAFE_DELETE(m_pArmet);
	SAFE_DELETE(m_pMantle);
	SAFE_DELETE(m_pArmorClone);
	SAFE_DELETE(m_pHead);
}

//------------------------------------------------------
void C3DRole::ResetMotion	(void)
{
	m_pMotionArmor	= NULL;
	m_pMotionArmet	= NULL;
	m_pMotionWeaponR= NULL;
	m_pMotionWeaponL= NULL;
	m_pMotionMount	= NULL;
	m_pMotionMantle = NULL;
}

//------------------------------------------------------
void C3DRole::Move ( float x, float y, float z )
{
	if(m_pArmor)
		m_pArmor->Move(x,y,z);
	if(m_pLWeapon)
		m_pLWeapon->Move(x,y,z);
	if(m_pRWeapon)
		m_pRWeapon->Move(x,y,z);
	if(m_pMount)
		m_pMount->Move(x,y,z);
	if(m_pArmet)
		m_pArmet->Move(x,y,z);
	if(m_pArmorClone)
		m_pArmorClone->Move(x, y, z);
	if(m_pMantle)
		m_pMantle->Move(x, y, z);
	if(m_pHead)
		m_pHead->Move(x, y, z);
}

//------------------------------------------------------
void C3DRole::Rotate ( float x, float y, float z )
{
	if(m_pArmor)
		m_pArmor->Rotate(x,y,z);
	if(m_pLWeapon)
		m_pLWeapon->Rotate(x,y,z);
	if(m_pRWeapon)
		m_pRWeapon->Rotate(x,y,z);
	if(m_pMount)
		m_pMount->Rotate(x,y,z);
	if(m_pArmet)
		m_pArmet->Rotate(x,y,z);
	if(m_pArmorClone)
		m_pArmorClone->Rotate(x, y, z);
	if(m_pMantle)
		m_pMantle->Rotate(x, y, z);
	if(m_pHead)
		m_pHead->Rotate(x, y, z);

}

//------------------------------------------------------
void C3DRole::Scale ( float x, float y, float z )
{
	if(m_pArmor)
		m_pArmor->Scale(x,y,z);
	if(m_pLWeapon)
		m_pLWeapon->Scale(x,y,z);
	if(m_pRWeapon)
		m_pRWeapon->Scale(x,y,z);
	if(m_pMount)
		m_pMount->Scale(x,y,z);
	if(m_pArmet)
		m_pArmet->Scale(x,y,z);
	if(m_pArmorClone)
		m_pArmorClone->Scale(x, y, z);
	if(m_pMantle)
		m_pMantle->Scale(x, y, z);
	if(m_pHead)
		m_pHead->Scale(x, y, z);
}

//------------------------------------------------------
DWORD C3DRole::GetWeaponActionData (void)
{
	if (m_pRWeapon && !m_pLWeapon)	// single or two hand weapon
	{
		OBJID idType = m_pRWeapon->GetTypeID();
		return (idType%1000000)/1000;
	}

	if (!m_pRWeapon && m_pLWeapon)	// shield only
	{
		OBJID idType = m_pLWeapon->GetTypeID();
		return 741;
	}

	if (m_pRWeapon && m_pLWeapon)	// two weapon
	{
		if (((m_pLWeapon->GetTypeID()%1000000)/100000) == 9)		// shield
		{
			OBJID idTypeR = m_pRWeapon->GetTypeID();
			OBJID idTypeL = m_pLWeapon->GetTypeID();

			return 7*100 + ((idTypeR%1000000)/10000);
		}
		else if (((m_pLWeapon->GetTypeID()%1000000)/100000) == 4)	// single hand weapon
		{
			OBJID idTypeR = m_pRWeapon->GetTypeID();
			OBJID idTypeL = m_pLWeapon->GetTypeID();

			return 6*100 + ((idTypeR%100000)/10000)*10 + ((idTypeL%100000)/10000);
		}
		if(m_pRWeapon->GetTypeID() / 1000 == 500) // bow
			return 500;
	}

	return 0;	// default
}

//------------------------------------------------------
DWORD C3DRole::GetMountActionData (void)
{
	if (!m_pMount)
		return 0;

	// temp code
	return 1;
}


//------------------------------------------------------
int  C3DRole::SetCloneAction (int nActionType, BOOL bPlaySound, int nWorldX, int nWorldY, BOOL bSetEffect)
{
	MYASSERT (m_pArmor);

	// body motion
	OBJID idBodyMotion = m_nLookClone *1000000 + nActionType;

	// load motion
	C3DMotion* pBodyMotion = g_objGameDataSet.Get3DMotion(idBodyMotion);

	if (!pBodyMotion)
	{
		::LogMsg("Error: motion(%u) can't found.", idBodyMotion);

		// load default motion if error
		OBJID idDefaultMotion = m_nLook *1000000 + nActionType;
		pBodyMotion	 = g_objGameDataSet.Get3DMotion(idDefaultMotion);
		if (!pBodyMotion)
		{
			const OBJID idActionError =  500000;
			::ErrorOut(g_objGameDataSet.GetStr(idActionError), idBodyMotion, idDefaultMotion);
			return 0;
		}
		else
			return pBodyMotion->GetFrameAmount();
	}
	
	if (m_pArmorClone)
	{
		if (bSetEffect)
			m_pArmorClone->Set3DEffect(m_nLook, nActionType, m_pArmor->GetTypeID()%1000, m_pEffect, "v_body");
		m_pArmorClone->SetMotion(pBodyMotion);
	}

	return pBodyMotion->GetFrameAmount();
}


//------------------------------------------------------
C3DMotion* C3DRole::GetWeaponMotion	(OBJID idWeapon, int nActionType)
{
	idWeapon = (idWeapon/10)*10;

	OBJID idMotion = idWeapon*1000+nActionType;
	C3DMotion* pMotion  = g_objGameDataSet.Get3DWeaponMotion(idMotion);
	if (pMotion)	
		return pMotion;

	idMotion = idWeapon*1000+999;
	pMotion  = g_objGameDataSet.Get3DWeaponMotion(idMotion);
	if (pMotion)
		return pMotion;

	idMotion = ((idWeapon/1000)*1000+999)*1000+nActionType;
	pMotion  = g_objGameDataSet.Get3DWeaponMotion(idMotion);
	if (pMotion)
		return pMotion;
			
	idMotion = ((idWeapon/1000)*1000+999)*1000+999;
	pMotion  = g_objGameDataSet.Get3DWeaponMotion(idMotion);
	if (pMotion)
		return pMotion;

	return NULL;
}

//------------------------------------------------------
void C3DRole::NextFrame ( int nStep )
{
	m_pArmor->NextFrame(nStep);
}

//------------------------------------------------------
BOOL C3DRole::SetLWeapon(OBJID idType)
{
	// reset motion
	this->ResetMotion();

	SAFE_DELETE(m_pLWeapon);
	if (m_pEffect!=NULL)
		m_pEffect->DeleteByVMesh("v_l_weapon");
	if(idType == ID_NONE)
		return false;

	m_pLWeapon = C3DWeapon::CreateNew(idType);
	m_pLWeapon->CreateLight(idType);
	return true;
}

//------------------------------------------------------
BOOL C3DRole::SetRWeapon(OBJID idType)
{
	// reset motion
	this->ResetMotion();

	idType %= 1000000;

	SAFE_DELETE(m_pRWeapon);
	if (m_pEffect!=NULL)
		m_pEffect->DeleteByVMesh("v_r_weapon");
	if(idType == ID_NONE)
		return false;

	m_pRWeapon = C3DWeapon::CreateNew(idType);
	m_pRWeapon->CreateLight(idType);
	return true;
}
//------------------------------------------------------
void C3DRole::SetHead(OBJID idFace)
{
	// reset motion
	this->ResetMotion();

	SAFE_DELETE(m_pHead);
	if(m_nLook == 1)
		m_pHead = C3DHead::CreateNew(1000000 + idFace);
	else if(m_nLook == 2)
		m_pHead = C3DHead::CreateNew(2000000 + idFace);
	if (m_pEffect!=NULL)
		m_pEffect->DeleteByVMesh("v_head");
	//MYASSERT (m_pHead);
}
//------------------------------------------------------

void C3DRole::SetArmor(OBJID idType)
{
	// reset motion
	this->ResetMotion();

	idType %= 1000000;

	SAFE_DELETE(m_pArmor);
	/*
	if(idType == ID_NONE)
		return;
	*/
	m_pArmor = C3DArmor::CreateNew(m_nLook*1000000+idType/10*10);
	m_pArmor->CreateLight(idType);
	if (m_pEffect!=NULL)
		m_pEffect->DeleteByVMesh("v_body");
	MYASSERT (m_pArmor);
}
//------------------------------------------------------
void C3DRole::SetMantle	(OBJID idType)
{
	// reset motion
	this->ResetMotion();
	SAFE_DELETE(m_pMantle);
	if (m_pEffect!=NULL)
		m_pEffect->DeleteByVMesh("v_mantle");
	if(idType == ID_NONE)
		return;
	
	idType %= 1000000;
	idType = m_nLook * 1000000 + idType;
	
	m_pMantle = C3DMantle::CreateNew(idType);
	m_pMantle->CreateLight(idType);
	MYASSERT(m_pMantle);
}
//------------------------------------------------------
void C3DRole::SetMount(OBJID idMountType)
{
	// reset motion
	this->ResetMotion();

	idMountType %= 1000000;

	SAFE_DELETE(m_pMount);
	if (m_pEffect!=NULL)
		m_pEffect->DeleteByVMesh("v_pet");
	if(idMountType == ID_NONE)
		return;
	m_pMount = C3DMount::CreateNew(idMountType);
	m_pMount->CreateLight(idMountType);
	MYASSERT (m_pMount);
}

//------------------------------------------------------
void C3DRole::SetLook(int nLook)
{
	MYASSERT (nLook>0 && nLook<1000); 
	m_nLook = nLook;
	
	if (!m_pArmor)
	{
		m_pArmor = C3DArmor::CreateNew(m_nLook*1000000);
		MYASSERT (m_pArmor);
	}
	else
	{
		OBJID idType = m_pArmor->GetTypeID();
		if ((idType%1000000) == 0)	// no real armor
		{
			SAFE_DELETE(m_pArmor);

			m_pArmor = C3DArmor::CreateNew(m_nLook*1000000);
			MYASSERT (m_pArmor);
		}
	}
//	this->SetHead(0);	//fot TerrainEffectEditor
}

//------------------------------------------------------
void C3DRole::SetArmet(OBJID idArmetType)
{
	// reset motion
	this->ResetMotion();

	// auto correct type id
	idArmetType = idArmetType%1000000;

	if (119 != (idArmetType%1000000)/1000)
		idArmetType = (idArmetType/10)*10;

	// sub type...
	int nSubType = (idArmetType%1000000)/1000;
	if (nSubType == 117 || nSubType == 118 || (nSubType == 112 && (idArmetType/10)%10 == 8))
	{	// invisible head equipment
		if (m_pArmet)	// got armet already
		{
			int nSubType = (m_pArmet->GetTypeID()%1000000)/1000;
			if (nSubType == 119)	// current armet is hair
				return;
			else					// current armet is helmet, so replace it
			{
				SAFE_DELETE(m_pArmet);

				if (m_nHair != 0)	// got hair
				{
					OBJID idNewType = 119000+m_nHair;
					m_pArmet = C3DArmet::CreateNew(m_nLook*1000000+idNewType);
					MYASSERT (m_pArmet);
				}
			}
		}
		
		return;
	}
	else if (nSubType == 119)	// new hair
	{
		if (m_pArmet)	// got armet already
		{
			int nSubType = (m_pArmet->GetTypeID()%1000000)/1000;
			if (nSubType == 119)	// current armet is hair, so replace it
			{
				SAFE_DELETE(m_pArmet);

				if ((idArmetType%1000) != 0)	// not zero
				{
					m_pArmet = C3DArmet::CreateNew(m_nLook*1000000+idArmetType);
					MYASSERT (m_pArmet);
				}
			}
		}
		else	// no armet, so create it
		{
			if (idArmetType%1000)	// not zero
			{
				m_pArmet = C3DArmet::CreateNew(m_nLook*1000000+idArmetType);
				MYASSERT (m_pArmet);
			}
		}
		
		return;
	}
	else	// new helmet or ID_NONE
	{
		if (idArmetType == ID_NONE)
		{
			if (m_pArmet)	// got armet already
			{
				int nSubType = (m_pArmet->GetTypeID()%1000000)/1000;
				if (nSubType == 119)	// current armet is hair
				{	// do nothing
					//SAFE_DELETE(m_pArmet);
				}
				else	// is not hair, so delete it; and restore hair if it got one
				{
					SAFE_DELETE(m_pArmet);

					if (m_nHair != 0)
					{
						m_pArmet = C3DArmet::CreateNew(m_nLook*1000000+119000+m_nHair);
						MYASSERT (m_pArmet);
					}
				}
			}
		}
		else	// new helmet
		{
			SAFE_DELETE(m_pArmet);

			m_pArmet = C3DArmet::CreateNew(m_nLook*1000000+idArmetType);
			MYASSERT (m_pArmet);
		}
	}
}

//------------------------------------------------------
void C3DRole::SetHair(int nHair)
{
	m_nHair = nHair;

	this->SetArmet(nHair+119000);
}

//------------------------------------------------------
void C3DRole::Transform(int nLook)
{
	m_nLookClone = nLook;
	SAFE_DELETE(m_pArmorClone);
	if(nLook == 99 || nLook == 98)
	{
		return;
	}
	else if(nLook > 0)
	{
		m_pArmorClone = C3DArmor::CreateNew(nLook * 1000000);
	}
}
//------------------------------------------------------
void C3DRole::SetFrame (DWORD dwFrame)
{
	if(m_pArmorClone)
		m_pArmorClone->SetFrame(dwFrame);
	else
	{
		if(m_pArmor)
			m_pArmor->SetFrame(dwFrame);
		if(m_pMount)
			m_pMount->SetFrame(dwFrame);
		if(m_pArmet)
			m_pArmet->SetFrame(dwFrame);
		if(m_pRWeapon)
			m_pRWeapon->SetFrame(dwFrame);
		if(m_pLWeapon)
			m_pLWeapon->SetFrame(dwFrame);
		if(m_pMantle)
			m_pMantle->SetFrame(dwFrame);

⌨️ 快捷键说明

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