X-Git-Url: https://git.xonotic.org/?a=blobdiff_plain;f=cl_main.c;h=0963ce99472df0b2a3a549853465e5a9f846f503;hb=3d642b0313d856c3cfcafe50205ab81dbed24cab;hp=b6c293c0e525bb58c678ea2b30026e7c6a7c1e34;hpb=39c4fcd8bfa6a68277054d79062446cf2156c14a;p=xonotic%2Fdarkplaces.git diff --git a/cl_main.c b/cl_main.c index b6c293c0..0963ce99 100644 --- a/cl_main.c +++ b/cl_main.c @@ -122,7 +122,7 @@ void CL_ClearState(void) cl.sensitivityscale = 1.0f; // enable rendering of the world and such - cl.csqc_vidvars.drawworld = r_drawworld.integer; + cl.csqc_vidvars.drawworld = r_drawworld.integer != 0; cl.csqc_vidvars.drawenginesbar = true; cl.csqc_vidvars.drawcrosshair = true; @@ -171,7 +171,7 @@ void CL_ClearState(void) cl.entities[i].state_current = defaultstate; } - if (gamemode == GAME_NEXUIZ) + if (gamemode == GAME_NEXUIZ || gamemode == GAME_XONOTIC) { VectorSet(cl.playerstandmins, -16, -16, -24); VectorSet(cl.playerstandmaxs, 16, 16, 45); @@ -297,6 +297,7 @@ void CL_ExpandEntities(int num) void CL_ExpandCSQCRenderEntities(int num) { + int i; int oldmaxcsqcrenderentities; entity_render_t *oldcsqcrenderentities; if (num >= cl.max_csqcrenderentities) @@ -310,6 +311,9 @@ void CL_ExpandCSQCRenderEntities(int num) if (oldcsqcrenderentities) { memcpy(cl.csqcrenderentities, oldcsqcrenderentities, oldmaxcsqcrenderentities * sizeof(entity_render_t)); + for (i = 0;i < r_refdef.scene.numentities;i++) + if(r_refdef.scene.entities[i] >= oldcsqcrenderentities && r_refdef.scene.entities[i] < (oldcsqcrenderentities + oldmaxcsqcrenderentities)) + r_refdef.scene.entities[i] = cl.csqcrenderentities + (r_refdef.scene.entities[i] - oldcsqcrenderentities); Mem_Free(oldcsqcrenderentities); } } @@ -407,7 +411,7 @@ CL_EstablishConnection Host should be either "local" or a net address ===================== */ -void CL_EstablishConnection(const char *host) +void CL_EstablishConnection(const char *host, int firstarg) { if (cls.state == ca_dedicated) return; @@ -434,7 +438,24 @@ void CL_EstablishConnection(const char *host) cls.connect_trying = true; cls.connect_remainingtries = 3; cls.connect_nextsendtime = 0; + + // only NOW, set connect_userinfo + if(firstarg >= 0) + { + int i; + *cls.connect_userinfo = 0; + for(i = firstarg; i+2 <= Cmd_Argc(); i += 2) + InfoString_SetValue(cls.connect_userinfo, sizeof(cls.connect_userinfo), Cmd_Argv(i), Cmd_Argv(i+1)); + } + else if(firstarg < -1) + { + // -1: keep as is (reconnect) + // -2: clear + *cls.connect_userinfo = 0; + } + M_Update_Return_Reason("Trying to connect..."); + // run several network frames to jump into the game quickly //if (sv.active) //{ @@ -905,6 +926,7 @@ void CL_UpdateNetworkEntity(entity_t *e, int recursionlimit, qboolean interpolat int frame; float origin[3], angles[3], lerp; entity_t *t; + entity_render_t *r; //entity_persistent_t *p = &e->persistent; //entity_render_t *r = &e->render; // skip inactive entities and world @@ -937,22 +959,33 @@ void CL_UpdateNetworkEntity(entity_t *e, int recursionlimit, qboolean interpolat return; t = cl.entities + e->state_current.tagentity; // if the tag entity is inactive, skip it - if (!t->state_current.active) - return; - // update the parent first - CL_UpdateNetworkEntity(t, recursionlimit - 1, interpolate); + if (t->state_current.active) + { + // update the parent first + CL_UpdateNetworkEntity(t, recursionlimit - 1, interpolate); + r = &t->render; + } + else + { + // it may still be a CSQC entity... trying to use its + // info from last render frame (better than nothing) + if(!cl.csqc_server2csqcentitynumber[e->state_current.tagentity]) + return; + r = cl.csqcrenderentities + cl.csqc_server2csqcentitynumber[e->state_current.tagentity]; + if(!r->entitynumber) + return; // neither CSQC nor legacy entity... can't attach + } // make relative to the entity - matrix = &t->render.matrix; + matrix = &r->matrix; // some properties of the tag entity carry over - e->render.flags |= t->render.flags & (RENDER_EXTERIORMODEL | RENDER_VIEWMODEL); + e->render.flags |= r->flags & (RENDER_EXTERIORMODEL | RENDER_VIEWMODEL); // if a valid tagindex is used, make it relative to that tag instead - // FIXME: use a model function to get tag info (need to handle skeletal) - if (e->state_current.tagentity && e->state_current.tagindex >= 1 && t->render.model) + if (e->state_current.tagentity && e->state_current.tagindex >= 1 && r->model) { - if(!Mod_Alias_GetTagMatrix(t->render.model, t->render.frameblend, t->render.skeleton, e->state_current.tagindex - 1, &blendmatrix)) // i.e. no error + if(!Mod_Alias_GetTagMatrix(r->model, r->frameblend, r->skeleton, e->state_current.tagindex - 1, &blendmatrix)) // i.e. no error { // concat the tag matrices onto the entity matrix - Matrix4x4_Concat(&tempmatrix, &t->render.matrix, &blendmatrix); + Matrix4x4_Concat(&tempmatrix, &r->matrix, &blendmatrix); // use the constructed tag matrix matrix = &tempmatrix; } @@ -1159,15 +1192,15 @@ void CL_UpdateNetworkEntityTrail(entity_t *e) { if (e->render.effects & EF_BRIGHTFIELD) { - if (gamemode == GAME_NEXUIZ) + if (gamemode == GAME_NEXUIZ || gamemode == GAME_XONOTIC) trailtype = EFFECT_TR_NEXUIZPLASMA; else CL_EntityParticles(e); } if (e->render.effects & EF_FLAME) - CL_ParticleTrail(EFFECT_EF_FLAME, bound(0, cl.time - cl.oldtime, 0.1), origin, origin, vec3_origin, vec3_origin, NULL, 0, false, true); + CL_ParticleTrail(EFFECT_EF_FLAME, bound(0, cl.time - cl.oldtime, 0.1), origin, origin, vec3_origin, vec3_origin, NULL, 0, false, true, NULL, NULL); if (e->render.effects & EF_STARDUST) - CL_ParticleTrail(EFFECT_EF_STARDUST, bound(0, cl.time - cl.oldtime, 0.1), origin, origin, vec3_origin, vec3_origin, NULL, 0, false, true); + CL_ParticleTrail(EFFECT_EF_STARDUST, bound(0, cl.time - cl.oldtime, 0.1), origin, origin, vec3_origin, vec3_origin, NULL, 0, false, true, NULL, NULL); } if (e->render.internaleffects & (INTEF_FLAG1QW | INTEF_FLAG2QW)) { @@ -1211,7 +1244,7 @@ void CL_UpdateNetworkEntityTrail(entity_t *e) if (len > 0) len = 1.0f / len; VectorScale(vel, len, vel); - CL_ParticleTrail(trailtype, 1, e->persistent.trail_origin, origin, vel, vel, e, e->state_current.glowcolor, false, true); + CL_ParticleTrail(trailtype, 1, e->persistent.trail_origin, origin, vel, vel, e, e->state_current.glowcolor, false, true, NULL, NULL); } // now that the entity has survived one trail update it is allowed to // leave a real trail on later frames @@ -1355,7 +1388,13 @@ void CL_LinkNetworkEntity(entity_t *e) return; // if the tag entity is inactive, skip it if (!cl.entities[e->state_current.tagentity].state_current.active) - return; + { + if(!cl.csqc_server2csqcentitynumber[e->state_current.tagentity]) + return; + if(!cl.csqcrenderentities[cl.csqc_server2csqcentitynumber[e->state_current.tagentity]].entitynumber) + return; + // if we get here, it's properly csqc networked and attached + } } // create entity dlights associated with this entity @@ -1378,7 +1417,7 @@ void CL_LinkNetworkEntity(entity_t *e) { if (e->render.effects & EF_BRIGHTFIELD) { - if (gamemode == GAME_NEXUIZ) + if (gamemode == GAME_NEXUIZ || gamemode == GAME_XONOTIC) trailtype = EFFECT_TR_NEXUIZPLASMA; } if (e->render.effects & EF_DIMLIGHT) @@ -1411,9 +1450,9 @@ void CL_LinkNetworkEntity(entity_t *e) dlightcolor[2] += 1.50f; } if (e->render.effects & EF_FLAME) - CL_ParticleTrail(EFFECT_EF_FLAME, 0, origin, origin, vec3_origin, vec3_origin, NULL, 0, true, false); + CL_ParticleTrail(EFFECT_EF_FLAME, 1, origin, origin, vec3_origin, vec3_origin, NULL, 0, true, false, NULL, NULL); if (e->render.effects & EF_STARDUST) - CL_ParticleTrail(EFFECT_EF_STARDUST, 0, origin, origin, vec3_origin, vec3_origin, NULL, 0, true, false); + CL_ParticleTrail(EFFECT_EF_STARDUST, 1, origin, origin, vec3_origin, vec3_origin, NULL, 0, true, false, NULL, NULL); } // muzzleflash fades over time, and is offset a bit if (e->persistent.muzzleflash > 0 && r_refdef.scene.numlights < MAX_DLIGHTS) @@ -1423,7 +1462,7 @@ void CL_LinkNetworkEntity(entity_t *e) trace_t trace; matrix4x4_t tempmatrix; Matrix4x4_Transform(&e->render.matrix, muzzleflashorigin, v2); - trace = CL_TraceLine(origin, v2, MOVE_NOMONSTERS, NULL, SUPERCONTENTS_SOLID | SUPERCONTENTS_SKY, true, false, NULL, false); + trace = CL_TraceLine(origin, v2, MOVE_NOMONSTERS, NULL, SUPERCONTENTS_SOLID | SUPERCONTENTS_SKY, true, false, NULL, false, false); Matrix4x4_Normalize(&tempmatrix, &e->render.matrix); Matrix4x4_SetOrigin(&tempmatrix, trace.endpos[0], trace.endpos[1], trace.endpos[2]); Matrix4x4_Scale(&tempmatrix, 150, 1); @@ -1493,7 +1532,7 @@ void CL_LinkNetworkEntity(entity_t *e) if (e->render.flags & RENDER_GLOWTRAIL) trailtype = EFFECT_TR_GLOWTRAIL; if (trailtype) - CL_ParticleTrail(trailtype, 0, origin, origin, vec3_origin, vec3_origin, NULL, e->state_current.glowcolor, true, false); + CL_ParticleTrail(trailtype, 1, origin, origin, vec3_origin, vec3_origin, NULL, e->state_current.glowcolor, true, false, NULL, NULL); // don't show entities with no modelindex (note: this still shows // entities which have a modelindex that resolved to a NULL model) @@ -2106,8 +2145,7 @@ void CL_Locs_Save_f(void) Con_Printf("No level loaded!\n"); return; } - FS_StripExtension(cl.worldmodel->name, locfilename, sizeof(locfilename)); - strlcat(locfilename, ".loc", sizeof(locfilename)); + dpsnprintf(locfilename, sizeof(locfilename), "%s.loc", cl.worldnamenoextension); outfile = FS_OpenRealFile(locfilename, "w", false); if (!outfile) @@ -2184,14 +2222,12 @@ void CL_Locs_Reload_f(void) CL_Locs_Clear_f(); // try maps/something.loc first (LordHavoc: where I think they should be) - FS_StripExtension(cl.worldmodel->name, locfilename, sizeof(locfilename)); - strlcat(locfilename, ".loc", sizeof(locfilename)); + dpsnprintf(locfilename, sizeof(locfilename), "%s.loc", cl.worldnamenoextension); filedata = (char *)FS_LoadFile(locfilename, cls.levelmempool, false, &filesize); if (!filedata) { // try proquake name as well (LordHavoc: I hate path mangling) - FS_StripExtension(va("locs/%s", FS_FileWithoutPath(cl.worldmodel->name)), locfilename, sizeof(locfilename)); - strlcat(locfilename, ".loc", sizeof(locfilename)); + dpsnprintf(locfilename, sizeof(locfilename), "locs/%s.loc", cl.worldbasename); filedata = (char *)FS_LoadFile(locfilename, cls.levelmempool, false, &filesize); if (!filedata) return;