cvar_t sv_gameplayfix_grenadebouncedownslopes = {0, "sv_gameplayfix_grenadebouncedownslopes", "1", "prevents MOVETYPE_BOUNCE (grenades) from getting stuck when fired down a downward sloping surface"};
cvar_t sv_gameplayfix_noairborncorpse = {0, "sv_gameplayfix_noairborncorpse", "1", "causes entities (corpses) sitting ontop of moving entities (players) to fall when the moving entity (player) is no longer supporting them"};
-cvar_t sv_gameplayfix_stepdown = {0, "sv_gameplayfix_stepdown", "1", "attempts to step down stairs, not just up them (prevents the familiar thud..thud..thud.. when running down stairs and slopes)"};
+cvar_t sv_gameplayfix_stepdown = {0, "sv_gameplayfix_stepdown", "0", "attempts to step down stairs, not just up them (prevents the familiar thud..thud..thud.. when running down stairs and slopes)"};
cvar_t sv_gameplayfix_stepwhilejumping = {0, "sv_gameplayfix_stepwhilejumping", "1", "applies step-up onto a ledge even while airborn, useful if you would otherwise just-miss the floor when running across small areas with gaps (for instance running across the moving platforms in dm2, or jumping to the megahealth and red armor in dm2 rather than using the bridge)"};
cvar_t sv_gameplayfix_swiminbmodels = {0, "sv_gameplayfix_swiminbmodels", "1", "causes pointcontents (used to determine if you are in a liquid) to check bmodel entities as well as the world model, so you can swim around in (possibly moving) water bmodel entities"};
cvar_t sv_gameplayfix_setmodelrealbox = {0, "sv_gameplayfix_setmodelrealbox", "1", "fixes a bug in Quake that made setmodel always set the entity box to ('-16 -16 -16', '16 16 16') rather than properly checking the model box, breaks some poorly coded mods"};
*/
void SV_StartParticle (vec3_t org, vec3_t dir, int color, int count)
{
- int i, v;
+ int i;
if (sv.datagram.cursize > MAX_PACKETFRAGMENT-18)
return;
MSG_WriteCoord (&sv.datagram, org[1], sv.protocol);
MSG_WriteCoord (&sv.datagram, org[2], sv.protocol);
for (i=0 ; i<3 ; i++)
- {
- v = dir[i]*16;
- if (v > 127)
- v = 127;
- else if (v < -128)
- v = -128;
- MSG_WriteChar (&sv.datagram, v);
- }
+ MSG_WriteChar (&sv.datagram, (int)bound(-128, dir[i]*16, 127));
MSG_WriteByte (&sv.datagram, count);
MSG_WriteByte (&sv.datagram, color);
}
if (field_mask & SND_VOLUME)
MSG_WriteByte (&sv.datagram, volume);
if (field_mask & SND_ATTENUATION)
- MSG_WriteByte (&sv.datagram, attenuation*64);
+ MSG_WriteByte (&sv.datagram, (int)(attenuation*64));
if (field_mask & SND_LARGEENTITY)
{
MSG_WriteShort (&sv.datagram, ent);
// send music
MSG_WriteByte (&client->netconnection->message, svc_cdtrack);
- MSG_WriteByte (&client->netconnection->message, prog->edicts->fields.server->sounds);
- MSG_WriteByte (&client->netconnection->message, prog->edicts->fields.server->sounds);
+ MSG_WriteByte (&client->netconnection->message, (int)prog->edicts->fields.server->sounds);
+ MSG_WriteByte (&client->netconnection->message, (int)prog->edicts->fields.server->sounds);
// set view
MSG_WriteByte (&client->netconnection->message, svc_setview);
PRVM_ExecuteProgram (prog->globals.server->SetNewParms, "QC function SetNewParms is missing");
for (i=0 ; i<NUM_SPAWN_PARMS ; i++)
client->spawn_parms[i] = (&prog->globals.server->parm1)[i];
- }
- // set up the entity for this client (including .colormap, .team, etc)
- PRVM_ED_ClearEdict(client->edict);
+ // set up the entity for this client (including .colormap, .team, etc)
+ PRVM_ED_ClearEdict(client->edict);
+ }
// don't call SendServerinfo for a fresh botclient because its fields have
// not been set up by the qc yet
if (effects & 32)
{
effects &= ~32;
- light[0] = 0.2;
- light[1] = 1;
- light[2] = 0.2;
+ light[0] = (int)(0.2*256);
+ light[1] = (int)(1.0*256);
+ light[2] = (int)(0.2*256);
light[3] = 200;
lightpflags |= PFLAGS_FULLDYNAMIC;
}
val = PRVM_GETEDICTFIELDVALUE(ent, eval_colormod);
if (val->vector[0] || val->vector[1] || val->vector[2])
{
- i = val->vector[0] * 32.0f;cs->colormod[0] = bound(0, i, 255);
- i = val->vector[1] * 32.0f;cs->colormod[1] = bound(0, i, 255);
- i = val->vector[2] * 32.0f;cs->colormod[2] = bound(0, i, 255);
+ i = (int)(val->vector[0] * 32.0f);cs->colormod[0] = bound(0, i, 255);
+ i = (int)(val->vector[1] * 32.0f);cs->colormod[1] = bound(0, i, 255);
+ i = (int)(val->vector[2] * 32.0f);cs->colormod[2] = bound(0, i, 255);
}
cs->modelindex = modelindex;
}
else
{
- VectorCopy(cs->origin, cullmins);
- VectorCopy(cs->origin, cullmaxs);
+ // if there is no model (or it could not be loaded), use the physics box
+ VectorAdd(cs->origin, ent->fields.server->mins, cullmins);
+ VectorAdd(cs->origin, ent->fields.server->maxs, cullmaxs);
}
if (specialvisibilityradius)
{
testorigin[0] = (ed->priv.server->cullmins[0] + ed->priv.server->cullmaxs[0]) * 0.5f;
testorigin[1] = (ed->priv.server->cullmins[1] + ed->priv.server->cullmaxs[1]) * 0.5f;
testorigin[2] = (ed->priv.server->cullmins[2] + ed->priv.server->cullmaxs[2]) * 0.5f;
- sv.worldmodel->TraceBox(sv.worldmodel, 0, &trace, sv_writeentitiestoclient_testeye, sv_writeentitiestoclient_testeye, testorigin, testorigin, SUPERCONTENTS_SOLID);
+ sv.worldmodel->TraceBox(sv.worldmodel, 0, &trace, sv_writeentitiestoclient_testeye, vec3_origin, vec3_origin, testorigin, SUPERCONTENTS_SOLID);
if (trace.fraction == 1 || BoxesOverlap(trace.endpos, trace.endpos, ed->priv.server->cullmins, ed->priv.server->cullmaxs))
sv_writeentitiestoclient_client->visibletime[s->number] = realtime + 1;
else
testorigin[0] = lhrandom(ed->priv.server->cullmins[0], ed->priv.server->cullmaxs[0]);
testorigin[1] = lhrandom(ed->priv.server->cullmins[1], ed->priv.server->cullmaxs[1]);
testorigin[2] = lhrandom(ed->priv.server->cullmins[2], ed->priv.server->cullmaxs[2]);
- sv.worldmodel->TraceBox(sv.worldmodel, 0, &trace, sv_writeentitiestoclient_testeye, sv_writeentitiestoclient_testeye, testorigin, testorigin, SUPERCONTENTS_SOLID);
+ sv.worldmodel->TraceBox(sv.worldmodel, 0, &trace, sv_writeentitiestoclient_testeye, vec3_origin, vec3_origin, testorigin, SUPERCONTENTS_SOLID);
if (trace.fraction == 1 || BoxesOverlap(trace.endpos, trace.endpos, ed->priv.server->cullmins, ed->priv.server->cullmaxs))
sv_writeentitiestoclient_client->visibletime[s->number] = realtime + 1;
else
testorigin[0] = lhrandom(ed->priv.server->cullmins[0], ed->priv.server->cullmaxs[0]);
testorigin[1] = lhrandom(ed->priv.server->cullmins[1], ed->priv.server->cullmaxs[1]);
testorigin[2] = lhrandom(ed->priv.server->cullmins[2], ed->priv.server->cullmaxs[2]);
- sv.worldmodel->TraceBox(sv.worldmodel, 0, &trace, sv_writeentitiestoclient_testeye, sv_writeentitiestoclient_testeye, testorigin, testorigin, SUPERCONTENTS_SOLID);
+ sv.worldmodel->TraceBox(sv.worldmodel, 0, &trace, sv_writeentitiestoclient_testeye, vec3_origin, vec3_origin, testorigin, SUPERCONTENTS_SOLID);
if (trace.fraction == 1 || BoxesOverlap(trace.endpos, trace.endpos, ed->priv.server->cullmins, ed->priv.server->cullmaxs))
sv_writeentitiestoclient_client->visibletime[s->number] = realtime + 1;
}
int items;
prvm_eval_t *val;
vec3_t punchvector;
- unsigned char viewzoom;
+ int viewzoom;
const char *s;
//
{
other = PRVM_PROG_TO_EDICT(ent->fields.server->dmg_inflictor);
MSG_WriteByte (msg, svc_damage);
- MSG_WriteByte (msg, ent->fields.server->dmg_save);
- MSG_WriteByte (msg, ent->fields.server->dmg_take);
+ MSG_WriteByte (msg, (int)ent->fields.server->dmg_save);
+ MSG_WriteByte (msg, (int)ent->fields.server->dmg_take);
for (i=0 ; i<3 ; i++)
MSG_WriteCoord (msg, other->fields.server->origin[i] + 0.5*(other->fields.server->mins[i] + other->fields.server->maxs[i]), sv.protocol);
viewzoom = 255;
if ((val = PRVM_GETEDICTFIELDVALUE(ent, eval_viewzoom)))
- viewzoom = val->_float * 255.0f;
+ viewzoom = (int)(val->_float * 255.0f);
if (viewzoom == 0)
viewzoom = 255;
}
memset(stats, 0, sizeof(int[MAX_CL_STATS]));
- stats[STAT_VIEWHEIGHT] = ent->fields.server->view_ofs[2];
+ stats[STAT_VIEWHEIGHT] = (int)ent->fields.server->view_ofs[2];
stats[STAT_ITEMS] = items;
- stats[STAT_WEAPONFRAME] = ent->fields.server->weaponframe;
- stats[STAT_ARMOR] = ent->fields.server->armorvalue;
+ stats[STAT_WEAPONFRAME] = (int)ent->fields.server->weaponframe;
+ stats[STAT_ARMOR] = (int)ent->fields.server->armorvalue;
stats[STAT_WEAPON] = client->weaponmodelindex;
- stats[STAT_HEALTH] = ent->fields.server->health;
- stats[STAT_AMMO] = ent->fields.server->currentammo;
- stats[STAT_SHELLS] = ent->fields.server->ammo_shells;
- stats[STAT_NAILS] = ent->fields.server->ammo_nails;
- stats[STAT_ROCKETS] = ent->fields.server->ammo_rockets;
- stats[STAT_CELLS] = ent->fields.server->ammo_cells;
- stats[STAT_ACTIVEWEAPON] = ent->fields.server->weapon;
+ stats[STAT_HEALTH] = (int)ent->fields.server->health;
+ stats[STAT_AMMO] = (int)ent->fields.server->currentammo;
+ stats[STAT_SHELLS] = (int)ent->fields.server->ammo_shells;
+ stats[STAT_NAILS] = (int)ent->fields.server->ammo_nails;
+ stats[STAT_ROCKETS] = (int)ent->fields.server->ammo_rockets;
+ stats[STAT_CELLS] = (int)ent->fields.server->ammo_cells;
+ stats[STAT_ACTIVEWEAPON] = (int)ent->fields.server->weapon;
stats[STAT_VIEWZOOM] = viewzoom;
// the QC bumps these itself by sending svc_'s, so we have to keep them
// zero or they'll be corrected by the engine
MSG_WriteChar (msg, stats[STAT_VIEWHEIGHT]);
if (bits & SU_IDEALPITCH)
- MSG_WriteChar (msg, ent->fields.server->idealpitch);
+ MSG_WriteChar (msg, (int)ent->fields.server->idealpitch);
for (i=0 ; i<3 ; i++)
{
if (bits & (SU_PUNCH1<<i))
{
if (sv.protocol == PROTOCOL_QUAKE || sv.protocol == PROTOCOL_QUAKEDP || sv.protocol == PROTOCOL_NEHAHRAMOVIE)
- MSG_WriteChar(msg, ent->fields.server->punchangle[i]);
+ MSG_WriteChar(msg, (int)ent->fields.server->punchangle[i]);
else
MSG_WriteAngle16i(msg, ent->fields.server->punchangle[i]);
}
if (bits & (SU_VELOCITY1<<i))
{
if (sv.protocol == PROTOCOL_QUAKE || sv.protocol == PROTOCOL_DARKPLACES1 || sv.protocol == PROTOCOL_DARKPLACES2 || sv.protocol == PROTOCOL_DARKPLACES3 || sv.protocol == PROTOCOL_DARKPLACES4)
- MSG_WriteChar(msg, ent->fields.server->velocity[i] * (1.0f / 16.0f));
+ MSG_WriteChar(msg, (int)(ent->fields.server->velocity[i] * (1.0f / 16.0f)));
else
MSG_WriteCoord32f(msg, ent->fields.server->velocity[i]);
}
MSG_WriteShort (msg, stats[STAT_CELLS]);
MSG_WriteShort (msg, stats[STAT_ACTIVEWEAPON]);
if (bits & SU_VIEWZOOM)
- MSG_WriteShort (msg, min(stats[STAT_VIEWZOOM], 65535));
+ MSG_WriteShort (msg, bound(0, stats[STAT_VIEWZOOM], 65535));
}
else if (sv.protocol == PROTOCOL_QUAKE || sv.protocol == PROTOCOL_QUAKEDP || sv.protocol == PROTOCOL_NEHAHRAMOVIE || sv.protocol == PROTOCOL_DARKPLACES1 || sv.protocol == PROTOCOL_DARKPLACES2 || sv.protocol == PROTOCOL_DARKPLACES3 || sv.protocol == PROTOCOL_DARKPLACES4)
{
if (bits & SU_VIEWZOOM)
{
if (sv.protocol == PROTOCOL_DARKPLACES2 || sv.protocol == PROTOCOL_DARKPLACES3 || sv.protocol == PROTOCOL_DARKPLACES4)
- MSG_WriteByte (msg, min(stats[STAT_VIEWZOOM], 255));
+ MSG_WriteByte (msg, bound(0, stats[STAT_VIEWZOOM], 255));
else
- MSG_WriteShort (msg, min(stats[STAT_VIEWZOOM], 65535));
+ MSG_WriteShort (msg, bound(0, stats[STAT_VIEWZOOM], 65535));
}
}
}
// create entity baseline
VectorCopy (svent->fields.server->origin, svent->priv.server->baseline.origin);
VectorCopy (svent->fields.server->angles, svent->priv.server->baseline.angles);
- svent->priv.server->baseline.frame = svent->fields.server->frame;
- svent->priv.server->baseline.skin = svent->fields.server->skin;
+ svent->priv.server->baseline.frame = (int)svent->fields.server->frame;
+ svent->priv.server->baseline.skin = (int)svent->fields.server->skin;
if (entnum > 0 && entnum <= svs.maxclients)
{
svent->priv.server->baseline.colormap = entnum;
else
{
svent->priv.server->baseline.colormap = 0;
- svent->priv.server->baseline.modelindex = svent->fields.server->modelindex;
+ svent->priv.server->baseline.modelindex = (int)svent->fields.server->modelindex;
}
large = false;
{
int i, j;
- svs.serverflags = prog->globals.server->serverflags;
+ svs.serverflags = (int)prog->globals.server->serverflags;
for (i = 0, host_client = svs.clients;i < svs.maxclients;i++, host_client++)
{
//
if (sv.active)
{
- // Tell all the clients that the server is changing levels
- MSG_WriteByte(&sv.reliable_datagram, svc_stufftext);
- MSG_WriteString(&sv.reliable_datagram, "reconnect\n");
+ client_t *client;
+ for (i = 0, client = svs.clients;i < svs.maxclients;i++, client++)
+ {
+ if (client->netconnection)
+ {
+ MSG_WriteByte(&client->netconnection->message, svc_stufftext);
+ MSG_WriteString(&client->netconnection->message, "reconnect\n");
+ }
+ }
}
else
{
//
// set up the new server
//
- Host_ClearMemory ();
-
memset (&sv, 0, sizeof(sv));
+ // if running a local client, make sure it doesn't try to access the last
+ // level's data which is no longer valiud
+ cls.signon = 0;
SV_VM_Setup();
}
// load replacement entity file if found
- entities = NULL;
- if (sv_entpatch.integer)
- entities = (char *)FS_LoadFile(va("maps/%s.ent", sv.name), tempmempool, true, NULL);
- if (entities)
+ if (sv_entpatch.integer && (entities = (char *)FS_LoadFile(va("maps/%s.ent", sv.name), tempmempool, true, NULL)))
{
Con_Printf("Loaded maps/%s.ent\n", sv.name);
PRVM_ED_LoadFromFile (entities);
// run two frames to allow everything to settle
for (i = 0;i < 2;i++)
{
- sv.frametime = host_frametime = 0.1;
+ sv.frametime = 0.1;
SV_Physics ();
}
int eval_SendEntity;
int eval_Version;
int eval_customizeentityforclient;
+int eval_dphitcontentsmask;
+
+int gval_trace_dpstartcontents;
+int gval_trace_dphitcontents;
+int gval_trace_dphitq3surfaceflags;
+int gval_trace_dphittexturename;
mfunction_t *SV_PlayerPhysicsQC;
mfunction_t *EndFrameQC;
eval_SendEntity = PRVM_ED_FindFieldOffset("SendEntity");
eval_Version = PRVM_ED_FindFieldOffset("Version");
eval_customizeentityforclient = PRVM_ED_FindFieldOffset("customizeentityforclient");
+ eval_dphitcontentsmask = PRVM_ED_FindFieldOffset("dphitcontentsmask");
// LordHavoc: allowing QuakeC to override the player movement code
SV_PlayerPhysicsQC = PRVM_ED_FindFunction ("SV_PlayerPhysics");
SV_InitCmd = PRVM_G_STRING(PRVM_ED_FindGlobal("SV_InitCmd")->ofs);
else
SV_InitCmd = NULL;
+
+ gval_trace_dpstartcontents = PRVM_ED_FindGlobalOffset("trace_dpstartcontents");
+ gval_trace_dphitcontents = PRVM_ED_FindGlobalOffset("trace_dphitcontents");
+ gval_trace_dphitq3surfaceflags = PRVM_ED_FindGlobalOffset("trace_dphitq3surfaceflags");
+ gval_trace_dphittexturename = PRVM_ED_FindGlobalOffset("trace_dphittexturename");
}
#define REQFIELDS (sizeof(reqfields) / sizeof(prvm_required_field_t))