1
0
Fork 0
forked from fte/fteqw

Added .vector gravitydir;

Added csqc getentity builtin (untested, broken for players).

git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@3998 fc73d0e0-1445-4013-8a0c-d673dee63da5
This commit is contained in:
Spoike 2012-02-17 01:12:37 +00:00
parent bd44e87734
commit 854157a4e7
8 changed files with 112 additions and 68 deletions

View file

@ -478,6 +478,10 @@ typedef struct {
vec3_t oldorigin; /*origin that we're lerping away from*/
vec3_t newangle;
vec3_t oldangle;
//for further info
int sequence;
entity_state_t *entstate;
} lerpents_t;
//
// the client_state_t structure is wiped completely at every

View file

@ -712,9 +712,12 @@ void PM_CategorizePosition (void)
int cont;
trace_t trace;
pmove.gravitydir[0] = 0;
pmove.gravitydir[1] = 0;
pmove.gravitydir[2] = -1;
if (pmove.gravitydir[0] == 0 && pmove.gravitydir[1] == 0 && pmove.gravitydir[2] == 0)
{
pmove.gravitydir[0] = 0;
pmove.gravitydir[1] = 0;
pmove.gravitydir[2] = -1;
}
if (pmove.pm_type == PM_WALLWALK)
{
vec3_t tmin,tmax;

View file

@ -1651,7 +1651,7 @@ static void R_DB_Sprite(batch_t *batch)
entity_t *e = batch->ent;
vec3_t point;
mspriteframe_t *frame, genframe;
vec3_t forward, right, up;
vec3_t spraxis[3];
msprite_t *psprite;
vec3_t sprorigin;
unsigned int sprtype;
@ -1708,34 +1708,41 @@ static void R_DB_Sprite(batch_t *batch)
{
case SPR_ORIENTED:
// bullet marks on walls
AngleVectors (e->angles, forward, right, up);
if (e->flags & Q2RF_WEAPONMODEL && r_refdef.currentplayernum >= 0)
{
vec3_t ea[3];
AngleVectors (e->angles, ea[0], ea[1], ea[2]);
Matrix3_Multiply(ea, cl.viewent[r_refdef.currentplayernum].axis, spraxis);
}
else
AngleVectors (e->angles, spraxis[0], spraxis[1], spraxis[2]);
break;
case SPR_FACING_UPRIGHT:
up[0] = 0;up[1] = 0;up[2]=1;
right[0] = sprorigin[1] - r_origin[1];
right[1] = -(sprorigin[0] - r_origin[0]);
right[2] = 0;
VectorNormalize (right);
spraxis[2][0] = 0;spraxis[2][1] = 0;spraxis[2][2]=1;
spraxis[1][0] = sprorigin[1] - r_origin[1];
spraxis[1][1] = -(sprorigin[0] - r_origin[0]);
spraxis[1][2] = 0;
VectorNormalize (spraxis[1]);
break;
case SPR_VP_PARALLEL_UPRIGHT:
up[0] = 0;up[1] = 0;up[2]=1;
VectorCopy (vright, right);
spraxis[2][0] = 0;spraxis[2][1] = 0;spraxis[2][2]=1;
VectorCopy (vright, spraxis[1]);
break;
default:
case SPR_VP_PARALLEL:
//normal sprite
VectorCopy(vup, up);
VectorCopy(vright, right);
VectorCopy(vup, spraxis[2]);
VectorCopy(vright, spraxis[1]);
break;
}
up[0]*=e->scale;
up[1]*=e->scale;
up[2]*=e->scale;
right[0]*=e->scale;
right[1]*=e->scale;
right[2]*=e->scale;
spraxis[2][0]*=e->scale;
spraxis[2][1]*=e->scale;
spraxis[2][2]*=e->scale;
spraxis[1][0]*=e->scale;
spraxis[1][1]*=e->scale;
spraxis[1][2]*=e->scale;
if (e->shaderRGBAf[0] > 1)
e->shaderRGBAf[0] = 1;
@ -1749,17 +1756,17 @@ static void R_DB_Sprite(batch_t *batch)
Vector4Copy(e->shaderRGBAf, colours[2]);
Vector4Copy(e->shaderRGBAf, colours[3]);
VectorMA (sprorigin, frame->down, up, point);
VectorMA (point, frame->left, right, vertcoords[0]);
VectorMA (sprorigin, frame->down, spraxis[2], point);
VectorMA (point, frame->left, spraxis[1], vertcoords[0]);
VectorMA (sprorigin, frame->up, up, point);
VectorMA (point, frame->left, right, vertcoords[1]);
VectorMA (sprorigin, frame->up, spraxis[2], point);
VectorMA (point, frame->left, spraxis[1], vertcoords[1]);
VectorMA (sprorigin, frame->up, up, point);
VectorMA (point, frame->right, right, vertcoords[2]);
VectorMA (sprorigin, frame->up, spraxis[2], point);
VectorMA (point, frame->right, spraxis[1], vertcoords[2]);
VectorMA (sprorigin, frame->down, up, point);
VectorMA (point, frame->right, right, vertcoords[3]);
VectorMA (sprorigin, frame->down, spraxis[2], point);
VectorMA (point, frame->right, spraxis[1], vertcoords[3]);
batch->ent = &r_worldentity;
batch->mesh = &meshptr;

View file

@ -495,7 +495,7 @@ reeval:
fdef_t *f;
d16 = ED_GlobalAtOfs16(progfuncs, st->a);
f = ED_FieldAtOfs(progfuncs, OPB->_int + progfuncs->fieldadjust);
PR_RunError (progfuncs, "assignment to read-only entity in %s (%s.%s)", PR_StringToNative(progfuncs, pr_xfunction->s_name), d16?PR_StringToNative(progfuncs, d16->s_name):NULL, f?f->name:NULL);
printf ("assignment to read-only entity in %s (%s.%s)\n", PR_StringToNative(progfuncs, pr_xfunction->s_name), d16?PR_StringToNative(progfuncs, d16->s_name):NULL, f?f->name:NULL);
}
#endif
}

