@@ -514,16 +514,26 @@ static void CMod_LoadBrushSides(const byte *const cmod_base, const lump_t *l)
514514CMod_LoadEntityString
515515=================
516516*/
517- static void CMod_LoadEntityString (const byte *const cmod_base, const lump_t *l)
517+ static void CMod_LoadEntityString (const byte *const cmod_base, const lump_t *l, std::string &externalEntities )
518518{
519519 const char *p, *token;
520520 char keyname[ MAX_TOKEN_CHARS ];
521521 char value[ MAX_TOKEN_CHARS ];
522522
523- cm.entityString = ( char * ) CM_Alloc ( l->filelen + 1 );
524- cm.numEntityChars = l->filelen ;
525- memcpy ( cm.entityString , cmod_base + l->fileofs , l->filelen );
526- cm.entityString [l->filelen ] = ' \0 ' ;
523+ if ( externalEntities.empty () )
524+ {
525+ cm.entityString = ( char * ) CM_Alloc ( l->filelen + 1 );
526+ cm.numEntityChars = l->filelen ;
527+ memcpy ( cm.entityString , cmod_base + l->fileofs , l->filelen );
528+ cm.entityString [l->filelen ] = ' \0 ' ;
529+ }
530+ else
531+ {
532+ int len = externalEntities.length ();
533+ cm.entityString = ( char * ) CM_Alloc ( len + 1 );
534+ cm.numEntityChars = len;
535+ memcpy ( cm.entityString , externalEntities.c_str (), len + 1 );
536+ }
527537
528538 p = cm.entityString ;
529539
@@ -764,6 +774,17 @@ void CM_LoadMap(Str::StringRef name)
764774 Sys::Drop (" Could not load %s" , mapFile.c_str ());
765775 }
766776
777+ std::string externalEntities = FS::PakPath::ReadFile ( " maps/" + name + " .ent" , err );
778+ if ( err )
779+ {
780+ const std::error_code notFound ( Util::ordinal ( FS::filesystem_error::no_such_file ), FS::filesystem_category () );
781+ if ( err != notFound )
782+ {
783+ Sys::Drop ( " Could not read file 'maps/%s.ent': %s" , name.c_str (), err.message () );
784+ }
785+ externalEntities = " " ;
786+ }
787+
767788 // clear collision map data
768789 CM_ClearMap ();
769790
@@ -801,7 +822,7 @@ void CM_LoadMap(Str::StringRef name)
801822 CMod_LoadBrushes (cmod_base, &header.lumps [LUMP_BRUSHES]);
802823 CMod_LoadSubmodels (cmod_base, &header.lumps [LUMP_MODELS]);
803824 CMod_LoadNodes (cmod_base, &header.lumps [LUMP_NODES]);
804- CMod_LoadEntityString (cmod_base, &header.lumps [LUMP_ENTITIES]);
825+ CMod_LoadEntityString (cmod_base, &header.lumps [LUMP_ENTITIES], externalEntities );
805826 CMod_LoadVisibility (cmod_base, &header.lumps [LUMP_VISIBILITY]);
806827 CMod_LoadSurfaces (cmod_base,
807828 &header.lumps [LUMP_SURFACES], &header.lumps [LUMP_DRAWVERTS], &header.lumps [LUMP_DRAWINDEXES]);
0 commit comments