📄 3drole.cpp
字号:
//-------------------------------------------------------------
// 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 + -