mirror of
https://git.code.sf.net/p/quake/newtree
synced 2024-11-28 23:02:31 +00:00
now only svs is reverenced where it shouldn't be, and that's to set info
strings (skybox and *progs). skybox is easy to take care of (aditional parse functions), but I haven't yet decided what to do with *progs. Also, progs code needs a bit of a cleanup, but that will come later.
This commit is contained in:
parent
ff89f60c74
commit
2debf6f669
13 changed files with 160 additions and 135 deletions
|
@ -93,22 +93,22 @@ ddef_t *ED_FindField (struct progs_s *pr, char *name);
|
||||||
dfunction_t *ED_FindFunction (struct progs_s *pr, char *name);
|
dfunction_t *ED_FindFunction (struct progs_s *pr, char *name);
|
||||||
|
|
||||||
|
|
||||||
//define EDICT_NUM(p,n) ((edict_t *)(sv.edicts+ (n)*(p)->pr_edict_size))
|
//define EDICT_NUM(p,n) ((edict_t *)(*(p)->edicts+ (n)*(p)->pr_edict_size))
|
||||||
//define NUM_FOR_EDICT(p,e) (((byte *)(e) - sv.edicts)/(p)->pr_edict_size)
|
//define NUM_FOR_EDICT(p,e) (((byte *)(e) - *(p)->edicts)/(p)->pr_edict_size)
|
||||||
|
|
||||||
edict_t *EDICT_NUM(struct progs_s *pr, int n);
|
edict_t *EDICT_NUM(struct progs_s *pr, int n);
|
||||||
int NUM_FOR_EDICT(struct progs_s *pr, edict_t *e);
|
int NUM_FOR_EDICT(struct progs_s *pr, edict_t *e);
|
||||||
|
|
||||||
#define NEXT_EDICT(p,e) ((edict_t *)( (byte *)e + (p)->pr_edict_size))
|
#define NEXT_EDICT(p,e) ((edict_t *)( (byte *)e + (p)->pr_edict_size))
|
||||||
|
|
||||||
#define EDICT_TO_PROG(e) ((byte *)e - (byte *)sv.edicts)
|
#define EDICT_TO_PROG(p,e) ((byte *)e - (byte *)*(p)->edicts)
|
||||||
#define PROG_TO_EDICT(e) ((edict_t *)((byte *)sv.edicts + e))
|
#define PROG_TO_EDICT(p,e) ((edict_t *)((byte *)*(p)->edicts + e))
|
||||||
|
|
||||||
//============================================================================
|
//============================================================================
|
||||||
|
|
||||||
#define G_FLOAT(p,o) ((p)->pr_globals[o])
|
#define G_FLOAT(p,o) ((p)->pr_globals[o])
|
||||||
#define G_INT(p,o) (*(int *)&(p)->pr_globals[o])
|
#define G_INT(p,o) (*(int *)&(p)->pr_globals[o])
|
||||||
#define G_EDICT(p,o) ((edict_t *)((byte *)sv.edicts+ *(int *)&(p)->pr_globals[o]))
|
#define G_EDICT(p,o) ((edict_t *)((byte *)*(p)->edicts+ *(int *)&(p)->pr_globals[o]))
|
||||||
#define G_EDICTNUM(p,o) NUM_FOR_EDICT(p,G_EDICT(p, o))
|
#define G_EDICTNUM(p,o) NUM_FOR_EDICT(p,G_EDICT(p, o))
|
||||||
#define G_VECTOR(p,o) (&(p)->pr_globals[o])
|
#define G_VECTOR(p,o) (&(p)->pr_globals[o])
|
||||||
#define G_STRING(p,o) (PR_GetString(pr,*(string_t *)&(p)->pr_globals[o]))
|
#define G_STRING(p,o) (PR_GetString(pr,*(string_t *)&(p)->pr_globals[o]))
|
||||||
|
@ -137,6 +137,11 @@ void PR_RunError (struct progs_s *pr, char *error, ...) __attribute__((format(pr
|
||||||
|
|
||||||
void ED_PrintEdicts (struct progs_s *pr);
|
void ED_PrintEdicts (struct progs_s *pr);
|
||||||
void ED_PrintNum (struct progs_s *pr, int ent);
|
void ED_PrintNum (struct progs_s *pr, int ent);
|
||||||
|
void ED_Count (struct progs_s *pr);
|
||||||
|
void ED_PrintEdict_f (void);
|
||||||
|
void ED_PrintEdicts_f (void);
|
||||||
|
void ED_Count_f (void);
|
||||||
|
void PR_Profile (struct progs_s *pr);
|
||||||
|
|
||||||
eval_t *GetEdictFieldValue(struct progs_s *pr, edict_t *ed, char *field);
|
eval_t *GetEdictFieldValue(struct progs_s *pr, edict_t *ed, char *field);
|
||||||
|
|
||||||
|
@ -185,6 +190,11 @@ typedef struct progs_s {
|
||||||
|
|
||||||
int localstack[LOCALSTACK_SIZE];
|
int localstack[LOCALSTACK_SIZE];
|
||||||
int localstack_used;
|
int localstack_used;
|
||||||
|
|
||||||
|
edict_t **edicts;
|
||||||
|
int *num_edicts;
|
||||||
|
double *time;
|
||||||
|
int null_bad;
|
||||||
} progs_t;
|
} progs_t;
|
||||||
|
|
||||||
#endif // _PROGS_H
|
#endif // _PROGS_H
|
||||||
|
|
|
@ -404,6 +404,7 @@ extern progs_t sv_progs;
|
||||||
|
|
||||||
void SV_Error (char *error, ...) __attribute__((format(printf,1,2)));
|
void SV_Error (char *error, ...) __attribute__((format(printf,1,2)));
|
||||||
void SV_Init (void);
|
void SV_Init (void);
|
||||||
|
void SV_Progs_Init (void);
|
||||||
|
|
||||||
void Con_Printf (char *fmt, ...) __attribute__((format(printf,1,2)));
|
void Con_Printf (char *fmt, ...) __attribute__((format(printf,1,2)));
|
||||||
void Con_DPrintf (char *fmt, ...) __attribute__((format(printf,1,2)));
|
void Con_DPrintf (char *fmt, ...) __attribute__((format(printf,1,2)));
|
||||||
|
|
|
@ -38,7 +38,7 @@
|
||||||
#include "world.h"
|
#include "world.h"
|
||||||
#include "va.h"
|
#include "va.h"
|
||||||
|
|
||||||
#define RETURN_EDICT(p, e) (((int *)(p)->pr_globals)[OFS_RETURN] = EDICT_TO_PROG(e))
|
#define RETURN_EDICT(p, e) (((int *)(p)->pr_globals)[OFS_RETURN] = EDICT_TO_PROG(p, e))
|
||||||
#define RETURN_STRING(p, s) (((int *)(p)->pr_globals)[OFS_RETURN] = PR_SetString((p), s))
|
#define RETURN_STRING(p, s) (((int *)(p)->pr_globals)[OFS_RETURN] = PR_SetString((p), s))
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -81,7 +81,7 @@ PF_error (progs_t *pr)
|
||||||
s = PF_VarString (pr, 0);
|
s = PF_VarString (pr, 0);
|
||||||
Con_Printf ("======SERVER ERROR in %s:\n%s\n",
|
Con_Printf ("======SERVER ERROR in %s:\n%s\n",
|
||||||
PR_GetString (pr, pr->pr_xfunction->s_name), s);
|
PR_GetString (pr, pr->pr_xfunction->s_name), s);
|
||||||
ed = PROG_TO_EDICT (pr->pr_global_struct->self);
|
ed = PROG_TO_EDICT (pr, pr->pr_global_struct->self);
|
||||||
ED_Print (pr, ed);
|
ED_Print (pr, ed);
|
||||||
|
|
||||||
SV_Error ("Program error");
|
SV_Error ("Program error");
|
||||||
|
@ -104,7 +104,7 @@ PF_objerror (progs_t *pr)
|
||||||
s = PF_VarString (pr, 0);
|
s = PF_VarString (pr, 0);
|
||||||
Con_Printf ("======OBJECT ERROR in %s:\n%s\n",
|
Con_Printf ("======OBJECT ERROR in %s:\n%s\n",
|
||||||
PR_GetString (pr, pr->pr_xfunction->s_name), s);
|
PR_GetString (pr, pr->pr_xfunction->s_name), s);
|
||||||
ed = PROG_TO_EDICT (pr->pr_global_struct->self);
|
ed = PROG_TO_EDICT (pr, pr->pr_global_struct->self);
|
||||||
ED_Print (pr, ed);
|
ED_Print (pr, ed);
|
||||||
ED_Free (pr, ed);
|
ED_Free (pr, ed);
|
||||||
|
|
||||||
|
@ -529,9 +529,9 @@ PF_traceline (progs_t *pr)
|
||||||
VectorCopy (trace.plane.normal, pr->pr_global_struct->trace_plane_normal);
|
VectorCopy (trace.plane.normal, pr->pr_global_struct->trace_plane_normal);
|
||||||
pr->pr_global_struct->trace_plane_dist = trace.plane.dist;
|
pr->pr_global_struct->trace_plane_dist = trace.plane.dist;
|
||||||
if (trace.ent)
|
if (trace.ent)
|
||||||
pr->pr_global_struct->trace_ent = EDICT_TO_PROG (trace.ent);
|
pr->pr_global_struct->trace_ent = EDICT_TO_PROG (pr, trace.ent);
|
||||||
else
|
else
|
||||||
pr->pr_global_struct->trace_ent = EDICT_TO_PROG (sv.edicts);
|
pr->pr_global_struct->trace_ent = EDICT_TO_PROG (pr, sv.edicts);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -636,7 +636,7 @@ PF_checkclient (progs_t *pr)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// if current entity can't possibly see the check entity, return 0
|
// if current entity can't possibly see the check entity, return 0
|
||||||
self = PROG_TO_EDICT (pr->pr_global_struct->self);
|
self = PROG_TO_EDICT (pr, pr->pr_global_struct->self);
|
||||||
VectorAdd (self->v.origin, self->v.view_ofs, view);
|
VectorAdd (self->v.origin, self->v.view_ofs, view);
|
||||||
leaf = Mod_PointInLeaf (view, sv.worldmodel);
|
leaf = Mod_PointInLeaf (view, sv.worldmodel);
|
||||||
l = (leaf - sv.worldmodel->leafs) - 1;
|
l = (leaf - sv.worldmodel->leafs) - 1;
|
||||||
|
@ -786,7 +786,7 @@ PF_findradius (progs_t *pr)
|
||||||
if (Length (eorg) > rad)
|
if (Length (eorg) > rad)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
ent->v.chain = EDICT_TO_PROG (chain);
|
ent->v.chain = EDICT_TO_PROG (pr, chain);
|
||||||
chain = ent;
|
chain = ent;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1000,7 +1000,7 @@ PF_walkmove (progs_t *pr)
|
||||||
dfunction_t *oldf;
|
dfunction_t *oldf;
|
||||||
int oldself;
|
int oldself;
|
||||||
|
|
||||||
ent = PROG_TO_EDICT (pr->pr_global_struct->self);
|
ent = PROG_TO_EDICT (pr, pr->pr_global_struct->self);
|
||||||
yaw = G_FLOAT (pr, OFS_PARM0);
|
yaw = G_FLOAT (pr, OFS_PARM0);
|
||||||
dist = G_FLOAT (pr, OFS_PARM1);
|
dist = G_FLOAT (pr, OFS_PARM1);
|
||||||
|
|
||||||
|
@ -1039,7 +1039,7 @@ PF_droptofloor (progs_t *pr)
|
||||||
vec3_t end;
|
vec3_t end;
|
||||||
trace_t trace;
|
trace_t trace;
|
||||||
|
|
||||||
ent = PROG_TO_EDICT (pr->pr_global_struct->self);
|
ent = PROG_TO_EDICT (pr, pr->pr_global_struct->self);
|
||||||
|
|
||||||
VectorCopy (ent->v.origin, end);
|
VectorCopy (ent->v.origin, end);
|
||||||
end[2] -= 256;
|
end[2] -= 256;
|
||||||
|
@ -1052,7 +1052,7 @@ PF_droptofloor (progs_t *pr)
|
||||||
VectorCopy (trace.endpos, ent->v.origin);
|
VectorCopy (trace.endpos, ent->v.origin);
|
||||||
SV_LinkEdict (ent, false);
|
SV_LinkEdict (ent, false);
|
||||||
ent->v.flags = (int) ent->v.flags | FL_ONGROUND;
|
ent->v.flags = (int) ent->v.flags | FL_ONGROUND;
|
||||||
ent->v.groundentity = EDICT_TO_PROG (trace.ent);
|
ent->v.groundentity = EDICT_TO_PROG (pr, trace.ent);
|
||||||
G_FLOAT (pr, OFS_RETURN) = 1;
|
G_FLOAT (pr, OFS_RETURN) = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1262,7 +1262,7 @@ PF_changeyaw (progs_t *pr)
|
||||||
edict_t *ent;
|
edict_t *ent;
|
||||||
float ideal, current, move, speed;
|
float ideal, current, move, speed;
|
||||||
|
|
||||||
ent = PROG_TO_EDICT (pr->pr_global_struct->self);
|
ent = PROG_TO_EDICT (pr, pr->pr_global_struct->self);
|
||||||
current = anglemod (ent->v.angles[1]);
|
current = anglemod (ent->v.angles[1]);
|
||||||
ideal = ent->v.ideal_yaw;
|
ideal = ent->v.ideal_yaw;
|
||||||
speed = ent->v.yaw_speed;
|
speed = ent->v.yaw_speed;
|
||||||
|
@ -1315,7 +1315,7 @@ WriteDest (progs_t *pr)
|
||||||
case MSG_ONE:
|
case MSG_ONE:
|
||||||
SV_Error ("Shouldn't be at MSG_ONE");
|
SV_Error ("Shouldn't be at MSG_ONE");
|
||||||
#if 0
|
#if 0
|
||||||
ent = PROG_TO_EDICT (pr->pr_global_struct->msg_entity);
|
ent = PROG_TO_EDICT (pr, pr->pr_global_struct->msg_entity);
|
||||||
entnum = NUM_FOR_EDICT (pr, ent);
|
entnum = NUM_FOR_EDICT (pr, ent);
|
||||||
if (entnum < 1 || entnum > MAX_CLIENTS)
|
if (entnum < 1 || entnum > MAX_CLIENTS)
|
||||||
PR_RunError (pr, "WriteDest: not a client");
|
PR_RunError (pr, "WriteDest: not a client");
|
||||||
|
@ -1348,7 +1348,7 @@ Write_GetClient (progs_t *pr)
|
||||||
int entnum;
|
int entnum;
|
||||||
edict_t *ent;
|
edict_t *ent;
|
||||||
|
|
||||||
ent = PROG_TO_EDICT (pr->pr_global_struct->msg_entity);
|
ent = PROG_TO_EDICT (pr, pr->pr_global_struct->msg_entity);
|
||||||
entnum = NUM_FOR_EDICT (pr, ent);
|
entnum = NUM_FOR_EDICT (pr, ent);
|
||||||
if (entnum < 1 || entnum > MAX_CLIENTS)
|
if (entnum < 1 || entnum > MAX_CLIENTS)
|
||||||
PR_RunError (pr, "Write_GetClient: not a client");
|
PR_RunError (pr, "Write_GetClient: not a client");
|
||||||
|
|
|
@ -105,11 +105,11 @@ ED_Alloc (progs_t *pr)
|
||||||
int i;
|
int i;
|
||||||
edict_t *e;
|
edict_t *e;
|
||||||
|
|
||||||
for (i = MAX_CLIENTS + 1; i < sv.num_edicts; i++) {
|
for (i = MAX_CLIENTS + 1; i < *(pr)->num_edicts; i++) {
|
||||||
e = EDICT_NUM (pr, i);
|
e = EDICT_NUM (pr, i);
|
||||||
// the first couple seconds of server time can involve a lot of
|
// the first couple seconds of server time can involve a lot of
|
||||||
// freeing and allocating, so relax the replacement policy
|
// freeing and allocating, so relax the replacement policy
|
||||||
if (e->free && (e->freetime < 2 || sv.time - e->freetime > 0.5)) {
|
if (e->free && (e->freetime < 2 || *(pr)->time - e->freetime > 0.5)) {
|
||||||
ED_ClearEdict (pr, e);
|
ED_ClearEdict (pr, e);
|
||||||
return e;
|
return e;
|
||||||
}
|
}
|
||||||
|
@ -121,7 +121,7 @@ ED_Alloc (progs_t *pr)
|
||||||
e = EDICT_NUM (pr, i);
|
e = EDICT_NUM (pr, i);
|
||||||
SV_UnlinkEdict (e);
|
SV_UnlinkEdict (e);
|
||||||
} else
|
} else
|
||||||
sv.num_edicts++;
|
(*(pr)->num_edicts)++;
|
||||||
e = EDICT_NUM (pr, i);
|
e = EDICT_NUM (pr, i);
|
||||||
ED_ClearEdict (pr, e);
|
ED_ClearEdict (pr, e);
|
||||||
|
|
||||||
|
@ -151,7 +151,7 @@ ED_Free (progs_t *pr, edict_t *ed)
|
||||||
ed->v.nextthink = -1;
|
ed->v.nextthink = -1;
|
||||||
ed->v.solid = 0;
|
ed->v.solid = 0;
|
||||||
|
|
||||||
ed->freetime = sv.time;
|
ed->freetime = *(pr)->time;
|
||||||
}
|
}
|
||||||
|
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
|
@ -292,7 +292,7 @@ PR_ValueString (progs_t *pr, etype_t type, eval_t *val)
|
||||||
break;
|
break;
|
||||||
case ev_entity:
|
case ev_entity:
|
||||||
snprintf (line, sizeof (line), "entity %i",
|
snprintf (line, sizeof (line), "entity %i",
|
||||||
NUM_FOR_EDICT (pr, PROG_TO_EDICT (val->edict)));
|
NUM_FOR_EDICT (pr, PROG_TO_EDICT (pr, val->edict)));
|
||||||
break;
|
break;
|
||||||
case ev_function:
|
case ev_function:
|
||||||
f = pr->pr_functions + val->function;
|
f = pr->pr_functions + val->function;
|
||||||
|
@ -344,7 +344,7 @@ PR_UglyValueString (progs_t *pr, etype_t type, eval_t *val)
|
||||||
break;
|
break;
|
||||||
case ev_entity:
|
case ev_entity:
|
||||||
snprintf (line, sizeof (line), "%i",
|
snprintf (line, sizeof (line), "%i",
|
||||||
NUM_FOR_EDICT (pr, PROG_TO_EDICT (val->edict)));
|
NUM_FOR_EDICT (pr, PROG_TO_EDICT (pr, val->edict)));
|
||||||
break;
|
break;
|
||||||
case ev_function:
|
case ev_function:
|
||||||
f = pr->pr_functions + val->function;
|
f = pr->pr_functions + val->function;
|
||||||
|
@ -534,32 +534,12 @@ ED_PrintEdicts (progs_t *pr)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
Con_Printf ("%i entities\n", sv.num_edicts);
|
Con_Printf ("%i entities\n", *(pr)->num_edicts);
|
||||||
for (i = 0; i < sv.num_edicts; i++) {
|
for (i = 0; i < *(pr)->num_edicts; i++) {
|
||||||
Con_Printf ("\nEDICT %i:\n", i);
|
Con_Printf ("\nEDICT %i:\n", i);
|
||||||
ED_PrintNum (pr, i);
|
ED_PrintNum (pr, i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
void
|
|
||||||
ED_PrintEdicts_f (void)
|
|
||||||
{
|
|
||||||
ED_PrintEdicts (&sv_progs);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
ED_PrintEdict_f
|
|
||||||
|
|
||||||
For debugging, prints a single edicy
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
ED_PrintEdict_f (void)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
i = atoi (Cmd_Argv (1));
|
|
||||||
Con_Printf ("\n EDICT %i:\n", i);
|
|
||||||
ED_PrintNum (&sv_progs, i);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
ED_Count
|
ED_Count
|
||||||
|
@ -574,7 +554,7 @@ ED_Count (progs_t *pr)
|
||||||
int active, models, solid, step;
|
int active, models, solid, step;
|
||||||
|
|
||||||
active = models = solid = step = 0;
|
active = models = solid = step = 0;
|
||||||
for (i = 0; i < sv.num_edicts; i++) {
|
for (i = 0; i < *(pr)->num_edicts; i++) {
|
||||||
ent = EDICT_NUM (pr, i);
|
ent = EDICT_NUM (pr, i);
|
||||||
if (ent->free)
|
if (ent->free)
|
||||||
continue;
|
continue;
|
||||||
|
@ -587,7 +567,7 @@ ED_Count (progs_t *pr)
|
||||||
step++;
|
step++;
|
||||||
}
|
}
|
||||||
|
|
||||||
Con_Printf ("num_edicts:%3i\n", sv.num_edicts);
|
Con_Printf ("num_edicts:%3i\n", *(pr)->num_edicts);
|
||||||
Con_Printf ("active :%3i\n", active);
|
Con_Printf ("active :%3i\n", active);
|
||||||
Con_Printf ("view :%3i\n", models);
|
Con_Printf ("view :%3i\n", models);
|
||||||
Con_Printf ("touch :%3i\n", solid);
|
Con_Printf ("touch :%3i\n", solid);
|
||||||
|
@ -595,12 +575,6 @@ ED_Count (progs_t *pr)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
ED_Count_f (void)
|
|
||||||
{
|
|
||||||
ED_Count (&sv_progs);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
==============================================================================
|
==============================================================================
|
||||||
|
|
||||||
|
@ -750,7 +724,7 @@ ED_ParseEpair (progs_t *pr, void *base, ddef_t *key, char *s)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ev_entity:
|
case ev_entity:
|
||||||
*(int *) d = EDICT_TO_PROG (EDICT_NUM (pr, atoi (s)));
|
*(int *) d = EDICT_TO_PROG (pr, EDICT_NUM (pr, atoi (s)));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ev_field:
|
case ev_field:
|
||||||
|
@ -795,7 +769,7 @@ ED_ParseEdict (progs_t *pr, char *data, edict_t *ent)
|
||||||
init = false;
|
init = false;
|
||||||
|
|
||||||
// clear it
|
// clear it
|
||||||
if (ent != sv.edicts) // hack
|
if (ent != *(pr)->edicts) // hack
|
||||||
memset (&ent->v, 0, pr->progs->entityfields * 4);
|
memset (&ent->v, 0, pr->progs->entityfields * 4);
|
||||||
|
|
||||||
// go through all the dictionary pairs
|
// go through all the dictionary pairs
|
||||||
|
@ -896,7 +870,7 @@ ED_LoadFromFile (progs_t *pr, char *data)
|
||||||
|
|
||||||
ent = NULL;
|
ent = NULL;
|
||||||
inhibit = 0;
|
inhibit = 0;
|
||||||
pr->pr_global_struct->time = sv.time;
|
pr->pr_global_struct->time = *(pr)->time;
|
||||||
|
|
||||||
// parse ents
|
// parse ents
|
||||||
while (1) {
|
while (1) {
|
||||||
|
@ -938,7 +912,7 @@ ED_LoadFromFile (progs_t *pr, char *data)
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
pr->pr_global_struct->self = EDICT_TO_PROG (ent);
|
pr->pr_global_struct->self = EDICT_TO_PROG (pr, ent);
|
||||||
PR_ExecuteProgram (pr, func - pr->pr_functions);
|
PR_ExecuteProgram (pr, func - pr->pr_functions);
|
||||||
SV_FlushSignon ();
|
SV_FlushSignon ();
|
||||||
}
|
}
|
||||||
|
@ -1186,7 +1160,7 @@ EDICT_NUM (progs_t *pr, int n)
|
||||||
{
|
{
|
||||||
if (n < 0 || n >= MAX_EDICTS)
|
if (n < 0 || n >= MAX_EDICTS)
|
||||||
SV_Error ("EDICT_NUM: bad number %i", n);
|
SV_Error ("EDICT_NUM: bad number %i", n);
|
||||||
return (edict_t *) ((byte *) sv.edicts + (n) * pr->pr_edict_size);
|
return (edict_t *) ((byte *) *(pr)->edicts + (n) * pr->pr_edict_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
|
@ -1194,10 +1168,10 @@ NUM_FOR_EDICT (progs_t *pr, edict_t *e)
|
||||||
{
|
{
|
||||||
int b;
|
int b;
|
||||||
|
|
||||||
b = (byte *) e - (byte *) sv.edicts;
|
b = (byte *) e - (byte *) *(pr)->edicts;
|
||||||
b = b / pr->pr_edict_size;
|
b = b / pr->pr_edict_size;
|
||||||
|
|
||||||
if (b < 0 || b >= sv.num_edicts)
|
if (b < 0 || b >= *(pr)->num_edicts)
|
||||||
SV_Error ("NUM_FOR_EDICT: bad pointer");
|
SV_Error ("NUM_FOR_EDICT: bad pointer");
|
||||||
return b;
|
return b;
|
||||||
}
|
}
|
||||||
|
|
|
@ -226,13 +226,6 @@ PR_Profile (progs_t *pr)
|
||||||
} while (best);
|
} while (best);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
PR_Profile_f (void)
|
|
||||||
{
|
|
||||||
PR_Profile (&sv_progs);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
PR_RunError
|
PR_RunError
|
||||||
|
|
||||||
|
@ -354,7 +347,7 @@ PR_ExecuteProgram (progs_t *pr, func_t fnum)
|
||||||
|
|
||||||
if (!fnum || fnum >= pr->progs->numfunctions) {
|
if (!fnum || fnum >= pr->progs->numfunctions) {
|
||||||
if (pr->pr_global_struct->self)
|
if (pr->pr_global_struct->self)
|
||||||
ED_Print (pr, PROG_TO_EDICT (pr->pr_global_struct->self));
|
ED_Print (pr, PROG_TO_EDICT (pr, pr->pr_global_struct->self));
|
||||||
SV_Error ("PR_ExecuteProgram: NULL function");
|
SV_Error ("PR_ExecuteProgram: NULL function");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -457,7 +450,7 @@ PR_ExecuteProgram (progs_t *pr, func_t fnum)
|
||||||
OPC->_float = !OPA->function;
|
OPC->_float = !OPA->function;
|
||||||
break;
|
break;
|
||||||
case OP_NOT_ENT:
|
case OP_NOT_ENT:
|
||||||
OPC->_float = (PROG_TO_EDICT (OPA->edict) == sv.edicts);
|
OPC->_float = (PROG_TO_EDICT (pr, OPA->edict) == *pr->edicts);
|
||||||
break;
|
break;
|
||||||
case OP_EQ_F:
|
case OP_EQ_F:
|
||||||
OPC->_float = OPA->_float == OPB->_float;
|
OPC->_float = OPA->_float == OPB->_float;
|
||||||
|
@ -525,14 +518,14 @@ PR_ExecuteProgram (progs_t *pr, func_t fnum)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (pr_boundscheck->int_val && (OPB->_int % pr->pr_edict_size <
|
if (pr_boundscheck->int_val && (OPB->_int % pr->pr_edict_size <
|
||||||
((byte *) & sv.edicts->v -
|
((byte *) & (*pr->edicts)->v -
|
||||||
(byte *) sv.edicts))) {
|
(byte *) *pr->edicts))) {
|
||||||
pr->pr_xstatement = st - pr->pr_statements;
|
pr->pr_xstatement = st - pr->pr_statements;
|
||||||
PR_RunError
|
PR_RunError
|
||||||
(pr, "Progs attempted to write to an engine edict field\n");
|
(pr, "Progs attempted to write to an engine edict field\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
ptr = (eval_t *) ((byte *) sv.edicts + OPB->_int);
|
ptr = (eval_t *) ((byte *) *pr->edicts + OPB->_int);
|
||||||
ptr->_int = OPA->_int;
|
ptr->_int = OPA->_int;
|
||||||
break;
|
break;
|
||||||
case OP_STOREP_V:
|
case OP_STOREP_V:
|
||||||
|
@ -543,7 +536,7 @@ PR_ExecuteProgram (progs_t *pr, func_t fnum)
|
||||||
(pr, "Progs attempted to write to an out of bounds edict\n");
|
(pr, "Progs attempted to write to an out of bounds edict\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
ptr = (eval_t *) ((byte *) sv.edicts + OPB->_int);
|
ptr = (eval_t *) ((byte *) *pr->edicts + OPB->_int);
|
||||||
ptr->vector[0] = OPA->vector[0];
|
ptr->vector[0] = OPA->vector[0];
|
||||||
ptr->vector[1] = OPA->vector[1];
|
ptr->vector[1] = OPA->vector[1];
|
||||||
ptr->vector[2] = OPA->vector[2];
|
ptr->vector[2] = OPA->vector[2];
|
||||||
|
@ -557,7 +550,7 @@ PR_ExecuteProgram (progs_t *pr, func_t fnum)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (pr_boundscheck->int_val
|
if (pr_boundscheck->int_val
|
||||||
&& (OPA->edict == 0 && sv.state == ss_active)) {
|
&& (OPA->edict == 0 && pr->null_bad)) {
|
||||||
pr->pr_xstatement = st - pr->pr_statements;
|
pr->pr_xstatement = st - pr->pr_statements;
|
||||||
PR_RunError (pr, "assignment to world entity");
|
PR_RunError (pr, "assignment to world entity");
|
||||||
return;
|
return;
|
||||||
|
@ -569,9 +562,9 @@ PR_ExecuteProgram (progs_t *pr, func_t fnum)
|
||||||
(pr, "Progs attempted to address an invalid field in an edict\n");
|
(pr, "Progs attempted to address an invalid field in an edict\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
ed = PROG_TO_EDICT (OPA->edict);
|
ed = PROG_TO_EDICT (pr, OPA->edict);
|
||||||
OPC->_int =
|
OPC->_int =
|
||||||
(byte *) ((int *) &ed->v + OPB->_int) - (byte *) sv.edicts;
|
(byte *) ((int *) &ed->v + OPB->_int) - (byte *) *pr->edicts;
|
||||||
break;
|
break;
|
||||||
case OP_LOAD_F:
|
case OP_LOAD_F:
|
||||||
case OP_LOAD_FLD:
|
case OP_LOAD_FLD:
|
||||||
|
@ -592,7 +585,7 @@ PR_ExecuteProgram (progs_t *pr, func_t fnum)
|
||||||
(pr, "Progs attempted to read an invalid field in an edict\n");
|
(pr, "Progs attempted to read an invalid field in an edict\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
ed = PROG_TO_EDICT (OPA->edict);
|
ed = PROG_TO_EDICT (pr, OPA->edict);
|
||||||
OPC->_int = ((eval_t *) ((int *) &ed->v + OPB->_int))->_int;
|
OPC->_int = ((eval_t *) ((int *) &ed->v + OPB->_int))->_int;
|
||||||
break;
|
break;
|
||||||
case OP_LOAD_V:
|
case OP_LOAD_V:
|
||||||
|
@ -610,7 +603,7 @@ PR_ExecuteProgram (progs_t *pr, func_t fnum)
|
||||||
(pr, "Progs attempted to read an invalid field in an edict\n");
|
(pr, "Progs attempted to read an invalid field in an edict\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
ed = PROG_TO_EDICT (OPA->edict);
|
ed = PROG_TO_EDICT (pr, OPA->edict);
|
||||||
OPC->vector[0] =
|
OPC->vector[0] =
|
||||||
((eval_t *) ((int *) &ed->v + OPB->_int))->vector[0];
|
((eval_t *) ((int *) &ed->v + OPB->_int))->vector[0];
|
||||||
OPC->vector[1] =
|
OPC->vector[1] =
|
||||||
|
@ -671,7 +664,7 @@ PR_ExecuteProgram (progs_t *pr, func_t fnum)
|
||||||
return; // all done
|
return; // all done
|
||||||
break;
|
break;
|
||||||
case OP_STATE:
|
case OP_STATE:
|
||||||
ed = PROG_TO_EDICT (pr->pr_global_struct->self);
|
ed = PROG_TO_EDICT (pr, pr->pr_global_struct->self);
|
||||||
ed->v.nextthink = pr->pr_global_struct->time + 0.1;
|
ed->v.nextthink = pr->pr_global_struct->time + 0.1;
|
||||||
ed->v.frame = OPA->_float;
|
ed->v.frame = OPA->_float;
|
||||||
ed->v.think = OPB->function;
|
ed->v.think = OPB->function;
|
||||||
|
@ -840,13 +833,13 @@ PR_ExecuteProgram (progs_t *pr, func_t fnum)
|
||||||
}
|
}
|
||||||
if (pr_boundscheck->int_val
|
if (pr_boundscheck->int_val
|
||||||
&& (OPB->_int % pr->pr_edict_size <
|
&& (OPB->_int % pr->pr_edict_size <
|
||||||
((byte *) & sv.edicts->v - (byte *) sv.edicts))) {
|
((byte *) & (*pr->edicts)->v - (byte *) *pr->edicts))) {
|
||||||
pr->pr_xstatement = st - pr->pr_statements;
|
pr->pr_xstatement = st - pr->pr_statements;
|
||||||
PR_RunError
|
PR_RunError
|
||||||
(pr, "Progs attempted to write to an engine edict field\n");
|
(pr, "Progs attempted to write to an engine edict field\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
ptr = (eval_t *) ((byte *) sv.edicts + OPB->_int);
|
ptr = (eval_t *) ((byte *) *pr->edicts + OPB->_int);
|
||||||
ptr->_int = OPA->_int;
|
ptr->_int = OPA->_int;
|
||||||
break;
|
break;
|
||||||
case OP_LOAD_I:
|
case OP_LOAD_I:
|
||||||
|
@ -864,7 +857,7 @@ PR_ExecuteProgram (progs_t *pr, func_t fnum)
|
||||||
(pr, "Progs attempted to read an invalid field in an edict\n");
|
(pr, "Progs attempted to read an invalid field in an edict\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
ed = PROG_TO_EDICT (OPA->edict);
|
ed = PROG_TO_EDICT (pr, OPA->edict);
|
||||||
OPC->_int = ((eval_t *) ((int *) &ed->v + OPB->_int))->_int;
|
OPC->_int = ((eval_t *) ((int *) &ed->v + OPB->_int))->_int;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
|
@ -192,7 +192,7 @@ SV_SaveSpawnparms (void)
|
||||||
host_client->state = cs_connected;
|
host_client->state = cs_connected;
|
||||||
|
|
||||||
// call the progs to get default spawn parms for the new client
|
// call the progs to get default spawn parms for the new client
|
||||||
sv_progs.pr_global_struct->self = EDICT_TO_PROG (host_client->edict);
|
sv_progs.pr_global_struct->self = EDICT_TO_PROG (&sv_progs, host_client->edict);
|
||||||
PR_ExecuteProgram (&sv_progs, sv_progs.pr_global_struct->SetChangeParms);
|
PR_ExecuteProgram (&sv_progs, sv_progs.pr_global_struct->SetChangeParms);
|
||||||
for (j = 0; j < NUM_SPAWN_PARMS; j++)
|
for (j = 0; j < NUM_SPAWN_PARMS; j++)
|
||||||
host_client->spawn_parms[j] = (&sv_progs.pr_global_struct->parm1)[j];
|
host_client->spawn_parms[j] = (&sv_progs.pr_global_struct->parm1)[j];
|
||||||
|
@ -316,6 +316,7 @@ SV_SpawnServer (char *server)
|
||||||
// restarted
|
// restarted
|
||||||
|
|
||||||
sv.state = ss_dead;
|
sv.state = ss_dead;
|
||||||
|
sv_progs.null_bad = 0;
|
||||||
|
|
||||||
Mod_ClearAll ();
|
Mod_ClearAll ();
|
||||||
Hunk_FreeToLowMark (host_hunklevel);
|
Hunk_FreeToLowMark (host_hunklevel);
|
||||||
|
@ -391,6 +392,7 @@ SV_SpawnServer (char *server)
|
||||||
// precache and static commands can be issued during
|
// precache and static commands can be issued during
|
||||||
// map initialization
|
// map initialization
|
||||||
sv.state = ss_loading;
|
sv.state = ss_loading;
|
||||||
|
sv_progs.null_bad = 0;
|
||||||
|
|
||||||
ent = EDICT_NUM (&sv_progs, 0);
|
ent = EDICT_NUM (&sv_progs, 0);
|
||||||
ent->free = false;
|
ent->free = false;
|
||||||
|
@ -415,6 +417,7 @@ SV_SpawnServer (char *server)
|
||||||
// all spawning is completed, any further precache statements
|
// all spawning is completed, any further precache statements
|
||||||
// or prog writes to the signon message are errors
|
// or prog writes to the signon message are errors
|
||||||
sv.state = ss_active;
|
sv.state = ss_active;
|
||||||
|
sv_progs.null_bad = 1;
|
||||||
|
|
||||||
// run two frames to allow everything to settle
|
// run two frames to allow everything to settle
|
||||||
sv_frametime = 0.1;
|
sv_frametime = 0.1;
|
||||||
|
|
|
@ -250,12 +250,12 @@ SV_DropClient (client_t *drop)
|
||||||
if (!drop->spectator) {
|
if (!drop->spectator) {
|
||||||
// call the prog function for removing a client
|
// call the prog function for removing a client
|
||||||
// this will set the body to a dead frame, among other things
|
// this will set the body to a dead frame, among other things
|
||||||
sv_progs.pr_global_struct->self = EDICT_TO_PROG (drop->edict);
|
sv_progs.pr_global_struct->self = EDICT_TO_PROG (&sv_progs, drop->edict);
|
||||||
PR_ExecuteProgram (&sv_progs, sv_progs.pr_global_struct->ClientDisconnect);
|
PR_ExecuteProgram (&sv_progs, sv_progs.pr_global_struct->ClientDisconnect);
|
||||||
} else if (SpectatorDisconnect) {
|
} else if (SpectatorDisconnect) {
|
||||||
// call the prog function for removing a client
|
// call the prog function for removing a client
|
||||||
// this will set the body to a dead frame, among other things
|
// this will set the body to a dead frame, among other things
|
||||||
sv_progs.pr_global_struct->self = EDICT_TO_PROG (drop->edict);
|
sv_progs.pr_global_struct->self = EDICT_TO_PROG (&sv_progs, drop->edict);
|
||||||
PR_ExecuteProgram (&sv_progs, SpectatorDisconnect);
|
PR_ExecuteProgram (&sv_progs, SpectatorDisconnect);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1907,6 +1907,7 @@ SV_Init (void)
|
||||||
COM_Init ();
|
COM_Init ();
|
||||||
|
|
||||||
PR_Init ();
|
PR_Init ();
|
||||||
|
SV_Progs_Init ();
|
||||||
Mod_Init ();
|
Mod_Init ();
|
||||||
|
|
||||||
SV_InitNet ();
|
SV_InitNet ();
|
||||||
|
|
|
@ -140,11 +140,11 @@ SV_movestep (edict_t *ent, vec3_t move, qboolean relink)
|
||||||
// try one move with vertical motion, then one without
|
// try one move with vertical motion, then one without
|
||||||
for (i = 0; i < 2; i++) {
|
for (i = 0; i < 2; i++) {
|
||||||
VectorAdd (ent->v.origin, move, neworg);
|
VectorAdd (ent->v.origin, move, neworg);
|
||||||
enemy = PROG_TO_EDICT (ent->v.enemy);
|
enemy = PROG_TO_EDICT (&sv_progs, ent->v.enemy);
|
||||||
if (i == 0 && enemy != sv.edicts) {
|
if (i == 0 && enemy != sv.edicts) {
|
||||||
dz =
|
dz =
|
||||||
ent->v.origin[2] -
|
ent->v.origin[2] -
|
||||||
PROG_TO_EDICT (ent->v.enemy)->v.origin[2];
|
PROG_TO_EDICT (&sv_progs, ent->v.enemy)->v.origin[2];
|
||||||
if (dz > 40)
|
if (dz > 40)
|
||||||
neworg[2] -= 8;
|
neworg[2] -= 8;
|
||||||
if (dz < 30)
|
if (dz < 30)
|
||||||
|
@ -220,7 +220,7 @@ SV_movestep (edict_t *ent, vec3_t move, qboolean relink)
|
||||||
// Con_Printf ("back on ground\n");
|
// Con_Printf ("back on ground\n");
|
||||||
ent->v.flags = (int) ent->v.flags & ~FL_PARTIALGROUND;
|
ent->v.flags = (int) ent->v.flags & ~FL_PARTIALGROUND;
|
||||||
}
|
}
|
||||||
ent->v.groundentity = EDICT_TO_PROG (trace.ent);
|
ent->v.groundentity = EDICT_TO_PROG (&sv_progs, trace.ent);
|
||||||
|
|
||||||
// the move is ok
|
// the move is ok
|
||||||
if (relink)
|
if (relink)
|
||||||
|
@ -402,8 +402,8 @@ SV_MoveToGoal (progs_t *pr)
|
||||||
edict_t *ent, *goal;
|
edict_t *ent, *goal;
|
||||||
float dist;
|
float dist;
|
||||||
|
|
||||||
ent = PROG_TO_EDICT (sv_progs.pr_global_struct->self);
|
ent = PROG_TO_EDICT (&sv_progs, sv_progs.pr_global_struct->self);
|
||||||
goal = PROG_TO_EDICT (ent->v.goalentity);
|
goal = PROG_TO_EDICT (&sv_progs, ent->v.goalentity);
|
||||||
dist = G_FLOAT (&sv_progs, OFS_PARM0);
|
dist = G_FLOAT (&sv_progs, OFS_PARM0);
|
||||||
|
|
||||||
if (!((int) ent->v.flags & (FL_ONGROUND | FL_FLY | FL_SWIM))) {
|
if (!((int) ent->v.flags & (FL_ONGROUND | FL_FLY | FL_SWIM))) {
|
||||||
|
@ -411,7 +411,7 @@ SV_MoveToGoal (progs_t *pr)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// if the next step hits the enemy, return immediately
|
// if the next step hits the enemy, return immediately
|
||||||
if (PROG_TO_EDICT (ent->v.enemy) != sv.edicts
|
if (PROG_TO_EDICT (&sv_progs, ent->v.enemy) != sv.edicts
|
||||||
&& SV_CloseEnough (ent, goal, dist)) return;
|
&& SV_CloseEnough (ent, goal, dist)) return;
|
||||||
|
|
||||||
// bump around...
|
// bump around...
|
||||||
|
|
|
@ -163,8 +163,8 @@ SV_RunThink (edict_t *ent)
|
||||||
// by a trigger with a local time.
|
// by a trigger with a local time.
|
||||||
ent->v.nextthink = 0;
|
ent->v.nextthink = 0;
|
||||||
sv_progs.pr_global_struct->time = thinktime;
|
sv_progs.pr_global_struct->time = thinktime;
|
||||||
sv_progs.pr_global_struct->self = EDICT_TO_PROG (ent);
|
sv_progs.pr_global_struct->self = EDICT_TO_PROG (&sv_progs, ent);
|
||||||
sv_progs.pr_global_struct->other = EDICT_TO_PROG (sv.edicts);
|
sv_progs.pr_global_struct->other = EDICT_TO_PROG (&sv_progs, sv.edicts);
|
||||||
PR_ExecuteProgram (&sv_progs, ent->v.think);
|
PR_ExecuteProgram (&sv_progs, ent->v.think);
|
||||||
|
|
||||||
if (ent->free)
|
if (ent->free)
|
||||||
|
@ -191,14 +191,14 @@ SV_Impact (edict_t *e1, edict_t *e2)
|
||||||
|
|
||||||
sv_progs.pr_global_struct->time = sv.time;
|
sv_progs.pr_global_struct->time = sv.time;
|
||||||
if (e1->v.touch && e1->v.solid != SOLID_NOT) {
|
if (e1->v.touch && e1->v.solid != SOLID_NOT) {
|
||||||
sv_progs.pr_global_struct->self = EDICT_TO_PROG (e1);
|
sv_progs.pr_global_struct->self = EDICT_TO_PROG (&sv_progs, e1);
|
||||||
sv_progs.pr_global_struct->other = EDICT_TO_PROG (e2);
|
sv_progs.pr_global_struct->other = EDICT_TO_PROG (&sv_progs, e2);
|
||||||
PR_ExecuteProgram (&sv_progs, e1->v.touch);
|
PR_ExecuteProgram (&sv_progs, e1->v.touch);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (e2->v.touch && e2->v.solid != SOLID_NOT) {
|
if (e2->v.touch && e2->v.solid != SOLID_NOT) {
|
||||||
sv_progs.pr_global_struct->self = EDICT_TO_PROG (e2);
|
sv_progs.pr_global_struct->self = EDICT_TO_PROG (&sv_progs, e2);
|
||||||
sv_progs.pr_global_struct->other = EDICT_TO_PROG (e1);
|
sv_progs.pr_global_struct->other = EDICT_TO_PROG (&sv_progs, e1);
|
||||||
PR_ExecuteProgram (&sv_progs, e2->v.touch);
|
PR_ExecuteProgram (&sv_progs, e2->v.touch);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -309,7 +309,7 @@ SV_FlyMove (edict_t *ent, float time, trace_t *steptrace)
|
||||||
if ((trace.ent->v.solid == SOLID_BSP)
|
if ((trace.ent->v.solid == SOLID_BSP)
|
||||||
|| (trace.ent->v.movetype == MOVETYPE_PPUSH)) {
|
|| (trace.ent->v.movetype == MOVETYPE_PPUSH)) {
|
||||||
ent->v.flags = (int) ent->v.flags | FL_ONGROUND;
|
ent->v.flags = (int) ent->v.flags | FL_ONGROUND;
|
||||||
ent->v.groundentity = EDICT_TO_PROG (trace.ent);
|
ent->v.groundentity = EDICT_TO_PROG (&sv_progs, trace.ent);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!trace.plane.normal[2]) {
|
if (!trace.plane.normal[2]) {
|
||||||
|
@ -491,7 +491,7 @@ SV_Push (edict_t *pusher, vec3_t move)
|
||||||
// if the entity is standing on the pusher, it will definately be
|
// if the entity is standing on the pusher, it will definately be
|
||||||
// moved
|
// moved
|
||||||
if (!(((int) check->v.flags & FL_ONGROUND)
|
if (!(((int) check->v.flags & FL_ONGROUND)
|
||||||
&& PROG_TO_EDICT (check->v.groundentity) == pusher)) {
|
&& PROG_TO_EDICT (&sv_progs, check->v.groundentity) == pusher)) {
|
||||||
if (check->v.absmin[0] >= maxs[0]
|
if (check->v.absmin[0] >= maxs[0]
|
||||||
|| check->v.absmin[1] >= maxs[1]
|
|| check->v.absmin[1] >= maxs[1]
|
||||||
|| check->v.absmin[2] >= maxs[2]
|
|| check->v.absmin[2] >= maxs[2]
|
||||||
|
@ -541,8 +541,8 @@ SV_Push (edict_t *pusher, vec3_t move)
|
||||||
// if the pusher has a "blocked" function, call it
|
// if the pusher has a "blocked" function, call it
|
||||||
// otherwise, just stay in place until the obstacle is gone
|
// otherwise, just stay in place until the obstacle is gone
|
||||||
if (pusher->v.blocked) {
|
if (pusher->v.blocked) {
|
||||||
sv_progs.pr_global_struct->self = EDICT_TO_PROG (pusher);
|
sv_progs.pr_global_struct->self = EDICT_TO_PROG (&sv_progs, pusher);
|
||||||
sv_progs.pr_global_struct->other = EDICT_TO_PROG (check);
|
sv_progs.pr_global_struct->other = EDICT_TO_PROG (&sv_progs, check);
|
||||||
PR_ExecuteProgram (&sv_progs, pusher->v.blocked);
|
PR_ExecuteProgram (&sv_progs, pusher->v.blocked);
|
||||||
}
|
}
|
||||||
// move back any entities we already moved
|
// move back any entities we already moved
|
||||||
|
@ -616,8 +616,8 @@ SV_Physics_Pusher (edict_t *ent)
|
||||||
VectorCopy (ent->v.origin, oldorg);
|
VectorCopy (ent->v.origin, oldorg);
|
||||||
ent->v.nextthink = 0;
|
ent->v.nextthink = 0;
|
||||||
sv_progs.pr_global_struct->time = sv.time;
|
sv_progs.pr_global_struct->time = sv.time;
|
||||||
sv_progs.pr_global_struct->self = EDICT_TO_PROG (ent);
|
sv_progs.pr_global_struct->self = EDICT_TO_PROG (&sv_progs, ent);
|
||||||
sv_progs.pr_global_struct->other = EDICT_TO_PROG (sv.edicts);
|
sv_progs.pr_global_struct->other = EDICT_TO_PROG (&sv_progs, sv.edicts);
|
||||||
PR_ExecuteProgram (&sv_progs, ent->v.think);
|
PR_ExecuteProgram (&sv_progs, ent->v.think);
|
||||||
if (ent->free)
|
if (ent->free)
|
||||||
return;
|
return;
|
||||||
|
@ -764,7 +764,7 @@ SV_Physics_Toss (edict_t *ent)
|
||||||
if (trace.plane.normal[2] > 0.7) {
|
if (trace.plane.normal[2] > 0.7) {
|
||||||
if (ent->v.velocity[2] < 60 || ent->v.movetype != MOVETYPE_BOUNCE) {
|
if (ent->v.velocity[2] < 60 || ent->v.movetype != MOVETYPE_BOUNCE) {
|
||||||
ent->v.flags = (int) ent->v.flags | FL_ONGROUND;
|
ent->v.flags = (int) ent->v.flags | FL_ONGROUND;
|
||||||
ent->v.groundentity = EDICT_TO_PROG (trace.ent);
|
ent->v.groundentity = EDICT_TO_PROG (&sv_progs, trace.ent);
|
||||||
VectorCopy (vec3_origin, ent->v.velocity);
|
VectorCopy (vec3_origin, ent->v.velocity);
|
||||||
VectorCopy (vec3_origin, ent->v.avelocity);
|
VectorCopy (vec3_origin, ent->v.avelocity);
|
||||||
}
|
}
|
||||||
|
@ -881,8 +881,8 @@ SV_PPushMove (edict_t *pusher, float movetime) // player push
|
||||||
// Stage 4: Yes, it must be. Fail the move.
|
// Stage 4: Yes, it must be. Fail the move.
|
||||||
VectorCopy (pusher->v.origin, pusher->v.oldorigin); // Revert
|
VectorCopy (pusher->v.origin, pusher->v.oldorigin); // Revert
|
||||||
if (pusher->v.blocked) { // Blocked func?
|
if (pusher->v.blocked) { // Blocked func?
|
||||||
sv_progs.pr_global_struct->self = EDICT_TO_PROG (pusher);
|
sv_progs.pr_global_struct->self = EDICT_TO_PROG (&sv_progs, pusher);
|
||||||
sv_progs.pr_global_struct->other = EDICT_TO_PROG (check);
|
sv_progs.pr_global_struct->other = EDICT_TO_PROG (&sv_progs, check);
|
||||||
PR_ExecuteProgram (&sv_progs, pusher->v.blocked);
|
PR_ExecuteProgram (&sv_progs, pusher->v.blocked);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -918,8 +918,8 @@ SV_Physics_PPusher (edict_t *ent)
|
||||||
if (thinktime > oldltime && thinktime <= ent->v.ltime) {
|
if (thinktime > oldltime && thinktime <= ent->v.ltime) {
|
||||||
ent->v.nextthink = 0;
|
ent->v.nextthink = 0;
|
||||||
sv_progs.pr_global_struct->time = sv.time;
|
sv_progs.pr_global_struct->time = sv.time;
|
||||||
sv_progs.pr_global_struct->self = EDICT_TO_PROG (ent);
|
sv_progs.pr_global_struct->self = EDICT_TO_PROG (&sv_progs, ent);
|
||||||
sv_progs.pr_global_struct->other = EDICT_TO_PROG (sv.edicts);
|
sv_progs.pr_global_struct->other = EDICT_TO_PROG (&sv_progs, sv.edicts);
|
||||||
PR_ExecuteProgram (&sv_progs, ent->v.think);
|
PR_ExecuteProgram (&sv_progs, ent->v.think);
|
||||||
if (ent->free)
|
if (ent->free)
|
||||||
return;
|
return;
|
||||||
|
@ -932,8 +932,8 @@ void
|
||||||
SV_ProgStartFrame (void)
|
SV_ProgStartFrame (void)
|
||||||
{
|
{
|
||||||
// let the progs know that a new frame has started
|
// let the progs know that a new frame has started
|
||||||
sv_progs.pr_global_struct->self = EDICT_TO_PROG (sv.edicts);
|
sv_progs.pr_global_struct->self = EDICT_TO_PROG (&sv_progs, sv.edicts);
|
||||||
sv_progs.pr_global_struct->other = EDICT_TO_PROG (sv.edicts);
|
sv_progs.pr_global_struct->other = EDICT_TO_PROG (&sv_progs, sv.edicts);
|
||||||
sv_progs.pr_global_struct->time = sv.time;
|
sv_progs.pr_global_struct->time = sv.time;
|
||||||
PR_ExecuteProgram (&sv_progs, sv_progs.pr_global_struct->StartFrame);
|
PR_ExecuteProgram (&sv_progs, sv_progs.pr_global_struct->StartFrame);
|
||||||
}
|
}
|
||||||
|
@ -991,7 +991,7 @@ SV_RunNewmis (void)
|
||||||
|
|
||||||
if (!sv_progs.pr_global_struct->newmis)
|
if (!sv_progs.pr_global_struct->newmis)
|
||||||
return;
|
return;
|
||||||
ent = PROG_TO_EDICT (sv_progs.pr_global_struct->newmis);
|
ent = PROG_TO_EDICT (&sv_progs, sv_progs.pr_global_struct->newmis);
|
||||||
sv_frametime = 0.05;
|
sv_frametime = 0.05;
|
||||||
sv_progs.pr_global_struct->newmis = 0;
|
sv_progs.pr_global_struct->newmis = 0;
|
||||||
|
|
||||||
|
@ -1049,8 +1049,8 @@ SV_Physics (void)
|
||||||
// 2000-01-02 EndFrame function by Maddes/FrikaC start
|
// 2000-01-02 EndFrame function by Maddes/FrikaC start
|
||||||
if (EndFrame) {
|
if (EndFrame) {
|
||||||
// let the progs know that the frame has ended
|
// let the progs know that the frame has ended
|
||||||
sv_progs.pr_global_struct->self = EDICT_TO_PROG (sv.edicts);
|
sv_progs.pr_global_struct->self = EDICT_TO_PROG (&sv_progs, sv.edicts);
|
||||||
sv_progs.pr_global_struct->other = EDICT_TO_PROG (sv.edicts);
|
sv_progs.pr_global_struct->other = EDICT_TO_PROG (&sv_progs, sv.edicts);
|
||||||
sv_progs.pr_global_struct->time = sv.time;
|
sv_progs.pr_global_struct->time = sv.time;
|
||||||
PR_ExecuteProgram (&sv_progs, EndFrame);
|
PR_ExecuteProgram (&sv_progs, EndFrame);
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,7 +30,9 @@
|
||||||
# include "config.h"
|
# include "config.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include "cmd.h"
|
||||||
#include "progs.h"
|
#include "progs.h"
|
||||||
|
#include "server.h"
|
||||||
|
|
||||||
int eval_alpha, eval_scale, eval_glowsize, eval_glowcolor, eval_colormod;
|
int eval_alpha, eval_scale, eval_glowsize, eval_glowcolor, eval_colormod;
|
||||||
progs_t sv_progs;
|
progs_t sv_progs;
|
||||||
|
@ -67,4 +69,45 @@ FindEdictFieldOffsets (progs_t *pr)
|
||||||
eval_glowcolor = FindFieldOffset (&sv_progs, "glow_color");
|
eval_glowcolor = FindFieldOffset (&sv_progs, "glow_color");
|
||||||
eval_colormod = FindFieldOffset (&sv_progs, "colormod");
|
eval_colormod = FindFieldOffset (&sv_progs, "colormod");
|
||||||
}
|
}
|
||||||
};
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
SV_Progs_Init (void)
|
||||||
|
{
|
||||||
|
sv_progs.edicts = &sv.edicts;
|
||||||
|
sv_progs.num_edicts = &sv.num_edicts;
|
||||||
|
sv_progs.time = &sv.time;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ED_PrintEdicts_f (void)
|
||||||
|
{
|
||||||
|
ED_PrintEdicts (&sv_progs);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
ED_PrintEdict_f
|
||||||
|
|
||||||
|
For debugging, prints a single edicy
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
ED_PrintEdict_f (void)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
i = atoi (Cmd_Argv (1));
|
||||||
|
Con_Printf ("\n EDICT %i:\n", i);
|
||||||
|
ED_PrintNum (&sv_progs, i);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ED_Count_f (void)
|
||||||
|
{
|
||||||
|
ED_Count (&sv_progs);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
PR_Profile_f (void)
|
||||||
|
{
|
||||||
|
PR_Profile (&sv_progs);
|
||||||
|
}
|
||||||
|
|
|
@ -527,7 +527,7 @@ SV_WriteClientdataToMessage (client_t *client, sizebuf_t *msg)
|
||||||
}
|
}
|
||||||
// send a damage message if the player got hit this frame
|
// send a damage message if the player got hit this frame
|
||||||
if (ent->v.dmg_take || ent->v.dmg_save) {
|
if (ent->v.dmg_take || ent->v.dmg_save) {
|
||||||
other = PROG_TO_EDICT (ent->v.dmg_inflictor);
|
other = PROG_TO_EDICT (&sv_progs, ent->v.dmg_inflictor);
|
||||||
MSG_WriteByte (msg, svc_damage);
|
MSG_WriteByte (msg, svc_damage);
|
||||||
MSG_WriteByte (msg, ent->v.dmg_save);
|
MSG_WriteByte (msg, ent->v.dmg_save);
|
||||||
MSG_WriteByte (msg, ent->v.dmg_take);
|
MSG_WriteByte (msg, ent->v.dmg_take);
|
||||||
|
|
|
@ -498,7 +498,7 @@ SV_Begin_f (void)
|
||||||
|
|
||||||
// call the spawn function
|
// call the spawn function
|
||||||
sv_progs.pr_global_struct->time = sv.time;
|
sv_progs.pr_global_struct->time = sv.time;
|
||||||
sv_progs.pr_global_struct->self = EDICT_TO_PROG (sv_player);
|
sv_progs.pr_global_struct->self = EDICT_TO_PROG (&sv_progs, sv_player);
|
||||||
PR_ExecuteProgram (&sv_progs, SpectatorConnect);
|
PR_ExecuteProgram (&sv_progs, SpectatorConnect);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -508,12 +508,12 @@ SV_Begin_f (void)
|
||||||
|
|
||||||
// call the spawn function
|
// call the spawn function
|
||||||
sv_progs.pr_global_struct->time = sv.time;
|
sv_progs.pr_global_struct->time = sv.time;
|
||||||
sv_progs.pr_global_struct->self = EDICT_TO_PROG (sv_player);
|
sv_progs.pr_global_struct->self = EDICT_TO_PROG (&sv_progs, sv_player);
|
||||||
PR_ExecuteProgram (&sv_progs, sv_progs.pr_global_struct->ClientConnect);
|
PR_ExecuteProgram (&sv_progs, sv_progs.pr_global_struct->ClientConnect);
|
||||||
|
|
||||||
// actually spawn the player
|
// actually spawn the player
|
||||||
sv_progs.pr_global_struct->time = sv.time;
|
sv_progs.pr_global_struct->time = sv.time;
|
||||||
sv_progs.pr_global_struct->self = EDICT_TO_PROG (sv_player);
|
sv_progs.pr_global_struct->self = EDICT_TO_PROG (&sv_progs, sv_player);
|
||||||
PR_ExecuteProgram (&sv_progs, sv_progs.pr_global_struct->PutClientInServer);
|
PR_ExecuteProgram (&sv_progs, sv_progs.pr_global_struct->PutClientInServer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -946,7 +946,7 @@ SV_Kill_f (void)
|
||||||
}
|
}
|
||||||
|
|
||||||
sv_progs.pr_global_struct->time = sv.time;
|
sv_progs.pr_global_struct->time = sv.time;
|
||||||
sv_progs.pr_global_struct->self = EDICT_TO_PROG (sv_player);
|
sv_progs.pr_global_struct->self = EDICT_TO_PROG (&sv_progs, sv_player);
|
||||||
PR_ExecuteProgram (&sv_progs, sv_progs.pr_global_struct->ClientKill);
|
PR_ExecuteProgram (&sv_progs, sv_progs.pr_global_struct->ClientKill);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1054,7 +1054,7 @@ SV_PTrack_f (void)
|
||||||
host_client->spec_track = 0;
|
host_client->spec_track = 0;
|
||||||
ent = EDICT_NUM (&sv_progs, host_client - svs.clients + 1);
|
ent = EDICT_NUM (&sv_progs, host_client - svs.clients + 1);
|
||||||
tent = EDICT_NUM (&sv_progs, 0);
|
tent = EDICT_NUM (&sv_progs, 0);
|
||||||
ent->v.goalentity = EDICT_TO_PROG (tent);
|
ent->v.goalentity = EDICT_TO_PROG (&sv_progs, tent);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1065,14 +1065,14 @@ SV_PTrack_f (void)
|
||||||
host_client->spec_track = 0;
|
host_client->spec_track = 0;
|
||||||
ent = EDICT_NUM (&sv_progs, host_client - svs.clients + 1);
|
ent = EDICT_NUM (&sv_progs, host_client - svs.clients + 1);
|
||||||
tent = EDICT_NUM (&sv_progs, 0);
|
tent = EDICT_NUM (&sv_progs, 0);
|
||||||
ent->v.goalentity = EDICT_TO_PROG (tent);
|
ent->v.goalentity = EDICT_TO_PROG (&sv_progs, tent);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
host_client->spec_track = i + 1; // now tracking
|
host_client->spec_track = i + 1; // now tracking
|
||||||
|
|
||||||
ent = EDICT_NUM (&sv_progs, host_client - svs.clients + 1);
|
ent = EDICT_NUM (&sv_progs, host_client - svs.clients + 1);
|
||||||
tent = EDICT_NUM (&sv_progs, i + 1);
|
tent = EDICT_NUM (&sv_progs, i + 1);
|
||||||
ent->v.goalentity = EDICT_TO_PROG (tent);
|
ent->v.goalentity = EDICT_TO_PROG (&sv_progs, tent);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1324,7 +1324,7 @@ AddLinksToPmove (areanode_t *node)
|
||||||
int i;
|
int i;
|
||||||
physent_t *pe;
|
physent_t *pe;
|
||||||
|
|
||||||
pl = EDICT_TO_PROG (sv_player);
|
pl = EDICT_TO_PROG (&sv_progs, sv_player);
|
||||||
|
|
||||||
// touch linked edicts
|
// touch linked edicts
|
||||||
for (l = node->solid_edicts.next; l != &node->solid_edicts; l = next) {
|
for (l = node->solid_edicts.next; l != &node->solid_edicts; l = next) {
|
||||||
|
@ -1390,7 +1390,7 @@ AddAllEntsToPmove (void)
|
||||||
physent_t *pe;
|
physent_t *pe;
|
||||||
int pl;
|
int pl;
|
||||||
|
|
||||||
pl = EDICT_TO_PROG (sv_player);
|
pl = EDICT_TO_PROG (&sv_progs, sv_player);
|
||||||
check = NEXT_EDICT (&sv_progs, sv.edicts);
|
check = NEXT_EDICT (&sv_progs, sv.edicts);
|
||||||
for (e = 1; e < sv.num_edicts; e++, check = NEXT_EDICT (&sv_progs, check)) {
|
for (e = 1; e < sv.num_edicts; e++, check = NEXT_EDICT (&sv_progs, check)) {
|
||||||
if (check->free)
|
if (check->free)
|
||||||
|
@ -1534,7 +1534,7 @@ SV_RunCmd (usercmd_t *ucmd, qboolean inside)
|
||||||
sv_progs.pr_global_struct->frametime = sv_frametime;
|
sv_progs.pr_global_struct->frametime = sv_frametime;
|
||||||
|
|
||||||
sv_progs.pr_global_struct->time = sv.time;
|
sv_progs.pr_global_struct->time = sv.time;
|
||||||
sv_progs.pr_global_struct->self = EDICT_TO_PROG (sv_player);
|
sv_progs.pr_global_struct->self = EDICT_TO_PROG (&sv_progs, sv_player);
|
||||||
PR_ExecuteProgram (&sv_progs, sv_progs.pr_global_struct->PlayerPreThink);
|
PR_ExecuteProgram (&sv_progs, sv_progs.pr_global_struct->PlayerPreThink);
|
||||||
|
|
||||||
SV_RunThink (sv_player);
|
SV_RunThink (sv_player);
|
||||||
|
@ -1591,7 +1591,7 @@ SV_RunCmd (usercmd_t *ucmd, qboolean inside)
|
||||||
if (onground != -1) {
|
if (onground != -1) {
|
||||||
sv_player->v.flags = (int) sv_player->v.flags | FL_ONGROUND;
|
sv_player->v.flags = (int) sv_player->v.flags | FL_ONGROUND;
|
||||||
sv_player->v.groundentity =
|
sv_player->v.groundentity =
|
||||||
EDICT_TO_PROG (EDICT_NUM (&sv_progs, pmove.physents[onground].info));
|
EDICT_TO_PROG (&sv_progs, EDICT_NUM (&sv_progs, pmove.physents[onground].info));
|
||||||
} else {
|
} else {
|
||||||
sv_player->v.flags = (int) sv_player->v.flags & ~FL_ONGROUND;
|
sv_player->v.flags = (int) sv_player->v.flags & ~FL_ONGROUND;
|
||||||
}
|
}
|
||||||
|
@ -1619,8 +1619,8 @@ SV_RunCmd (usercmd_t *ucmd, qboolean inside)
|
||||||
ent = EDICT_NUM (&sv_progs, n);
|
ent = EDICT_NUM (&sv_progs, n);
|
||||||
if (!ent->v.touch || (playertouch[n / 8] & (1 << (n % 8))))
|
if (!ent->v.touch || (playertouch[n / 8] & (1 << (n % 8))))
|
||||||
continue;
|
continue;
|
||||||
sv_progs.pr_global_struct->self = EDICT_TO_PROG (ent);
|
sv_progs.pr_global_struct->self = EDICT_TO_PROG (&sv_progs, ent);
|
||||||
sv_progs.pr_global_struct->other = EDICT_TO_PROG (sv_player);
|
sv_progs.pr_global_struct->other = EDICT_TO_PROG (&sv_progs, sv_player);
|
||||||
PR_ExecuteProgram (&sv_progs, ent->v.touch);
|
PR_ExecuteProgram (&sv_progs, ent->v.touch);
|
||||||
playertouch[n / 8] |= 1 << (n % 8);
|
playertouch[n / 8] |= 1 << (n % 8);
|
||||||
}
|
}
|
||||||
|
@ -1640,12 +1640,12 @@ SV_PostRunCmd (void)
|
||||||
|
|
||||||
if (!host_client->spectator) {
|
if (!host_client->spectator) {
|
||||||
sv_progs.pr_global_struct->time = sv.time;
|
sv_progs.pr_global_struct->time = sv.time;
|
||||||
sv_progs.pr_global_struct->self = EDICT_TO_PROG (sv_player);
|
sv_progs.pr_global_struct->self = EDICT_TO_PROG (&sv_progs, sv_player);
|
||||||
PR_ExecuteProgram (&sv_progs, sv_progs.pr_global_struct->PlayerPostThink);
|
PR_ExecuteProgram (&sv_progs, sv_progs.pr_global_struct->PlayerPostThink);
|
||||||
SV_RunNewmis ();
|
SV_RunNewmis ();
|
||||||
} else if (SpectatorThink) {
|
} else if (SpectatorThink) {
|
||||||
sv_progs.pr_global_struct->time = sv.time;
|
sv_progs.pr_global_struct->time = sv.time;
|
||||||
sv_progs.pr_global_struct->self = EDICT_TO_PROG (sv_player);
|
sv_progs.pr_global_struct->self = EDICT_TO_PROG (&sv_progs, sv_player);
|
||||||
PR_ExecuteProgram (&sv_progs, SpectatorThink);
|
PR_ExecuteProgram (&sv_progs, SpectatorThink);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -316,8 +316,8 @@ SV_TouchLinks (edict_t *ent, areanode_t *node)
|
||||||
old_self = sv_progs.pr_global_struct->self;
|
old_self = sv_progs.pr_global_struct->self;
|
||||||
old_other = sv_progs.pr_global_struct->other;
|
old_other = sv_progs.pr_global_struct->other;
|
||||||
|
|
||||||
sv_progs.pr_global_struct->self = EDICT_TO_PROG (touch);
|
sv_progs.pr_global_struct->self = EDICT_TO_PROG (&sv_progs, touch);
|
||||||
sv_progs.pr_global_struct->other = EDICT_TO_PROG (ent);
|
sv_progs.pr_global_struct->other = EDICT_TO_PROG (&sv_progs, ent);
|
||||||
sv_progs.pr_global_struct->time = sv.time;
|
sv_progs.pr_global_struct->time = sv.time;
|
||||||
PR_ExecuteProgram (&sv_progs, touch->v.touch);
|
PR_ExecuteProgram (&sv_progs, touch->v.touch);
|
||||||
|
|
||||||
|
@ -777,9 +777,9 @@ SV_ClipToLinks (areanode_t *node, moveclip_t * clip)
|
||||||
if (clip->trace.allsolid)
|
if (clip->trace.allsolid)
|
||||||
return;
|
return;
|
||||||
if (clip->passedict) {
|
if (clip->passedict) {
|
||||||
if (PROG_TO_EDICT (touch->v.owner) == clip->passedict)
|
if (PROG_TO_EDICT (&sv_progs, touch->v.owner) == clip->passedict)
|
||||||
continue; // don't clip against own missiles
|
continue; // don't clip against own missiles
|
||||||
if (PROG_TO_EDICT (clip->passedict->v.owner) == touch)
|
if (PROG_TO_EDICT (&sv_progs, clip->passedict->v.owner) == touch)
|
||||||
continue; // don't clip against owner
|
continue; // don't clip against owner
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue