From b92a3a9da538886e5c25a7fedf479f5f33f77bcf Mon Sep 17 00:00:00 2001 From: Marco Cawthorne Date: Mon, 12 Sep 2022 23:07:33 -0700 Subject: [PATCH] PMove_Custom: Go over some checks, one trace_fraction check was wrong and caused us to not slide along rotating brushes (doors) properly. --- src/gs-entbase/server/func_conveyor.qc | 6 ++-- src/shared/pmove_custom.qc | 46 +++++++++++++++----------- 2 files changed, 30 insertions(+), 22 deletions(-) diff --git a/src/gs-entbase/server/func_conveyor.qc b/src/gs-entbase/server/func_conveyor.qc index 631153e2..0eaf5b14 100644 --- a/src/gs-entbase/server/func_conveyor.qc +++ b/src/gs-entbase/server/func_conveyor.qc @@ -99,9 +99,9 @@ func_conveyor::Respawn(void) RestoreAngles(); SetMovementDirection(); ClearAngles(); - SetModel(GetSpawnModel()); SetMovetype(MOVETYPE_NONE); SetSolid(SOLID_BSP); + SetModel(GetSpawnModel()); Trigger(this, TRIG_ON); @@ -149,9 +149,9 @@ func_conveyor::Trigger(entity act, int state) } /* changes direction */ - glowmod[1] = 0.5f; + glowmod[1] = 0.5; glowmod[2] = m_flSpeed / 1024; - SetSendFlags(RDENT_CHANGED_RENDERMODE); + SetSendFlags(RDENT_CHANGED_RENDERCOLOR); } void diff --git a/src/shared/pmove_custom.qc b/src/shared/pmove_custom.qc index 240a9f4f..c5b09c70 100644 --- a/src/shared/pmove_custom.qc +++ b/src/shared/pmove_custom.qc @@ -82,13 +82,13 @@ PMoveCustom_Categorize(void) tracebox(self.origin, self.mins, self.maxs, self.origin - [0,0,1], MOVE_NORMAL, self); if (!trace_startsolid) { - if ((trace_fraction < 1) && (trace_plane_normal[2] > 0.7)) { + if ((trace_fraction < 1.0f) && (trace_plane_normal[2] > 0.7)) { self.flags |= FL_ONGROUND; self.groundentity = trace_ent; - if (self.groundentity) { - self.basevelocity += self.groundentity.velocity; - } + //if (self.groundentity) { + // self.basevelocity += self.groundentity.velocity; + //} } else { self.flags &= ~FL_ONGROUND; } @@ -416,8 +416,10 @@ PMoveCustom_Rebound(vector normal) self.velocity = self.velocity - normal * (self.velocity * normal); if (normal[2] > 0.7) { - self.groundentity = trace_ent; - self.flags |= FL_ONGROUND; + if (trace_ent.solid == SOLID_BSP) { + self.groundentity = trace_ent; + self.flags |= FL_ONGROUND; + } } } @@ -444,6 +446,7 @@ PMoveCustom_Fix_Origin(void) } } +#if 0 /* still not done */ for (z = 0; z < 3; z++) { norg = oorg; @@ -473,6 +476,8 @@ PMoveCustom_Fix_Origin(void) return (1); } } +#endif + return (0); } @@ -484,7 +489,7 @@ PMoveCustom_Move(void) vector saved_plane; float stepped; float move_time; - int i; + float i; /* no friction for the deceased */ if (self.movetype == MOVETYPE_NOCLIP) { @@ -492,15 +497,11 @@ PMoveCustom_Move(void) return; } - /* hacky attempt at base-velocity, this needs to be cleared/wiped at the end */ - if (!(self.flags & FL_ONGROUND)) { - self.basevelocity[2] = 0; - } - /* we need to bounce off surfaces (in order to slide along them), * so we need at 2 attempts */ for (i = 3, move_time = input_timelength; move_time > 0 && i; i--) { dest = self.origin + (self.velocity * move_time); + dest += (self.basevelocity * move_time); tracebox(self.origin, self.mins, self.maxs, dest, MOVE_NORMAL, self); @@ -512,11 +513,15 @@ PMoveCustom_Move(void) continue; } + /* move us into place */ self.origin = trace_endpos; - if (trace_fraction > 1) { + /* no obstacles? no further tests needed */ + if (trace_fraction >= 1.0f) { + setorigin(self, self.origin); break; } + saved_plane = trace_plane_normal; move_time -= move_time * trace_fraction; @@ -536,14 +541,15 @@ PMoveCustom_Move(void) float roof_fraction = trace_fraction; vector roof_plane_normal = trace_plane_normal; - dest = trace_endpos + (self.velocity*move_time); + dest = trace_endpos + (self.velocity * move_time); + dest += (self.basevelocity * move_time); dest[2] = trace_endpos[2]; /*only horizontally*/ /* move forwards */ tracebox(trace_endpos, self.mins, self.maxs, dest, MOVE_NORMAL, self); /* if we got anywhere, make this raised-step move count */ - if (trace_fraction != 0) { + if (trace_fraction == 1.0f) { float fwfrac = trace_fraction; vector fwplane = trace_plane_normal; @@ -552,7 +558,7 @@ PMoveCustom_Move(void) dest[2] -= stepped + 1; tracebox(trace_endpos, self.mins, self.maxs, dest, MOVE_NORMAL, self); - if (trace_fraction < 1 && trace_plane_normal[2] > 0.7f) { + if (trace_fraction < 1.0 && trace_plane_normal[2] > 0.7f) { move_time -= move_time * fwfrac; /* bounce off the ceiling */ if (roof_fraction < 1) { @@ -579,9 +585,11 @@ PMoveCustom_Move(void) dest = self.origin; dest[2] -= serverkeyfloat("phy_stepheight"); tracebox(self.origin, self.mins, self.maxs, dest, MOVE_NORMAL, self); - if (trace_fraction >= 1) { + + if (trace_fraction == 1.0) { return; } + /*if (trace_startsolid) { if (!PMoveCustom_Fix_Origin()) { return; @@ -590,8 +598,6 @@ PMoveCustom_Move(void) PMoveCustom_DoTouch(trace_ent); self.groundentity = trace_ent; } - - tracebox(self.origin, self.mins, self.maxs, self.origin, MOVE_NORMAL, self); } /* this is called for when we want to run the custom QC player physics */ @@ -607,6 +613,7 @@ PMoveCustom_RunPlayerPhysics(entity target) if (self.maxspeed <= 0) self.maxspeed = 240; + /* call accelerate before and after the actual move, * with half the move each time. this reduces framerate dependence. * and makes controlling jumps slightly easier */ @@ -623,6 +630,7 @@ PMoveCustom_RunPlayerPhysics(entity target) /* activate any SOLID_TRIGGER entities */ touchtriggers(); + setorigin(self, self.origin); self = oldself; }