]> de.git.xonotic.org Git - xonotic/darkplaces.git/commitdiff
now supports missing models
authorhavoc <havoc@d7cf8633-e32d-0410-b094-e92efae38249>
Wed, 31 Mar 2004 01:08:50 +0000 (01:08 +0000)
committerhavoc <havoc@d7cf8633-e32d-0410-b094-e92efae38249>
Wed, 31 Mar 2004 01:08:50 +0000 (01:08 +0000)
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

model_shared.c
sv_main.c

index 3927458428f3d40517c3b49754e77a353f679132..1fb1102cbea40b71fbf79afbc7f6a161449b756d 100644 (file)
@@ -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;
index 4bd029285034556163168a49ce7ec4b6a1747ea7..259eff80c6bb260f70b0cff85817c8b97eeb92a6 100644 (file)
--- 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;
 
 //