43#define MOVE_EPSILON 0.01
107 int i, bodysupercontents;
113 vec3_t touchmins, touchmaxs;
115 vec3_t clipboxmins, clipboxmaxs;
117 vec3_t clipmins2, clipmaxs2;
136#if COLLISIONPARANOID >= 3
137 Con_Printf(
"move(%f %f %f)", clipstart[0], clipstart[1], clipstart[2]);
151 for (
i = 0;
i < 3;
i++)
159 for (
i = 0;
i < 3;
i++)
161 clipboxmins[
i] =
min(clipstart[
i], cliptrace.
endpos[
i]) + clipmins2[
i] - 1;
162 clipboxmaxs[
i] =
max(clipstart[
i], cliptrace.
endpos[
i]) + clipmaxs2[
i] + 1;
168 clipboxmins[0] = clipboxmins[1] = clipboxmins[2] = (
vec_t)-999999999;
169 clipboxmaxs[0] = clipboxmaxs[1] = clipboxmaxs[2] = (
vec_t)999999999;
173 if (passedict == prog->
edicts)
192 for (
i = 0;
i < numtouchedicts;
i++)
194 touch = touchedicts[
i];
204 if (passedict == touch)
207 if (traceowner == touch)
230 Matrix4x4_CreateFromQuakeEntity(&matrix,
PRVM_serveredictvector(touch,
origin)[0],
PRVM_serveredictvector(touch,
origin)[1],
PRVM_serveredictvector(touch,
origin)[2], pitchsign *
PRVM_serveredictvector(touch,
angles)[0],
PRVM_serveredictvector(touch,
angles)[1],
PRVM_serveredictvector(touch,
angles)[2], 1);
240 Collision_ClipToGenericEntity(&trace,
model, touch->
priv.
server->frameblend, &touch->
priv.
server->skeleton, touchmins, touchmaxs, bodysupercontents, &matrix, &imatrix, clipstart, clipmins2, clipmaxs2, clipstart, hitsupercontentsmask, skipsupercontentsmask, skipmaterialflagsmask, 0.0f);
242 Collision_ClipPointToGenericEntity(&trace,
model, touch->
priv.
server->frameblend, &touch->
priv.
server->skeleton, touchmins, touchmaxs, bodysupercontents, &matrix, &imatrix, clipstart, hitsupercontentsmask, skipsupercontentsmask, skipmaterialflagsmask);
259 int i, bodysupercontents;
265 vec3_t touchmins, touchmaxs;
267 vec3_t clipboxmins, clipboxmaxs;
269 vec3_t clipmins2, clipmaxs2;
271 vec3_t clipstart, clipend;
283 return SV_TracePoint(start,
type, passedict, hitsupercontentsmask, skipsupercontentsmask, skipmaterialflagsmask);
291#if COLLISIONPARANOID >= 3
292 Con_Printf(
"move(%f %f %f,%f %f %f)", clipstart[0], clipstart[1], clipstart[2], clipend[0], clipend[1], clipend[2]);
306 for (
i = 0;
i < 3;
i++)
314 for (
i = 0;
i < 3;
i++)
316 clipboxmins[
i] =
min(clipstart[
i], cliptrace.
endpos[
i]) + clipmins2[
i] - 1;
317 clipboxmaxs[
i] =
max(clipstart[
i], cliptrace.
endpos[
i]) + clipmaxs2[
i] + 1;
323 clipboxmins[0] = clipboxmins[1] = clipboxmins[2] = (
vec_t)-999999999;
324 clipboxmaxs[0] = clipboxmaxs[1] = clipboxmaxs[2] = (
vec_t)999999999;
328 if (passedict == prog->
edicts)
347 for (
i = 0;
i < numtouchedicts;
i++)
349 touch = touchedicts[
i];
359 if (passedict == touch)
362 if (traceowner == touch)
385 Matrix4x4_CreateFromQuakeEntity(&matrix,
PRVM_serveredictvector(touch,
origin)[0],
PRVM_serveredictvector(touch,
origin)[1],
PRVM_serveredictvector(touch,
origin)[2], pitchsign *
PRVM_serveredictvector(touch,
angles)[0],
PRVM_serveredictvector(touch,
angles)[1],
PRVM_serveredictvector(touch,
angles)[2], 1);
395 Collision_ClipToGenericEntity(&trace,
model, touch->
priv.
server->frameblend, &touch->
priv.
server->skeleton, touchmins, touchmaxs, bodysupercontents, &matrix, &imatrix, clipstart, clipmins2, clipmaxs2, clipend, hitsupercontentsmask, skipsupercontentsmask, skipmaterialflagsmask, extend);
397 Collision_ClipLineToGenericEntity(&trace,
model, touch->
priv.
server->frameblend, &touch->
priv.
server->skeleton, touchmins, touchmaxs, bodysupercontents, &matrix, &imatrix, clipstart, clipend, hitsupercontentsmask, skipsupercontentsmask, skipmaterialflagsmask, extend,
false);
411#if COLLISIONPARANOID >= 1
418 vec3_t hullmins, hullmaxs;
419 int i, bodysupercontents;
426 vec3_t touchmins, touchmaxs;
428 vec3_t clipboxmins, clipboxmaxs;
430 vec3_t clipmins, clipmaxs;
432 vec3_t clipmins2, clipmaxs2;
434 vec3_t clipstart, clipend;
447 vec3_t shiftstart, shiftend;
451 trace =
SV_TracePoint(shiftstart,
type, passedict, hitsupercontentsmask, skipsupercontentsmask, skipmaterialflagsmask);
453 trace =
SV_TraceLine(shiftstart, shiftend,
type, passedict, hitsupercontentsmask, skipsupercontentsmask, skipmaterialflagsmask, extend);
464#if COLLISIONPARANOID >= 3
465 Con_Printf(
"move(%f %f %f,%f %f %f)", clipstart[0], clipstart[1], clipstart[2], clipend[0], clipend[1], clipend[2]);
469 Collision_ClipToWorld(&cliptrace,
sv.
worldmodel, clipstart, clipmins, clipmaxs, clipend, hitsupercontentsmask, skipsupercontentsmask, skipmaterialflagsmask, extend);
479 for (
i = 0;
i < 3;
i++)
496 for (
i = 0;
i < 3;
i++)
498 clipboxmins[
i] =
min(clipstart[
i], cliptrace.
endpos[
i]) +
min(hullmins[
i], clipmins2[
i]) - 1;
499 clipboxmaxs[
i] =
max(clipstart[
i], cliptrace.
endpos[
i]) +
max(hullmaxs[
i], clipmaxs2[
i]) + 1;
505 clipboxmins[0] = clipboxmins[1] = clipboxmins[2] = (
vec_t)-999999999;
506 clipboxmaxs[0] = clipboxmaxs[1] = clipboxmaxs[2] = (
vec_t)999999999;
510 if (passedict == prog->
edicts)
531 for (
i = 0;
i < numtouchedicts;
i++)
533 touch = touchedicts[
i];
543 if (passedict == touch)
546 if (traceowner == touch)
569 Matrix4x4_CreateFromQuakeEntity(&matrix,
PRVM_serveredictvector(touch,
origin)[0],
PRVM_serveredictvector(touch,
origin)[1],
PRVM_serveredictvector(touch,
origin)[2], pitchsign *
PRVM_serveredictvector(touch,
angles)[0],
PRVM_serveredictvector(touch,
angles)[1],
PRVM_serveredictvector(touch,
angles)[2], 1);
579 Collision_ClipToGenericEntity(&trace,
model, touch->
priv.
server->frameblend, &touch->
priv.
server->skeleton, touchmins, touchmaxs, bodysupercontents, &matrix, &imatrix, clipstart, clipmins2, clipmaxs2, clipend, hitsupercontentsmask, skipsupercontentsmask, skipmaterialflagsmask, extend);
581 Collision_ClipToGenericEntity(&trace,
model, touch->
priv.
server->frameblend, &touch->
priv.
server->skeleton, touchmins, touchmaxs, bodysupercontents, &matrix, &imatrix, clipstart, clipmins, clipmaxs, clipend, hitsupercontentsmask, skipsupercontentsmask, skipmaterialflagsmask, extend);
590#if COLLISIONPARANOID >= 1
597 trace = SV_TraceBox_(start,
mins,
maxs, end,
type, passedict, hitsupercontentsmask, skipsupercontentsmask, skipmaterialflagsmask, extend);
601 endstuck = SV_TraceBox_(temp,
mins,
maxs, temp,
type, passedict, hitsupercontentsmask, skipsupercontentsmask, skipmaterialflagsmask, extend).startsolid;
602#if COLLISIONPARANOID < 3
605 Con_Printf(
"%s{e%i:%f %f %f:%f %f %f:%f:%f %f %f%s%s}\n", (trace.
startsolid || endstuck) ?
"^3" :
"", passedict ? (
int)(passedict - prog->
edicts) : -1,
PRVM_serveredictvector(passedict,
origin)[0],
PRVM_serveredictvector(passedict,
origin)[1],
PRVM_serveredictvector(passedict,
origin)[2], end[0] -
PRVM_serveredictvector(passedict,
origin)[0], end[1] -
PRVM_serveredictvector(passedict,
origin)[1], end[2] -
PRVM_serveredictvector(passedict,
origin)[2], trace.
fraction, trace.
endpos[0] -
PRVM_serveredictvector(passedict,
origin)[0], trace.
endpos[1] -
PRVM_serveredictvector(passedict,
origin)[1], trace.
endpos[2] -
PRVM_serveredictvector(passedict,
origin)[2], trace.
startsolid ?
" startstuck" :
"", endstuck ?
" endstuck" :
"");
614 int supercontents = 0;
633 return supercontents;
643 for (
i = 0;
i < numtouchedicts;
i++)
645 touch = touchedicts[
i];
655 Matrix4x4_CreateFromQuakeEntity(&matrix,
PRVM_serveredictvector(touch,
origin)[0],
PRVM_serveredictvector(touch,
origin)[1],
PRVM_serveredictvector(touch,
origin)[2],
PRVM_serveredictvector(touch,
angles)[0],
PRVM_serveredictvector(touch,
angles)[1],
PRVM_serveredictvector(touch,
angles)[2], 1);
662 return supercontents;
676 vec3_t paddedmins, paddedmaxs;
677 if (maxedicts < 1 || resultedicts ==
NULL)
686 int numresultedicts = 0;
689 for (edictindex = 1;edictindex < prog->
num_edicts;edictindex++)
694 resultedicts[numresultedicts++] = ed;
695 if (numresultedicts == maxedicts)
699 return numresultedicts;
730 int i, numtouchedicts, old_self, old_other;
755 for (
i = 0;
i < numtouchedicts;
i++)
757 touch = touchedicts[
i];
776 if(rotatedmins[0] > u[0]) { rotatedmins[0] = u[0]; }
if(rotatedmins[1] > u[1]) { rotatedmins[1] = u[1]; }
if(rotatedmins[2] > u[2]) { rotatedmins[2] = u[2]; }
777 if(rotatedmaxs[0] < u[0]) { rotatedmaxs[0] = u[0]; }
if(rotatedmaxs[1] < u[1]) { rotatedmaxs[1] = u[1]; }
if(rotatedmaxs[2] < u[2]) { rotatedmaxs[2] = u[2]; }
779 if(rotatedmins[0] > u[0]) { rotatedmins[0] = u[0]; }
if(rotatedmins[1] > u[1]) { rotatedmins[1] = u[1]; }
if(rotatedmins[2] > u[2]) { rotatedmins[2] = u[2]; }
780 if(rotatedmaxs[0] < u[0]) { rotatedmaxs[0] = u[0]; }
if(rotatedmaxs[1] < u[1]) { rotatedmaxs[1] = u[1]; }
if(rotatedmaxs[2] < u[2]) { rotatedmaxs[2] = u[2]; }
782 if(rotatedmins[0] > u[0]) { rotatedmins[0] = u[0]; }
if(rotatedmins[1] > u[1]) { rotatedmins[1] = u[1]; }
if(rotatedmins[2] > u[2]) { rotatedmins[2] = u[2]; }
783 if(rotatedmaxs[0] < u[0]) { rotatedmaxs[0] = u[0]; }
if(rotatedmaxs[1] < u[1]) { rotatedmaxs[1] = u[1]; }
if(rotatedmaxs[2] < u[2]) { rotatedmaxs[2] = u[2]; }
785 if(rotatedmins[0] > u[0]) { rotatedmins[0] = u[0]; }
if(rotatedmins[1] > u[1]) { rotatedmins[1] = u[1]; }
if(rotatedmins[2] > u[2]) { rotatedmins[2] = u[2]; }
786 if(rotatedmaxs[0] < u[0]) { rotatedmaxs[0] = u[0]; }
if(rotatedmaxs[1] < u[1]) { rotatedmaxs[1] = u[1]; }
if(rotatedmaxs[2] < u[2]) { rotatedmaxs[2] = u[2]; }
788 if(rotatedmins[0] > u[0]) { rotatedmins[0] = u[0]; }
if(rotatedmins[1] > u[1]) { rotatedmins[1] = u[1]; }
if(rotatedmins[2] > u[2]) { rotatedmins[2] = u[2]; }
789 if(rotatedmaxs[0] < u[0]) { rotatedmaxs[0] = u[0]; }
if(rotatedmaxs[1] < u[1]) { rotatedmaxs[1] = u[1]; }
if(rotatedmaxs[2] < u[2]) { rotatedmaxs[2] = u[2]; }
791 if(rotatedmins[0] > u[0]) { rotatedmins[0] = u[0]; }
if(rotatedmins[1] > u[1]) { rotatedmins[1] = u[1]; }
if(rotatedmins[2] > u[2]) { rotatedmins[2] = u[2]; }
792 if(rotatedmaxs[0] < u[0]) { rotatedmaxs[0] = u[0]; }
if(rotatedmaxs[1] < u[1]) { rotatedmaxs[1] = u[1]; }
if(rotatedmaxs[2] < u[2]) { rotatedmaxs[2] = u[2]; }
794 if(rotatedmins[0] > u[0]) { rotatedmins[0] = u[0]; }
if(rotatedmins[1] > u[1]) { rotatedmins[1] = u[1]; }
if(rotatedmins[2] > u[2]) { rotatedmins[2] = u[2]; }
795 if(rotatedmaxs[0] < u[0]) { rotatedmaxs[0] = u[0]; }
if(rotatedmaxs[1] < u[1]) { rotatedmaxs[1] = u[1]; }
if(rotatedmaxs[2] < u[2]) { rotatedmaxs[2] = u[2]; }
846 if (!
model->TraceBox)
929 int bValidFunctionCall;
932 bValidFunctionCall =
false;
940 bValidFunctionCall =
true;
956 return bValidFunctionCall;
974 for (
i=0 ;
i<3 ;
i++)
1025 for (iterations = 0;iterations < 128 && !ent->
free;iterations++)
1053 int restorevm_tempstringsbuf_cursize;
1054 int old_self, old_other;
1119#define STOP_EPSILON 0.1
1128 for (
i = 0;
i < 3;
i++)
1149#define MAX_CLIP_PLANES 5
1150static int SV_FlyMove (
prvm_edict_t *ent,
float time,
qbool applygravity,
float *stepnormal,
int hitsupercontentsmask,
int skipsupercontentsmask,
int skipmaterialflagsmask,
float stepheight)
1153 unsigned int i, j, numplanes, blocked, bumpcount;
1154 float d, time_left, gravity;
1156 prvm_vec3_t primal_velocity, original_velocity, new_velocity, restore_velocity;
1229 else if (stepheight)
1331 for (
i = 0;
i < numplanes;
i++)
1333 ClipVelocity(original_velocity, planes[
i], new_velocity, 1);
1334 for (j = 0;j < numplanes;j++)
1436 vec3_t stuckmins, stuckmaxs;
1437 vec3_t goodmins, goodmaxs;
1446 for (bump = 0;bump < 6;bump++)
1448 int coord = 2-(bump >> 1);
1450 int dir = (bump & 1);
1453 for(subbump = 0; ; ++subbump)
1459 testorigin[coord] += stuckmaxs[coord] - goodmaxs[coord];
1464 testorigin[coord] += stuckmins[coord] - goodmins[coord];
1496 goodmaxs[coord] = stuckmaxs[coord];
1501 goodmins[coord] = stuckmins[coord];
1569 if(
SV_TraceBox(
PRVM_serveredictvector(ent,
origin),
PRVM_serveredictvector(ent,
mins),
PRVM_serveredictvector(ent,
maxs),
PRVM_serveredictvector(ent,
origin),
type, ent,
SV_GenericHitSuperContentsMask(ent), 0).startsolid)
1597 int pusherowner, pusherprog;
1600 float savesolid, movetime2, pushltime;
1601 vec3_t mins,
maxs, move, move1, moveangle, pushorig, pushang,
a,
forward, left,
up, org, pushermins, pushermaxs, checkorigin, checkmins, checkmaxs;
1603 int numcheckentities;
1607 matrix4x4_t pusherfinalmatrix, pusherfinalimatrix;
1608 static unsigned short moved_edicts[
MAX_EDICTS];
1652 movetime2 = movetime;
1655 if (moveangle[0] || moveangle[2])
1657 for (
i = 0;
i < 3;
i++)
1671 else if (moveangle[1])
1673 for (
i = 0;
i < 3;
i++)
1689 for (
i = 0;
i < 3;
i++)
1719 Matrix4x4_CreateFromQuakeEntity(&pusherfinalmatrix,
PRVM_serveredictvector(pusher,
origin)[0],
PRVM_serveredictvector(pusher,
origin)[1],
PRVM_serveredictvector(pusher,
origin)[2],
PRVM_serveredictvector(pusher,
angles)[0],
PRVM_serveredictvector(pusher,
angles)[1],
PRVM_serveredictvector(pusher,
angles)[2], 1);
1728 numcheckentities = 0;
1731 for (e = 0;e < numcheckentities;e++)
1756 check->
priv.
server->waterposition_forceupdate =
true;
1770 Collision_ClipToGenericEntity(&trace, pushermodel, pusher->
priv.
server->frameblend, &pusher->
priv.
server->skeleton, pushermins, pushermaxs,
SUPERCONTENTS_BODY, &pusherfinalmatrix, &pusherfinalimatrix, checkorigin, checkmins, checkmaxs, checkorigin, checkcontents, 0, 0,
collision_extendmovelength.
value);
1837 Collision_ClipToGenericEntity(&trace, pushermodel, pusher->
priv.
server->frameblend, &pusher->
priv.
server->skeleton, pushermins, pushermaxs,
SUPERCONTENTS_BODY, &pusherfinalmatrix, &pusherfinalimatrix, checkorigin, checkmins, checkmaxs, checkorigin, checkcontents, 0, 0,
collision_extendmovelength.
value);
1878 for (
i = 0;
i < num_moved;
i++)
1976 Con_Printf(
"NudgeOutOfSolid returned a value outside its enum.\n");
2001 Con_Printf(
"UnstickEntityReturnOffset returned a value outside its enum.\n");
2016 int nNativeContents;
2104 for (
i=0 ;
i<8 ;
i++)
2109 case 0:
dir[0] = 2;
dir[1] = 0;
break;
2110 case 1:
dir[0] = 0;
dir[1] = 2;
break;
2111 case 2:
dir[0] = -2;
dir[1] = 0;
break;
2112 case 3:
dir[0] = 0;
dir[1] = -2;
break;
2113 case 4:
dir[0] = 2;
dir[1] = 2;
break;
2114 case 5:
dir[0] = -2;
dir[1] = 2;
break;
2115 case 6:
dir[0] = 2;
dir[1] = -2;
break;
2116 case 7:
dir[0] = -2;
dir[1] = -2;
break;
2158 int originalmove_flags;
2159 int originalmove_groundentity;
2161 int skipsupercontentsmask = 0;
2162 int skipmaterialflagsmask = 0;
2164 vec3_t upmove, downmove, start_origin, start_velocity, stepnormal, originalmove_origin, originalmove_velocity, entmins, entmaxs;
2239 if (
fabs(start_velocity[0]) < 0.03125 &&
fabs(start_velocity[1]) < 0.03125)
2270 clip =
SV_FlyMove (ent,
sv.
frametime, applygravity, stepnormal, hitsupercontentsmask, skipsupercontentsmask, skipmaterialflagsmask, 0);
2467 float d, ent_gravity;
2500 ent->
priv.
server->suspendedinairflag =
false;
2512 for (bump = 0;bump < MAX_CLIP_PLANES && movetime > 0;bump++)
2639 ent->
priv.
server->waterposition_forceupdate =
true;
2675 ent->
priv.
server->waterposition_forceupdate =
true;
2725 ent->
priv.
server->waterposition_forceupdate =
false;
2963 ent->
priv.
server->waterposition_forceupdate =
false;
3083 if (!ent->priv.server->move && !ent->free)
#define SUPERCONTENTS_BODY
#define SUPERCONTENTS_MONSTERCLIP
#define SUPERCONTENTS_SOLID
#define SUPERCONTENTS_LIQUIDSMASK
#define SUPERCONTENTS_CORPSE
#define SUPERCONTENTS_PLAYERCLIP
void Collision_ClipToWorld(trace_t *trace, model_t *model, const vec3_t tstart, const vec3_t mins, const vec3_t maxs, const vec3_t tend, int hitsupercontentsmask, int skipsupercontentsmask, int skipmaterialflagsmask, float extend)
void Collision_ClipLineToWorld(trace_t *trace, model_t *model, const vec3_t tstart, const vec3_t tend, int hitsupercontentsmask, int skipsupercontentsmask, int skipmaterialflagsmask, float extend, qbool hitsurfaces)
void Collision_CombineTraces(trace_t *cliptrace, const trace_t *trace, void *touch, qbool isbmodel)
void Collision_ClipLineToGenericEntity(trace_t *trace, model_t *model, const frameblend_t *frameblend, const skeleton_t *skeleton, const vec3_t bodymins, const vec3_t bodymaxs, int bodysupercontents, matrix4x4_t *matrix, matrix4x4_t *inversematrix, const vec3_t tstart, const vec3_t tend, int hitsupercontentsmask, int skipsupercontentsmask, int skipmaterialflagsmask, float extend, qbool hitsurfaces)
void Collision_ClipToGenericEntity(trace_t *trace, model_t *model, const frameblend_t *frameblend, const skeleton_t *skeleton, const vec3_t bodymins, const vec3_t bodymaxs, int bodysupercontents, matrix4x4_t *matrix, matrix4x4_t *inversematrix, const vec3_t tstart, const vec3_t mins, const vec3_t maxs, const vec3_t tend, int hitsupercontentsmask, int skipsupercontentsmask, int skipmaterialflagsmask, float extend)
cvar_t collision_extendmovelength
void Collision_ClipPointToWorld(trace_t *trace, model_t *model, const vec3_t start, int hitsupercontentsmask, int skipsupercontentsmask, int skipmaterialflagsmask)
void Collision_ClipPointToGenericEntity(trace_t *trace, model_t *model, const frameblend_t *frameblend, const skeleton_t *skeleton, const vec3_t bodymins, const vec3_t bodymaxs, int bodysupercontents, matrix4x4_t *matrix, matrix4x4_t *inversematrix, const vec3_t start, int hitsupercontentsmask, int skipsupercontentsmask, int skipmaterialflagsmask)
@ GAME_TENEBRAE
full of evil hackery
void Con_DPrintf(const char *fmt,...)
A Con_Printf that only shows up if the "developer" cvar is set.
void Con_Printf(const char *fmt,...)
Prints to all appropriate console targets.
void Con_DPrint(const char *msg)
A Con_Print that only shows up if the "developer" cvar is set.
float trace_dphitcontents
float trace_dpstartcontents
string trace_dphittexturename
float trace_dphitq3surfaceflags
vector trace_plane_normal
static int(ZEXPORT *qz_inflate)(z_stream *strm
GLuint GLuint GLintptr offset
void AngleVectorsFLU(const vec3_t angles, vec3_t forward, vec3_t left, vec3_t up)
LadyHavoc: proper matrix version of AngleVectors.
void AngleVectors(const vec3_t angles, vec3_t forward, vec3_t right, vec3_t up)
#define VectorLerp(v1, lerp, v2, out)
#define VectorNegate(a, b)
#define BoxesOverlap(a, b, c, d)
#define VectorNormalize(v)
#define bound(min, num, max)
#define VectorSet(vec, x, y, z)
#define VectorSubtract(a, b, out)
#define CrossProduct(a, b, out)
#define VectorCompare(a, b)
#define VectorCopy(in, out)
#define VectorScale(in, scale, out)
#define VectorAdd(a, b, out)
#define VectorMA(a, scale, b, out)
void Matrix4x4_Transform(const matrix4x4_t *in, const float v[3], float out[3])
void Matrix4x4_CreateTranslate(matrix4x4_t *out, double x, double y, double z)
void Matrix4x4_CreateFromQuakeEntity(matrix4x4_t *out, double x, double y, double z, double pitch, double yaw, double roll, double scale)
void Matrix4x4_Invert_Simple(matrix4x4_t *out, const matrix4x4_t *in1)
int Mod_Q1BSP_NativeContentsFromSuperContents(int supercontents)
unstickresult_t PHYS_UnstickEntityReturnOffset(prvm_prog_t *prog, prvm_edict_t *ent, vec3_t offset)
unstickresult_t PHYS_NudgeOutOfSolid(prvm_prog_t *prog, prvm_edict_t *ent)
qbool PHYS_TestEntityPosition(prvm_prog_t *prog, prvm_edict_t *ent, vec3_t offset)
@ UNSTICK_GOOD
didn't need to be unstuck
#define PRVM_serveredictvector(ed, fieldname)
#define PRVM_serverglobaledict(fieldname)
#define PRVM_serveredictedict(ed, fieldname)
void VM_UpdateEdictSkeleton(prvm_prog_t *prog, prvm_edict_t *ed, const struct model_s *edmodel, const struct frameblend_s *frameblend)
#define PRVM_EDICT_TO_PROG(e)
#define PRVM_EDICT_NUM(n)
#define PRVM_NEXT_EDICT(e)
const char * PRVM_GetString(prvm_prog_t *prog, int num)
#define PRVM_EDICT_MARK_SETORIGIN_CAUGHT
void VM_GenerateFrameGroupBlend(prvm_prog_t *prog, struct framegroupblend_s *framegroupblend, const prvm_edict_t *ed)
#define PRVM_NUM_FOR_EDICT(e)
void PRVM_GarbageCollection(prvm_prog_t *prog)
#define PRVM_PROG_TO_EDICT(n)
#define PRVM_serverglobalfloat(fieldname)
#define PRVM_serveredictfloat(ed, fieldname)
#define PRVM_serverfunction(funcname)
#define PRVM_serverglobalstring(fieldname)
#define PRVM_serveredictstring(ed, fieldname)
void VM_FrameBlendFromFrameGroupBlend(struct frameblend_s *frameblend, const struct framegroupblend_s *framegroupblend, const struct model_s *model, double curtime)
#define PRVM_serveredictfunction(ed, fieldname)
#define PRVM_EDICT_MARK_WAIT_FOR_SETORIGIN
#define PRVM_serverglobalvector(fieldname)
qbool PRVM_ED_CanAlloc(prvm_prog_t *prog, prvm_edict_t *e)
#define PFLAGS_FULLDYNAMIC
void VM_SetTraceGlobals(prvm_prog_t *prog, const trace_t *trace)
#define MAX_EDICTS
max number of objects in game world at once (32768 protocol limit)
#define MAX_MODELS
max number of models loaded at once (including during level transitions)
prvm_vec_t prvm_vec3_t[3]
#define MOVETYPE_PHYSICS
indicates this object is physics controlled
#define FL_WATERJUMP
player jumping out of water
cvar_t sv_gameplayfix_swiminbmodels
#define FL_MONSTER
movement is smoothed on the client side by step based interpolation
void SV_PlayerPhysics(void)
#define MOVETYPE_FAKEPUSH
tenebrae's push that doesn't push
cvar_t sv_gameplayfix_nudgeoutofsolid_separation
cvar_t sv_gameplayfix_delayprojectiles
cvar_t sv_gameplayfix_noairborncorpse_allowsuspendeditems
#define SOLID_BBOX
touch on edge, block
#define SOLID_SLIDEBOX
touch on edge, but not an onground
cvar_t sv_gameplayfix_consistentplayerprethink
#define MOVETYPE_TOSS
gravity
cvar_t sv_gameplayfix_easierwaterjump
cvar_t sv_areagrid_link_SOLID_NOT
cvar_t sv_gameplayfix_impactbeforeonground
cvar_t sv_gameplayfix_unstickplayers
cvar_t sv_gameplayfix_nudgeoutofsolid
void SV_StartSound(prvm_edict_t *entity, int channel, const char *sample, int volume, float attenuation, qbool reliable, float speed)
cvar_t sv_freezenonclients
#define MOVETYPE_WALK
gravity
#define SOLID_CORPSE
same as SOLID_BBOX, except it behaves as SOLID_NOT against SOLID_SLIDEBOX objects (players/monsters)
cvar_t sv_gameplayfix_nogravityonground
model_t * SV_GetModelByIndex(int modelindex)
#define MOVETYPE_NONE
never moves
#define MOVETYPE_FOLLOW
track movement of aiment
#define MOVETYPE_BOUNCEMISSILE
bounce w/o gravity
cvar_t sv_legacy_bbox_expand
cvar_t sv_sound_watersplash
cvar_t sv_gameplayfix_noairborncorpse
#define SOLID_NOT
no interaction with other objects
cvar_t sv_gameplayfix_nosquashentities
cvar_t sv_gameplayfix_gravityunaffectedbyticrate
cvar_t sv_gameplayfix_fixedcheckwatertransition
cvar_t sv_gameplayfix_slidemoveprojectiles
#define MOVETYPE_USER_FIRST
user defined movetypes
cvar_t sv_gameplayfix_upwardvelocityclearsongroundflag
model_t * SV_GetModelFromEdict(prvm_edict_t *ed)
#define MOVETYPE_FLY_WORLDONLY
like MOVETYPE_FLY, but uses MOVE_WORLDONLY for all its traces; objects of this movetype better be SOL...
server_static_t svs
persistant server info
cvar_t sv_gameplayfix_unstickentities
#define MOVETYPE_PUSH
no clip to world, push and crush
#define MOVETYPE_USER_LAST
cvar_t sv_gameplayfix_downtracesupportsongroundflag
#define MOVETYPE_STEP
gravity, special edge handling, special step based client side interpolation
cvar_t sv_gameplayfix_stepmultipletimes
#define SOLID_TRIGGER
touch on edge, but not blocking
#define MOVETYPE_FLYMISSILE
extra size to monsters
#define SOLID_BSP
bsp clip, touch on edge, block
cvar_t sv_gameplayfix_grenadebouncedownslopes
cvar_t sv_gameplayfix_stepdown
cvar_t sv_gameplayfix_multiplethinksperframe
float clmovement_inputtimeout
this is used by sv_clmovement_inputtimeout code
qbool begun
false = don't send datagrams
qbool fixangle_angles_set
prvm_edict_t * edict
PRVM_EDICT_NUM(clientnum+1)
int mark
mark for the leak detector
qbool free
true if this edict is unused
union prvm_edict_t::@29 priv
struct edict_engineprivate_s * server
FIXME: this server pointer really means world, not server (it is used by both server qc and client qc...
prvm_edict_private_t * required
int num_edicts
copies of some vars that were former read from sv
void(* ExecuteProgram)(struct prvm_prog_s *prog, func_t fnum, const char *errormessage)
pointer to one of the *VM_ExecuteProgram functions
sizebuf_t tempstringsbuf
buffer for storing all tempstrings created during one invocation of ExecuteProgram
struct client_s * clients
client slots
int maxclients
number of svs.clients slots (updated by maxplayers command)
world_t world
collision culling data
struct model_s * worldmodel
static void SV_Physics_Pusher(prvm_edict_t *ent)
static void SV_Physics_ClientEntity_PreThink(prvm_edict_t *ent)
trace_t SV_TracePoint(const vec3_t start, int type, prvm_edict_t *passedict, int hitsupercontentsmask, int skipsupercontentsmask, int skipmaterialflagsmask)
static qbool SV_CheckWater(prvm_edict_t *ent)
static void ClipVelocity(prvm_vec3_t in, vec3_t normal, prvm_vec3_t out, prvm_vec_t overbounce)
static void SV_WalkMove(prvm_edict_t *ent)
static qbool SV_Impact(prvm_edict_t *e1, trace_t *trace)
static qbool SV_RunThink(prvm_edict_t *ent)
static void SV_Physics_Step(prvm_edict_t *ent)
int SV_GenericHitSuperContentsMask(const prvm_edict_t *passedict)
calculates hitsupercontentsmask for a generic qc entity
void SV_Physics_Toss(prvm_edict_t *ent)
void SV_LinkEdict_TouchAreaGrid_Call(prvm_edict_t *touch, prvm_edict_t *ent)
static void SV_Physics_Follow(prvm_edict_t *ent)
trace_t SV_TraceLine(const vec3_t start, const vec3_t end, int type, prvm_edict_t *passedict, int hitsupercontentsmask, int skipsupercontentsmask, int skipmaterialflagsmask, float extend)
static void SV_Physics_ClientEntity_NoThink(prvm_edict_t *ent)
void SV_LinkEdict(prvm_edict_t *ent)
int SV_EntitiesInBox(const vec3_t mins, const vec3_t maxs, int maxedicts, prvm_edict_t **resultedicts)
static float SV_Gravity(prvm_edict_t *ent)
void SV_CheckVelocity(prvm_edict_t *ent)
static void SV_Physics_ClientEntity_PostThink(prvm_edict_t *ent)
int SV_GetPitchSign(prvm_prog_t *prog, prvm_edict_t *ent)
static void SV_CheckWaterTransition(prvm_edict_t *ent)
static int SV_FlyMove(prvm_edict_t *ent, float time, qbool applygravity, float *stepnormal, int hitsupercontentsmask, int skipsupercontentsmask, int skipmaterialflagsmask, float stepheight)
int SV_PointSuperContents(const vec3_t point)
static void SV_PushMove(prvm_edict_t *pusher, float movetime)
static int SV_CheckContentsTransition(prvm_edict_t *ent, const int nContents)
static qbool SV_NudgeOutOfSolid_PivotIsKnownGood(prvm_edict_t *ent, vec3_t pivot)
static qbool SV_PushEntity(trace_t *trace, prvm_edict_t *ent, vec3_t push, qbool dotouch, qbool checkstuck)
static void SV_Physics_ClientEntity(prvm_edict_t *ent)
static qbool SV_UnstickEntity(prvm_edict_t *ent)
static void SV_WallFriction(prvm_edict_t *ent, float *stepnormal)
trace_t SV_TraceBox(const vec3_t start, const vec3_t mins, const vec3_t maxs, const vec3_t end, int type, prvm_edict_t *passedict, int hitsupercontentsmask, int skipsupercontentsmask, int skipmaterialflagsmask, float extend)
traces a box move against worldmodel and all entities in the specified area
static void RotateBBox(const vec3_t mins, const vec3_t maxs, const vec3_t angles, vec3_t rotatedmins, vec3_t rotatedmaxs)
static void SV_Physics_Entity(prvm_edict_t *ent)
void SV_Physics_ClientMove(void)
void SV_LinkEdict_TouchAreaGrid(prvm_edict_t *ent)
int World_EntitiesInBox(world_t *world, const vec3_t requestmins, const vec3_t requestmaxs, int maxlist, prvm_edict_t **list)
void World_LinkEdict(world_t *world, prvm_edict_t *ent, const vec3_t mins, const vec3_t maxs, qbool link_solid_not)
void World_Physics_Frame(world_t *world, double frametime, double gravity)