This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
edict_t *sv_player;
-extern cvar_t sv_friction;
-cvar_t sv_edgefriction = {"edgefriction", "2"};
-extern cvar_t sv_stopspeed;
+cvar_t sv_edgefriction = {0, "edgefriction", "2"};
+cvar_t sv_predict = {0, "sv_predict", "1"};
+cvar_t sv_deltacompress = {0, "sv_deltacompress", "1"};
+cvar_t sv_idealpitchscale = {0, "sv_idealpitchscale","0.8"};
+cvar_t sv_maxspeed = {CVAR_NOTIFY, "sv_maxspeed", "320"};
+cvar_t sv_accelerate = {0, "sv_accelerate", "10"};
static vec3_t forward, right, up;
usercmd_t cmd;
-cvar_t sv_idealpitchscale = {"sv_idealpitchscale","0.8"};
-
/*
===============
bottom[0] = top[0];
bottom[1] = top[1];
bottom[2] = top[2] - 160;
-
- tr = SV_Move (top, vec3_origin, vec3_origin, bottom, 1, sv_player);
+
+ tr = SV_Move (top, vec3_origin, vec3_origin, bottom, MOVE_NOMONSTERS, sv_player);
if (tr.allsolid)
return; // looking at a wall, leave ideal the way is was
start[2] = origin[2] + sv_player->v.mins[2];
stop[2] = start[2] - 34;
- trace = SV_Move (start, vec3_origin, vec3_origin, stop, true, sv_player);
+ trace = SV_Move (start, vec3_origin, vec3_origin, stop, MOVE_NOMONSTERS, sv_player);
if (trace.fraction == 1.0)
friction = sv_friction.value*sv_edgefriction.value;
// apply friction
control = speed < sv_stopspeed.value ? sv_stopspeed.value : speed;
- newspeed = speed - host_frametime*control*friction;
+ newspeed = speed - sv.frametime*control*friction;
if (newspeed < 0)
newspeed = 0;
SV_Accelerate
==============
*/
-cvar_t sv_maxspeed = {"sv_maxspeed", "320", false, true};
-cvar_t sv_accelerate = {"sv_accelerate", "10"};
#if 0
void SV_Accelerate (vec3_t wishvel)
{
VectorSubtract (wishvel, velocity, pushvec);
addspeed = VectorNormalize (pushvec);
- accelspeed = sv_accelerate.value*host_frametime*addspeed;
+ accelspeed = sv_accelerate.value*sv.frametime*addspeed;
if (accelspeed > addspeed)
accelspeed = addspeed;
addspeed = wishspeed - currentspeed;
if (addspeed <= 0)
return;
- accelspeed = sv_accelerate.value*host_frametime*wishspeed;
+ accelspeed = sv_accelerate.value*sv.frametime*wishspeed;
if (accelspeed > addspeed)
accelspeed = addspeed;
addspeed = wishspd - currentspeed;
if (addspeed <= 0)
return;
-// accelspeed = sv_accelerate.value * host_frametime;
- accelspeed = sv_accelerate.value*wishspeed * host_frametime;
+// accelspeed = sv_accelerate.value * sv.frametime;
+ accelspeed = sv_accelerate.value*wishspeed * sv.frametime;
if (accelspeed > addspeed)
accelspeed = addspeed;
void DropPunchAngle (void)
{
float len;
+ eval_t *val;
len = VectorNormalizeLength (sv_player->v.punchangle);
-
- len -= 10*host_frametime;
+
+ len -= 10*sv.frametime;
if (len < 0)
len = 0;
VectorScale (sv_player->v.punchangle, len, sv_player->v.punchangle);
+
+ if ((val = GETEDICTFIELDVALUE(sv_player, eval_punchvector)))
+ {
+ len = VectorNormalizeLength (val->vector);
+
+ len -= 20*sv.frametime;
+ if (len < 0)
+ len = 0;
+ VectorScale (val->vector, len, val->vector);
+ }
}
/*
{
int i;
vec3_t wishvel;
- float speed, newspeed, wishspeed, addspeed, accelspeed;
+ float speed, newspeed, wishspeed, addspeed, accelspeed, temp;
//
// user intentions
wishspeed = Length(wishvel);
if (wishspeed > sv_maxspeed.value)
{
- VectorScale (wishvel, sv_maxspeed.value/wishspeed, wishvel);
+ temp = sv_maxspeed.value/wishspeed;
+ VectorScale (wishvel, temp, wishvel);
wishspeed = sv_maxspeed.value;
}
wishspeed *= 0.7;
speed = Length (velocity);
if (speed)
{
- newspeed = speed - host_frametime * speed * sv_friction.value;
+ newspeed = speed - sv.frametime * speed * sv_friction.value;
if (newspeed < 0)
- newspeed = 0;
- VectorScale (velocity, newspeed/speed, velocity);
+ newspeed = 0;
+ temp = newspeed/speed;
+ VectorScale (velocity, temp, velocity);
}
else
newspeed = 0;
return;
VectorNormalize (wishvel);
- accelspeed = sv_accelerate.value * wishspeed * host_frametime;
+ accelspeed = sv_accelerate.value * wishspeed * sv.frametime;
if (accelspeed > addspeed)
accelspeed = addspeed;
{
int i;
vec3_t wishvel;
- float fmove, smove;
+ float fmove, smove, temp;
// LordHavoc: correct quake movement speed bug when looking up/down
wishvel[0] = wishvel[2] = 0;
wishspeed = VectorNormalizeLength(wishdir);
if (wishspeed > sv_maxspeed.value)
{
- VectorScale (wishvel, sv_maxspeed.value/wishspeed, wishvel);
+ temp = sv_maxspeed.value/wishspeed;
+ VectorScale (wishvel, temp, wishvel);
wishspeed = sv_maxspeed.value;
}
//
// walk
//
- if ( (sv_player->v.waterlevel >= 2)
- && (sv_player->v.movetype != MOVETYPE_NOCLIP) )
+ if ( (sv_player->v.waterlevel >= 2) && (sv_player->v.movetype != MOVETYPE_NOCLIP) )
{
SV_WaterMove ();
return;
}
- SV_AirMove ();
+ SV_AirMove ();
}
int bits;
eval_t *val;
float total;
-
+
// read ping time
- host_client->ping_times[host_client->num_pings%NUM_PING_TIMES]
- = sv.time - MSG_ReadFloat ();
+ host_client->ping_times[host_client->num_pings % NUM_PING_TIMES] = sv.time - MSG_ReadFloat ();
host_client->num_pings++;
- if (val = GETEDICTFIELDVALUE(host_client->edict, eval_ping))
- {
- for (i=0, total = 0;i < NUM_PING_TIMES;i++)
- total += host_client->ping_times[i];
- val->_float = 1000.0 / NUM_PING_TIMES;
- }
-
-// read current angles
- for (i=0 ; i<3 ; i++)
- angle[i] = MSG_ReadAngle ();
+ for (i=0, total = 0;i < NUM_PING_TIMES;i++)
+ total += host_client->ping_times[i];
+ host_client->ping = total / NUM_PING_TIMES; // can be used for prediction
+ host_client->latency = 0;
+ if (sv_predict.integer && (svs.maxclients > 1) && (!sv.paused)) // if paused or a local game, don't predict
+ host_client->latency = host_client->ping;
+ if ((val = GETEDICTFIELDVALUE(host_client->edict, eval_ping)))
+ val->_float = host_client->ping * 1000.0;
+
+// read current angles
+ // dpprotocol version 2
+ for (i = 0;i < 3;i++)
+ angle[i] = MSG_ReadFloat ();
VectorCopy (angle, host_client->edict->v.v_angle);
-
+
// read movement
move->forwardmove = MSG_ReadShort ();
move->sidemove = MSG_ReadShort ();
move->upmove = MSG_ReadShort ();
- if (val = GETEDICTFIELDVALUE(host_client->edict, eval_movement))
+ if ((val = GETEDICTFIELDVALUE(host_client->edict, eval_movement)))
{
val->vector[0] = move->forwardmove;
val->vector[1] = move->sidemove;
val->vector[2] = move->upmove;
}
-
+
// read buttons
bits = MSG_ReadByte ();
host_client->edict->v.button0 = bits & 1;
host_client->edict->v.button2 = (bits & 2)>>1;
// LordHavoc: added 6 new buttons
- if (val = GETEDICTFIELDVALUE(host_client->edict, eval_button3)) val->_float = ((bits >> 2) & 1);
- if (val = GETEDICTFIELDVALUE(host_client->edict, eval_button4)) val->_float = ((bits >> 3) & 1);
- if (val = GETEDICTFIELDVALUE(host_client->edict, eval_button5)) val->_float = ((bits >> 4) & 1);
- if (val = GETEDICTFIELDVALUE(host_client->edict, eval_button6)) val->_float = ((bits >> 5) & 1);
- if (val = GETEDICTFIELDVALUE(host_client->edict, eval_button7)) val->_float = ((bits >> 6) & 1);
- if (val = GETEDICTFIELDVALUE(host_client->edict, eval_button8)) val->_float = ((bits >> 7) & 1);
+ if ((val = GETEDICTFIELDVALUE(host_client->edict, eval_button3))) val->_float = ((bits >> 2) & 1);
+ if ((val = GETEDICTFIELDVALUE(host_client->edict, eval_button4))) val->_float = ((bits >> 3) & 1);
+ if ((val = GETEDICTFIELDVALUE(host_client->edict, eval_button5))) val->_float = ((bits >> 4) & 1);
+ if ((val = GETEDICTFIELDVALUE(host_client->edict, eval_button6))) val->_float = ((bits >> 5) & 1);
+ if ((val = GETEDICTFIELDVALUE(host_client->edict, eval_button7))) val->_float = ((bits >> 6) & 1);
+ if ((val = GETEDICTFIELDVALUE(host_client->edict, eval_button8))) val->_float = ((bits >> 7) & 1);
i = MSG_ReadByte ();
if (i)
Returns false if the client should be killed
===================
*/
+void SV_SendServerinfo (client_t *client);
qboolean SV_ReadClientMessage (void)
{
int ret;
int cmd;
char *s;
-
+
do
{
nextmsg:
}
if (!ret)
return true;
-
+
MSG_BeginReading ();
-
+
while (1)
{
if (!host_client->active)
{
Sys_Printf ("SV_ReadClientMessage: badread\n");
return false;
- }
-
+ }
+
cmd = MSG_ReadChar ();
-
+
+ if (cmd != -1 && host_client->waitingforconnect)
+ {
+ host_client->waitingforconnect = false;
+ host_client->sendserverinfo = true;
+ }
+
switch (cmd)
{
case -1:
goto nextmsg; // end of message
-
+
default:
- Sys_Printf ("SV_ReadClientMessage: unknown command char\n");
+ Sys_Printf ("SV_ReadClientMessage: unknown command char %i\n", cmd);
return false;
-
+
case clc_nop:
// Sys_Printf ("clc_nop\n");
break;
-
- case clc_stringcmd:
+
+ case clc_stringcmd:
s = MSG_ReadString ();
- if (host_client->privileged)
- ret = 2;
- else
- ret = 0;
+ ret = 0;
if (Q_strncasecmp(s, "status", 6) == 0
|| Q_strncasecmp(s, "name", 4) == 0
|| Q_strncasecmp(s, "say", 3) == 0
|| Q_strncasecmp(s, "ping", 4) == 0
|| Q_strncasecmp(s, "ban", 3) == 0
|| Q_strncasecmp(s, "pmodel", 6) == 0
- || (nehahra && (Q_strncasecmp(s, "max", 3) == 0 || Q_strncasecmp(s, "monster", 7) == 0 || Q_strncasecmp(s, "scrag", 5) == 0 || Q_strncasecmp(s, "gimme", 5) == 0 || Q_strncasecmp(s, "wraith", 6) == 0))
- || (!nehahra && (Q_strncasecmp(s, "god", 3) == 0 || Q_strncasecmp(s, "notarget", 8) == 0 || Q_strncasecmp(s, "fly", 3) == 0 || Q_strncasecmp(s, "give", 4) == 0 || Q_strncasecmp(s, "noclip", 6) == 0)))
+ || (gamemode == GAME_NEHAHRA && (Q_strncasecmp(s, "max", 3) == 0 || Q_strncasecmp(s, "monster", 7) == 0 || Q_strncasecmp(s, "scrag", 5) == 0 || Q_strncasecmp(s, "gimme", 5) == 0 || Q_strncasecmp(s, "wraith", 6) == 0))
+ || (gamemode != GAME_NEHAHRA && (Q_strncasecmp(s, "god", 3) == 0 || Q_strncasecmp(s, "notarget", 8) == 0 || Q_strncasecmp(s, "fly", 3) == 0 || Q_strncasecmp(s, "give", 4) == 0 || Q_strncasecmp(s, "noclip", 6) == 0)))
+ {
ret = 1;
+ Cmd_ExecuteString (s, src_client);
+ }
+ else
+ Con_DPrintf("%s tried to %s\n", host_client->name, s);
+ /*
if (ret == 2)
Cbuf_InsertText (s);
else if (ret == 1)
Cmd_ExecuteString (s, src_client);
else
Con_DPrintf("%s tried to %s\n", host_client->name, s);
+ */
break;
-
+
case clc_disconnect:
// Sys_Printf ("SV_ReadClientMessage: client disconnected\n");
return false;
-
+
case clc_move:
SV_ReadClientMove (&host_client->cmd);
break;
+
+ case clc_ackentities:
+ EntityFrame_AckFrame(&host_client->entitydatabase, MSG_ReadLong());
+ break;
}
}
} while (ret == 1);
-
+
return true;
}
SV_RunClients
==================
*/
-extern dfunction_t *SV_PlayerPhysicsQC;
void SV_RunClients (void)
{
int i;
{
pr_global_struct->time = sv.time;
pr_global_struct->self = EDICT_TO_PROG(sv_player);
- PR_ExecuteProgram ((func_t)(SV_PlayerPhysicsQC - pr_functions));
+ PR_ExecuteProgram ((func_t)(SV_PlayerPhysicsQC - pr_functions), "");
}
else
SV_ClientThink ();