Files
Sun1602/Tools/WiseClient/Information/Zone/MapWmoInfo.cpp
T
2022-10-26 12:25:11 +08:00

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;
}