141 lines
3.4 KiB
C++
141 lines
3.4 KiB
C++
#include "stdafx.h"
|
|
#include "MapWmoInfo.h"
|
|
//
|
|
#include <MapInfoParser.h>
|
|
|
|
#include <io.h>
|
|
|
|
BOOL MapWmoInfo::Create(CWzArchive& archive, FIELDCODE fcWMO)
|
|
{
|
|
m_fcCODE = fcWMO;
|
|
|
|
MapInfoParser* pPARSER = MapInfoParser::Instance();
|
|
const sWMOINFO* pWMOINFO = pPARSER->FindWMOInfo(m_fcCODE);
|
|
if(!pWMOINFO)
|
|
return FALSE;
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
// <WMO EXTRA EREA>
|
|
|
|
BOOL bRET = FALSE;
|
|
|
|
CDiscAccess cda;
|
|
cda.Create();
|
|
archive.SetDiscAccess(&cda);
|
|
|
|
if(_access(pWMOINFO->pszPath, 0) < 0)
|
|
{
|
|
//SUNLOG(eCRITICAL_LOG, "[_LoadMapObjectInfo] Failed : %s file is not Exist", pszFilePath);
|
|
goto CLOSURE_MARK;
|
|
}
|
|
|
|
if(!archive.LoadFile((CHAR*)pWMOINFO->pszPath))
|
|
{
|
|
goto CLOSURE_MARK;
|
|
}
|
|
|
|
WORD wVersion = 0;
|
|
archive.Seek(4, SO_CURRENT);
|
|
archive >> wVersion;
|
|
archive.Seek(-6, SO_CURRENT);
|
|
archive.SetVersion(wVersion);
|
|
/*
|
|
{
|
|
BOOL bAreaChunk = FALSE;
|
|
while( TRUE )
|
|
{
|
|
St_ChunkInfo ci = archive.ReadChunk();
|
|
if( ci.m_nID == 0x1792 )
|
|
{
|
|
bAreaChunk = TRUE;
|
|
break;
|
|
}
|
|
archive.SkipCurrentChunk(ci);
|
|
}
|
|
ASSERT( TRUE == bAreaChunk );
|
|
};
|
|
|
|
St_LHFileHeader stLHFH;
|
|
if(170 < archive.GetVersion())
|
|
{
|
|
archive.Read(&stLHFH.wSecondVersion, sizeof(WORD));
|
|
archive.Read(&stLHFH.dwCheckSum, sizeof(DWORD));
|
|
//SUNLOG(eDEV_LOG, "Second Ver[%u] and CheckSum[%u]", fhInfo.wSecondVersion, fhInfo.dwCheckSum);
|
|
}
|
|
|
|
|
|
EIWORLDBASE()->SerializeExtraAreaInfo(&archive, TRUE);
|
|
|
|
if(! (bRET = _Load_WMO_MAPOBJECT(archive)))
|
|
goto CLOSURE_MARK;
|
|
|
|
if(! (bRET = _Load_WMO_TRIGGER(archive)))
|
|
goto CLOSURE_MARK;
|
|
*/
|
|
bRET = TRUE;
|
|
|
|
CLOSURE_MARK:
|
|
archive.Close();
|
|
|
|
return bRET;
|
|
}
|
|
|
|
BOOL MapWmoInfo::_Load_WMO_MAPOBJECT(CWzArchive& archive)
|
|
{
|
|
//////////////////////////////////////////////////////////////////////////
|
|
// <MAP OBJECT>
|
|
CLoadHelper* pLoadHelper = (EIWORLDBASE()->x_pLoadHelper);
|
|
pLoadHelper->LoadObj(&archive);
|
|
|
|
//오브 젝트 리스트 로딩
|
|
DWORD dwCount = pLoadHelper->GetObjectCount();
|
|
St_LHObject* pLHObject = pLoadHelper->GetObject();
|
|
static DWORD dwObjTotalCount = 0;
|
|
ObjectPoolRouter* pROUTER = ObjectPoolRouter::Instance();
|
|
//ASSERT(count < (ITEM_OBJECT_KEY - MAP_OBJECT_KEY)); //< 키가 5만개 이하여야 한다.
|
|
for(DWORD dwIdx=0 ; dwIdx<dwCount ; ++dwIdx)
|
|
{
|
|
St_LHObject* pOffObj = &pLHObject[dwIdx];
|
|
sMAPOBJECT_INFO* pOBJECT = (sMAPOBJECT_INFO*)pROUTER->Alloc(OBJTYPE_MAPOBJECT_INFO);
|
|
////
|
|
// WzID wzId;
|
|
// DWORD dwAttribute;
|
|
// WzVector wvPos;
|
|
// WzVector wzScale;
|
|
// WzVector wzRot;
|
|
// WzBoundingVolume wzBV;
|
|
// DWORD dwExtraInfos[eMAPOBJECT_MAX];
|
|
|
|
pOBJECT->dwMapObjectID = dwIdx; // MAP_OBJECT_KEY +
|
|
pOBJECT->wzId = pOffObj->m_WzID;
|
|
pOBJECT->dwAttribute = pOffObj->m_dwAttribute;
|
|
pOBJECT->wvPos = pOffObj->m_wvPos;
|
|
pOBJECT->wzScale = pOffObj->m_wvScale;
|
|
pOBJECT->wzRot = pOffObj->m_wvRot;
|
|
pOBJECT->wzBV = pOffObj->m_wzBV;
|
|
|
|
//// 추가 데이터 설정 (설정값들)
|
|
// eMAPOBJECT_TYPE
|
|
// eMAPOBJECT_MONSTER
|
|
// eMAPOBJECT_USE_ALPHA
|
|
// eMAPOBJECT_RESERVED2
|
|
CopyMemory(pOBJECT->dwExtraInfos, pOffObj->m_dwParam, sizeof(pOBJECT->dwExtraInfos));
|
|
m_MapObjHash.insert(make_pair(dwIdx, pOBJECT));
|
|
|
|
++dwObjTotalCount;
|
|
}
|
|
|
|
pLoadHelper->DeleteObject();
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL MapWmoInfo::_Load_WMO_TRIGGER(CWzArchive& archive)
|
|
{
|
|
m_TriggerInfoManager.LoadGroupInfos(archive);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|