1
0
Fork 0
forked from fte/fteqw

Random hacks, ODE works in csqc.

git-svn-id: https://svn.code.sf.net/p/fteqw/code/branches/wip@3464 fc73d0e0-1445-4013-8a0c-d673dee63da5
This commit is contained in:
Spoike 2009-11-17 00:15:44 +00:00
parent 8f43c1297f
commit 1f34680832
30 changed files with 1153 additions and 1101 deletions

View file

@ -275,7 +275,8 @@ static void PClassic_DrawParticles(void)
union c usecolours; union c usecolours;
RSpeedMark(); RSpeedMark();
RQ_RenderDistAndClear(); //make sure all ents are pushed through first
RQ_RenderBatchClear();
if (!active_particles) if (!active_particles)
{ {

View file

@ -1719,37 +1719,7 @@ static void P_AddRainParticles(void)
skipped = false; skipped = false;
lastrendered = particletime; lastrendered = particletime;
/*
{
int i;
glDisable(GL_TEXTURE_2D);
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
glDisable(GL_DEPTH_TEST);
glBegin(GL_TRIANGLES);
st = skytris;
for (i = 0; i < r_part_rain_quantity.ival; i++)
st = st->next;
glVertex3f(st->org[0], st->org[1], st->org[2]);
glVertex3f(st->org[0]+st->x[0], st->org[1]+st->x[1], st->org[2]+st->x[2]);
glVertex3f(st->org[0]+st->y[0], st->org[1]+st->y[1], st->org[2]+st->y[2]);
glEnd();
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
glBegin(GL_POINTS);
for (i = 0; i < 1000; i++)
{
x = frandom()*frandom();
y = frandom() * (1-x);
VectorMA(st->org, x, st->x, org);
VectorMA(org, y, st->y, org);
glVertex3f(org[0], org[1], org[2]);
}
glEnd();
glEnable(GL_DEPTH_TEST);
}
*/
for (ptype = 0; ptype<numparticletypes; ptype++) for (ptype = 0; ptype<numparticletypes; ptype++)
{ {
if (!part_type[ptype].loaded) //woo, batch skipping. if (!part_type[ptype].loaded) //woo, batch skipping.
@ -1757,9 +1727,6 @@ glEnable(GL_DEPTH_TEST);
for (st = part_type[ptype].skytris; st; st = st->next) for (st = part_type[ptype].skytris; st; st = st->next)
{ {
// if (st->face->visframe != r_framecount)
// continue;
if (st->face->visframe != r_framecount) if (st->face->visframe != r_framecount)
{ {
st->nexttime = particletime; st->nexttime = particletime;
@ -4122,10 +4089,6 @@ static void PScript_DrawParticleTypes (void (*texturedparticles)(int count, part
particletime += pframetime; particletime += pframetime;
} }
static void PScript_FlushRenderer(void)
{
}
/* /*
=============== ===============
R_DrawParticles R_DrawParticles
@ -4133,18 +4096,9 @@ R_DrawParticles
*/ */
static void PScript_DrawParticles (void) static void PScript_DrawParticles (void)
{ {
RSpeedMark();
P_AddRainParticles(); P_AddRainParticles();
PScript_FlushRenderer();
PScript_DrawParticleTypes(GL_DrawTexturedParticle, GL_DrawLineSparkParticle, GL_DrawTrifanParticle, GL_DrawTexturedSparkParticle, GL_DrawParticleBeam, GL_DrawClippedDecal); PScript_DrawParticleTypes(GL_DrawTexturedParticle, GL_DrawLineSparkParticle, GL_DrawTrifanParticle, GL_DrawTexturedSparkParticle, GL_DrawParticleBeam, GL_DrawClippedDecal);
RSpeedRemark();
RQ_RenderBatchClear();
RSpeedEnd(RSPEED_PARTICLESDRAW);
} }

View file

@ -440,6 +440,8 @@ skelobject_t *skel_get(progfuncs_t *prinst, int skelidx, int bonecount);
void skel_dodelete(void); void skel_dodelete(void);
qboolean csqc_deprecated_warned;
#define csqc_deprecated(s) do {if (!csqc_deprecated_warned){Con_Printf("deprecated feature used: %s\n", s); csqc_deprecated_warned = true;}}while(0)
static model_t *CSQC_GetModelForIndex(int index); static model_t *CSQC_GetModelForIndex(int index);
@ -543,6 +545,18 @@ static void PF_cvar (progfuncs_t *prinst, struct globalvars_s *pr_globals)
char *str; char *str;
str = PR_GetStringOfs(prinst, OFS_PARM0); str = PR_GetStringOfs(prinst, OFS_PARM0);
if (!strcmp(str, "vid_conwidth"))
{
csqc_deprecated("vid_conwidth cvar");
G_FLOAT(OFS_RETURN) = vid.width;
}
else if (!strcmp(str, "vid_conheight"))
{
csqc_deprecated("vid_conheight cvar");
G_FLOAT(OFS_RETURN) = vid.height;
}
else
{ {
var = Cvar_Get(str, "", 0, "csqc cvars"); var = Cvar_Get(str, "", 0, "csqc cvars");
if (var) if (var)
@ -1356,8 +1370,6 @@ static void PF_R_RenderScene(progfuncs_t *prinst, struct globalvars_s *pr_global
if (qrenderer == QR_OPENGL) if (qrenderer == QR_OPENGL)
{ {
gl_ztrickdisabled|=16; gl_ztrickdisabled|=16;
qglDisable(GL_ALPHA_TEST);
qglDisable(GL_BLEND);
} }
#endif #endif
@ -1373,16 +1385,6 @@ static void PF_R_RenderScene(progfuncs_t *prinst, struct globalvars_s *pr_global
{ {
gl_ztrickdisabled&=~16; gl_ztrickdisabled&=~16;
GL_Set2D (); GL_Set2D ();
qglBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
GL_TexEnv(GL_MODULATE);
}
#endif
#ifdef GLQUAKE
if (qrenderer == QR_OPENGL)
{
qglDisable(GL_ALPHA_TEST);
qglEnable(GL_BLEND);
} }
#endif #endif
@ -2164,6 +2166,8 @@ typedef struct {
} }
else else
{ {
csqc_deprecated("runplayerphysics with no ent");
if (csqcg.pmove_jump_held) if (csqcg.pmove_jump_held)
pmove.jump_held = *csqcg.pmove_jump_held; pmove.jump_held = *csqcg.pmove_jump_held;
if (csqcg.pmove_waterjumptime) if (csqcg.pmove_waterjumptime)
@ -3934,82 +3938,13 @@ static void PF_skel_delete (progfuncs_t *prinst, struct globalvars_s *pr_globals
static qboolean CS_CheckBottom (csqcedict_t *ent)
{
int savedhull;
vec3_t mins, maxs, start, stop;
trace_t trace;
int x, y;
float mid, bottom;
if (!cl.worldmodel)
return false;
VectorAdd (ent->v->origin, ent->v->mins, mins);
VectorAdd (ent->v->origin, ent->v->maxs, maxs);
// if all of the points under the corners are solid world, don't bother
// with the tougher checks
// the corners must be within 16 of the midpoint
start[2] = mins[2] - 1;
for (x=0 ; x<=1 ; x++)
for (y=0 ; y<=1 ; y++)
{
start[0] = x ? maxs[0] : mins[0];
start[1] = y ? maxs[1] : mins[1];
if (!(CS_PointContents (start) & FTECONTENTS_SOLID))
goto realcheck;
}
// c_yes++;
return true; // we got out easy
realcheck:
// c_no++;
//
// check it for real...
//
start[2] = mins[2];
// the midpoint must be within 16 of the bottom
start[0] = stop[0] = (mins[0] + maxs[0])*0.5;
start[1] = stop[1] = (mins[1] + maxs[1])*0.5;
stop[2] = start[2] - 2*movevars.stepheight;
trace = World_Move (&csqc_world, start, vec3_origin, vec3_origin, stop, true, (wedict_t*)ent);
if (trace.fraction == 1.0)
return false;
mid = bottom = trace.endpos[2];
// the corners must be within 16 of the midpoint
for (x=0 ; x<=1 ; x++)
for (y=0 ; y<=1 ; y++)
{
start[0] = stop[0] = x ? maxs[0] : mins[0];
start[1] = stop[1] = y ? maxs[1] : mins[1];
savedhull = ent->xv->hull;
ent->xv->hull = 0;
trace = World_Move (&csqc_world, start, vec3_origin, vec3_origin, stop, true, (wedict_t*)ent);
ent->xv->hull = savedhull;
if (trace.fraction != 1.0 && trace.endpos[2] > bottom)
bottom = trace.endpos[2];
if (trace.fraction == 1.0 || mid - trace.endpos[2] > movevars.stepheight)
return false;
}
// c_yes++;
return true;
}
static void PF_cs_checkbottom (progfuncs_t *prinst, struct globalvars_s *pr_globals) static void PF_cs_checkbottom (progfuncs_t *prinst, struct globalvars_s *pr_globals)
{ {
csqcedict_t *ent; csqcedict_t *ent;
ent = (csqcedict_t*)G_EDICT(prinst, OFS_PARM0); ent = (csqcedict_t*)G_EDICT(prinst, OFS_PARM0);
G_FLOAT(OFS_RETURN) = CS_CheckBottom (ent); G_FLOAT(OFS_RETURN) = World_CheckBottom (&csqc_world, (wedict_t*)ent);
} }
static void PF_cs_break (progfuncs_t *prinst, struct globalvars_s *pr_globals) static void PF_cs_break (progfuncs_t *prinst, struct globalvars_s *pr_globals)
@ -4113,7 +4048,7 @@ static qboolean CS_movestep (csqcedict_t *ent, vec3_t move, qboolean relink, qbo
// check point traces down for dangling corners // check point traces down for dangling corners
VectorCopy (trace.endpos, ent->v->origin); VectorCopy (trace.endpos, ent->v->origin);
if (!CS_CheckBottom (ent)) if (!World_CheckBottom (&csqc_world, (wedict_t*)ent))
{ {
if ( (int)ent->v->flags & FL_PARTIALGROUND ) if ( (int)ent->v->flags & FL_PARTIALGROUND )
{ // entity had floor mostly pulled out from underneath it { // entity had floor mostly pulled out from underneath it
@ -4177,6 +4112,15 @@ static void PF_cs_walkmove (progfuncs_t *prinst, struct globalvars_s *pr_globals
*csqcg.self = oldself; *csqcg.self = oldself;
} }
static void PF_cs_movetogoal (progfuncs_t *prinst, struct globalvars_s *pr_globals)
{
wedict_t *ent;
float dist;
ent = (wedict_t*)PROG_TO_EDICT(prinst, *csqcg.self);
dist = G_FLOAT(OFS_PARM0);
World_MoveToGoal (&csqc_world, ent, dist);
}
static void CS_ConsoleCommand_f(void) static void CS_ConsoleCommand_f(void)
{ //FIXME: unregister them. { //FIXME: unregister them.
char cmd[2048]; char cmd[2048];
@ -4801,7 +4745,7 @@ static struct {
{"etos", PF_etos, 65}, // #65 string(entity ent) etos (DP_QC_ETOS) {"etos", PF_etos, 65}, // #65 string(entity ent) etos (DP_QC_ETOS)
{"?", PF_Fixme, 66}, // #66 {"?", PF_Fixme, 66}, // #66
// {"movetogoal", PF_Fixme, 67}, // #67 void(float step) movetogoal (QUAKE) {"movetogoal", PF_cs_movetogoal, 67}, // #67 void(float step) movetogoal (QUAKE)
{"precache_file", PF_NoCSQC, 68}, // #68 void(string s) precache_file (QUAKE) (don't support) {"precache_file", PF_NoCSQC, 68}, // #68 void(string s) precache_file (QUAKE) (don't support)
{"makestatic", PF_cs_makestatic, 69}, // #69 void(entity e) makestatic (QUAKE) {"makestatic", PF_cs_makestatic, 69}, // #69 void(entity e) makestatic (QUAKE)
//70 //70
@ -5311,6 +5255,10 @@ void CSQC_Shutdown(void)
} }
csqcprogs = NULL; csqcprogs = NULL;
#ifdef USEODE
World_Physics_End(&csqc_world);
#endif
Z_Free(csqcdelta_pack_new.e); Z_Free(csqcdelta_pack_new.e);
memset(&csqcdelta_pack_new, 0, sizeof(csqcdelta_pack_new)); memset(&csqcdelta_pack_new, 0, sizeof(csqcdelta_pack_new));
Z_Free(csqcdelta_pack_old.e); Z_Free(csqcdelta_pack_old.e);
@ -5513,6 +5461,7 @@ qboolean CSQC_Init (unsigned int checksum)
in_sensitivityscale = 1; in_sensitivityscale = 1;
csqcmapentitydataloaded = true; csqcmapentitydataloaded = true;
csqcprogs = InitProgs(&csqcprogparms); csqcprogs = InitProgs(&csqcprogparms);
csqc_world.progs = csqcprogs;
PR_Configure(csqcprogs, -1, 16); PR_Configure(csqcprogs, -1, 16);
csqc_world.worldmodel = cl.worldmodel; csqc_world.worldmodel = cl.worldmodel;
csqc_world.Event_Touch = CSQC_Event_Touch; csqc_world.Event_Touch = CSQC_Event_Touch;
@ -5548,18 +5497,22 @@ qboolean CSQC_Init (unsigned int checksum)
CSQC_FindGlobals(); CSQC_FindGlobals();
csqc_world.physicstime = 0;
csqc_fakereadbyte = -1; csqc_fakereadbyte = -1;
memset(csqcent, 0, sizeof(*csqcent)*maxcsqcentities); //clear the server->csqc entity translations. memset(csqcent, 0, sizeof(*csqcent)*maxcsqcentities); //clear the server->csqc entity translations.
csqcentsize = PR_InitEnts(csqcprogs, pr_csmaxedicts.value); csqcentsize = PR_InitEnts(csqcprogs, pr_csmaxedicts.value);
ED_Alloc(csqcprogs); //we need a word entity. ED_Alloc(csqcprogs); //we need a world entity.
//world edict becomes readonly //world edict becomes readonly
worldent = (csqcedict_t *)EDICT_NUM(csqcprogs, 0); worldent = (csqcedict_t *)EDICT_NUM(csqcprogs, 0);
worldent->readonly = true; worldent->readonly = true;
worldent->isfree = false; worldent->isfree = false;
worldent->v->model = PR_SetString(csqcprogs, cl.model_name[1]); worldent->v->modelindex = 1;
worldent->v->model = PR_SetString(csqcprogs, cl.model_name[(int)worldent->v->modelindex]);
worldent->v->solid = SOLID_BSP;
str = (string_t*)csqcprogs->GetEdictFieldValue(csqcprogs, (edict_t*)worldent, "message", NULL); str = (string_t*)csqcprogs->GetEdictFieldValue(csqcprogs, (edict_t*)worldent, "message", NULL);
if (str) if (str)
@ -5598,6 +5551,12 @@ void CSQC_WorldLoaded(void)
return; return;
csqcmapentitydataloaded = true; csqcmapentitydataloaded = true;
csqcmapentitydata = cl.worldmodel->entities; csqcmapentitydata = cl.worldmodel->entities;
csqc_world.worldmodel = cl.worldmodel;
#ifdef USEODE
World_Physics_Start(&csqc_world);
#endif
if (csqcg.worldloaded) if (csqcg.worldloaded)
PR_ExecuteProgram(csqcprogs, csqcg.worldloaded); PR_ExecuteProgram(csqcprogs, csqcg.worldloaded);
csqcmapentitydata = NULL; csqcmapentitydata = NULL;
@ -5748,13 +5707,39 @@ void CSQC_RegisterCvarsAndThings(void)
qboolean CSQC_DrawView(void) qboolean CSQC_DrawView(void)
{ {
#ifdef USEODE
int ticlimit = 10;
float ft;
float mintic = 0.01;
#endif
if (!csqcg.draw_function || !csqcprogs || !cl.worldmodel) if (!csqcg.draw_function || !csqcprogs || !cl.worldmodel)
return false; return false;
r_secondaryview = 0; r_secondaryview = 0;
CL_CalcClientTime(); CL_CalcClientTime();
#ifdef USEODE
while(1)
{
ft = cl.servertime - csqc_world.physicstime;
if (ft < mintic)
break;
if (!--ticlimit)
{
csqc_world.physicstime = cl.servertime;
break;
}
if (ft > mintic)
ft = mintic;
csqc_world.physicstime += ft;
World_Physics_Frame(&csqc_world, ft, 800);
}
#else
csqc_world.physicstime = cl.servertime; csqc_world.physicstime = cl.servertime;
#endif
DropPunchAngle (0); DropPunchAngle (0);
if (cl.worldmodel) if (cl.worldmodel)

File diff suppressed because it is too large Load diff

View file

@ -238,7 +238,7 @@ void P_EmitEffect (vec3_t pos, int type, trailstate_t **tsk)
if (cl.paused) if (cl.paused)
return; return;
pe->RunParticleEffectState(pos, NULL, host_frametime, type, tsk); pe->RunParticleEffectState(pos, NULL, ((host_frametime>0.1)?0.1:host_frametime), type, tsk);
} }

View file

@ -190,6 +190,7 @@ void Surf_LessenStains(void);
void Surf_WipeStains(void); void Surf_WipeStains(void);
void Surf_DeInit(void); void Surf_DeInit(void);
void Surf_BuildLightmaps(void); void Surf_BuildLightmaps(void);
void Surf_BuildSurfaceDisplayList (struct model_s *mod, struct msurface_s *fa);
void Surf_RenderDynamicLightmaps (struct msurface_s *fa, int shift); void Surf_RenderDynamicLightmaps (struct msurface_s *fa, int shift);
int Surf_LightmapShift (struct model_s *model); int Surf_LightmapShift (struct model_s *model);
#ifndef LMBLOCK_WIDTH #ifndef LMBLOCK_WIDTH

View file

@ -3,7 +3,7 @@
void RQ_AddDistReorder(void (*render) (int count, void **objects, void *objtype), void *object, void *objtype, float *pos); void RQ_AddDistReorder(void (*render) (int count, void **objects, void *objtype), void *object, void *objtype, float *pos);
void RQ_RenderDistAndClear(void); FTE_DEPRECATED void RQ_RenderDistAndClear(void);
void RQ_RenderBatchClear(void); void RQ_RenderBatchClear(void);
typedef struct renderque_s typedef struct renderque_s

View file

@ -123,6 +123,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#define PSET_CLASSIC #define PSET_CLASSIC
#define CSQC_DAT //support for csqc
#ifndef SERVERONLY //don't be stupid, stupid. #ifndef SERVERONLY //don't be stupid, stupid.
#ifndef CLIENTONLY #ifndef CLIENTONLY
#define CLIENTONLY #define CLIENTONLY

View file

@ -1540,7 +1540,7 @@ static void World_Physics_Frame_JointFromEntity(world_t *world, wedict_t *ed)
//Con_Printf("made new joint %i\n", (int) (ed - prog->edicts)); //Con_Printf("made new joint %i\n", (int) (ed - prog->edicts));
dJointSetData(j, (void *) ed); dJointSetData(j, (void *) ed);
if(enemy) if(enemy)
b1 = (dBodyID)(EDICT_NUM(world->progs, enemy)->ode.ode_body); b1 = (dBodyID)(((wedict_t*)EDICT_NUM(world->progs, enemy))->ode.ode_body);
if(aiment) if(aiment)
b2 = (dBodyID)world->edicts[aiment].ode.ode_body; b2 = (dBodyID)world->edicts[aiment].ode.ode_body;
dJointAttach(j, b1, b2); dJointAttach(j, b1, b2);

View file

@ -352,7 +352,6 @@ void PF_logfrag (progfuncs_t *prinst, struct globalvars_s *pr_globals);
void PF_centerprint (progfuncs_t *prinst, struct globalvars_s *pr_globals); void PF_centerprint (progfuncs_t *prinst, struct globalvars_s *pr_globals);
void PF_ExecuteCommand (progfuncs_t *prinst, struct globalvars_s *pr_globals); void PF_ExecuteCommand (progfuncs_t *prinst, struct globalvars_s *pr_globals);
void PF_setspawnparms (progfuncs_t *prinst, struct globalvars_s *pr_globals); void PF_setspawnparms (progfuncs_t *prinst, struct globalvars_s *pr_globals);
void PF_walkmove (progfuncs_t *prinst, struct globalvars_s *pr_globals);
void PF_ForceInfoKey(progfuncs_t *prinst, struct globalvars_s *pr_globals); void PF_ForceInfoKey(progfuncs_t *prinst, struct globalvars_s *pr_globals);
void PF_precache_vwep_model(progfuncs_t *prinst, struct globalvars_s *pr_globals); void PF_precache_vwep_model(progfuncs_t *prinst, struct globalvars_s *pr_globals);
int PF_checkclient_Internal (progfuncs_t *prinst); int PF_checkclient_Internal (progfuncs_t *prinst);
@ -365,6 +364,8 @@ void PF_WriteString_Internal (int target, char *str);
pbool ED_CanFree (edict_t *ed); pbool ED_CanFree (edict_t *ed);
#endif #endif
#define MOVETYPE_NONE 0 // never moves
#define MOVETYPE_PHYSICS 32
// edict->solid values // edict->solid values
#define SOLID_NOT 0 // no interaction with other objects #define SOLID_NOT 0 // no interaction with other objects
@ -375,6 +376,17 @@ pbool ED_CanFree (edict_t *ed);
#define SOLID_PHASEH2 5 #define SOLID_PHASEH2 5
#define SOLID_CORPSE 5 #define SOLID_CORPSE 5
#define SOLID_LADDER 20 //dmw. touch on edge, not blocking. Touching players have different physics. Otherwise a SOLID_TRIGGER #define SOLID_LADDER 20 //dmw. touch on edge, not blocking. Touching players have different physics. Otherwise a SOLID_TRIGGER
#define SOLID_PHYSICS_BOX 32 ///< physics object (mins, maxs, mass, origin, axis_forward, axis_left, axis_up, velocity, spinvelocity)
#define SOLID_PHYSICS_SPHERE 33 ///< physics object (mins, maxs, mass, origin, axis_forward, axis_left, axis_up, velocity, spinvelocity)
#define SOLID_PHYSICS_CAPSULE 34 ///< physics object (mins, maxs, mass, origin, axis_forward, axis_left, axis_up, velocity, spinvelocity)
#define JOINTTYPE_POINT 1
#define JOINTTYPE_HINGE 2
#define JOINTTYPE_SLIDER 3
#define JOINTTYPE_UNIVERSAL 4
#define JOINTTYPE_HINGE2 5
#define JOINTTYPE_FIXED -1
#define DAMAGE_NO 0 #define DAMAGE_NO 0
#define DAMAGE_YES 1 #define DAMAGE_YES 1

View file

@ -105,6 +105,8 @@ typedef struct areanode_s
#define AREA_DEPTH 4 #define AREA_DEPTH 4
#define AREA_NODES 32 //pow(2, AREA_DEPTH+1) #define AREA_NODES 32 //pow(2, AREA_DEPTH+1)
#define EDICT_FROM_AREA(l) STRUCT_FROM_LINK(l,wedict_t,area)
typedef struct wedict_s wedict_t; typedef struct wedict_s wedict_t;
typedef struct typedef struct
@ -142,8 +144,6 @@ FTE_DEPRECATED unsigned int edict_size;
}; };
typedef struct world_s world_t; typedef struct world_s world_t;
#ifndef CLIENTONLY
#ifdef USEODE #ifdef USEODE
void World_Physics_RemoveFromEntity(world_t *world, wedict_t *ed); void World_Physics_RemoveFromEntity(world_t *world, wedict_t *ed);
void World_Physics_RemoveJointFromEntity(world_t *world, wedict_t *ed); void World_Physics_RemoveJointFromEntity(world_t *world, wedict_t *ed);
@ -207,4 +207,10 @@ qboolean Q2BSP_EdictInFatPVS(model_t *mod, wedict_t *ent, qbyte *pvs);
void Q2BSP_FindTouchedLeafs(world_t *w, model_t *mod, wedict_t *ent, float *mins, float *maxs); void Q2BSP_FindTouchedLeafs(world_t *w, model_t *mod, wedict_t *ent, float *mins, float *maxs);
#endif #endif
#endif
/*sv_move.c*/
qboolean World_CheckBottom (world_t *world, wedict_t *ent);
qboolean World_movestep (world_t *world, wedict_t *ent, vec3_t move, qboolean relink, qboolean noenemy, struct globalvars_s *set_trace);
qboolean World_MoveToGoal (world_t *world, wedict_t *ent, float dist);

View file

@ -1686,7 +1686,7 @@ void *Cache_Alloc (cache_user_t *c, int size, char *name)
if (c->data) if (c->data)
Sys_Error ("Cache_Alloc: already allocated"); Sys_Error ("Cache_Alloc: already allocated");
if (size <= 0) if (size <= 0)
Sys_Error ("Cache_Alloc: size %i", size); Sys_Error ("Cache_Alloc: size %i", size);

View file

@ -1190,6 +1190,7 @@ static void (D3D9_R_RenderView) (void)
d3d9error(IDirect3DDevice9_Clear(pD3DDev9, 0, NULL, D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0,0,0), 1, 0)); d3d9error(IDirect3DDevice9_Clear(pD3DDev9, 0, NULL, D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0,0,0), 1, 0));
Surf_DrawWorld(); Surf_DrawWorld();
P_DrawParticles (); P_DrawParticles ();
RQ_RenderBatchClear();
} }
void (D3D9_R_NewMap) (void); void (D3D9_R_NewMap) (void);

View file

@ -3727,190 +3727,6 @@
/> />
</FileConfiguration> </FileConfiguration>
</File> </File>
<File
RelativePath="..\server\sv_move.c"
>
<FileConfiguration
Name="MinGLDebug|Win32"
>
<Tool
Name="VCCLCompilerTool"
AdditionalIncludeDirectories=""
PreprocessorDefinitions=""
PrecompiledHeaderThrough="qwsvdef.h"
/>
</FileConfiguration>
<FileConfiguration
Name="MinGLDebug|x64"
>
<Tool
Name="VCCLCompilerTool"
AdditionalIncludeDirectories=""
PreprocessorDefinitions=""
PrecompiledHeaderThrough="qwsvdef.h"
/>
</FileConfiguration>
<FileConfiguration
Name="D3DDebug|Win32"
>
<Tool
Name="VCCLCompilerTool"
AdditionalIncludeDirectories=""
PreprocessorDefinitions=""
PrecompiledHeaderThrough="qwsvdef.h"
/>
</FileConfiguration>
<FileConfiguration
Name="D3DDebug|x64"
>
<Tool
Name="VCCLCompilerTool"
AdditionalIncludeDirectories=""
PreprocessorDefinitions=""
PrecompiledHeaderThrough="qwsvdef.h"
/>
</FileConfiguration>
<FileConfiguration
Name="MinGLRelease|Win32"
>
<Tool
Name="VCCLCompilerTool"
AdditionalIncludeDirectories=""
PreprocessorDefinitions=""
PrecompiledHeaderThrough="qwsvdef.h"
/>
</FileConfiguration>
<FileConfiguration
Name="MinGLRelease|x64"
>
<Tool
Name="VCCLCompilerTool"
AdditionalIncludeDirectories=""
PreprocessorDefinitions=""
PrecompiledHeaderThrough="qwsvdef.h"
/>
</FileConfiguration>
<FileConfiguration
Name="GLDebug|Win32"
>
<Tool
Name="VCCLCompilerTool"
AdditionalIncludeDirectories=""
PreprocessorDefinitions=""
PrecompiledHeaderThrough="qwsvdef.h"
/>
</FileConfiguration>
<FileConfiguration
Name="GLDebug|x64"
>
<Tool
Name="VCCLCompilerTool"
AdditionalIncludeDirectories=""
PreprocessorDefinitions=""
PrecompiledHeaderThrough="qwsvdef.h"
/>
</FileConfiguration>
<FileConfiguration
Name="Release Dedicated Server|Win32"
>
<Tool
Name="VCCLCompilerTool"
AdditionalIncludeDirectories=""
PreprocessorDefinitions=""
PrecompiledHeaderThrough="qwsvdef.h"
/>
</FileConfiguration>
<FileConfiguration
Name="Release Dedicated Server|x64"
>
<Tool
Name="VCCLCompilerTool"
AdditionalIncludeDirectories=""
PreprocessorDefinitions=""
PrecompiledHeaderThrough="qwsvdef.h"
/>
</FileConfiguration>
<FileConfiguration
Name="MRelease|Win32"
>
<Tool
Name="VCCLCompilerTool"
AdditionalIncludeDirectories=""
PreprocessorDefinitions=""
PrecompiledHeaderThrough="qwsvdef.h"
/>
</FileConfiguration>
<FileConfiguration
Name="MRelease|x64"
>
<Tool
Name="VCCLCompilerTool"
AdditionalIncludeDirectories=""
PreprocessorDefinitions=""
PrecompiledHeaderThrough="qwsvdef.h"
/>
</FileConfiguration>
<FileConfiguration
Name="Debug Dedicated Server|Win32"
>
<Tool
Name="VCCLCompilerTool"
AdditionalIncludeDirectories=""
PreprocessorDefinitions=""
PrecompiledHeaderThrough="qwsvdef.h"
/>
</FileConfiguration>
<FileConfiguration
Name="Debug Dedicated Server|x64"
>
<Tool
Name="VCCLCompilerTool"
AdditionalIncludeDirectories=""
PreprocessorDefinitions=""
PrecompiledHeaderThrough="qwsvdef.h"
/>
</FileConfiguration>
<FileConfiguration
Name="MDebug|Win32"
>
<Tool
Name="VCCLCompilerTool"
AdditionalIncludeDirectories=""
PreprocessorDefinitions=""
PrecompiledHeaderThrough="qwsvdef.h"
/>
</FileConfiguration>
<FileConfiguration
Name="MDebug|x64"
>
<Tool
Name="VCCLCompilerTool"
AdditionalIncludeDirectories=""
PreprocessorDefinitions=""
PrecompiledHeaderThrough="qwsvdef.h"
/>
</FileConfiguration>
<FileConfiguration
Name="GLRelease|Win32"
>
<Tool
Name="VCCLCompilerTool"
AdditionalIncludeDirectories=""
PreprocessorDefinitions=""
PrecompiledHeaderThrough="qwsvdef.h"
/>
</FileConfiguration>
<FileConfiguration
Name="GLRelease|x64"
>
<Tool
Name="VCCLCompilerTool"
AdditionalIncludeDirectories=""
PreprocessorDefinitions=""
PrecompiledHeaderThrough="qwsvdef.h"
/>
</FileConfiguration>
</File>
<File <File
RelativePath="..\server\sv_mvd.c" RelativePath="..\server\sv_mvd.c"
> >
@ -21418,6 +21234,190 @@
/> />
</FileConfiguration> </FileConfiguration>
</File> </File>
<File
RelativePath="..\server\sv_move.c"
>
<FileConfiguration
Name="MinGLDebug|Win32"
>
<Tool
Name="VCCLCompilerTool"
AdditionalIncludeDirectories=""
PreprocessorDefinitions=""
PrecompiledHeaderThrough="quakedef.h"
/>
</FileConfiguration>
<FileConfiguration
Name="MinGLDebug|x64"
>
<Tool
Name="VCCLCompilerTool"
AdditionalIncludeDirectories=""
PreprocessorDefinitions=""
PrecompiledHeaderThrough="qwsvdef.h"
/>
</FileConfiguration>
<FileConfiguration
Name="D3DDebug|Win32"
>
<Tool
Name="VCCLCompilerTool"
AdditionalIncludeDirectories=""
PreprocessorDefinitions=""
PrecompiledHeaderThrough="quakedef.h"
/>
</FileConfiguration>
<FileConfiguration
Name="D3DDebug|x64"
>
<Tool
Name="VCCLCompilerTool"
AdditionalIncludeDirectories=""
PreprocessorDefinitions=""
PrecompiledHeaderThrough="qwsvdef.h"
/>
</FileConfiguration>
<FileConfiguration
Name="MinGLRelease|Win32"
>
<Tool
Name="VCCLCompilerTool"
AdditionalIncludeDirectories=""
PreprocessorDefinitions=""
PrecompiledHeaderThrough="quakedef.h"
/>
</FileConfiguration>
<FileConfiguration
Name="MinGLRelease|x64"
>
<Tool
Name="VCCLCompilerTool"
AdditionalIncludeDirectories=""
PreprocessorDefinitions=""
PrecompiledHeaderThrough="qwsvdef.h"
/>
</FileConfiguration>
<FileConfiguration
Name="GLDebug|Win32"
>
<Tool
Name="VCCLCompilerTool"
AdditionalIncludeDirectories=""
PreprocessorDefinitions=""
PrecompiledHeaderThrough="quakedef.h"
/>
</FileConfiguration>
<FileConfiguration
Name="GLDebug|x64"
>
<Tool
Name="VCCLCompilerTool"
AdditionalIncludeDirectories=""
PreprocessorDefinitions=""
PrecompiledHeaderThrough="qwsvdef.h"
/>
</FileConfiguration>
<FileConfiguration
Name="Release Dedicated Server|Win32"
>
<Tool
Name="VCCLCompilerTool"
AdditionalIncludeDirectories=""
PreprocessorDefinitions=""
PrecompiledHeaderThrough="quakedef.h"
/>
</FileConfiguration>
<FileConfiguration
Name="Release Dedicated Server|x64"
>
<Tool
Name="VCCLCompilerTool"
AdditionalIncludeDirectories=""
PreprocessorDefinitions=""
PrecompiledHeaderThrough="qwsvdef.h"
/>
</FileConfiguration>
<FileConfiguration
Name="MRelease|Win32"
>
<Tool
Name="VCCLCompilerTool"
AdditionalIncludeDirectories=""
PreprocessorDefinitions=""
PrecompiledHeaderThrough="quakedef.h"
/>
</FileConfiguration>
<FileConfiguration
Name="MRelease|x64"
>
<Tool
Name="VCCLCompilerTool"
AdditionalIncludeDirectories=""
PreprocessorDefinitions=""
PrecompiledHeaderThrough="qwsvdef.h"
/>
</FileConfiguration>
<FileConfiguration
Name="Debug Dedicated Server|Win32"
>
<Tool
Name="VCCLCompilerTool"
AdditionalIncludeDirectories=""
PreprocessorDefinitions=""
PrecompiledHeaderThrough="quakedef.h"
/>
</FileConfiguration>
<FileConfiguration
Name="Debug Dedicated Server|x64"
>
<Tool
Name="VCCLCompilerTool"
AdditionalIncludeDirectories=""
PreprocessorDefinitions=""
PrecompiledHeaderThrough="qwsvdef.h"
/>
</FileConfiguration>
<FileConfiguration
Name="MDebug|Win32"
>
<Tool
Name="VCCLCompilerTool"
AdditionalIncludeDirectories=""
PreprocessorDefinitions=""
PrecompiledHeaderThrough="quakedef.h"
/>
</FileConfiguration>
<FileConfiguration
Name="MDebug|x64"
>
<Tool
Name="VCCLCompilerTool"
AdditionalIncludeDirectories=""
PreprocessorDefinitions=""
PrecompiledHeaderThrough="qwsvdef.h"
/>
</FileConfiguration>
<FileConfiguration
Name="GLRelease|Win32"
>
<Tool
Name="VCCLCompilerTool"
AdditionalIncludeDirectories=""
PreprocessorDefinitions=""
PrecompiledHeaderThrough="quakedef.h"
/>
</FileConfiguration>
<FileConfiguration
Name="GLRelease|x64"
>
<Tool
Name="VCCLCompilerTool"
AdditionalIncludeDirectories=""
PreprocessorDefinitions=""
PrecompiledHeaderThrough="qwsvdef.h"
/>
</FileConfiguration>
</File>
<File <File
RelativePath="..\common\translate.c" RelativePath="..\common\translate.c"
> >

View file

@ -1156,7 +1156,6 @@ void R_DrawGAliasModel (entity_t *e, unsigned int rmode)
BE_SelectMode(rmode, 0); BE_SelectMode(rmode, 0);
} }
#if defined(RTLIGHTS) && defined(GLQUAKE)
//returns result in the form of the result vector //returns result in the form of the result vector
void RotateLightVector(const vec3_t *axis, const vec3_t origin, const vec3_t lightpoint, vec3_t result) void RotateLightVector(const vec3_t *axis, const vec3_t origin, const vec3_t lightpoint, vec3_t result)
{ {
@ -1171,6 +1170,7 @@ void RotateLightVector(const vec3_t *axis, const vec3_t origin, const vec3_t lig
result[2] = DotProduct (offs, axis[2]); result[2] = DotProduct (offs, axis[2]);
} }
#if defined(RTLIGHTS) && defined(GLQUAKE)
void GL_LightMesh (mesh_t *mesh, vec3_t lightpos, vec3_t colours, float radius) void GL_LightMesh (mesh_t *mesh, vec3_t lightpos, vec3_t colours, float radius)
{ {
vec3_t dir; vec3_t dir;

View file

@ -1901,14 +1901,6 @@ static void DrawPass(const shaderpass_t *pass, const mesh_t *meshlist)
checkerror(); checkerror();
} }
#if 0
void Matrix4_TransformN3(float *matrix, float *_vector, float *product)
{
product[0] = -matrix[12] - matrix[0]*_vector[0] - matrix[4]*_vector[1] - matrix[8]*_vector[2];
product[1] = -matrix[13] - matrix[1]*_vector[0] - matrix[5]*_vector[1] - matrix[9]*_vector[2];
product[2] = -matrix[14] - matrix[2]*_vector[0] - matrix[6]*_vector[1] - matrix[10]*_vector[2];
}
#endif
static void BE_RenderMeshProgram(const shader_t *shader, const shaderpass_t *pass, const mesh_t *meshlist) static void BE_RenderMeshProgram(const shader_t *shader, const shaderpass_t *pass, const mesh_t *meshlist)
{ {
@ -2497,8 +2489,10 @@ static void BaseBrushTextures(entity_t *ent)
msurface_t *s, *chain; msurface_t *s, *chain;
model_t *model; model_t *model;
#ifdef RTLIGHTS
if (BE_LightCullModel(ent->origin, ent->model)) if (BE_LightCullModel(ent->origin, ent->model))
return; return;
#endif
qglPushMatrix(); qglPushMatrix();
R_RotateForEntity(ent); R_RotateForEntity(ent);

View file

@ -1224,6 +1224,7 @@ void R_RenderScene (void)
TRACE(("dbg: calling R_DrawParticles\n")); TRACE(("dbg: calling R_DrawParticles\n"));
P_DrawParticles (); P_DrawParticles ();
} }
RQ_RenderBatchClear();
} }

View file

@ -1762,6 +1762,9 @@ static void Sh_DrawBrushModelShadow(dlight_t *dl, entity_t *e)
continue; continue;
} }
if (!surf->mesh)
continue;
//front face //front face
qglVertexPointer(3, GL_FLOAT, sizeof(vecV_t), surf->mesh->xyz_array); qglVertexPointer(3, GL_FLOAT, sizeof(vecV_t), surf->mesh->xyz_array);
qglDrawArrays(GL_POLYGON, 0, surf->mesh->numvertexes); qglDrawArrays(GL_POLYGON, 0, surf->mesh->numvertexes);

View file

@ -473,6 +473,7 @@ GLhandleARB GLSlang_CreateShader (char *precompilerconstants, char *shadersource
GLhandleARB shader; GLhandleARB shader;
GLint compiled; GLint compiled;
char str[1024]; char str[1024];
int loglen;
char *prstrings[3]; char *prstrings[3];
if (!precompilerconstants) if (!precompilerconstants)
@ -500,6 +501,7 @@ GLhandleARB GLSlang_CreateShader (char *precompilerconstants, char *shadersource
qglGetObjectParameterivARB(shader, GL_OBJECT_COMPILE_STATUS_ARB, &compiled); qglGetObjectParameterivARB(shader, GL_OBJECT_COMPILE_STATUS_ARB, &compiled);
if(!compiled) if(!compiled)
{ {
Con_DPrintf("Shader source:\n%s%s%s\n", prstrings[0], prstrings[1], prstrings[2]);
qglGetInfoLogARB(shader, sizeof(str), NULL, str); qglGetInfoLogARB(shader, sizeof(str), NULL, str);
qglDeleteObjectARB(shader); qglDeleteObjectARB(shader);
switch (shadertype) switch (shadertype)
@ -517,6 +519,20 @@ GLhandleARB GLSlang_CreateShader (char *precompilerconstants, char *shadersource
return 0; return 0;
} }
if (developer.ival)
{
qglGetObjectParameterivARB(shader, GL_OBJECT_INFO_LOG_LENGTH_ARB, &loglen);
if (loglen)
{
qglGetInfoLogARB(shader, sizeof(str), NULL, str);
if (strstr(str, "WARNING"))
{
Con_Printf("Shader source:\n%s%s%s\n", prstrings[0], prstrings[1], prstrings[2]);
Con_Printf("%s\n", str);
}
}
}
return shader; return shader;
} }

View file

@ -98,6 +98,9 @@ int PR_InitEnts(progfuncs_t *progfuncs, int max_ents)
QC_ClearEdict(progfuncs, sv_edicts); QC_ClearEdict(progfuncs, sv_edicts);
sv_num_edicts = 1; sv_num_edicts = 1;
if (externs->entspawn)
externs->entspawn((struct edict_s *)sv_edicts, false);
return max_fields_size; return max_fields_size;
} }
edictrun_t tempedict; //used as a safty buffer edictrun_t tempedict; //used as a safty buffer

View file

@ -3468,6 +3468,15 @@ void PF_svcoredump (progfuncs_t *prinst, struct globalvars_s *pr_globals)
BZ_Free(buffer); BZ_Free(buffer);
} }
static void PF_sv_movetogoal (progfuncs_t *prinst, struct globalvars_s *pr_globals)
{
wedict_t *ent;
float dist;
ent = (wedict_t*)PROG_TO_EDICT(prinst, pr_global_struct->self);
dist = G_FLOAT(OFS_PARM0);
World_MoveToGoal (&sv.world, ent, dist);
}
/* /*
=============== ===============
PF_walkmove PF_walkmove
@ -3475,7 +3484,7 @@ PF_walkmove
float(float yaw, float dist) walkmove float(float yaw, float dist) walkmove
=============== ===============
*/ */
void PF_walkmove (progfuncs_t *prinst, struct globalvars_s *pr_globals) static void PF_walkmove (progfuncs_t *prinst, struct globalvars_s *pr_globals)
{ {
edict_t *ent; edict_t *ent;
float yaw, dist; float yaw, dist;
@ -3514,7 +3523,7 @@ void PF_walkmove (progfuncs_t *prinst, struct globalvars_s *pr_globals)
// } // }
// else if (!SV_TestEntityPosition(ent)) // else if (!SV_TestEntityPosition(ent))
// { // {
G_FLOAT(OFS_RETURN) = SV_movestep(ent, move, true, false, settrace); G_FLOAT(OFS_RETURN) = World_movestep(&sv.world, (wedict_t*)ent, move, true, false, settrace);
// if (SV_TestEntityPosition(ent)) // if (SV_TestEntityPosition(ent))
// Con_Printf("Entity became stuck\n"); // Con_Printf("Entity became stuck\n");
// } // }
@ -3703,13 +3712,13 @@ void PF_lightstylestatic (progfuncs_t *prinst, struct globalvars_s *pr_globals)
PF_checkbottom PF_checkbottom
============= =============
*/ */
void PF_checkbottom (progfuncs_t *prinst, struct globalvars_s *pr_globals) static void PF_checkbottom (progfuncs_t *prinst, struct globalvars_s *pr_globals)
{ {
edict_t *ent; edict_t *ent;
ent = G_EDICT(prinst, OFS_PARM0); ent = G_EDICT(prinst, OFS_PARM0);
G_FLOAT(OFS_RETURN) = SV_CheckBottom (ent); G_FLOAT(OFS_RETURN) = World_CheckBottom (&sv.world, (wedict_t*)ent);
} }
/* /*
@ -6998,7 +7007,7 @@ void PF_plaque_draw(progfuncs_t *prinst, struct globalvars_s *pr_globals)
} }
} }
void PF_movestep (progfuncs_t *prinst, struct globalvars_s *pr_globals) static void PF_movestep (progfuncs_t *prinst, struct globalvars_s *pr_globals)
{ {
vec3_t v; vec3_t v;
edict_t *ent; edict_t *ent;
@ -7015,7 +7024,7 @@ void PF_movestep (progfuncs_t *prinst, struct globalvars_s *pr_globals)
// save program state, because SV_movestep may call other progs // save program state, because SV_movestep may call other progs
oldself = pr_global_struct->self; oldself = pr_global_struct->self;
G_INT(OFS_RETURN) = SV_movestep (ent, v, false, true, set_trace?pr_globals:NULL); G_INT(OFS_RETURN) = World_movestep (&sv.world, (wedict_t*)ent, v, false, true, set_trace?pr_globals:NULL);
// restore program state // restore program state
pr_global_struct->self = oldself; pr_global_struct->self = oldself;
@ -9069,7 +9078,7 @@ BuiltinList_t BuiltinList[] = { //nq qw h2 ebfs
{"tracetoss", PF_TraceToss, 0, 0, 0, 64}, {"tracetoss", PF_TraceToss, 0, 0, 0, 64},
{"etos", PF_etos, 0, 0, 0, 65}, {"etos", PF_etos, 0, 0, 0, 65},
{"movetogoal", SV_MoveToGoal, 67, 67, 67}, //67 {"movetogoal", PF_sv_movetogoal, 67, 67, 67}, //67
{"precache_file", PF_precache_file, 68, 68, 68}, //68 {"precache_file", PF_precache_file, 68, 68, 68}, //68
{"makestatic", PF_makestatic, 69, 69, 69}, //69 {"makestatic", PF_makestatic, 69, 69, 69}, //69

View file

@ -731,7 +731,7 @@ static qintptr_t syscallhandle (void *offset, quintptr_t mask, qintptr_t fn, con
move[1] = sin(yaw)*dist; move[1] = sin(yaw)*dist;
move[2] = 0; move[2] = 0;
return SV_movestep(ed, move, true, false, NULL); return World_movestep(&sv.world, (wedict_t*)ed, move, true, false, NULL);
} }
case G_DROPTOFLOOR: case G_DROPTOFLOOR:
@ -767,7 +767,7 @@ static qintptr_t syscallhandle (void *offset, quintptr_t mask, qintptr_t fn, con
break; break;
case G_CHECKBOTTOM: case G_CHECKBOTTOM:
return SV_CheckBottom(EDICT_NUM(svprogfuncs, VM_LONG(arg[0]))); return World_CheckBottom(&sv.world, (wedict_t*)EDICT_NUM(svprogfuncs, VM_LONG(arg[0])));
case G_POINTCONTENTS: case G_POINTCONTENTS:
{ {
@ -1141,7 +1141,7 @@ Con_DPrintf("PF_readcmd: %s\n%s", s, output);
//fallthrough //fallthrough
case G_MOVETOGOAL: case G_MOVETOGOAL:
return !!WrapQCBuiltin(SV_MoveToGoal, offset, mask, arg, "f"); return World_MoveToGoal(&sv.world, (wedict_t*)Q1QVMPF_ProgsToEdict(svprogfuncs, pr_global_struct->self), VM_FLOAT(arg[0]));
case G_SetBotUserInfo: case G_SetBotUserInfo:
WrapQCBuiltin(PF_ForceInfoKey, offset, mask, arg, "ess"); WrapQCBuiltin(PF_ForceInfoKey, offset, mask, arg, "ess");
@ -1317,7 +1317,11 @@ qboolean PR_LoadQ1QVM(void)
q1qvm = VM_Create(NULL, "qwprogs", syscallnative, syscallqvm); q1qvm = VM_Create(NULL, "qwprogs", syscallnative, syscallqvm);
if (!q1qvm) if (!q1qvm)
{
if (svprogfuncs == &q1qvmprogfuncs)
sv.world.progs = svprogfuncs = NULL;
return false; return false;
}
progstype = PROG_QW; progstype = PROG_QW;
@ -1578,8 +1582,12 @@ void Q1QVM_GameCodePausedTic(float pausedduration)
void Q1QVM_DropClient(client_t *cl) void Q1QVM_DropClient(client_t *cl)
{ {
if (cl->name)
Q_strncpyz(cl->namebuf, cl->name, sizeof(cl->namebuf));
pr_global_struct->self = EDICT_TO_PROG(svprogfuncs, cl->edict); pr_global_struct->self = EDICT_TO_PROG(svprogfuncs, cl->edict);
VM_Call(q1qvm, GAME_CLIENT_DISCONNECT); VM_Call(q1qvm, GAME_CLIENT_DISCONNECT);
cl->name = cl->namebuf;
} }
void Q1QVM_ChainMoved(void) void Q1QVM_ChainMoved(void)

View file

@ -172,7 +172,7 @@ and the extension fields are added on the end and can have extra vm-specific stu
comfieldfloat(ideal_yaw,ideal_yaw,ideal_yaw);\ comfieldfloat(ideal_yaw,ideal_yaw,ideal_yaw);\
comfieldfloat(yaw_speed,yaw_speed,yaw_speed);\ comfieldfloat(yaw_speed,yaw_speed,yaw_speed);\
comfieldentity(aiment,aiment,aiment);\ comfieldentity(aiment,aiment,aiment);\
comfieldentity(goalentity,_goalentity,_goalentity);\ comfieldentity(goalentity,goalentity,goalentity);\
comfieldfloat(_spawnflags,_spawnflags,_spawnflags);\ comfieldfloat(_spawnflags,_spawnflags,_spawnflags);\
comfieldstring(_target,_target,_target);\ comfieldstring(_target,_target,_target);\
comfieldstring(targetname,_targetname,_targetname);\ comfieldstring(targetname,_targetname,_targetname);\
@ -300,9 +300,12 @@ comqcfields
#undef comfieldentity #undef comfieldentity
#undef comfieldstring #undef comfieldstring
#undef comfieldfunction #undef comfieldfunction
} comentvars_t;
#ifdef VM_Q1
} comentvars_t;
typedef struct { typedef struct {
#endif
#define comfieldfloat(name) float name #define comfieldfloat(name) float name
#define comfieldvector(name) vec3_t name #define comfieldvector(name) vec3_t name
#define comfieldentity(name) int name #define comfieldentity(name) int name
@ -314,7 +317,67 @@ comextqcfields
#undef comfieldentity #undef comfieldentity
#undef comfieldstring #undef comfieldstring
#undef comfieldfunction #undef comfieldfunction
} comextentvars_t;
#ifdef VM_Q1
} comextentvars_t;
#else
} comentvars_t;
#endif
#define MAX_ENT_LEAFS 16 #define MAX_ENT_LEAFS 16
#if defined(ODE_STATIC) || defined(ODE_DYNAMIC)
#define USEODE 1
#endif
#ifdef USEODE
typedef struct {
// physics parameters
qboolean ode_physics;
void *ode_body;
void *ode_geom;
void *ode_joint;
float *ode_vertex3f;
int *ode_element3i;
int ode_numvertices;
int ode_numtriangles;
vec3_t ode_mins;
vec3_t ode_maxs;
vec_t ode_mass;
vec3_t ode_origin;
vec3_t ode_velocity;
vec3_t ode_angles;
vec3_t ode_avelocity;
qboolean ode_gravity;
int ode_modelindex;
vec_t ode_movelimit; // smallest component of (maxs[]-mins[])
float ode_offsetmatrix[16];
float ode_offsetimatrix[16];
int ode_joint_type;
int ode_joint_enemy;
int ode_joint_aiment;
vec3_t ode_joint_origin; // joint anchor
vec3_t ode_joint_angles; // joint axis
vec3_t ode_joint_velocity; // second joint axis
vec3_t ode_joint_movedir; // parameters
void *ode_massbuf;
} entityode_t;
typedef struct
{
// for ODE physics engine
qboolean ode; // if true then ode is activated
void *ode_world;
void *ode_space;
void *ode_contactgroup;
// number of constraint solver iterations to use (for dWorldStepFast)
int ode_iterations;
// actual step (server frametime / ode_iterations)
vec_t ode_step;
// max velocity for a 1-unit radius object at current step to prevent
// missed collisions
vec_t ode_movelimit;
} worldode_t;
#endif

View file

@ -60,60 +60,6 @@ extern progstype_t progstype;
//extern progsnum_t mainprogs; //extern progsnum_t mainprogs;
#if defined(ODE_STATIC) || defined(ODE_DYNAMIC)
#define USEODE 1
#endif
#ifdef USEODE
typedef struct {
// physics parameters
qboolean ode_physics;
void *ode_body;
void *ode_geom;
void *ode_joint;
float *ode_vertex3f;
int *ode_element3i;
int ode_numvertices;
int ode_numtriangles;
vec3_t ode_mins;
vec3_t ode_maxs;
vec_t ode_mass;
vec3_t ode_origin;
vec3_t ode_velocity;
vec3_t ode_angles;
vec3_t ode_avelocity;
qboolean ode_gravity;
int ode_modelindex;
vec_t ode_movelimit; // smallest component of (maxs[]-mins[])
float ode_offsetmatrix[16];
float ode_offsetimatrix[16];
int ode_joint_type;
int ode_joint_enemy;
int ode_joint_aiment;
vec3_t ode_joint_origin; // joint anchor
vec3_t ode_joint_angles; // joint axis
vec3_t ode_joint_velocity; // second joint axis
vec3_t ode_joint_movedir; // parameters
void *ode_massbuf;
} entityode_t;
typedef struct
{
// for ODE physics engine
qboolean ode; // if true then ode is activated
void *ode_world;
void *ode_space;
void *ode_contactgroup;
// number of constraint solver iterations to use (for dWorldStepFast)
int ode_iterations;
// actual step (server frametime / ode_iterations)
vec_t ode_step;
// max velocity for a 1-unit radius object at current step to prevent
// missed collisions
vec_t ode_movelimit;
} worldode_t;
#endif
typedef struct edict_s typedef struct edict_s
{ {
//these 5 shared with qclib //these 5 shared with qclib
@ -167,7 +113,6 @@ extern progfuncs_t *svprogfuncs; //instance
extern progparms_t svprogparms; extern progparms_t svprogparms;
extern progsnum_t svmainprogs; extern progsnum_t svmainprogs;
extern progsnum_t clmainprogs; extern progsnum_t clmainprogs;
#define EDICT_FROM_AREA(l) STRUCT_FROM_LINK(l,wedict_t,area)
#define HLEDICT_FROM_AREA(l) STRUCT_FROM_LINK(l,hledict_t,area) #define HLEDICT_FROM_AREA(l) STRUCT_FROM_LINK(l,hledict_t,area)
#define Q2EDICT_FROM_AREA(l) STRUCT_FROM_LINK(l,q2edict_t,area) #define Q2EDICT_FROM_AREA(l) STRUCT_FROM_LINK(l,q2edict_t,area)
#define Q3EDICT_FROM_AREA(l) STRUCT_FROM_LINK(l,q3serverEntity_t,area) #define Q3EDICT_FROM_AREA(l) STRUCT_FROM_LINK(l,q3serverEntity_t,area)

View file

@ -796,17 +796,6 @@ typedef struct
#define SOLID_PHASEH2 5 #define SOLID_PHASEH2 5
#define SOLID_CORPSE 5 #define SOLID_CORPSE 5
#define SOLID_LADDER 20 //dmw. touch on edge, not blocking. Touching players have different physics. Otherwise a SOLID_TRIGGER #define SOLID_LADDER 20 //dmw. touch on edge, not blocking. Touching players have different physics. Otherwise a SOLID_TRIGGER
#define SOLID_PHYSICS_BOX 32 ///< physics object (mins, maxs, mass, origin, axis_forward, axis_left, axis_up, velocity, spinvelocity)
#define SOLID_PHYSICS_SPHERE 33 ///< physics object (mins, maxs, mass, origin, axis_forward, axis_left, axis_up, velocity, spinvelocity)
#define SOLID_PHYSICS_CAPSULE 34 ///< physics object (mins, maxs, mass, origin, axis_forward, axis_left, axis_up, velocity, spinvelocity)
#define JOINTTYPE_POINT 1
#define JOINTTYPE_HINGE 2
#define JOINTTYPE_SLIDER 3
#define JOINTTYPE_UNIVERSAL 4
#define JOINTTYPE_HINGE2 5
#define JOINTTYPE_FIXED -1
#define DAMAGE_NO 0 #define DAMAGE_NO 0
#define DAMAGE_YES 1 #define DAMAGE_YES 1
@ -940,14 +929,9 @@ void SVNQ_FullClientUpdate (client_t *client, sizebuf_t *buf);
int SV_ModelIndex (char *name); int SV_ModelIndex (char *name);
qboolean SV_CheckBottom (edict_t *ent);
qboolean SV_movestep (edict_t *ent, vec3_t move, qboolean relink, qboolean noenemy, struct globalvars_s *set_trace);
void SV_WriteClientdataToMessage (client_t *client, sizebuf_t *msg); void SV_WriteClientdataToMessage (client_t *client, sizebuf_t *msg);
void SV_WriteDelta (entity_state_t *from, entity_state_t *to, sizebuf_t *msg, qboolean force, unsigned int protext); void SV_WriteDelta (entity_state_t *from, entity_state_t *to, sizebuf_t *msg, qboolean force, unsigned int protext);
void SV_MoveToGoal (progfuncs_t *prinst, struct globalvars_s *pr_globals);
void SV_SaveSpawnparms (qboolean); void SV_SaveSpawnparms (qboolean);
void SV_SaveLevelCache(qboolean dontharmgame); void SV_SaveLevelCache(qboolean dontharmgame);
qboolean SV_LoadLevelCache(char *level, char *startspot, qboolean ignoreplayers); qboolean SV_LoadLevelCache(char *level, char *startspot, qboolean ignoreplayers);

View file

@ -2514,7 +2514,6 @@ void SV_Snapshot_BuildQ1(client_t *client, packet_entities_t *pack, qbyte *pvs,
leafnum = sv.world.worldmodel->funcs.LeafnumForPoint (sv.world.worldmodel, ent->v->origin)-1; leafnum = sv.world.worldmodel->funcs.LeafnumForPoint (sv.world.worldmodel, ent->v->origin)-1;
if ( !(mask[leafnum>>3] & (1<<(leafnum&7)) ) ) if ( !(mask[leafnum>>3] & (1<<(leafnum&7)) ) )
{ {
Con_Printf ("PHS supressed entity\n");
continue; continue;
} }
} }

View file

@ -1123,8 +1123,6 @@ void SV_SpawnServer (char *server, char *startspot, qboolean noents, qboolean us
ent->v->solid = SOLID_BSP; ent->v->solid = SOLID_BSP;
ent->v->movetype = MOVETYPE_PUSH; ent->v->movetype = MOVETYPE_PUSH;
ED_Spawned(ent, false);
if (progstype == PROG_QW && pr_imitatemvdsv.value>0) if (progstype == PROG_QW && pr_imitatemvdsv.value>0)
{ {
#ifdef VM_Q1 #ifdef VM_Q1

View file

@ -447,10 +447,6 @@ void SV_DropClient (client_t *drop)
case GT_MAX: case GT_MAX:
break; break;
case GT_Q1QVM: case GT_Q1QVM:
#ifdef VM_Q1
// FIXME: missing code here?
#endif
break;
case GT_PROGS: case GT_PROGS:
if (svprogfuncs) if (svprogfuncs)
{ {

View file

@ -19,9 +19,10 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/ */
// sv_move.c -- monster movement // sv_move.c -- monster movement
#include "qwsvdef.h" #include "quakedef.h"
#include "pr_common.h"
#ifndef CLIENTONLY #if defined(CSQC_DAT) || !defined(CLIENTONLY)
/* /*
============= =============
@ -34,7 +35,7 @@ is not a staircase.
*/ */
int c_yes, c_no; int c_yes, c_no;
qboolean SV_CheckBottom (edict_t *ent) qboolean World_CheckBottom (world_t *world, wedict_t *ent)
{ {
int savedhull; int savedhull;
vec3_t mins, maxs, start, stop; vec3_t mins, maxs, start, stop;
@ -54,7 +55,7 @@ qboolean SV_CheckBottom (edict_t *ent)
{ {
start[0] = x ? maxs[0] : mins[0]; start[0] = x ? maxs[0] : mins[0];
start[1] = y ? maxs[1] : mins[1]; start[1] = y ? maxs[1] : mins[1];
if (!(World_PointContents (&sv.world, start) & FTECONTENTS_SOLID)) if (!(World_PointContents (world, start) & FTECONTENTS_SOLID))
goto realcheck; goto realcheck;
} }
@ -74,7 +75,7 @@ realcheck:
stop[2] = start[2] - 2*movevars.stepheight; stop[2] = start[2] - 2*movevars.stepheight;
savedhull = ent->xv->hull; savedhull = ent->xv->hull;
ent->xv->hull = 0; ent->xv->hull = 0;
trace = World_Move (&sv.world, start, vec3_origin, vec3_origin, stop, true, (wedict_t*)ent); trace = World_Move (world, start, vec3_origin, vec3_origin, stop, true, ent);
ent->xv->hull = savedhull; ent->xv->hull = savedhull;
if (trace.fraction == 1.0) if (trace.fraction == 1.0)
@ -90,7 +91,7 @@ realcheck:
savedhull = ent->xv->hull; savedhull = ent->xv->hull;
ent->xv->hull = 0; ent->xv->hull = 0;
trace = World_Move (&sv.world, start, vec3_origin, vec3_origin, stop, true, (wedict_t*)ent); trace = World_Move (world, start, vec3_origin, vec3_origin, stop, true, ent);
ent->xv->hull = savedhull; ent->xv->hull = savedhull;
if (trace.fraction != 1.0 && trace.endpos[2] > bottom) if (trace.fraction != 1.0 && trace.endpos[2] > bottom)
@ -106,6 +107,10 @@ realcheck:
void set_move_trace(trace_t *trace, struct globalvars_s *pr_globals) void set_move_trace(trace_t *trace, struct globalvars_s *pr_globals)
{ {
#pragma message("set_move_trace: fixme")
#ifdef CLIENTONLY
Sys_Error("set_move_trace: not fixed\n");
#else
pr_global_struct->trace_allsolid = trace->allsolid; pr_global_struct->trace_allsolid = trace->allsolid;
pr_global_struct->trace_startsolid = trace->startsolid; pr_global_struct->trace_startsolid = trace->startsolid;
pr_global_struct->trace_fraction = trace->fraction; pr_global_struct->trace_fraction = trace->fraction;
@ -118,6 +123,7 @@ void set_move_trace(trace_t *trace, struct globalvars_s *pr_globals)
pr_global_struct->trace_ent = EDICT_TO_PROG(svprogfuncs, trace->ent); pr_global_struct->trace_ent = EDICT_TO_PROG(svprogfuncs, trace->ent);
else else
pr_global_struct->trace_ent = EDICT_TO_PROG(svprogfuncs, sv.world.edicts); pr_global_struct->trace_ent = EDICT_TO_PROG(svprogfuncs, sv.world.edicts);
#endif
} }
/* /*
@ -130,13 +136,13 @@ possible, no move is done, false is returned, and
pr_global_struct->trace_normal is set to the normal of the blocking wall pr_global_struct->trace_normal is set to the normal of the blocking wall
============= =============
*/ */
qboolean SV_movestep (edict_t *ent, vec3_t move, qboolean relink, qboolean noenemy, struct globalvars_s *set_trace) qboolean World_movestep (world_t *world, wedict_t *ent, vec3_t move, qboolean relink, qboolean noenemy, struct globalvars_s *set_trace)
{ {
float dz; float dz;
vec3_t oldorg, neworg, end; vec3_t oldorg, neworg, end;
trace_t trace; trace_t trace;
int i; int i;
edict_t *enemy = (edict_t*)sv.world.edicts; wedict_t *enemy = world->edicts;
// try the move // try the move
VectorCopy (ent->v->origin, oldorg); VectorCopy (ent->v->origin, oldorg);
@ -151,32 +157,32 @@ qboolean SV_movestep (edict_t *ent, vec3_t move, qboolean relink, qboolean noene
VectorAdd (ent->v->origin, move, neworg); VectorAdd (ent->v->origin, move, neworg);
if (!noenemy) if (!noenemy)
{ {
enemy = PROG_TO_EDICT(svprogfuncs, ent->v->enemy); enemy = (wedict_t*)PROG_TO_EDICT(world->progs, ent->v->enemy);
if (i == 0 && enemy != (edict_t*)sv.world.edicts) if (i == 0 && enemy->entnum)
{ {
dz = ent->v->origin[2] - PROG_TO_EDICT(svprogfuncs, ent->v->enemy)->v->origin[2]; dz = ent->v->origin[2] - ((wedict_t*)PROG_TO_EDICT(world->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)
neworg[2] += 8; neworg[2] += 8;
} }
} }
trace = World_Move (&sv.world, ent->v->origin, ent->v->mins, ent->v->maxs, neworg, false, (wedict_t*)ent); trace = World_Move (world, ent->v->origin, ent->v->mins, ent->v->maxs, neworg, false, ent);
if (set_trace) if (set_trace)
set_move_trace(&trace, set_trace); set_move_trace(&trace, set_trace);
if (trace.fraction == 1) if (trace.fraction == 1)
{ {
if ( ((int)ent->v->flags & FL_SWIM) && !(World_PointContents(&sv.world, trace.endpos) & FTECONTENTS_FLUID)) if ( ((int)ent->v->flags & FL_SWIM) && !(World_PointContents(world, trace.endpos) & FTECONTENTS_FLUID))
return false; // swim monster left water return false; // swim monster left water
VectorCopy (trace.endpos, ent->v->origin); VectorCopy (trace.endpos, ent->v->origin);
if (relink) if (relink)
World_LinkEdict (&sv.world, (wedict_t*)ent, true); World_LinkEdict (world, ent, true);
return true; return true;
} }
if (noenemy || enemy == (edict_t*)sv.world.edicts) if (noenemy || !enemy->entnum)
break; break;
} }
@ -188,7 +194,7 @@ qboolean SV_movestep (edict_t *ent, vec3_t move, qboolean relink, qboolean noene
VectorCopy (neworg, end); VectorCopy (neworg, end);
end[2] -= movevars.stepheight*2; end[2] -= movevars.stepheight*2;
trace = World_Move (&sv.world, neworg, ent->v->mins, ent->v->maxs, end, false, (wedict_t*)ent); trace = World_Move (world, neworg, ent->v->mins, ent->v->maxs, end, false, ent);
if (set_trace) if (set_trace)
set_move_trace(&trace, set_trace); set_move_trace(&trace, set_trace);
@ -198,7 +204,7 @@ qboolean SV_movestep (edict_t *ent, vec3_t move, qboolean relink, qboolean noene
if (trace.startsolid) if (trace.startsolid)
{ {
neworg[2] -= movevars.stepheight; neworg[2] -= movevars.stepheight;
trace = World_Move (&sv.world, neworg, ent->v->mins, ent->v->maxs, end, false, (wedict_t*)ent); trace = World_Move (world, neworg, ent->v->mins, ent->v->maxs, end, false, ent);
if (set_trace) if (set_trace)
set_move_trace(&trace, set_trace); set_move_trace(&trace, set_trace);
if (trace.allsolid || trace.startsolid) if (trace.allsolid || trace.startsolid)
@ -211,7 +217,7 @@ qboolean SV_movestep (edict_t *ent, vec3_t move, qboolean relink, qboolean noene
{ {
VectorAdd (ent->v->origin, move, ent->v->origin); VectorAdd (ent->v->origin, move, ent->v->origin);
if (relink) if (relink)
World_LinkEdict (&sv.world, (wedict_t*)ent, true); World_LinkEdict (world, ent, true);
ent->v->flags = (int)ent->v->flags & ~FL_ONGROUND; ent->v->flags = (int)ent->v->flags & ~FL_ONGROUND;
// Con_Printf ("fall down\n"); // Con_Printf ("fall down\n");
return true; return true;
@ -223,13 +229,13 @@ qboolean SV_movestep (edict_t *ent, vec3_t move, qboolean relink, qboolean noene
// check point traces down for dangling corners // check point traces down for dangling corners
VectorCopy (trace.endpos, ent->v->origin); VectorCopy (trace.endpos, ent->v->origin);
if (!SV_CheckBottom (ent)) if (!World_CheckBottom (world, ent))
{ {
if ( (int)ent->v->flags & FL_PARTIALGROUND ) if ( (int)ent->v->flags & FL_PARTIALGROUND )
{ // entity had floor mostly pulled out from underneath it { // entity had floor mostly pulled out from underneath it
// and is trying to correct // and is trying to correct
if (relink) if (relink)
World_LinkEdict (&sv.world, (wedict_t*)ent, true); World_LinkEdict (world, ent, true);
return true; return true;
} }
VectorCopy (oldorg, ent->v->origin); VectorCopy (oldorg, ent->v->origin);
@ -241,17 +247,59 @@ qboolean SV_movestep (edict_t *ent, vec3_t move, qboolean relink, qboolean noene
// 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(svprogfuncs, trace.ent); ent->v->groundentity = EDICT_TO_PROG(world->progs, trace.ent);
// the move is ok // the move is ok
if (relink) if (relink)
World_LinkEdict (&sv.world, (wedict_t*)ent, true); World_LinkEdict (world, ent, true);
return true; return true;
} }
//============================================================================ //============================================================================
/*
==============
PF_changeyaw
This was a major timewaster in progs, so it was converted to C
==============
*/
void World_changeyaw (wedict_t *ent)
{
float ideal, current, move, speed;
current = anglemod( ent->v->angles[1] );
ideal = ent->v->ideal_yaw;
speed = ent->v->yaw_speed;
if (current == ideal)
return;
move = ideal - current;
if (ideal > current)
{
if (move >= 180)
move = move - 360;
}
else
{
if (move <= -180)
move = move + 360;
}
if (move > 0)
{
if (move > speed)
move = speed;
}
else
{
if (move < -speed)
move = -speed;
}
ent->v->angles[1] = anglemod (current + move);
}
/* /*
====================== ======================
SV_StepDirection SV_StepDirection
@ -261,15 +309,14 @@ facing it.
====================== ======================
*/ */
void PF_changeyaw (progfuncs_t *prinst, struct globalvars_s *pr_globals); qboolean World_StepDirection (world_t *world, wedict_t *ent, float yaw, float dist)
qboolean SV_StepDirection (edict_t *ent, float yaw, float dist, struct globalvars_s *pr_globals)
{ {
vec3_t move, oldorigin; vec3_t move, oldorigin;
float delta; float delta;
ent->v->ideal_yaw = yaw; ent->v->ideal_yaw = yaw;
PF_changeyaw(svprogfuncs, pr_globals); World_changeyaw(ent);
yaw = yaw*M_PI*2 / 360; yaw = yaw*M_PI*2 / 360;
move[0] = cos(yaw)*dist; move[0] = cos(yaw)*dist;
@ -277,17 +324,17 @@ qboolean SV_StepDirection (edict_t *ent, float yaw, float dist, struct globalvar
move[2] = 0; move[2] = 0;
VectorCopy (ent->v->origin, oldorigin); VectorCopy (ent->v->origin, oldorigin);
if (SV_movestep (ent, move, false, false, NULL)) if (World_movestep (world, ent, move, false, false, NULL))
{ {
delta = ent->v->angles[YAW] - ent->v->ideal_yaw; delta = ent->v->angles[YAW] - ent->v->ideal_yaw;
if (delta > 45 && delta < 315) if (delta > 45 && delta < 315)
{ // not turned far enough, so don't take the step { // not turned far enough, so don't take the step
VectorCopy (oldorigin, ent->v->origin); VectorCopy (oldorigin, ent->v->origin);
} }
World_LinkEdict (&sv.world, (wedict_t*)ent, true); World_LinkEdict (world, ent, true);
return true; return true;
} }
World_LinkEdict (&sv.world, (wedict_t*)ent, true); World_LinkEdict (world, ent, true);
return false; return false;
} }
@ -298,7 +345,7 @@ SV_FixCheckBottom
====================== ======================
*/ */
void SV_FixCheckBottom (edict_t *ent) void World_FixCheckBottom (wedict_t *ent)
{ {
// Con_Printf ("SV_FixCheckBottom\n"); // Con_Printf ("SV_FixCheckBottom\n");
@ -315,7 +362,7 @@ SV_NewChaseDir
*/ */
#define DI_NODIR -1 #define DI_NODIR -1
void SV_NewChaseDir (edict_t *actor, edict_t *enemy, float dist, struct globalvars_s *pr_globals) void World_NewChaseDir (world_t *world, wedict_t *actor, wedict_t *enemy, float dist)
{ {
float deltax,deltay; float deltax,deltay;
float d[3]; float d[3];
@ -347,7 +394,7 @@ void SV_NewChaseDir (edict_t *actor, edict_t *enemy, float dist, struct globalva
else else
tdir = d[2] == 90 ? 135 : 215; tdir = d[2] == 90 ? 135 : 215;
if (tdir != turnaround && SV_StepDirection(actor, tdir, dist, pr_globals)) if (tdir != turnaround && World_StepDirection(world, actor, tdir, dist))
return; return;
} }
@ -360,32 +407,32 @@ void SV_NewChaseDir (edict_t *actor, edict_t *enemy, float dist, struct globalva
} }
if (d[1]!=DI_NODIR && d[1]!=turnaround if (d[1]!=DI_NODIR && d[1]!=turnaround
&& SV_StepDirection(actor, d[1], dist, pr_globals)) && World_StepDirection(world, actor, d[1], dist))
return; return;
if (d[2]!=DI_NODIR && d[2]!=turnaround if (d[2]!=DI_NODIR && d[2]!=turnaround
&& SV_StepDirection(actor, d[2], dist, pr_globals)) && World_StepDirection(world, actor, d[2], dist))
return; return;
/* there is no direct path to the player, so pick another direction */ /* there is no direct path to the player, so pick another direction */
if (olddir!=DI_NODIR && SV_StepDirection(actor, olddir, dist, pr_globals)) if (olddir!=DI_NODIR && World_StepDirection(world, actor, olddir, dist))
return; return;
if (rand()&1) /*randomly determine direction of search*/ if (rand()&1) /*randomly determine direction of search*/
{ {
for (tdir=0 ; tdir<=315 ; tdir += 45) for (tdir=0 ; tdir<=315 ; tdir += 45)
if (tdir!=turnaround && SV_StepDirection(actor, tdir, dist, pr_globals) ) if (tdir!=turnaround && World_StepDirection(world, actor, tdir, dist) )
return; return;
} }
else else
{ {
for (tdir=315 ; tdir >=0 ; tdir -= 45) for (tdir=315 ; tdir >=0 ; tdir -= 45)
if (tdir!=turnaround && SV_StepDirection(actor, tdir, dist, pr_globals) ) if (tdir!=turnaround && World_StepDirection(world, actor, tdir, dist) )
return; return;
} }
if (turnaround != DI_NODIR && SV_StepDirection(actor, turnaround, dist, pr_globals) ) if (turnaround != DI_NODIR && World_StepDirection(world, actor, turnaround, dist) )
return; return;
actor->v->ideal_yaw = olddir; // can't move actor->v->ideal_yaw = olddir; // can't move
@ -393,8 +440,8 @@ void SV_NewChaseDir (edict_t *actor, edict_t *enemy, float dist, struct globalva
// if a bridge was pulled out from underneath a monster, it may not have // if a bridge was pulled out from underneath a monster, it may not have
// a valid standing position at all // a valid standing position at all
if (!SV_CheckBottom (actor)) if (!World_CheckBottom (world, actor))
SV_FixCheckBottom (actor); World_FixCheckBottom (actor);
} }
@ -404,7 +451,7 @@ SV_CloseEnough
====================== ======================
*/ */
qboolean SV_CloseEnough (edict_t *ent, edict_t *goal, float dist) qboolean World_CloseEnough (wedict_t *ent, wedict_t *goal, float dist)
{ {
int i; int i;
@ -424,31 +471,29 @@ SV_MoveToGoal
====================== ======================
*/ */
void SV_MoveToGoal (progfuncs_t *prinst, struct globalvars_s *pr_globals) qboolean World_MoveToGoal (world_t *world, wedict_t *ent, float dist)
{ {
edict_t *ent, *goal; wedict_t *goal;
float dist;
ent = PROG_TO_EDICT(svprogfuncs, pr_global_struct->self); ent = (wedict_t*)PROG_TO_EDICT(world->progs, pr_global_struct->self);
goal = PROG_TO_EDICT(svprogfuncs, ent->v->goalentity); goal = (wedict_t*)PROG_TO_EDICT(world->progs, ent->v->goalentity);
dist = G_FLOAT(OFS_PARM0);
if ( !( (int)ent->v->flags & (FL_ONGROUND|FL_FLY|FL_SWIM) ) ) if ( !( (int)ent->v->flags & (FL_ONGROUND|FL_FLY|FL_SWIM) ) )
{ {
G_FLOAT(OFS_RETURN) = 0; return false;
return;
} }
// if the next step hits the enemy, return immediately // if the next step hits the enemy, return immediately
if ( PROG_TO_EDICT(svprogfuncs, ent->v->enemy) != (edict_t*)sv.world.edicts && SV_CloseEnough (ent, goal, dist) ) if ( PROG_TO_EDICT(world->progs, ent->v->enemy) != (edict_t*)world->edicts && World_CloseEnough (ent, goal, dist) )
return; return true;
// bump around... // bump around...
if ( (rand()&3)==1 || if ( (rand()&3)==1 ||
!SV_StepDirection (ent, ent->v->ideal_yaw, dist, pr_globals)) !World_StepDirection (world, ent, ent->v->ideal_yaw, dist))
{ {
SV_NewChaseDir (ent, goal, dist, pr_globals); World_NewChaseDir (world, ent, goal, dist);
} }
return true;
} }
#endif #endif

View file

@ -22,7 +22,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#include "quakedef.h" #include "quakedef.h"
#include "pr_common.h" #include "pr_common.h"
#ifndef CLIENTONLY #if defined(CSQC_DAT) || !defined(CLIENTONLY)
/* /*
entities never clip against themselves, or their owner entities never clip against themselves, or their owner
@ -1102,7 +1102,7 @@ static trace_t World_ClipMoveToEntity (world_t *w, wedict_t *ent, vec3_t eorg, v
{ {
model = w->GetCModel(w, ent->v->modelindex); model = w->GetCModel(w, ent->v->modelindex);
if (!model || (model->type != mod_brush && model->type != mod_heightmap)) if (!model || (model->type != mod_brush && model->type != mod_heightmap))
SV_Error("SOLID_BSP with non bsp model (classname: %s)", PR_GetString(svprogfuncs, ent->v->classname)); Host_Error("SOLID_BSP with non bsp model (classname: %s)", PR_GetString(w->progs, ent->v->classname));
} }
else else
{ {
@ -1134,7 +1134,7 @@ static trace_t World_ClipMoveToEntity (world_t *w, wedict_t *ent, vec3_t eorg, v
model_t *model; model_t *model;
if (ent->v->modelindex < 1 || ent->v->modelindex >= MAX_MODELS) if (ent->v->modelindex < 1 || ent->v->modelindex >= MAX_MODELS)
SV_Error("SV_ClipMoveToEntity: modelindex out of range\n"); Host_Error("SV_ClipMoveToEntity: modelindex out of range\n");
model = w->GetCModel(w, ent->v->modelindex); model = w->GetCModel(w, ent->v->modelindex);
if (model && model->funcs.Trace) if (model && model->funcs.Trace)
@ -1463,7 +1463,7 @@ static void World_ClipToEverything (world_t *w, moveclip_t *clip)
wedict_t *touch; wedict_t *touch;
for (e=1 ; e<w->num_edicts ; e++) for (e=1 ; e<w->num_edicts ; e++)
{ {
touch = (wedict_t*)EDICT_NUM(svprogfuncs, e); touch = (wedict_t*)EDICT_NUM(w->progs, e);
if (touch->isfree) if (touch->isfree)
continue; continue;
@ -1507,9 +1507,9 @@ static void World_ClipToEverything (world_t *w, moveclip_t *clip)
return; return;
if (clip->passedict) if (clip->passedict)
{ {
if ((wedict_t*)PROG_TO_EDICT(svprogfuncs, touch->v->owner) == clip->passedict) if ((wedict_t*)PROG_TO_EDICT(w->progs, touch->v->owner) == clip->passedict)
continue; // don't clip against own missiles continue; // don't clip against own missiles
if ((wedict_t*)PROG_TO_EDICT(svprogfuncs, clip->passedict->v->owner) == touch) if ((wedict_t*)PROG_TO_EDICT(w->progs, clip->passedict->v->owner) == touch)
continue; // don't clip against owner continue; // don't clip against owner
} }
@ -1585,9 +1585,9 @@ static void World_ClipToLinks (world_t *w, areanode_t *node, moveclip_t *clip)
return; return;
if (clip->passedict) if (clip->passedict)
{ {
if ((wedict_t*)PROG_TO_EDICT(svprogfuncs, touch->v->owner) == clip->passedict) if ((wedict_t*)PROG_TO_EDICT(w->progs, touch->v->owner) == clip->passedict)
continue; // don't clip against own missiles continue; // don't clip against own missiles
if ((wedict_t*)PROG_TO_EDICT(svprogfuncs, clip->passedict->v->owner) == touch) if ((wedict_t*)PROG_TO_EDICT(w->progs, clip->passedict->v->owner) == touch)
continue; // don't clip against owner continue; // don't clip against owner
} }
@ -1614,7 +1614,7 @@ static void World_ClipToLinks (world_t *w, areanode_t *node, moveclip_t *clip)
if (touch == clip->passedict) if (touch == clip->passedict)
continue; continue;
if (touch->v->solid == SOLID_TRIGGER || touch->v->solid == SOLID_LADDER) if (touch->v->solid == SOLID_TRIGGER || touch->v->solid == SOLID_LADDER)
SV_Error ("Trigger (%s) in clipping list", PR_GetString(svprogfuncs, touch->v->classname)); Host_Error ("Trigger (%s) in clipping list", PR_GetString(w->progs, touch->v->classname));
if (clip->type & MOVE_LAGGED) if (clip->type & MOVE_LAGGED)
{ {
@ -1656,9 +1656,9 @@ static void World_ClipToLinks (world_t *w, areanode_t *node, moveclip_t *clip)
return; return;
if (clip->passedict) if (clip->passedict)
{ {
if ((wedict_t*)PROG_TO_EDICT(svprogfuncs, touch->v->owner) == clip->passedict) if ((wedict_t*)PROG_TO_EDICT(w->progs, touch->v->owner) == clip->passedict)
continue; // don't clip against own missiles continue; // don't clip against own missiles
if ((wedict_t*)PROG_TO_EDICT(svprogfuncs, clip->passedict->v->owner) == touch) if ((wedict_t*)PROG_TO_EDICT(w->progs, clip->passedict->v->owner) == touch)
continue; // don't clip against owner continue; // don't clip against owner
} }
@ -1792,6 +1792,10 @@ trace_t World_Move (world_t *w, vec3_t start, vec3_t mins, vec3_t maxs, vec3_t e
if (passedict && passedict->xv->hull) if (passedict && passedict->xv->hull)
hullnum = passedict->xv->hull; hullnum = passedict->xv->hull;
#ifdef CLIENTONLY
else
hullnum = 0;
#else
else if (sv_compatiblehulls.value) else if (sv_compatiblehulls.value)
hullnum = 0; hullnum = 0;
else else
@ -1819,6 +1823,7 @@ trace_t World_Move (world_t *w, vec3_t start, vec3_t mins, vec3_t maxs, vec3_t e
} }
hullnum++; hullnum++;
} }
#endif
// clip to world // clip to world
clip.trace = World_ClipMoveToEntity (w, w->edicts, w->edicts->v->origin, start, mins, maxs, end, hullnum, false); clip.trace = World_ClipMoveToEntity (w, w->edicts, w->edicts->v->origin, start, mins, maxs, end, hullnum, false);
@ -1859,24 +1864,28 @@ trace_t World_Move (world_t *w, vec3_t start, vec3_t mins, vec3_t maxs, vec3_t e
if (clip.type & MOVE_LAGGED) if (clip.type & MOVE_LAGGED)
{ {
clip.type &= ~MOVE_LAGGED; clip.type &= ~MOVE_LAGGED;
#ifndef CLIENTONLY
if (passedict->entnum && passedict->entnum <= MAX_CLIENTS) if (w == &sv.world)
{ {
clip.type |= MOVE_LAGGED; if (passedict->entnum && passedict->entnum <= MAX_CLIENTS)
w->lagents = svs.clients[passedict->entnum-1].laggedents;
w->maxlagents = svs.clients[passedict->entnum-1].laggedents_count;
w->lagentsfrac = svs.clients[passedict->entnum-1].laggedents_frac;
}
else if (passedict->v->owner)
{
if (passedict->v->owner && passedict->v->owner <= MAX_CLIENTS)
{ {
clip.type |= MOVE_LAGGED; clip.type |= MOVE_LAGGED;
w->lagents = svs.clients[passedict->v->owner-1].laggedents; w->lagents = svs.clients[passedict->entnum-1].laggedents;
w->maxlagents = svs.clients[passedict->v->owner-1].laggedents_count; w->maxlagents = svs.clients[passedict->entnum-1].laggedents_count;
w->lagentsfrac = svs.clients[passedict->v->owner-1].laggedents_frac; w->lagentsfrac = svs.clients[passedict->entnum-1].laggedents_frac;
}
else if (passedict->v->owner)
{
if (passedict->v->owner && passedict->v->owner <= MAX_CLIENTS)
{
clip.type |= MOVE_LAGGED;
w->lagents = svs.clients[passedict->v->owner-1].laggedents;
w->maxlagents = svs.clients[passedict->v->owner-1].laggedents_count;
w->lagentsfrac = svs.clients[passedict->v->owner-1].laggedents_frac;
}
} }
} }
#endif
} }
if (clip.type & MOVE_LAGGED) if (clip.type & MOVE_LAGGED)
{ {
@ -1899,7 +1908,7 @@ trace_t World_Move (world_t *w, vec3_t start, vec3_t mins, vec3_t maxs, vec3_t e
if (touch == clip.passedict) if (touch == clip.passedict)
continue; continue;
if (touch->v->solid == SOLID_TRIGGER || touch->v->solid == SOLID_LADDER) if (touch->v->solid == SOLID_TRIGGER || touch->v->solid == SOLID_LADDER)
SV_Error ("Trigger (%s) in clipping list", PR_GetString(svprogfuncs, touch->v->classname)); Host_Error ("Trigger (%s) in clipping list", PR_GetString(w->progs, touch->v->classname));
if (clip.type & MOVE_NOMONSTERS && touch->v->solid != SOLID_BSP) if (clip.type & MOVE_NOMONSTERS && touch->v->solid != SOLID_BSP)
continue; continue;
@ -1932,9 +1941,9 @@ trace_t World_Move (world_t *w, vec3_t start, vec3_t mins, vec3_t maxs, vec3_t e
if (clip.passedict) if (clip.passedict)
{ {
if ((wedict_t*)PROG_TO_EDICT(svprogfuncs, touch->v->owner) == clip.passedict) if ((wedict_t*)PROG_TO_EDICT(w->progs, touch->v->owner) == clip.passedict)
continue; // don't clip against own missiles continue; // don't clip against own missiles
if ((wedict_t*)PROG_TO_EDICT(svprogfuncs, clip.passedict->v->owner) == touch) if ((wedict_t*)PROG_TO_EDICT(w->progs, clip.passedict->v->owner) == touch)
continue; // don't clip against owner continue; // don't clip against owner
} }