From: havoc Date: Sat, 1 Apr 2006 13:49:46 +0000 (+0000) Subject: rewrote much of SV_Trace_Toss to fix bugs (it basically wasn't working, though I... X-Git-Tag: xonotic-v0.1.0preview~4112 X-Git-Url: http://git.xonotic.org/?a=commitdiff_plain;h=32764cbf8a3330ee7ad91d4698c420cf582c569f;p=xonotic%2Fdarkplaces.git rewrote much of SV_Trace_Toss to fix bugs (it basically wasn't working, though I was unable to figure out why) git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@6220 d7cf8633-e32d-0410-b094-e92efae38249 --- diff --git a/sv_phys.c b/sv_phys.c index dcca2be3..035a72d6 100644 --- a/sv_phys.c +++ b/sv_phys.c @@ -1693,23 +1693,20 @@ void SV_Physics (void) trace_t SV_Trace_Toss (prvm_edict_t *tossent, prvm_edict_t *ignore) { int i; - float gravity, savesolid; + float gravity; vec3_t move, end; - prvm_edict_t tempent, *tent; - entvars_t vars; + vec3_t original_origin; + vec3_t original_velocity; + vec3_t original_angles; + vec3_t original_avelocity; prvm_eval_t *val; trace_t trace; - // copy the vars over - memcpy(&vars, tossent->fields.server, sizeof(entvars_t)); - // set up the temp entity to point to the copied vars - tent = &tempent; - tent->fields.server = &vars; + VectorCopy(tossent->fields.server->origin , original_origin ); + VectorCopy(tossent->fields.server->velocity , original_velocity ); + VectorCopy(tossent->fields.server->angles , original_angles ); + VectorCopy(tossent->fields.server->avelocity, original_avelocity); - savesolid = tossent->fields.server->solid; - tossent->fields.server->solid = SOLID_NOT; - - // this has to fetch the field from the original edict, since our copy is truncated val = PRVM_GETEDICTFIELDVALUE(tossent, eval_gravity); if (val != NULL && val->_float != 0) gravity = val->_float; @@ -1719,19 +1716,23 @@ trace_t SV_Trace_Toss (prvm_edict_t *tossent, prvm_edict_t *ignore) for (i = 0;i < 200;i++) // LordHavoc: sanity check; never trace more than 10 seconds { - SV_CheckVelocity (tent); - tent->fields.server->velocity[2] -= gravity; - VectorMA (tent->fields.server->angles, 0.05, tent->fields.server->avelocity, tent->fields.server->angles); - VectorScale (tent->fields.server->velocity, 0.05, move); - VectorAdd (tent->fields.server->origin, move, end); - trace = SV_Move (tent->fields.server->origin, tent->fields.server->mins, tent->fields.server->maxs, end, MOVE_NORMAL, tent); - VectorCopy (trace.endpos, tent->fields.server->origin); - - if (trace.fraction < 1 && trace.ent && trace.ent != ignore) + SV_CheckVelocity (tossent); + tossent->fields.server->velocity[2] -= gravity; + VectorMA (tossent->fields.server->angles, 0.05, tossent->fields.server->avelocity, tossent->fields.server->angles); + VectorScale (tossent->fields.server->velocity, 0.05, move); + VectorAdd (tossent->fields.server->origin, move, end); + trace = SV_Move (tossent->fields.server->origin, tossent->fields.server->mins, tossent->fields.server->maxs, end, MOVE_NORMAL, tossent); + VectorCopy (trace.endpos, tossent->fields.server->origin); + + if (trace.fraction < 1) break; } - tossent->fields.server->solid = savesolid; - trace.fraction = 0; // not relevant + + VectorCopy(original_origin , tossent->fields.server->origin ); + VectorCopy(original_velocity , tossent->fields.server->velocity ); + VectorCopy(original_angles , tossent->fields.server->angles ); + VectorCopy(original_avelocity, tossent->fields.server->avelocity); + return trace; }