1
This commit is contained in:
136
utils/common/map_shared.cpp
Normal file
136
utils/common/map_shared.cpp
Normal file
@ -0,0 +1,136 @@
|
||||
//========= 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;
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user