client/GameLib/ActorInstanceData.cpp

359 lines
9.4 KiB
C++

#include "StdAfx.h"
#include "ActorInstance.h"
#include "RaceManager.h"
#include "ItemManager.h"
#include "RaceData.h"
#include "../eterlib/ResourceManager.h"
#include "../etergrnlib/util.h"
DWORD CActorInstance::GetVirtualID()
{
return m_dwSelfVID;
}
void CActorInstance::SetVirtualID(DWORD dwVID)
{
m_dwSelfVID=dwVID;
}
void CActorInstance::UpdateAttribute()
{
if (!m_pAttributeInstance)
return;
if (!m_bNeedUpdateCollision)
return;
m_bNeedUpdateCollision = FALSE;
const CStaticCollisionDataVector & c_rkVec_ColliData = m_pAttributeInstance->GetObjectPointer()->GetCollisionDataVector();
UpdateCollisionData(&c_rkVec_ColliData);
m_pAttributeInstance->RefreshObject(GetTransform());
UpdateHeightInstance(m_pAttributeInstance);
//BOOL isHeightData = m_pAttributeInstance->IsEmpty();
}
void CActorInstance::__CreateAttributeInstance(CAttributeData * pData)
{
m_pAttributeInstance = CAttributeInstance::New();
m_pAttributeInstance->Clear();
m_pAttributeInstance->SetObjectPointer(pData);
if (pData->IsEmpty())
{
m_pAttributeInstance->Clear();
CAttributeInstance::Delete(m_pAttributeInstance);
}
}
DWORD CActorInstance::GetRace()
{
return m_eRace;
}
bool CActorInstance::SetRace(DWORD eRace)
{
CRaceData * pRaceData;
if (!CRaceManager::Instance().GetRaceDataPointer(eRace, &pRaceData))
{
m_eRace=0;
m_pkCurRaceData=NULL;
return false;
}
m_eRace=eRace;
m_pkCurRaceData = pRaceData;
CAttributeData * pAttributeData = pRaceData->GetAttributeDataPtr();
if (pAttributeData)
{
__CreateAttributeInstance(pAttributeData);
}
memset(m_adwPartItemID, 0, sizeof(m_adwPartItemID));
// Setup Graphic ResourceData
__ClearAttachingEffect();
CGraphicThingInstance::Clear();
//NOTE : PC만 Part별로 다 생성하게 해준다.
if( IsPC())
{
CGraphicThingInstance::ReserveModelThing(CRaceData::PART_MAX_NUM);
CGraphicThingInstance::ReserveModelInstance(CRaceData::PART_MAX_NUM);
}
else
{
CGraphicThingInstance::ReserveModelThing(1);
CGraphicThingInstance::ReserveModelInstance(1);
}
CRaceData::TMotionModeDataIterator itor;
if (pRaceData->CreateMotionModeIterator(itor))
{
do
{
WORD wMotionMode = itor->first;
CRaceData::TMotionModeData * pMotionModeData = itor->second;
CRaceData::TMotionVectorMap::iterator itorMotion = pMotionModeData->MotionVectorMap.begin();
for (; itorMotion != pMotionModeData->MotionVectorMap.end(); ++itorMotion)
{
WORD wMotionIndex = itorMotion->first;
const CRaceData::TMotionVector & c_rMotionVector = itorMotion->second;
CRaceData::TMotionVector::const_iterator it;
DWORD i;
for (i = 0, it = c_rMotionVector.begin(); it != c_rMotionVector.end(); ++i, ++it)
{
DWORD dwMotionKey = MAKE_RANDOM_MOTION_KEY(wMotionMode, wMotionIndex, i);
CGraphicThingInstance::RegisterMotionThing(dwMotionKey, it->pMotion);
}
}
}
while (pRaceData->NextMotionModeIterator(itor));
}
return true;
}
void CActorInstance::SetHair(DWORD eHair)
{
m_eHair = eHair;
CRaceData * pRaceData;
if (!CRaceManager::Instance().GetRaceDataPointer(m_eRace, &pRaceData))
return;
CRaceData::SHair* pkHair=pRaceData->FindHair(eHair);
if (pkHair)
{
if (!pkHair->m_stModelFileName.empty())
{
CGraphicThing * pkHairThing = (CGraphicThing *)CResourceManager::Instance().GetResourcePointer(pkHair->m_stModelFileName.c_str());
RegisterModelThing(CRaceData::PART_HAIR, pkHairThing);
SetModelInstance(CRaceData::PART_HAIR, CRaceData::PART_HAIR, 0, CRaceData::PART_MAIN);
}
const std::vector<CRaceData::SSkin>& c_rkVct_kSkin = pkHair->m_kVct_kSkin;
std::vector<CRaceData::SSkin>::const_iterator i;
for (i = c_rkVct_kSkin.begin(); i != c_rkVct_kSkin.end(); ++i)
{
const CRaceData::SSkin& c_rkSkinItem = *i;
CResource * pkRes = CResourceManager::Instance().GetResourcePointer(c_rkSkinItem.m_stDstFileName.c_str());
if (pkRes)
SetMaterialImagePointer(CRaceData::PART_HAIR, c_rkSkinItem.m_stSrcFileName.c_str(), static_cast<CGraphicImage*>(pkRes));
}
}
}
void CActorInstance::SetShape(DWORD eShape, float fSpecular)
{
m_eShape = eShape;
CRaceData * pRaceData;
if (!CRaceManager::Instance().GetRaceDataPointer(m_eRace, &pRaceData))
return;
CRaceData::SShape* pkShape=pRaceData->FindShape(eShape);
if (pkShape)
{
CResourceManager& rkResMgr=CResourceManager::Instance();
if (pkShape->m_stModelFileName.empty())
{
CGraphicThing* pModelThing = pRaceData->GetBaseModelThing();
RegisterModelThing(0, pModelThing);
}
else
{
CGraphicThing* pModelThing = (CGraphicThing *)rkResMgr.GetResourcePointer(pkShape->m_stModelFileName.c_str());
RegisterModelThing(0, pModelThing);
}
{
std::string stLODModelFileName;
char szLODModelFileNameEnd[256];
for (UINT uLODIndex=1; uLODIndex<=3; ++uLODIndex)
{
sprintf(szLODModelFileNameEnd, "_lod_%.2d.gr2", uLODIndex);
stLODModelFileName = CFileNameHelper::NoExtension(pkShape->m_stModelFileName) + szLODModelFileNameEnd;
if (!rkResMgr.IsFileExist(stLODModelFileName.c_str()))
break;
CGraphicThing* pLODModelThing = (CGraphicThing *)rkResMgr.GetResourcePointer(stLODModelFileName.c_str());
if (!pLODModelThing)
break;
RegisterLODThing(0, pLODModelThing);
}
}
SetModelInstance(0, 0, 0);
const std::vector<CRaceData::SSkin>& c_rkVct_kSkin = pkShape->m_kVct_kSkin;
std::vector<CRaceData::SSkin>::const_iterator i;
for (i = c_rkVct_kSkin.begin(); i != c_rkVct_kSkin.end(); ++i)
{
const CRaceData::SSkin& c_rkSkinItem = *i;
CResource * pkRes = CResourceManager::Instance().GetResourcePointer(c_rkSkinItem.m_stDstFileName.c_str());
if (pkRes)
{
if (fSpecular > 0.0f)
{
SMaterialData kMaterialData;
kMaterialData.pImage = static_cast<CGraphicImage*>(pkRes);
kMaterialData.isSpecularEnable = TRUE;
kMaterialData.fSpecularPower = fSpecular;
kMaterialData.bSphereMapIndex = 0;
SetMaterialData(c_rkSkinItem.m_ePart, c_rkSkinItem.m_stSrcFileName.c_str(), kMaterialData);
}
else
{
SetMaterialImagePointer(c_rkSkinItem.m_ePart, c_rkSkinItem.m_stSrcFileName.c_str(), static_cast<CGraphicImage*>(pkRes));
}
}
}
}
else
{
if (pRaceData->IsTree())
{
__CreateTree(pRaceData->GetTreeFileName());
}
else
{
CGraphicThing* pModelThing = pRaceData->GetBaseModelThing();
RegisterModelThing(0, pModelThing);
CGraphicThing* pLODModelThing = pRaceData->GetLODModelThing();
RegisterLODThing(0, pLODModelThing);
SetModelInstance(0, 0, 0);
}
}
// Attaching Objects
for (DWORD i = 0; i < pRaceData->GetAttachingDataCount(); ++i)
{
const NRaceData::TAttachingData * c_pAttachingData;
if (!pRaceData->GetAttachingDataPointer(i, &c_pAttachingData))
continue;
switch (c_pAttachingData->dwType)
{
case NRaceData::ATTACHING_DATA_TYPE_EFFECT:
if (c_pAttachingData->isAttaching)
{
AttachEffectByName(0, c_pAttachingData->strAttachingBoneName.c_str(), c_pAttachingData->pEffectData->strFileName.c_str());
}
else
{
AttachEffectByName(0, 0, c_pAttachingData->pEffectData->strFileName.c_str());
}
break;
}
}
}
void CActorInstance::ChangeMaterial(const char * c_szFileName)
{
CRaceData * pRaceData;
if (!CRaceManager::Instance().GetRaceDataPointer(m_eRace, &pRaceData))
return;
CRaceData::SShape* pkShape=pRaceData->FindShape(m_eShape);
if (!pkShape)
return;
const std::vector<CRaceData::SSkin>& c_rkVct_kSkin = pkShape->m_kVct_kSkin;
if (c_rkVct_kSkin.empty())
return;
std::vector<CRaceData::SSkin>::const_iterator i = c_rkVct_kSkin.begin();
const CRaceData::SSkin& c_rkSkinItem = *i;
std::string dstFileName = "d:/ymir work/npc/guild_symbol/guild_symbol.dds";
dstFileName = c_szFileName;
CResource * pkRes = CResourceManager::Instance().GetResourcePointer(dstFileName.c_str());
if (!pkRes)
return;
SetMaterialImagePointer(c_rkSkinItem.m_ePart, c_rkSkinItem.m_stSrcFileName.c_str(), static_cast<CGraphicImage*>(pkRes));
}
/*
void CActorInstance::SetPart(DWORD dwPartIndex, DWORD dwItemID)
{
if (dwPartIndex>=CRaceData::PART_MAX_NUM)
return;
if (!m_pkCurRaceData)
{
assert(m_pkCurRaceData);
return;
}
CItemData * pItemData;
if (!CItemManager::Instance().GetItemDataPointer(dwItemID, &pItemData))
return;
RegisterModelThing(dwPartIndex, pItemData->GetModelThing());
for (DWORD i = 0; i < pItemData->GetLODModelThingCount(); ++i)
{
CGraphicThing * pThing;
if (!pItemData->GetLODModelThingPointer(i, &pThing))
continue;
RegisterLODThing(dwPartIndex, pThing);
}
SetModelInstance(dwPartIndex, dwPartIndex, 0);
m_adwPartItemID[dwPartIndex] = dwItemID;
}
*/
DWORD CActorInstance::GetPartItemID(DWORD dwPartIndex)
{
if (dwPartIndex>=CRaceData::PART_MAX_NUM)
{
TraceError("CActorInstance::GetPartIndex(dwPartIndex=%d/CRaceData::PART_MAX_NUM=%d)", dwPartIndex, CRaceData::PART_MAX_NUM);
return 0;
}
return m_adwPartItemID[dwPartIndex];
}
void CActorInstance::SetSpecularInfo(BOOL bEnable, int iPart, float fAlpha)
{
CRaceData * pkRaceData;
if (!CRaceManager::Instance().GetRaceDataPointer(m_eRace, &pkRaceData))
return;
CRaceData::SShape * pkShape = pkRaceData->FindShape(m_eShape);
if (pkShape->m_kVct_kSkin.empty())
return;
std::string filename = pkShape->m_kVct_kSkin[0].m_stSrcFileName.c_str();
CFileNameHelper::ChangeDosPath(filename);
CGraphicThingInstance::SetSpecularInfo(iPart, filename.c_str(), bEnable, fAlpha);
}
void CActorInstance::SetSpecularInfoForce(BOOL bEnable, int iPart, float fAlpha)
{
CGraphicThingInstance::SetSpecularInfo(iPart, NULL, bEnable, fAlpha);
}