if (!sv.active)
Host_ClearMemory ();
+ // note: this also gets rid of the entity database
Mem_EmptyPool(cl_entities_mempool);
// wipe the entire cl structure
// clear menu's connect error message
m_return_reason[0] = 0;
-
- // stop demo loop in case this fails
cls.demonum = -1;
- CL_Disconnect();
if (LHNETADDRESS_FromString(&cls.connect_address, host, 26000) && (cls.connect_mysocket = NetConn_ChooseClientSocketForAddress(&cls.connect_address)))
{
+ // stop demo loop in case this fails
+ CL_Disconnect();
+
cls.connect_trying = true;
cls.connect_remainingtries = 3;
cls.connect_nextsendtime = 0;
NetConn_ServerFrame();
}
}
+ else
+ {
+ Con_Printf("Unable to find a suitable network socket to connect to server.\n");
+ strcpy(m_return_reason, "No network");
+ }
}
/*
continue;
if (ent->render.model)
- strncpy(name, ent->render.model->name, 25);
+ strlcpy (name, ent->render.model->name, 25);
else
strcpy(name, "--no model--");
- name[25] = 0;
for (j = strlen(name);j < 25;j++)
name[j] = ' ';
Con_Printf ("%3i: %s:%04i (%5i %5i %5i) [%3i %3i %3i] %4.2f %5.3f\n", i, name, ent->render.frame, (int) ent->render.origin[0], (int) ent->render.origin[1], (int) ent->render.origin[2], (int) ent->render.angles[0] % 360, (int) ent->render.angles[1] % 360, (int) ent->render.angles[2] % 360, ent->render.scale, ent->render.alpha);
// 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))
+ if (!f || cl_nolerp.integer || cls.timedemo || cl.islocalgame)
{
cl.time = cl.mtime[0];
return 1;
float time;
time = cl.time - cl.oldtime;
-
- dl = cl_dlights;
- for (i=0 ; i<MAX_DLIGHTS ; i++, dl++)
- {
- if (!dl->radius)
- continue;
- if (dl->die < cl.time)
- {
- dl->radius = 0;
- continue;
- }
-
- dl->radius -= time*dl->decay;
- if (dl->radius < 0)
- dl->radius = 0;
- }
+ for (i = 0, dl = cl_dlights;i < MAX_DLIGHTS;i++, dl++)
+ if (dl->radius)
+ dl->radius = (cl.time < dl->die) ? max(0, dl->radius - time * dl->decay) : 0;
}
-extern qboolean Nehahrademcompatibility;
#define MAXVIEWMODELS 32
entity_t *viewmodels[MAXVIEWMODELS];
int numviewmodels;
return;
if (e->render.flags & RENDER_VIEWMODEL)
{
- if (cl.stats[STAT_HEALTH] <= 0 || !r_drawviewmodel.integer || chase_active.integer || envmap || (cl.items & IT_INVISIBILITY))
+ if (!r_drawviewmodel.integer || chase_active.integer || envmap)
return;
if (cl.viewentity)
CL_LinkNetworkEntity(cl_entities + cl.viewentity);
if (e->state_current.tagentity && e->state_current.tagindex >= 1 && (model = t->render.model) && e->state_current.tagindex <= t->render.model->alias.aliasnum_tags)
{
// blend the matrices
- R_LerpAnimation(&t->render);
memset(&blendmatrix, 0, sizeof(blendmatrix));
for (j = 0;j < 4 && t->render.frameblend[j].lerp > 0;j++)
{
VectorCopy(e->persistent.newangles, angles);
}
// animation lerp
- if (e->render.frame2 != e->state_current.frame)
+ if (e->render.frame2 == e->state_current.frame)
+ {
+ // update frame lerp fraction
+ e->render.framelerp = 1;
+ if (e->render.frame2time > e->render.frame1time)
+ {
+ e->render.framelerp = (cl.time - e->render.frame2time) / (e->render.frame2time - e->render.frame1time);
+ e->render.framelerp = bound(0, e->render.framelerp, 1);
+ }
+ }
+ else
{
// begin a new frame lerp
e->render.frame1 = e->render.frame2;
e->render.frame = e->render.frame2 = e->state_current.frame;
e->render.frame2time = cl.time;
e->render.framelerp = 0;
- }
- else
- {
- // update frame lerp fraction
- e->render.framelerp = e->render.frame2time > e->render.frame1time ? ((cl.time - e->render.frame2time) / (e->render.frame2time - e->render.frame1time)) : 1;
- e->render.framelerp = bound(0, e->render.framelerp, 1);
+ // make sure frame lerp won't last longer than 100ms
+ // (this mainly helps with models that use framegroups and
+ // switch between them infrequently)
+ e->render.frame1time = max(e->render.frame1time, e->render.frame2time - 0.1f);
}
}
else
if (e->render.model)
{
Mod_CheckLoaded(e->render.model);
- if (e->render.model->type != mod_brush)
+ if (e->render.model->type == mod_alias || e->render.model->type == mod_sprite)
angles[0] = -angles[0];
- if (e->render.model->flags & EF_ROTATE)
+ if ((e->render.model->flags & EF_ROTATE) && (!e->state_current.tagentity && !(e->render.flags & RENDER_VIEWMODEL)))
{
angles[1] = ANGLEMOD(100*cl.time);
if (cl_itembobheight.value)
}
}
+ R_LerpAnimation(&e->render);
+
// FIXME: e->render.scale should go away
Matrix4x4_CreateFromQuakeEntity(&matrix2, origin[0], origin[1], origin[2], angles[0], angles[1], angles[2], e->render.scale);
// concat the matrices to make the entity relative to its tag
if (e->persistent.muzzleflash > 0)
{
Matrix4x4_Transform(&e->render.matrix, muzzleflashorigin, v2);
- CL_TraceLine(origin, v2, v, NULL, 0, true, NULL);
+ CL_TraceLine(origin, v2, v, NULL, true, NULL, SUPERCONTENTS_SOLID | SUPERCONTENTS_SKY);
CL_AllocDlight(NULL, v, e->persistent.muzzleflash, 1, 1, 1, 0, 0);
e->persistent.muzzleflash -= cl.frametime * 1000;
}
// LordHavoc: if the model has no flags, don't check each
- if (e->render.model && e->render.model->flags)
+ if (e->render.model && e->render.model->flags && (!e->state_current.tagentity && !(e->render.flags & RENDER_VIEWMODEL)))
{
if (e->render.model->flags & EF_GIB)
trailtype = 2;
if (!(e->render.effects & (EF_NOSHADOW | EF_ADDITIVE))
&& (e->render.alpha == 1)
&& !(e->render.flags & RENDER_VIEWMODEL)
- && ((e - cl_entities) != cl.viewentity || (!cl.intermission && !Nehahrademcompatibility && !cl_noplayershadow.integer)))
+ && ((e - cl_entities) != cl.viewentity || (!cl.intermission && cl.protocol != PROTOCOL_NEHAHRAMOVIE && !cl_noplayershadow.integer)))
e->render.flags |= RENDER_SHADOW;
// as soon as player is known we can call V_CalcRefDef
if ((e - cl_entities) == cl.viewentity)
V_CalcRefdef();
- if (e->render.model && e->render.model->name[0] == '*' && e->render.model->type == mod_brush)
+ if (e->render.model && e->render.model->name[0] == '*' && e->render.model->TraceBox)
cl_brushmodel_entities[cl_num_brushmodel_entities++] = &e->render;
// don't show entities with no modelindex (note: this still shows
// entities which have a modelindex that resolved to a NULL model)
ent->state_current.modelindex = cl.stats[STAT_WEAPON];
ent->state_current.frame = cl.stats[STAT_WEAPONFRAME];
ent->state_current.flags = RENDER_VIEWMODEL;
+ if (cl.stats[STAT_HEALTH] <= 0 || cl.intermission)
+ ent->state_current.modelindex = 0;
+ else if (cl.items & IT_INVISIBILITY)
+ {
+ if (gamemode == GAME_TRANSFUSION)
+ ent->state_current.alpha = 128;
+ else
+ ent->state_current.modelindex = 0;
+ }
// start on the entity after the world
entitylinkframenumber++;
CL_SendCmd
=================
*/
-void CL_SendCmd(void)
+void CL_SendCmd(usercmd_t *cmd)
{
- usercmd_t cmd;
-
if (cls.signon == SIGNONS)
- {
- // get basic movement from keyboard
- CL_BaseMove(&cmd);
-
- // OS independent code
- IN_PreMove();
-
- // allow mice or other external controllers to add to the move
- IN_Move(&cmd);
-
- // OS independent code
- IN_PostMove();
-
- // send the unreliable message
- CL_SendMove(&cmd);
- }
+ CL_SendMove(cmd);
if (cls.demoplayback)
{