You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
136 lines
3.0 KiB
136 lines
3.0 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: |
|
// |
|
// $NoKeywords: $ |
|
//=============================================================================// |
|
|
|
#include "map_shared.h" |
|
#include "bsplib.h" |
|
#include "cmdlib.h" |
|
|
|
|
|
CMapError g_MapError; |
|
int g_nMapFileVersion; |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
// Input : *szKey - |
|
// *szValue - |
|
// *pLoadEntity - |
|
// Output : ChunkFileResult_t |
|
//----------------------------------------------------------------------------- |
|
ChunkFileResult_t LoadEntityKeyCallback(const char *szKey, const char *szValue, LoadEntity_t *pLoadEntity) |
|
{ |
|
if (!stricmp(szKey, "classname")) |
|
{ |
|
if (!stricmp(szValue, "func_detail")) |
|
{ |
|
pLoadEntity->nBaseContents = CONTENTS_DETAIL; |
|
} |
|
else if (!stricmp(szValue, "func_ladder")) |
|
{ |
|
pLoadEntity->nBaseContents = CONTENTS_LADDER; |
|
} |
|
else if (!stricmp(szValue, "func_water")) |
|
{ |
|
pLoadEntity->nBaseContents = CONTENTS_WATER; |
|
} |
|
} |
|
else if (!stricmp(szKey, "id")) |
|
{ |
|
// UNDONE: flag entity errors by ID instead of index |
|
//g_MapError.EntityState( atoi( szValue ) ); |
|
// rename this field since DME code uses this name |
|
SetKeyValue( pLoadEntity->pEntity, "hammerid", szValue ); |
|
return(ChunkFile_Ok); |
|
} |
|
else if( !stricmp( szKey, "mapversion" ) ) |
|
{ |
|
// .vmf map revision number |
|
g_MapRevision = atoi( szValue ); |
|
SetKeyValue( pLoadEntity->pEntity, szKey, szValue ); |
|
return ( ChunkFile_Ok ); |
|
} |
|
|
|
SetKeyValue( pLoadEntity->pEntity, szKey, szValue ); |
|
|
|
return(ChunkFile_Ok); |
|
} |
|
|
|
|
|
static ChunkFileResult_t LoadEntityCallback( CChunkFile *pFile, int nParam ) |
|
{ |
|
if (num_entities == MAX_MAP_ENTITIES) |
|
{ |
|
// Exits. |
|
g_MapError.ReportError ("num_entities == MAX_MAP_ENTITIES"); |
|
} |
|
|
|
entity_t *mapent = &entities[num_entities]; |
|
num_entities++; |
|
memset(mapent, 0, sizeof(*mapent)); |
|
mapent->numbrushes = 0; |
|
|
|
LoadEntity_t LoadEntity; |
|
LoadEntity.pEntity = mapent; |
|
|
|
// No default flags/contents |
|
LoadEntity.nBaseFlags = 0; |
|
LoadEntity.nBaseContents = 0; |
|
|
|
// |
|
// Read the entity chunk. |
|
// |
|
ChunkFileResult_t eResult = pFile->ReadChunk((KeyHandler_t)LoadEntityKeyCallback, &LoadEntity); |
|
|
|
return eResult; |
|
} |
|
|
|
|
|
bool LoadEntsFromMapFile( char const *pFilename ) |
|
{ |
|
// |
|
// Dummy this up for the texture handling. This can be removed when old .MAP file |
|
// support is removed. |
|
// |
|
g_nMapFileVersion = 400; |
|
|
|
// |
|
// Open the file. |
|
// |
|
CChunkFile File; |
|
ChunkFileResult_t eResult = File.Open( pFilename, ChunkFile_Read ); |
|
|
|
if(eResult == ChunkFile_Ok) |
|
{ |
|
num_entities = 0; |
|
|
|
// |
|
// Set up handlers for the subchunks that we are interested in. |
|
// |
|
CChunkHandlerMap Handlers; |
|
Handlers.AddHandler("entity", (ChunkHandler_t)LoadEntityCallback, 0); |
|
|
|
File.PushHandlers(&Handlers); |
|
|
|
// |
|
// Read the sub-chunks. We ignore keys in the root of the file. |
|
// |
|
while (eResult == ChunkFile_Ok) |
|
{ |
|
eResult = File.ReadChunk(); |
|
} |
|
|
|
File.PopHandlers(); |
|
return true; |
|
} |
|
else |
|
{ |
|
Error("Error in LoadEntsFromMapFile (in-memory file): %s.\n", File.GetErrorText(eResult)); |
|
return false; |
|
} |
|
} |
|
|
|
|
|
|