memset(cl_effect, 0, sizeof(cl_effect));
CL_Screen_NewMap();
CL_Particles_Clear();
- CL_Decals_Clear();
// LordHavoc: have to set up the baseline info for alpha and other stuff
for (i = 0;i < MAX_EDICTS;i++)
{
NET_SendUnreliableMessage (cls.netcon, &cls.message);
SZ_Clear (&cls.message);
NET_Close (cls.netcon);
+ cls.state = ca_disconnected; // prevent this code from executing again during Host_ShutdownServer
// if running a local server, shut it down
if (sv.active)
Host_ShutdownServer(false);
cls.demonum = -1; // not in the demo loop now
cls.state = ca_connected;
cls.signon = 0; // need all the signon messages before playing
+
+ CL_ClearState ();
}
/*
*/
static float CL_LerpPoint (void)
{
- float f, frac;
+ float f;
- f = cl.mtime[0] - cl.mtime[1];
+ // dropped packet, or start of demo
+ if (cl.mtime[1] < cl.mtime[0] - 0.1)
+ cl.mtime[1] = cl.mtime[0] - 0.1;
+
+ cl.time = bound(cl.mtime[1], cl.time, cl.mtime[0]);
// LordHavoc: lerp in listen games as the server is being capped below the client (usually)
+ f = cl.mtime[0] - cl.mtime[1];
if (!f || cl_nolerp.integer || cls.timedemo || (sv.active && svs.maxclients == 1))
{
cl.time = cl.mtime[0];
return 1;
}
- if (f > 0.1)
- { // dropped packet, or start of demo
- cl.mtime[1] = cl.mtime[0] - 0.1;
- f = 0.1;
- }
- frac = (cl.time - cl.mtime[1]) / f;
-// Con_Printf ("frac: %f\n",frac);
- if (frac < 0)
- {
- if (frac < -0.01)
- {
- cl.time = cl.mtime[1];
-// Con_Printf ("low frac\n");
- }
- frac = 0;
- }
- else if (frac > 1)
- {
- if (frac > 1.01)
- {
- cl.time = cl.mtime[0];
-// Con_Printf ("high frac\n");
- }
- frac = 1;
- }
-
- return frac;
+ f = (cl.time - cl.mtime[1]) / f;
+ return bound(0, f, 1);
}
static void CL_RelinkStaticEntities(void)
else
bobjoffset = 0;
- CL_RelinkStaticEntities();
-
// start on the entity after the world
for (i = 1, ent = cl_entities + 1;i < MAX_EDICTS /*cl.num_entities*/;i++, ent++)
{
{
vec3_t mins, maxs;
int temp;
+ /*
if (ent->render.angles[0] || ent->render.angles[2])
{
- VectorAdd(neworg, ent->render.model->rotatedmins, mins);
- VectorAdd(neworg, ent->render.model->rotatedmaxs, maxs);
+ VectorMA(neworg, 0.25f, ent->render.model->rotatedmins, mins);
+ VectorMA(neworg, 0.25f, ent->render.model->rotatedmaxs, maxs);
}
else if (ent->render.angles[1])
{
- VectorAdd(neworg, ent->render.model->yawmins, mins);
- VectorAdd(neworg, ent->render.model->yawmaxs, maxs);
+ VectorMA(neworg, 0.25f, ent->render.model->yawmins, mins);
+ VectorMA(neworg, 0.25f, ent->render.model->yawmaxs, maxs);
}
else
{
- VectorAdd(neworg, ent->render.model->normalmins, mins);
- VectorAdd(neworg, ent->render.model->normalmaxs, maxs);
+ VectorMA(neworg, 0.25f, ent->render.model->normalmins, mins);
+ VectorMA(neworg, 0.25f, ent->render.model->normalmaxs, maxs);
}
+ */
+ mins[0] = neworg[0] - 16.0f;
+ mins[1] = neworg[1] - 16.0f;
+ mins[2] = neworg[2] - 16.0f;
+ maxs[0] = neworg[0] + 16.0f;
+ maxs[1] = neworg[1] + 16.0f;
+ maxs[2] = neworg[2] + 16.0f;
// how many flames to make
temp = (int) (cl.time * 300) - (int) (cl.oldtime * 300);
CL_FlameCube(mins, maxs, temp);
dlightcolor[1] += d * 0.7f;
dlightcolor[2] += d * 0.3f;
}
+ if (effects & EF_STARDUST)
+ {
+ if (ent->render.model)
+ {
+ vec3_t mins, maxs;
+ int temp;
+ /*
+ if (ent->render.angles[0] || ent->render.angles[2])
+ {
+ VectorMA(neworg, 0.25f, ent->render.model->rotatedmins, mins);
+ VectorMA(neworg, 0.25f, ent->render.model->rotatedmaxs, maxs);
+ }
+ else if (ent->render.angles[1])
+ {
+ VectorMA(neworg, 0.25f, ent->render.model->yawmins, mins);
+ VectorMA(neworg, 0.25f, ent->render.model->yawmaxs, maxs);
+ }
+ else
+ {
+ VectorMA(neworg, 0.25f, ent->render.model->normalmins, mins);
+ VectorMA(neworg, 0.25f, ent->render.model->normalmaxs, maxs);
+ }
+ */
+ mins[0] = neworg[0] - 16.0f;
+ mins[1] = neworg[1] - 16.0f;
+ mins[2] = neworg[2] - 16.0f;
+ maxs[0] = neworg[0] + 16.0f;
+ maxs[1] = neworg[1] + 16.0f;
+ maxs[2] = neworg[2] + 16.0f;
+ // how many particles to make
+ temp = (int) (cl.time * 200) - (int) (cl.oldtime * 200);
+ CL_Stardust(mins, maxs, temp);
+ }
+ d = 100;
+ dlightcolor[0] += d * 1.0f;
+ dlightcolor[1] += d * 0.7f;
+ dlightcolor[2] += d * 0.3f;
+ }
}
// LordHavoc: if the model has no flags, don't check each
else if (ent->render.model->flags & EF_ROCKET)
{
CL_RocketTrail (oldorg, ent->render.origin, 0, ent);
- // LordHavoc: changed from 200, 160, 80 to 250, 200, 100
- dlightcolor[0] += 250.0f;
- dlightcolor[1] += 200.0f;
- dlightcolor[2] += 100.0f;
+ dlightcolor[0] += 200.0f;
+ dlightcolor[1] += 160.0f;
+ dlightcolor[2] += 80.0f;
}
else if (ent->render.model->flags & EF_GRENADE)
{
}
}
// LordHavoc: customizable glow
- glowsize = ent->state_current.glowsize * 4.0f; // FIXME: interpolate?
+ glowsize = ent->state_current.glowsize; // FIXME: interpolate?
glowcolor = ent->state_current.glowcolor;
if (glowsize)
{
- byte *tempcolor = (byte *)&d_8to24table[glowcolor];
- dlightcolor[0] += glowsize * tempcolor[0] * (1.0f / 255.0f);
- dlightcolor[1] += glowsize * tempcolor[1] * (1.0f / 255.0f);
- dlightcolor[2] += glowsize * tempcolor[2] * (1.0f / 255.0f);
+ qbyte *tempcolor = (qbyte *)&d_8to24table[glowcolor];
+ // * 4 for the expansion from 0-255 to 0-1023 range,
+ // / 255 to scale down byte colors
+ glowsize *= (4.0f / 255.0f);
+ VectorMA(dlightcolor, glowsize, tempcolor, dlightcolor);
}
// LordHavoc: customizable trail
if (ent->render.flags & RENDER_GLOWTRAIL)
if (dlightcolor[0] || dlightcolor[1] || dlightcolor[2])
{
vec3_t vec;
- dlightradius = VectorLength(dlightcolor);
- d = 1.0f / dlightradius;
VectorCopy(neworg, vec);
// hack to make glowing player light shine on their gun
if (i == cl.viewentity && !chase_active.integer)
vec[2] += 30;
- CL_AllocDlight (/*&ent->render*/ NULL, vec, dlightradius, dlightcolor[0] * d, dlightcolor[1] * d, dlightcolor[2] * d, 0, 0);
+ CL_AllocDlight (/*&ent->render*/ NULL, vec, 1, dlightcolor[0], dlightcolor[1], dlightcolor[2], 0, 0);
}
if (chase_active.integer)
}
}
-static void CL_LerpPlayerVelocity (void)
+void CL_LerpPlayer(float frac)
{
int i;
- float frac, d;
+ float d;
- // fraction from previous network update to current
- frac = CL_LerpPoint ();
+ if (cl.entitydatabase.numframes)
+ {
+ cl.viewentorigin[0] = cl.viewentoriginold[0] + frac * (cl.viewentoriginnew[0] - cl.viewentoriginold[0]);
+ cl.viewentorigin[1] = cl.viewentoriginold[1] + frac * (cl.viewentoriginnew[1] - cl.viewentoriginold[1]);
+ cl.viewentorigin[2] = cl.viewentoriginold[2] + frac * (cl.viewentoriginnew[2] - cl.viewentoriginold[2]);
+ }
+ else
+ VectorCopy (cl_entities[cl.viewentity].render.origin, cl.viewentorigin);
+
+ cl.viewzoom = cl.viewzoomold + frac * (cl.viewzoomnew - cl.viewzoomold);
for (i = 0;i < 3;i++)
cl.velocity[i] = cl.mvelocity[1][i] + frac * (cl.mvelocity[0][i] - cl.mvelocity[1][i]);
void CL_RelinkEntities (void)
{
+ float frac;
+
+ // fraction from previous network update to current
+ frac = CL_LerpPoint ();
+
CL_DecayLights ();
- CL_LerpPlayerVelocity();
+ CL_RelinkStaticEntities();
CL_RelinkNetworkEntities();
TraceLine_ScanForBModels();
CL_RelinkEffects();
CL_MoveParticles();
- CL_UpdateDecals();
CL_UpdateTEnts();
+
+ CL_LerpPlayer(frac);
}
// get basic movement from keyboard
CL_BaseMove (&cmd);
+ IN_PreMove(); // OS independent code
+
// allow mice or other external controllers to add to the move
IN_Move (&cmd);
+ IN_PostMove(); // OS independent code
+
// send the unreliable message
CL_SendMove (&cmd);
}
+#ifndef NOROUTINGFIX
+ else
+ {
+ // LordHavoc: fix for NAT routing of netquake:
+ // bounce back a clc_nop message to the newly allocated server port,
+ // to establish a routing connection for incoming frames,
+ // the server waits for this before sending anything
+ if (realtime > cl.sendnoptime)
+ {
+ Con_DPrintf("sending clc_nop to get server's attention\n");
+ cl.sendnoptime = realtime + 3;
+ MSG_WriteByte(&cls.message, clc_nop);
+ }
+ }
+#endif
if (cls.demoplayback)
{
CL_Parse_Init();
CL_Particles_Init();
- CL_Decals_Init();
CL_Screen_Init();
CL_CGVM_Init();
}