From: havoc Date: Wed, 31 Mar 2004 01:08:50 +0000 (+0000) Subject: now supports missing models X-Git-Tag: xonotic-v0.1.0preview~5955 X-Git-Url: https://de.git.xonotic.org/?a=commitdiff_plain;h=e0470c8007dd30d87a142457f82ae37675104f31;p=xonotic%2Fdarkplaces.git now supports missing models trying to load a non-existent map no longer kills the server git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@4063 d7cf8633-e32d-0410-b094-e92efae38249 --- diff --git a/model_shared.c b/model_shared.c index 39274584..1fb1102c 100644 --- a/model_shared.c +++ b/model_shared.c @@ -260,75 +260,69 @@ static model_t *Mod_LoadModel(model_t *mod, qboolean crash, qboolean checkdisk, crc = 0; buf = NULL; - if (!mod->needload) + if (mod->isworldmodel != isworldmodel) + mod->needload = true; + if (mod->needload || checkdisk) { - if (checkdisk) + if (checkdisk && !mod->needload) + Con_DPrintf("checking model %s\n", mod->name); + buf = FS_LoadFile (mod->name, tempmempool, false); + if (buf) { - buf = FS_LoadFile (mod->name, tempmempool, false); - if (!buf) - { - if (crash) - Host_Error ("Mod_LoadModel: %s not found", mod->name); // LordHavoc: Sys_Error was *ANNOYING* - return NULL; - } - crc = CRC_Block(buf, fs_filesize); - } - else - crc = mod->crc; - - if (mod->crc == crc && mod->isworldmodel == isworldmodel) - { - if (buf) - Mem_Free(buf); - return mod; // already loaded + if (mod->crc != crc) + mod->needload = true; } } + if (!mod->needload) + return mod; // already loaded Con_DPrintf("loading model %s\n", mod->name); - - if (!buf) - { - buf = FS_LoadFile (mod->name, tempmempool, false); - if (!buf) - { - if (crash) - Host_Error ("Mod_LoadModel: %s not found", mod->name); - return NULL; - } - crc = CRC_Block(buf, fs_filesize); - } - - // allocate a new model - loadmodel = mod; - // LordHavoc: unload the existing model in this slot (if there is one) Mod_UnloadModel(mod); + // load the model mod->isworldmodel = isworldmodel; mod->used = true; mod->crc = crc; // errors can prevent the corresponding mod->needload = false; mod->needload = true; + // default model radius and bounding box (mainly for missing models) + mod->radius = 16; + VectorSet(mod->normalmins, -mod->radius, -mod->radius, -mod->radius); + VectorSet(mod->normalmaxs, mod->radius, mod->radius, mod->radius); + VectorSet(mod->yawmins, -mod->radius, -mod->radius, -mod->radius); + VectorSet(mod->yawmaxs, mod->radius, mod->radius, mod->radius); + VectorSet(mod->rotatedmins, -mod->radius, -mod->radius, -mod->radius); + VectorSet(mod->rotatedmaxs, mod->radius, mod->radius, mod->radius); + // all models use memory, so allocate a memory pool mod->mempool = Mem_AllocPool(mod->name); // all models load textures, so allocate a texture pool if (cls.state != ca_dedicated) mod->texturepool = R_AllocTexturePool(); - // call the apropriate loader - num = LittleLong(*((int *)buf)); - if (!memcmp(buf, "IDPO", 4)) Mod_IDP0_Load(mod, buf); - else if (!memcmp(buf, "IDP2", 4)) Mod_IDP2_Load(mod, buf); - else if (!memcmp(buf, "IDP3", 4)) Mod_IDP3_Load(mod, buf); - else if (!memcmp(buf, "IDSP", 4)) Mod_IDSP_Load(mod, buf); - else if (!memcmp(buf, "IBSP", 4)) Mod_IBSP_Load(mod, buf); - else if (!memcmp(buf, "ZYMOTICMODEL", 12)) Mod_ZYMOTICMODEL_Load(mod, buf); - else if (strlen(mod->name) >= 4 && !strcmp(mod->name - 4, ".map")) Mod_MAP_Load(mod, buf); - else if (num == BSPVERSION || num == 30) Mod_Q1BSP_Load(mod, buf); - else Host_Error("Mod_LoadModel: model \"%s\" is of unknown/unsupported type\n", mod->name); - - Mem_Free(buf); + if (buf) + { + num = LittleLong(*((int *)buf)); + // call the apropriate loader + loadmodel = mod; + if (!memcmp(buf, "IDPO", 4)) Mod_IDP0_Load(mod, buf); + else if (!memcmp(buf, "IDP2", 4)) Mod_IDP2_Load(mod, buf); + else if (!memcmp(buf, "IDP3", 4)) Mod_IDP3_Load(mod, buf); + else if (!memcmp(buf, "IDSP", 4)) Mod_IDSP_Load(mod, buf); + else if (!memcmp(buf, "IBSP", 4)) Mod_IBSP_Load(mod, buf); + else if (!memcmp(buf, "ZYMOTICMODEL", 12)) Mod_ZYMOTICMODEL_Load(mod, buf); + else if (strlen(mod->name) >= 4 && !strcmp(mod->name - 4, ".map")) Mod_MAP_Load(mod, buf); + else if (num == BSPVERSION || num == 30) Mod_Q1BSP_Load(mod, buf); + else Host_Error("Mod_LoadModel: model \"%s\" is of unknown/unsupported type\n", mod->name); + Mem_Free(buf); + } + else if (crash) + { + // LordHavoc: Sys_Error was *ANNOYING* + Con_Printf ("Mod_LoadModel: %s not found", mod->name); + } // no errors occurred mod->needload = false; diff --git a/sv_main.c b/sv_main.c index 4bd02928..259eff80 100644 --- a/sv_main.c +++ b/sv_main.c @@ -1791,13 +1791,24 @@ void SV_SpawnServer (const char *server) edict_t *ent; int i; qbyte *entities; + model_t *worldmodel; + char modelname[sizeof(sv.modelname)]; + + Con_DPrintf("SpawnServer: %s\n", server); + + snprintf (modelname, sizeof(modelname), "maps/%s.bsp", server); + worldmodel = Mod_ForName(modelname, false, true, true); + if (!worldmodel || !worldmodel->TraceBox) + { + Con_Printf("Couldn't load map %s\n", modelname); + return; + } // let's not have any servers with no name if (hostname.string[0] == 0) Cvar_Set ("hostname", "UNNAMED"); scr_centertime_off = 0; - Con_DPrintf("SpawnServer: %s\n",server); svs.changelevel_issued = false; // now safe to issue another // @@ -1876,16 +1887,11 @@ void SV_SpawnServer (const char *server) sv.time = 1.0; Mod_ClearUsed(); + worldmodel->used = true; strlcpy (sv.name, server, sizeof (sv.name)); - snprintf (sv.modelname, sizeof (sv.modelname), "maps/%s.bsp", server); - sv.worldmodel = Mod_ForName(sv.modelname, false, true, true); - if (!sv.worldmodel) - { - Con_Printf("Couldn't spawn server %s\n", sv.modelname); - sv.active = false; - return; - } + strcpy(sv.modelname, modelname); + sv.worldmodel = worldmodel; sv.models[1] = sv.worldmodel; //