mirror of
https://github.com/yquake2/yquake2remaster.git
synced 2025-02-01 21:51:08 +00:00
maps: prevalidate lumps on load
This commit is contained in:
parent
d87b1b512d
commit
d58e1493e3
3 changed files with 105 additions and 1 deletions
|
@ -144,3 +144,94 @@ Mod_LoadPlanes(const char *name, cplane_t **planes, int *numplanes,
|
|||
out->signbits = bits;
|
||||
}
|
||||
}
|
||||
|
||||
static const size_t idbsplumps[HEADER_LUMPS] = {
|
||||
sizeof(char), // LUMP_ENTITIES
|
||||
sizeof(dplane_t), // LUMP_PLANES
|
||||
sizeof(dvertex_t), // LUMP_VERTEXES
|
||||
sizeof(char), // LUMP_VISIBILITY
|
||||
sizeof(dnode_t), // LUMP_NODES
|
||||
sizeof(texinfo_t), // LUMP_TEXINFO
|
||||
sizeof(dface_t), // LUMP_FACES
|
||||
sizeof(char), // LUMP_LIGHTING
|
||||
sizeof(dleaf_t), // LUMP_LEAFS
|
||||
sizeof(short), // LUMP_LEAFFACES
|
||||
sizeof(short), // LUMP_LEAFBRUSHES
|
||||
sizeof(dedge_t), // LUMP_EDGES
|
||||
sizeof(int), // LUMP_SURFEDGES
|
||||
sizeof(dmodel_t), // LUMP_MODELS
|
||||
sizeof(dbrush_t), // LUMP_BRUSHES
|
||||
sizeof(dbrushside_t), // LUMP_BRUSHSIDES
|
||||
0, // LUMP_POP
|
||||
sizeof(darea_t), // LUMP_AREAS
|
||||
sizeof(dareaportal_t), // LUMP_AREAPORTALS
|
||||
};
|
||||
|
||||
static const size_t qbsplumps[HEADER_LUMPS] = {
|
||||
sizeof(char), // LUMP_ENTITIES
|
||||
sizeof(dplane_t), // LUMP_PLANES
|
||||
sizeof(dvertex_t), // LUMP_VERTEXES
|
||||
sizeof(char), // LUMP_VISIBILITY
|
||||
sizeof(dqnode_t), // LUMP_NODES
|
||||
sizeof(texinfo_t), // LUMP_TEXINFO
|
||||
sizeof(dqface_t), // LUMP_FACES
|
||||
sizeof(char), // LUMP_LIGHTING
|
||||
sizeof(dqleaf_t), // LUMP_LEAFS
|
||||
sizeof(int), // LUMP_LEAFFACES
|
||||
sizeof(int), // LUMP_LEAFBRUSHES
|
||||
sizeof(dqedge_t), // LUMP_EDGES
|
||||
sizeof(int), // LUMP_SURFEDGES
|
||||
sizeof(dmodel_t), // LUMP_MODELS
|
||||
sizeof(dbrush_t), // LUMP_BRUSHES
|
||||
sizeof(dqbrushside_t), // LUMP_BRUSHSIDES
|
||||
0, // LUMP_POP
|
||||
sizeof(darea_t), // LUMP_AREAS
|
||||
sizeof(dareaportal_t), // LUMP_AREAPORTALS
|
||||
};
|
||||
|
||||
void
|
||||
Mod_LoadValidateLumps(const char *name, const dheader_t *header)
|
||||
{
|
||||
const size_t *rules = NULL;
|
||||
qboolean error = false;
|
||||
int s;
|
||||
|
||||
if (header->ident == IDBSPHEADER)
|
||||
{
|
||||
rules = idbsplumps;
|
||||
}
|
||||
else if (header->ident == QBSPHEADER)
|
||||
{
|
||||
rules = qbsplumps;
|
||||
}
|
||||
else
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
for (s = 0; s < HEADER_LUMPS; s++)
|
||||
{
|
||||
if (rules[s])
|
||||
{
|
||||
if (header->lumps[s].filelen % rules[s])
|
||||
{
|
||||
Com_Printf("%s: lump #%d: incorrect size %d / %zd\n",
|
||||
__func__, s, header->lumps[s].filelen, rules[s]);
|
||||
error = true;
|
||||
}
|
||||
#ifdef DEBUG
|
||||
else
|
||||
{
|
||||
Com_Printf("%s: lump #%d: correct size %d / %zd\n",
|
||||
__func__, s, header->lumps[s].filelen, rules[s]);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
if (error)
|
||||
{
|
||||
Com_Error(ERR_DROP, "%s: Map %s has incorrect lumps",
|
||||
__func__, name);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1955,7 +1955,17 @@ CM_LoadCachedMap(const char *name, model_t *mod)
|
|||
__func__, name, header.ident, IDBSPHEADER);
|
||||
}
|
||||
|
||||
if (header.version != BSPVERSION && header.version != BSPDKMVERSION)
|
||||
if ((header.ident == IDBSPHEADER) &&
|
||||
(header.version != BSPVERSION) &&
|
||||
(header.version != BSPDKMVERSION))
|
||||
{
|
||||
Com_Error(ERR_DROP,
|
||||
"%s: %s has wrong version number (%i should be %i)",
|
||||
__func__, name, header.version, BSPVERSION);
|
||||
}
|
||||
|
||||
if ((header.ident == QBSPHEADER) &&
|
||||
(header.version != BSPVERSION))
|
||||
{
|
||||
Com_Error(ERR_DROP,
|
||||
"%s: %s has wrong version number (%i should be %i)",
|
||||
|
@ -1970,6 +1980,8 @@ CM_LoadCachedMap(const char *name, model_t *mod)
|
|||
(header.ident >> 24) & 0xFF,
|
||||
header.version);
|
||||
|
||||
Mod_LoadValidateLumps(name, &header);
|
||||
|
||||
cmod_base = (byte *)buf;
|
||||
|
||||
/* load into heap */
|
||||
|
|
|
@ -44,5 +44,6 @@ extern void Mod_LoadVisibility(const char *name, dvis_t **vis, int *numvisibilit
|
|||
const byte *mod_base, const lump_t *l);
|
||||
extern void Mod_LoadPlanes(const char *name, cplane_t **planes, int *numplanes,
|
||||
const byte *mod_base, const lump_t *l);
|
||||
extern void Mod_LoadValidateLumps(const char *name, const dheader_t *header);
|
||||
|
||||
#endif
|
||||
|
|
Loading…
Reference in a new issue