#define MAX_FORWARD 6
void SV_SetIdealPitch (void)
{
+ prvm_prog_t *prog = SVVM_prog;
float angleval, sinval, cosval, step, dir;
trace_t tr;
vec3_t top, bottom;
bottom[1] = top[1];
bottom[2] = top[2] - 160;
- tr = SV_TraceLine(top, bottom, MOVE_NOMONSTERS, host_client->edict, SUPERCONTENTS_SOLID);
+ tr = SV_TraceLine(top, bottom, MOVE_NOMONSTERS, host_client->edict, SUPERCONTENTS_SOLID, 0, 0, collision_extendmovelength.value);
// if looking at a wall, leave ideal the way is was
if (tr.startsolid)
return;
==================
*/
-void SV_UserFriction (void)
+static void SV_UserFriction (void)
{
+ prvm_prog_t *prog = SVVM_prog;
float speed, newspeed, control, friction;
vec3_t start, stop;
trace_t trace;
start[2] = PRVM_serveredictvector(host_client->edict, origin)[2] + PRVM_serveredictvector(host_client->edict, mins)[2];
stop[2] = start[2] - 34;
- trace = SV_TraceLine(start, stop, MOVE_NOMONSTERS, host_client->edict, SV_GenericHitSuperContentsMask(host_client->edict));
+ trace = SV_TraceLine(start, stop, MOVE_NOMONSTERS, host_client->edict, SV_GenericHitSuperContentsMask(host_client->edict), 0, 0, collision_extendmovelength.value);
if (trace.fraction == 1.0)
friction = sv_friction.value*sv_edgefriction.value;
SV_Accelerate
==============
*/
-void SV_Accelerate (void)
+static void SV_Accelerate (void)
{
+ prvm_prog_t *prog = SVVM_prog;
int i;
float addspeed, accelspeed, currentspeed;
}
extern cvar_t sv_gameplayfix_q2airaccelerate;
-void SV_AirAccelerate (vec3_t wishveloc)
+static void SV_AirAccelerate (vec3_t wishveloc)
{
+ prvm_prog_t *prog = SVVM_prog;
int i;
float addspeed, wishspd, accelspeed, currentspeed;
}
-void DropPunchAngle (void)
+static void DropPunchAngle (void)
{
- float len;
- vec3_t v;
+ prvm_prog_t *prog = SVVM_prog;
+ vec_t len;
+ vec3_t punchangle, punchvector;
- len = VectorNormalizeLength (PRVM_serveredictvector(host_client->edict, punchangle));
+ VectorCopy(PRVM_serveredictvector(host_client->edict, punchangle), punchangle);
+ VectorCopy(PRVM_serveredictvector(host_client->edict, punchvector), punchvector);
- len -= 10*sv.frametime;
- if (len < 0)
- len = 0;
- VectorScale (PRVM_serveredictvector(host_client->edict, punchangle), len, PRVM_serveredictvector(host_client->edict, punchangle));
+ len = VectorNormalizeLength(punchangle);
+ if (len > 0)
+ {
+ len -= 10*sv.frametime;
+ if (len < 0)
+ len = 0;
+ VectorScale(punchangle, len, punchangle);
+ }
- VectorCopy(PRVM_serveredictvector(host_client->edict, punchvector), v);
- len = VectorNormalizeLength(v);
+ len = VectorNormalizeLength(punchvector);
if (len > 0)
{
len -= 20*sv.frametime;
if (len < 0)
len = 0;
- VectorScale(v, len, v);
+ VectorScale(punchvector, len, punchvector);
}
- VectorCopy(v, PRVM_serveredictvector(host_client->edict, punchvector));
-}
-
-/*
-===================
-SV_FreeMove
-===================
-*/
-void SV_FreeMove (void)
-{
- int i;
- float wishspeed;
- AngleVectors (PRVM_serveredictvector(host_client->edict, v_angle), forward, right, up);
-
- for (i = 0; i < 3; i++)
- PRVM_serveredictvector(host_client->edict, velocity)[i] = forward[i] * cmd.forwardmove + right[i] * cmd.sidemove;
-
- PRVM_serveredictvector(host_client->edict, velocity)[2] += cmd.upmove;
-
- wishspeed = VectorLength(PRVM_serveredictvector(host_client->edict, velocity));
- if (wishspeed > sv_maxspeed.value)
- VectorScale(PRVM_serveredictvector(host_client->edict, velocity), sv_maxspeed.value / wishspeed, PRVM_serveredictvector(host_client->edict, velocity));
+ VectorCopy(punchangle, PRVM_serveredictvector(host_client->edict, punchangle));
+ VectorCopy(punchvector, PRVM_serveredictvector(host_client->edict, punchvector));
}
/*
===================
*/
-void SV_WaterMove (void)
+static void SV_WaterMove (void)
{
+ prvm_prog_t *prog = SVVM_prog;
int i;
- vec3_t wishvel;
- float speed, newspeed, wishspeed, addspeed, accelspeed, temp;
+ vec3_t wishvel, v_angle;
+ vec_t speed, newspeed, fwishspeed, addspeed, accelspeed, temp;
// user intentions
- AngleVectors (PRVM_serveredictvector(host_client->edict, v_angle), forward, right, up);
+ VectorCopy(PRVM_serveredictvector(host_client->edict, v_angle), v_angle);
+ AngleVectors(v_angle, forward, right, up);
for (i=0 ; i<3 ; i++)
wishvel[i] = forward[i]*cmd.forwardmove + right[i]*cmd.sidemove;
else
wishvel[2] += cmd.upmove;
- wishspeed = VectorLength(wishvel);
- if (wishspeed > sv_maxspeed.value)
+ fwishspeed = VectorLength(wishvel);
+ if (fwishspeed > sv_maxspeed.value)
{
- temp = sv_maxspeed.value/wishspeed;
+ temp = sv_maxspeed.value/fwishspeed;
VectorScale (wishvel, temp, wishvel);
- wishspeed = sv_maxspeed.value;
+ fwishspeed = sv_maxspeed.value;
}
- wishspeed *= 0.7;
+ fwishspeed *= 0.7;
// water friction
speed = VectorLength(PRVM_serveredictvector(host_client->edict, velocity));
newspeed = 0;
// water acceleration
- if (!wishspeed)
+ if (!fwishspeed)
return;
- addspeed = wishspeed - newspeed;
+ addspeed = fwishspeed - newspeed;
if (addspeed <= 0)
return;
VectorNormalize (wishvel);
- accelspeed = (sv_wateraccelerate.value < 0 ? sv_accelerate.value : sv_wateraccelerate.value) * wishspeed * sv.frametime;
+ accelspeed = (sv_wateraccelerate.value < 0 ? sv_accelerate.value : sv_wateraccelerate.value) * fwishspeed * sv.frametime;
if (accelspeed > addspeed)
accelspeed = addspeed;
PRVM_serveredictvector(host_client->edict, velocity)[i] += accelspeed * wishvel[i];
}
-void SV_WaterJump (void)
+static void SV_WaterJump (void)
{
+ prvm_prog_t *prog = SVVM_prog;
if (sv.time > PRVM_serveredictfloat(host_client->edict, teleport_time) || !PRVM_serveredictfloat(host_client->edict, waterlevel))
{
PRVM_serveredictfloat(host_client->edict, flags) = (int)PRVM_serveredictfloat(host_client->edict, flags) & ~FL_WATERJUMP;
===================
*/
-void SV_AirMove (void)
+static void SV_AirMove (void)
{
+ prvm_prog_t *prog = SVVM_prog;
int i;
vec3_t wishvel;
float fmove, smove, temp;
*/
void SV_ClientThink (void)
{
- vec3_t v_angle;
+ prvm_prog_t *prog = SVVM_prog;
+ vec3_t v_angle, angles, velocity;
//Con_Printf("clientthink for %ims\n", (int) (sv.frametime * 1000));
{
PRVM_serverglobalfloat(time) = sv.time;
PRVM_serverglobaledict(self) = PRVM_EDICT_TO_PROG(host_client->edict);
- PRVM_ExecuteProgram (PRVM_serverfunction(SV_PlayerPhysics), "QC function SV_PlayerPhysics is missing");
+ prog->ExecuteProgram(prog, PRVM_serverfunction(SV_PlayerPhysics), "QC function SV_PlayerPhysics is missing");
SV_CheckVelocity(host_client->edict);
return;
}
// angles
// show 1/3 the pitch angle and all the roll angle
VectorAdd (PRVM_serveredictvector(host_client->edict, v_angle), PRVM_serveredictvector(host_client->edict, punchangle), v_angle);
- PRVM_serveredictvector(host_client->edict, angles)[ROLL] = V_CalcRoll (PRVM_serveredictvector(host_client->edict, angles), PRVM_serveredictvector(host_client->edict, velocity))*4;
+ VectorCopy(PRVM_serveredictvector(host_client->edict, angles), angles);
+ VectorCopy(PRVM_serveredictvector(host_client->edict, velocity), velocity);
+ PRVM_serveredictvector(host_client->edict, angles)[ROLL] = V_CalcRoll (angles, velocity)*4;
if (!PRVM_serveredictfloat(host_client->edict, fixangle))
{
PRVM_serveredictvector(host_client->edict, angles)[PITCH] = -v_angle[PITCH]/3;
*/
int sv_numreadmoves = 0;
usercmd_t sv_readmoves[CL_MAX_USERCMDS];
-void SV_ReadClientMove (void)
+static void SV_ReadClientMove (void)
{
+ prvm_prog_t *prog = SVVM_prog;
int i;
usercmd_t newmove;
usercmd_t *move = &newmove;
memset(move, 0, sizeof(*move));
- if (msg_badread) Con_Printf("SV_ReadClientMessage: badread at %s:%i\n", __FILE__, __LINE__);
+ if (sv_message.badread) Con_Printf("SV_ReadClientMessage: badread at %s:%i\n", __FILE__, __LINE__);
// read ping time
if (sv.protocol != PROTOCOL_QUAKE && sv.protocol != PROTOCOL_QUAKEDP && sv.protocol != PROTOCOL_NEHAHRAMOVIE && sv.protocol != PROTOCOL_NEHAHRABJP && sv.protocol != PROTOCOL_NEHAHRABJP2 && sv.protocol != PROTOCOL_NEHAHRABJP3 && sv.protocol != PROTOCOL_DARKPLACES1 && sv.protocol != PROTOCOL_DARKPLACES2 && sv.protocol != PROTOCOL_DARKPLACES3 && sv.protocol != PROTOCOL_DARKPLACES4 && sv.protocol != PROTOCOL_DARKPLACES5 && sv.protocol != PROTOCOL_DARKPLACES6)
- move->sequence = MSG_ReadLong ();
- move->time = move->clienttime = MSG_ReadFloat ();
- if (msg_badread) Con_Printf("SV_ReadClientMessage: badread at %s:%i\n", __FILE__, __LINE__);
+ move->sequence = MSG_ReadLong(&sv_message);
+ move->time = move->clienttime = MSG_ReadFloat(&sv_message);
+ if (sv_message.badread) Con_Printf("SV_ReadClientMessage: badread at %s:%i\n", __FILE__, __LINE__);
move->receivetime = (float)sv.time;
#if DEBUGMOVES
- Con_Printf("%s move%i #%i %ims (%ims) %i %i '%i %i %i' '%i %i %i'\n", move->time > move->receivetime ? "^3read future" : "^4read normal", sv_numreadmoves + 1, move->sequence, (int)floor((move->time - host_client->cmd.time) * 1000.0 + 0.5), (int)floor(move->time * 1000.0 + 0.5), move->impulse, move->buttons, (int)move->viewangles[0], (int)move->viewangles[1], (int)move->viewangles[2], (int)move->forwardmove, (int)move->sidemove, (int)move->upmove);
+ Con_Printf("%s move%i #%u %ims (%ims) %i %i '%i %i %i' '%i %i %i'\n", move->time > move->receivetime ? "^3read future" : "^4read normal", sv_numreadmoves + 1, move->sequence, (int)floor((move->time - host_client->cmd.time) * 1000.0 + 0.5), (int)floor(move->time * 1000.0 + 0.5), move->impulse, move->buttons, (int)move->viewangles[0], (int)move->viewangles[1], (int)move->viewangles[2], (int)move->forwardmove, (int)move->sidemove, (int)move->upmove);
#endif
// limit reported time to current time
// (incase the client is trying to cheat)
for (i = 0;i < 3;i++)
{
if (sv.protocol == PROTOCOL_QUAKE || sv.protocol == PROTOCOL_QUAKEDP || sv.protocol == PROTOCOL_NEHAHRAMOVIE || sv.protocol == PROTOCOL_NEHAHRABJP || sv.protocol == PROTOCOL_NEHAHRABJP2 || sv.protocol == PROTOCOL_NEHAHRABJP3)
- move->viewangles[i] = MSG_ReadAngle8i();
+ move->viewangles[i] = MSG_ReadAngle8i(&sv_message);
else if (sv.protocol == PROTOCOL_DARKPLACES1)
- move->viewangles[i] = MSG_ReadAngle16i();
+ move->viewangles[i] = MSG_ReadAngle16i(&sv_message);
else if (sv.protocol == PROTOCOL_DARKPLACES2 || sv.protocol == PROTOCOL_DARKPLACES3)
- move->viewangles[i] = MSG_ReadAngle32f();
+ move->viewangles[i] = MSG_ReadAngle32f(&sv_message);
else
- move->viewangles[i] = MSG_ReadAngle16i();
+ move->viewangles[i] = MSG_ReadAngle16i(&sv_message);
}
- if (msg_badread) Con_Printf("SV_ReadClientMessage: badread at %s:%i\n", __FILE__, __LINE__);
+ if (sv_message.badread) Con_Printf("SV_ReadClientMessage: badread at %s:%i\n", __FILE__, __LINE__);
// read movement
- move->forwardmove = MSG_ReadCoord16i ();
- move->sidemove = MSG_ReadCoord16i ();
- move->upmove = MSG_ReadCoord16i ();
- if (msg_badread) Con_Printf("SV_ReadClientMessage: badread at %s:%i\n", __FILE__, __LINE__);
+ move->forwardmove = MSG_ReadCoord16i(&sv_message);
+ move->sidemove = MSG_ReadCoord16i(&sv_message);
+ move->upmove = MSG_ReadCoord16i(&sv_message);
+ if (sv_message.badread) Con_Printf("SV_ReadClientMessage: badread at %s:%i\n", __FILE__, __LINE__);
// read buttons
// be sure to bitwise OR them into the move->buttons because we want to
// accumulate button presses from multiple packets per actual move
if (sv.protocol == PROTOCOL_QUAKE || sv.protocol == PROTOCOL_QUAKEDP || sv.protocol == PROTOCOL_NEHAHRAMOVIE || sv.protocol == PROTOCOL_NEHAHRABJP || sv.protocol == PROTOCOL_NEHAHRABJP2 || sv.protocol == PROTOCOL_NEHAHRABJP3 || sv.protocol == PROTOCOL_DARKPLACES1 || sv.protocol == PROTOCOL_DARKPLACES2 || sv.protocol == PROTOCOL_DARKPLACES3 || sv.protocol == PROTOCOL_DARKPLACES4 || sv.protocol == PROTOCOL_DARKPLACES5)
- move->buttons = MSG_ReadByte ();
+ move->buttons = MSG_ReadByte(&sv_message);
else
- move->buttons = MSG_ReadLong ();
- if (msg_badread) Con_Printf("SV_ReadClientMessage: badread at %s:%i\n", __FILE__, __LINE__);
+ move->buttons = MSG_ReadLong(&sv_message);
+ if (sv_message.badread) Con_Printf("SV_ReadClientMessage: badread at %s:%i\n", __FILE__, __LINE__);
// read impulse
- move->impulse = MSG_ReadByte ();
- if (msg_badread) Con_Printf("SV_ReadClientMessage: badread at %s:%i\n", __FILE__, __LINE__);
+ move->impulse = MSG_ReadByte(&sv_message);
+ if (sv_message.badread) Con_Printf("SV_ReadClientMessage: badread at %s:%i\n", __FILE__, __LINE__);
// PRYDON_CLIENTCURSOR
if (sv.protocol != PROTOCOL_QUAKE && sv.protocol != PROTOCOL_QUAKEDP && sv.protocol != PROTOCOL_NEHAHRAMOVIE && sv.protocol != PROTOCOL_NEHAHRABJP && sv.protocol != PROTOCOL_NEHAHRABJP2 && sv.protocol != PROTOCOL_NEHAHRABJP3 && sv.protocol != PROTOCOL_DARKPLACES1 && sv.protocol != PROTOCOL_DARKPLACES2 && sv.protocol != PROTOCOL_DARKPLACES3 && sv.protocol != PROTOCOL_DARKPLACES4 && sv.protocol != PROTOCOL_DARKPLACES5)
{
// 30 bytes
- move->cursor_screen[0] = MSG_ReadShort() * (1.0f / 32767.0f);
- move->cursor_screen[1] = MSG_ReadShort() * (1.0f / 32767.0f);
- move->cursor_start[0] = MSG_ReadFloat();
- move->cursor_start[1] = MSG_ReadFloat();
- move->cursor_start[2] = MSG_ReadFloat();
- move->cursor_impact[0] = MSG_ReadFloat();
- move->cursor_impact[1] = MSG_ReadFloat();
- move->cursor_impact[2] = MSG_ReadFloat();
- move->cursor_entitynumber = (unsigned short)MSG_ReadShort();
+ move->cursor_screen[0] = MSG_ReadShort(&sv_message) * (1.0f / 32767.0f);
+ move->cursor_screen[1] = MSG_ReadShort(&sv_message) * (1.0f / 32767.0f);
+ move->cursor_start[0] = MSG_ReadFloat(&sv_message);
+ move->cursor_start[1] = MSG_ReadFloat(&sv_message);
+ move->cursor_start[2] = MSG_ReadFloat(&sv_message);
+ move->cursor_impact[0] = MSG_ReadFloat(&sv_message);
+ move->cursor_impact[1] = MSG_ReadFloat(&sv_message);
+ move->cursor_impact[2] = MSG_ReadFloat(&sv_message);
+ move->cursor_entitynumber = (unsigned short)MSG_ReadShort(&sv_message);
if (move->cursor_entitynumber >= prog->max_edicts)
{
Con_DPrintf("SV_ReadClientMessage: client send bad cursor_entitynumber\n");
// entity is free at time of receipt
if (PRVM_EDICT_NUM(move->cursor_entitynumber)->priv.server->free)
move->cursor_entitynumber = 0;
- if (msg_badread) Con_Printf("SV_ReadClientMessage: badread at %s:%i\n", __FILE__, __LINE__);
+ if (sv_message.badread) Con_Printf("SV_ReadClientMessage: badread at %s:%i\n", __FILE__, __LINE__);
}
// if the previous move has not been applied yet, we need to accumulate
if(host_client->movement_highestsequence_seen)
{
// mark moves in between as lost
- if(move->sequence - host_client->movement_highestsequence_seen - 1 < NETGRAPH_PACKETS)
- for(i = host_client->movement_highestsequence_seen + 1; i < move->sequence; ++i)
- host_client->movement_count[i % NETGRAPH_PACKETS] = -1;
+ unsigned int delta = move->sequence - host_client->movement_highestsequence_seen - 1;
+ if(delta < NETGRAPH_PACKETS)
+ {
+ unsigned int u;
+ for(u = 0; u < delta; ++u)
+ host_client->movement_count[(host_client->movement_highestsequence_seen + 1 + u) % NETGRAPH_PACKETS] = -1;
+ }
else
memset(host_client->movement_count, -1, sizeof(host_client->movement_count));
}
}
}
-void SV_ExecuteClientMoves(void)
+static void SV_ExecuteClientMoves(void)
{
+ prvm_prog_t *prog = SVVM_prog;
int moveindex;
float moveframetime;
double oldframetime;
if (sv_numreadmoves < 1)
return;
// only start accepting input once the player is spawned
- if (!host_client->spawned)
+ if (!host_client->begun)
return;
#if DEBUGMOVES
Con_Printf("SV_ExecuteClientMoves: read %i moves at sv.time %f\n", sv_numreadmoves, (float)sv.time);
if (ceil(max(sv_readmoves[sv_numreadmoves-1].receivetime - sv_readmoves[sv_numreadmoves-1].time, 0) * 1000.0) < sv_clmovement_minping.integer)
host_client->clmovement_disabletimeout = realtime + sv_clmovement_minping_disabletime.value / 1000.0;
// several conditions govern whether clientside movement prediction is allowed
- if (sv_readmoves[sv_numreadmoves-1].sequence && sv_clmovement_enable.integer && sv_clmovement_inputtimeout.value > 0 && host_client->clmovement_disabletimeout <= realtime && PRVM_serveredictfloat(host_client->edict, movetype) == MOVETYPE_WALK && (!PRVM_serveredictfloat(host_client->edict, disableclientprediction)))
+ if (sv_readmoves[sv_numreadmoves-1].sequence && sv_clmovement_enable.integer && sv_clmovement_inputtimeout.value > 0 && host_client->clmovement_disabletimeout <= realtime && (PRVM_serveredictfloat(host_client->edict, disableclientprediction) == -1 || (PRVM_serveredictfloat(host_client->edict, movetype) == MOVETYPE_WALK && (!PRVM_serveredictfloat(host_client->edict, disableclientprediction)))))
{
// process the moves in order and ignore old ones
// but always trust the latest move
if (host_client->movesequence < move->sequence || moveindex == sv_numreadmoves - 1)
{
#if DEBUGMOVES
- Con_Printf("%smove #%i %ims (%ims) %i %i '%i %i %i' '%i %i %i'\n", (move->time - host_client->cmd.time) > sv.frametime * 1.01 ? "^1" : "^2", move->sequence, (int)floor((move->time - host_client->cmd.time) * 1000.0 + 0.5), (int)floor(move->time * 1000.0 + 0.5), move->impulse, move->buttons, (int)move->viewangles[0], (int)move->viewangles[1], (int)move->viewangles[2], (int)move->forwardmove, (int)move->sidemove, (int)move->upmove);
+ Con_Printf("%smove #%u %ims (%ims) %i %i '%i %i %i' '%i %i %i'\n", (move->time - host_client->cmd.time) > sv.frametime * 1.01 ? "^1" : "^2", move->sequence, (int)floor((move->time - host_client->cmd.time) * 1000.0 + 0.5), (int)floor(move->time * 1000.0 + 0.5), move->impulse, move->buttons, (int)move->viewangles[0], (int)move->viewangles[1], (int)move->viewangles[2], (int)move->forwardmove, (int)move->sidemove, (int)move->upmove);
#endif
// this is a new move
move->time = bound(sv.time - 1, move->time, sv.time); // prevent slowhack/speedhack combos
void SV_ApplyClientMove (void)
{
+ prvm_prog_t *prog = SVVM_prog;
usercmd_t *move = &host_client->cmd;
int j, movementloss, packetloss;
PRVM_serveredictfloat(host_client->edict, ping_movementloss) = movementloss / (float) NETGRAPH_PACKETS;
}
-void SV_FrameLost(int framenum)
+static qboolean SV_FrameLost(int framenum)
{
if (host_client->entitydatabase5)
{
- EntityFrame5_LostFrame(host_client->entitydatabase5, framenum);
- EntityFrameCSQC_LostFrame(host_client, framenum);
+ if (framenum <= host_client->entitydatabase5->latestframenum)
+ {
+ EntityFrame5_LostFrame(host_client->entitydatabase5, framenum);
+ EntityFrameCSQC_LostFrame(host_client, framenum);
+ return true;
+ }
}
+ return false;
}
-void SV_FrameAck(int framenum)
+static void SV_FrameAck(int framenum)
{
if (host_client->entitydatabase)
EntityFrame_AckFrame(host_client->entitydatabase, framenum);
SV_ReadClientMessage
===================
*/
-extern void SV_SendServerinfo(client_t *client);
-extern sizebuf_t vm_tempstringsbuf;
void SV_ReadClientMessage(void)
{
- int cmd, num, start;
+ prvm_prog_t *prog = SVVM_prog;
+ int netcmd, num, start;
char *s, *p, *q;
if(sv_autodemo_perclient.integer >= 2)
return;
}
- if (msg_badread)
+ if (sv_message.badread)
{
Con_Print("SV_ReadClientMessage: badread\n");
SV_DropClient (false);
return;
}
- cmd = MSG_ReadByte ();
- if (cmd == -1)
+ netcmd = MSG_ReadByte(&sv_message);
+ if (netcmd == -1)
{
// end of message
// apply the moves that were read this frame
break;
}
- switch (cmd)
+ switch (netcmd)
{
default:
- Con_Printf("SV_ReadClientMessage: unknown command char %i (at offset 0x%x)\n", cmd, msg_readcount);
+ Con_Printf("SV_ReadClientMessage: unknown command char %i (at offset 0x%x)\n", netcmd, sv_message.readcount);
if (developer_networking.integer)
- Com_HexDumpToConsole(net_message.data, net_message.cursize);
+ Com_HexDumpToConsole(sv_message.data, sv_message.cursize);
SV_DropClient (false);
return;
// allow reliable messages now as the client is done with initial loading
if (host_client->sendsignon == 2)
host_client->sendsignon = 0;
- s = MSG_ReadString ();
+ s = MSG_ReadString(&sv_message, sv_readstring, sizeof(sv_readstring));
q = NULL;
for(p = s; *p; ++p) switch(*p)
{
if (strncasecmp(s, "spawn", 5) == 0
|| strncasecmp(s, "begin", 5) == 0
|| strncasecmp(s, "prespawn", 8) == 0)
- Cmd_ExecuteString (s, src_client);
+ Cmd_ExecuteString (s, src_client, true);
else if (PRVM_serverfunction(SV_ParseClientCommand))
{
int restorevm_tempstringsbuf_cursize;
- restorevm_tempstringsbuf_cursize = vm_tempstringsbuf.cursize;
- PRVM_G_INT(OFS_PARM0) = PRVM_SetTempString(s);
+ restorevm_tempstringsbuf_cursize = prog->tempstringsbuf.cursize;
+ PRVM_G_INT(OFS_PARM0) = PRVM_SetTempString(prog, s);
+ PRVM_serverglobalfloat(time) = sv.time;
PRVM_serverglobaledict(self) = PRVM_EDICT_TO_PROG(host_client->edict);
- PRVM_ExecuteProgram (PRVM_serverfunction(SV_ParseClientCommand), "QC function SV_ParseClientCommand is missing");
- vm_tempstringsbuf.cursize = restorevm_tempstringsbuf_cursize;
+ prog->ExecuteProgram(prog, PRVM_serverfunction(SV_ParseClientCommand), "QC function SV_ParseClientCommand is missing");
+ prog->tempstringsbuf.cursize = restorevm_tempstringsbuf_cursize;
}
else
- Cmd_ExecuteString (s, src_client);
+ Cmd_ExecuteString (s, src_client, true);
break;
clc_stringcmd_invalid:
Con_Printf("Received invalid stringcmd from %s\n", host_client->name);
if(developer.integer > 0)
- Com_HexDumpToConsole((unsigned char *) s, strlen(s));
+ Com_HexDumpToConsole((unsigned char *) s, (int)strlen(s));
break;
case clc_disconnect:
break;
case clc_ackdownloaddata:
- start = MSG_ReadLong();
- num = MSG_ReadShort();
+ start = MSG_ReadLong(&sv_message);
+ num = MSG_ReadShort(&sv_message);
if (host_client->download_file && host_client->download_started)
{
if (host_client->download_expectedposition == start)
break;
case clc_ackframe:
- if (msg_badread) Con_Printf("SV_ReadClientMessage: badread at %s:%i\n", __FILE__, __LINE__);
- num = MSG_ReadLong();
- if (msg_badread) Con_Printf("SV_ReadClientMessage: badread at %s:%i\n", __FILE__, __LINE__);
+ if (sv_message.badread) Con_Printf("SV_ReadClientMessage: badread at %s:%i\n", __FILE__, __LINE__);
+ num = MSG_ReadLong(&sv_message);
+ if (sv_message.badread) Con_Printf("SV_ReadClientMessage: badread at %s:%i\n", __FILE__, __LINE__);
if (developer_networkentities.integer >= 10)
Con_Printf("recv clc_ackframe %i\n", num);
// if the client hasn't progressed through signons yet,
// ignore any clc_ackframes we get (they're probably from the
// previous level)
- if (host_client->spawned && host_client->latestframenum < num)
+ if (host_client->begun && host_client->latestframenum < num)
{
int i;
for (i = host_client->latestframenum + 1;i < num;i++)
- SV_FrameLost(i);
+ if (!SV_FrameLost(i))
+ break;
SV_FrameAck(num);
host_client->latestframenum = num;
}