View file

@ -3855,14 +3855,21 @@ static void QCBUILTIN PF_droptofloor (progfuncs_t *prinst, struct globalvars_s *
vec3_t end;
vec3_t start;
trace_t trace;
const float *gravitydir;
extern const vec3_t standardgravity;
ent = PROG_TO_EDICT(prinst, pr_global_struct->self);
if (ent->xv->gravitydir[2] || ent->xv->gravitydir[1] || ent->xv->gravitydir[0])
gravitydir = ent->xv->gravitydir;
else
gravitydir = standardgravity;
VectorCopy (ent->v->origin, end);
if (pr_droptofloorunits.value > 0)
end[2] -= pr_droptofloorunits.value;
VectorMA(end, pr_droptofloorunits.value, gravitydir, end);
else
end[2] -= 256;
VectorMA(end, 256, gravitydir, end);
VectorCopy (ent->v->origin, start);
trace = World_Move (&sv.world, start, ent->v->mins, ent->v->maxs, end, MOVE_NORMAL, (wedict_t*)ent);
@ -9207,12 +9214,14 @@ BuiltinList_t BuiltinList[] = { //nq qw h2 ebfs
//DP_SV_WRITEPICTURE
{"WritePicture", PF_WritePicture, 0, 0, 0, 501, "void(float to, string s, float sz)"},//
{"ReadPicture", PF_Fixme, 0, 0, 0, 501, "string()"},//
//no 502 documented
// {"boxparticles", PF_Fixme, 0, 0, 0, 502, "void(float effectindex, entity own, vector org_from, vector org_to, vector dir_from, vector dir_to, float countmultiplier, float flags)"},
//DP_QC_WHICHPACK
{"whichpack", PF_whichpack, 0, 0, 0, 503, "string(string filename)"},//
//no 504
//DP_CSQC_QUERYRENDERENTITY
{"getentity", PF_Fixme, 0, 0, 0, 504 "__variant(float entnum, fload fieldnum)"},
//DP_QC_URI_ESCAPE
{"uri_escape", PF_uri_escape, 0, 0, 0, 510, "string(string in)"},//

View file

@ -200,6 +200,7 @@ and the extension fields are added on the end and can have extra vm-specific stu
comfieldfloat(skeletonindex) /*FTE_CSQC_SKELETONOBJECTS*/\
comfieldvector(colormod)\
comfieldvector(glowmod)\
comfieldvector(gravitydir)\
comfieldfloat(pmove_flags)/*EXT_CSQC_1*/\
comfieldfloat(friction)/*DP_...PHYSICS*/\
comfieldfloat(erp)/*DP_...PHYSICS*/\

View file

@ -91,6 +91,7 @@ void WPhys_Init(void)
#define MOVE_EPSILON 0.01
static void WPhys_Physics_Toss (world_t *w, wedict_t *ent);
const vec3_t standardgravity = {0, 0, -1};
// warning: SV_CheckAllEnts defined but not used
/*
@ -271,7 +272,7 @@ If steptrace is not NULL, the trace of any vertical wall hit will be stored
============
*/
#define MAX_CLIP_PLANES 5
static int WPhys_FlyMove (world_t *w, wedict_t *ent, float time, trace_t *steptrace)
static int WPhys_FlyMove (world_t *w, wedict_t *ent, const vec3_t gravitydir, float time, trace_t *steptrace)
{
int bumpcount, numbumps;
vec3_t dir;
@ -325,7 +326,7 @@ static int WPhys_FlyMove (world_t *w, wedict_t *ent, float time, trace_t *steptr
if (!trace.ent)
Host_Error ("SV_FlyMove: !trace.ent");
if (trace.plane.normal[2] > 0.7)
if (-DotProduct(gravitydir, trace.plane.normal) > 0.7)
{
blocked |= 1; // floor
if (((wedict_t *)trace.ent)->v->solid == SOLID_BSP)
@ -334,7 +335,7 @@ static int WPhys_FlyMove (world_t *w, wedict_t *ent, float time, trace_t *steptr
ent->v->groundentity = EDICT_TO_PROG(w->progs, trace.ent);
}
}
if (!trace.plane.normal[2])
if (!DotProduct(gravitydir, trace.plane.normal))
{
blocked |= 2; // step
if (steptrace)
@ -439,11 +440,12 @@ SV_AddGravity
============
*/
static void WPhys_AddGravity (world_t *w, wedict_t *ent, float scale)
static void WPhys_AddGravity (world_t *w, wedict_t *ent, const float *gravitydir, float scale)
{
if (!scale)
scale = w->defaultgravityscale;
ent->v->velocity[2] -= scale * movevars.gravity * host_frametime;
VectorMA(ent->v->velocity, scale * movevars.gravity * host_frametime, gravitydir, ent->v->velocity);
}
/*
@ -1062,6 +1064,7 @@ static void WPhys_Physics_Toss (world_t *w, wedict_t *ent)
vec3_t temporg;
int fl;
const float *gravitydir;
WPhys_CheckVelocity (w, ent);
@ -1069,10 +1072,15 @@ static void WPhys_Physics_Toss (world_t *w, wedict_t *ent)
if (!WPhys_RunThink (w, ent))
return;
if (ent->xv->gravitydir[2] || ent->xv->gravitydir[1] || ent->xv->gravitydir[0])
gravitydir = ent->xv->gravitydir;
else
gravitydir = standardgravity;
// if onground, return without moving
if ( ((int)ent->v->flags & FL_ONGROUND) )
{
if (ent->v->velocity[2] >= (1.0f/32.0f))
if (-DotProduct(gravitydir, ent->v->velocity) >= (1.0f/32.0f))
ent->v->flags = (int)ent->v->flags & ~FL_ONGROUND;
else
{
@ -1093,7 +1101,7 @@ static void WPhys_Physics_Toss (world_t *w, wedict_t *ent)
&& ent->v->movetype != MOVETYPE_FLYMISSILE
&& ent->v->movetype != MOVETYPE_BOUNCEMISSILE
&& ent->v->movetype != MOVETYPE_H2SWIM)
WPhys_AddGravity (w, ent, 1.0);
WPhys_AddGravity (w, ent, gravitydir, 1.0);
// move angles
VectorMA (ent->v->angles, host_frametime, ent->v->avelocity, ent->v->angles);
@ -1117,10 +1125,8 @@ static void WPhys_Physics_Toss (world_t *w, wedict_t *ent)
{
trace.fraction = 0;
#pragma warningmsg("These three lines might help boost framerates a lot in rmq, not sure if they violate expected behaviour in other mods though - check that they're safe.")
trace.plane.normal[0] = 0;
trace.plane.normal[1] = 0;
trace.plane.normal[2] = 1;
#pragma warningmsg("The following line might help boost framerates a lot in rmq, not sure if they violate expected behaviour in other mods though - check that they're safe.")
VectorNegate(gravitydir, trace.plane.normal);
}
if (trace.fraction == 1)
return;
@ -1146,9 +1152,9 @@ static void WPhys_Physics_Toss (world_t *w, wedict_t *ent)
// stop if on ground
if ((trace.plane.normal[2] > 0.7) && (ent->v->movetype != MOVETYPE_BOUNCEMISSILE))
if ((-DotProduct(gravitydir, trace.plane.normal) > 0.7) && (ent->v->movetype != MOVETYPE_BOUNCEMISSILE))
{
if (ent->v->velocity[2] < 60 || ent->v->movetype != MOVETYPE_BOUNCE )
if (-DotProduct(gravitydir, ent->v->velocity) < 60 || ent->v->movetype != MOVETYPE_BOUNCE )
{
ent->v->flags = (int)ent->v->flags | FL_ONGROUND;
ent->v->groundentity = EDICT_TO_PROG(w->progs, trace.ent);
@ -1186,8 +1192,14 @@ static void WPhys_Physics_Step (world_t *w, wedict_t *ent)
qboolean hitsound;
qboolean freefall;
int fl = ent->v->flags;
const float *gravitydir;
if (ent->v->velocity[2] >= (1.0 / 32.0) && (fl & FL_ONGROUND))
if (ent->xv->gravitydir[2] || ent->xv->gravitydir[1] || ent->xv->gravitydir[0])
gravitydir = ent->xv->gravitydir;
else
gravitydir = standardgravity;
if (-DotProduct(gravitydir, ent->v->velocity) >= (1.0 / 32.0) && (fl & FL_ONGROUND))
{
fl &= ~FL_ONGROUND;
ent->v->flags = fl;
@ -1202,11 +1214,11 @@ static void WPhys_Physics_Step (world_t *w, wedict_t *ent)
freefall = ent->v->waterlevel <= 0;
if (freefall)
{
hitsound = ent->v->velocity[2] < movevars.gravity*-0.1;
hitsound = -DotProduct(gravitydir, ent->v->velocity) < movevars.gravity*-0.1;
WPhys_AddGravity (w, ent, 1.0);
WPhys_AddGravity (w, ent, gravitydir, 1.0);
WPhys_CheckVelocity (w, ent);
WPhys_FlyMove (w, ent, host_frametime, NULL);
WPhys_FlyMove (w, ent, gravitydir, host_frametime, NULL);
World_LinkEdict (w, ent, true);
if ( (int)ent->v->flags & FL_ONGROUND ) // just hit ground
@ -1608,17 +1620,15 @@ static void SV_WalkMove (edict_t *ent)
// 1/32 epsilon to keep floating point happy
#define DIST_EPSILON (0.03125)
static int WPhys_SetOnGround (world_t *w, wedict_t *ent)
static int WPhys_SetOnGround (world_t *w, wedict_t *ent, const float *gravitydir)
{
vec3_t end;
trace_t trace;
if ((int)ent->v->flags & FL_ONGROUND)
return 1;
end[0] = ent->v->origin[0];
end[1] = ent->v->origin[1];
end[2] = ent->v->origin[2] - 1;
VectorMA(ent->v->origin, 1, gravitydir, end);
trace = World_Move(w, ent->v->origin, ent->v->mins, ent->v->maxs, end, MOVE_NORMAL, (wedict_t*)ent);
if (trace.fraction <= DIST_EPSILON && trace.plane.normal[2] >= 0.7)
if (trace.fraction <= DIST_EPSILON && -DotProduct(gravitydir, trace.plane.normal) >= 0.7)
{
ent->v->flags = (int)ent->v->flags | FL_ONGROUND;
ent->v->groundentity = EDICT_TO_PROG(w->progs, trace.ent);
@ -1626,7 +1636,7 @@ static int WPhys_SetOnGround (world_t *w, wedict_t *ent)
}
return 0;
}
static void WPhys_WalkMove (world_t *w, wedict_t *ent)
static void WPhys_WalkMove (world_t *w, wedict_t *ent, const float *gravitydir)
{
int clip, oldonground, originalmove_clip, originalmove_flags, originalmove_groundentity;
vec3_t upmove, downmove, start_origin, start_velocity, originalmove_origin, originalmove_velocity;
@ -1641,9 +1651,9 @@ static void WPhys_WalkMove (world_t *w, wedict_t *ent)
VectorCopy (ent->v->origin, start_origin);
VectorCopy (ent->v->velocity, start_velocity);
clip = WPhys_FlyMove (w, ent, host_frametime, NULL);
clip = WPhys_FlyMove (w, ent, gravitydir, host_frametime, NULL);
WPhys_SetOnGround (w, ent);
WPhys_SetOnGround (w, ent, gravitydir);
WPhys_CheckVelocity(w, ent);
VectorCopy(ent->v->origin, originalmove_origin);
@ -1683,14 +1693,13 @@ static void WPhys_WalkMove (world_t *w, wedict_t *ent)
VectorCopy (start_velocity, ent->v->velocity);
// move up
VectorClear (upmove);
upmove[2] = movevars.stepheight;
VectorScale(gravitydir, -movevars.stepheight, upmove);
// FIXME: don't link?
WPhys_PushEntity(w, ent, upmove, MOVE_NORMAL);
// move forward
ent->v->velocity[2] = 0;
clip = WPhys_FlyMove (w, ent, host_frametime, &steptrace);
clip = WPhys_FlyMove (w, ent, gravitydir, host_frametime, &steptrace);
ent->v->velocity[2] += start_velocity[2];
WPhys_CheckVelocity(w, ent);
@ -1726,12 +1735,11 @@ static void WPhys_WalkMove (world_t *w, wedict_t *ent)
return;
// move down
VectorClear (downmove);
downmove[2] = -movevars.stepheight + start_velocity[2]*host_frametime;
VectorScale(gravitydir, -(-movevars.stepheight + start_velocity[2]*host_frametime), downmove);
// FIXME: don't link?
downtrace = WPhys_PushEntity (w, ent, downmove, MOVE_NORMAL);
if (downtrace.fraction < 1 && downtrace.plane.normal[2] > 0.7)
if (downtrace.fraction < 1 && -DotProduct(gravitydir, downtrace.plane.normal) > 0.7)
{
// LordHavoc: disabled this check so you can walk on monsters/players
//if (ent->v->solid == SOLID_BSP)
@ -1754,7 +1762,7 @@ static void WPhys_WalkMove (world_t *w, wedict_t *ent)
ent->v->groundentity = originalmove_groundentity;
}
WPhys_SetOnGround (w, ent);
WPhys_SetOnGround (w, ent, gravitydir);
WPhys_CheckVelocity(w, ent);
}
#endif
@ -1801,6 +1809,7 @@ void WPhys_RunEntity (world_t *w, wedict_t *ent)
{
wedict_t *movechain;
vec3_t initial_origin = {0},initial_angle = {0}; // warning: initial_?[?] may be used uninitialized in this function
const float *gravitydir;
#ifndef CLIENTONLY
edict_t *svent = (edict_t*)ent;
@ -1894,11 +1903,17 @@ void WPhys_RunEntity (world_t *w, wedict_t *ent)
case MOVETYPE_WALK:
if (!WPhys_RunThink (w, ent))
return;
if (ent->xv->gravitydir[2] || ent->xv->gravitydir[1] || ent->xv->gravitydir[0])
gravitydir = ent->xv->gravitydir;
else
gravitydir = standardgravity;
if (!WPhys_CheckWater (w, ent) && ! ((int)ent->v->flags & FL_WATERJUMP) )
WPhys_AddGravity (w, ent, ent->xv->gravity);
WPhys_AddGravity (w, ent, gravitydir, ent->xv->gravity);
WPhys_CheckStuck (w, ent);
WPhys_WalkMove (w, ent);
WPhys_WalkMove (w, ent, gravitydir);
#ifndef CLIENTONLY
if (!(ent->entnum > 0 && ent->entnum <= sv.allocated_client_slots) && w == &sv.world)

View file

@ -5440,6 +5440,9 @@ int SV_PMTypeForClient (client_t *cl)
}
#endif
if (!cl->isindependant)
return PM_NONE;
if (sv_brokenmovetypes.value) //this is to mimic standard qw servers, which don't support movetypes other than MOVETYPE_FLY.
{ //it prevents bugs from being visible in unsuspecting mods.
if (cl->spectator)
@ -5751,6 +5754,8 @@ void SV_RunCmd (usercmd_t *ucmd, qboolean recurse)
player_maxs[1] = sv_player->v->maxs[1];
player_maxs[2] = sv_player->v->maxs[2];
VectorCopy(sv_player->xv->gravitydir, pmove.gravitydir);
for (i=0 ; i<3 ; i++)
pmove.origin[i] = sv_player->v->origin[i];// + (sv_player->v->mins[i] - player_mins[i]);
@ -5847,7 +5852,7 @@ if (sv_player->v->health > 0 && before && !after )
VectorCopy (pmove.origin, sv_player->v->origin);
VectorCopy (pmove.angles, sv_player->v->v_angle);
if (pmove.pm_type == PM_WALLWALK)
if (pmove.gravitydir[0] || pmove.gravitydir[1] || pmove.gravitydir[2] != -1)
{
if (!sv_player->v->fixangle)
{