From 52a9c292d13ebe409521e61be89dcb4eebe1114e Mon Sep 17 00:00:00 2001 From: Mario Date: Sat, 31 Jul 2021 20:36:22 +1000 Subject: [PATCH] Save global trace values when performing touch operations as touches may perform additional traces, fixes #2617 --- qcsrc/common/physics/movetypes/movetypes.qc | 34 ++++++++++++++++++--- qcsrc/common/physics/movetypes/toss.qc | 10 +++++- qcsrc/common/weapons/weapon/electro.qc | 2 +- 3 files changed, 40 insertions(+), 6 deletions(-) diff --git a/qcsrc/common/physics/movetypes/movetypes.qc b/qcsrc/common/physics/movetypes/movetypes.qc index 48216f392..1bd0eb7ae 100644 --- a/qcsrc/common/physics/movetypes/movetypes.qc +++ b/qcsrc/common/physics/movetypes/movetypes.qc @@ -414,11 +414,40 @@ void _Movetype_Impact(entity this, entity oth) // SV_Impact if(!this && !oth) return; + // due to a lack of pointers in QC, we must save the trace values and restore them for other functions + bool save_trace_allsolid = trace_allsolid; + bool save_trace_startsolid = trace_startsolid; + float save_trace_fraction = trace_fraction; + bool save_trace_inwater = trace_inwater; + bool save_trace_inopen = trace_inopen; + vector save_trace_endpos = trace_endpos; + vector save_trace_plane_normal = trace_plane_normal; + float save_trace_plane_dist = trace_plane_dist; + entity save_trace_ent = trace_ent; + int save_trace_dpstartcontents = trace_dpstartcontents; + int save_trace_dphitcontents = trace_dphitcontents; + int save_trace_dphitq3surfaceflags = trace_dphitq3surfaceflags; + string save_trace_dphittexturename = trace_dphittexturename; + if(this.solid != SOLID_NOT && gettouch(this)) gettouch(this)(this, oth); if(oth.solid != SOLID_NOT && gettouch(oth)) gettouch(oth)(oth, this); + + trace_allsolid = save_trace_allsolid; + trace_startsolid = save_trace_startsolid; + trace_fraction = save_trace_fraction; + trace_inwater = save_trace_inwater; + trace_inopen = save_trace_inopen; + trace_endpos = save_trace_endpos; + trace_plane_normal = save_trace_plane_normal; + trace_plane_dist = save_trace_plane_dist; + trace_ent = save_trace_ent; + trace_dpstartcontents = save_trace_dpstartcontents; + trace_dphitcontents = save_trace_dphitcontents; + trace_dphitq3surfaceflags = save_trace_dphitq3surfaceflags; + trace_dphittexturename = save_trace_dphittexturename; } void _Movetype_LinkEdict_TouchAreaGrid(entity this) // SV_LinkEdict_TouchAreaGrid @@ -636,7 +665,7 @@ void _Movetype_CheckStuck(entity this) // SV_CheckStuck } } -vector _Movetype_ClipVelocity(vector vel, vector norm, float f) // SV_ClipVelocity +vector _Movetype_ClipVelocity(vector vel, vector norm, float f) // ClipVelocity { vel -= ((vel * norm) * norm) * f; @@ -725,9 +754,6 @@ void _Movetype_Physics_Frame(entity this, float movedt) case MOVETYPE_FLY: case MOVETYPE_FLY_WORLDONLY: _Movetype_Physics_Toss(this, movedt); - if(wasfreed(this)) - return; - _Movetype_LinkEdict(this, true); break; case MOVETYPE_PHYSICS: break; diff --git a/qcsrc/common/physics/movetypes/toss.qc b/qcsrc/common/physics/movetypes/toss.qc index 772eb1b07..67405a636 100644 --- a/qcsrc/common/physics/movetypes/toss.qc +++ b/qcsrc/common/physics/movetypes/toss.qc @@ -56,9 +56,17 @@ void _Movetype_Physics_Toss(entity this, float dt) // SV_Physics_Toss if (wasfreed(this)) return; - if (trace_startsolid) + // NOTE: this is bmodelstartsolid in the engine + if (trace_startsolid && trace_ent.solid == SOLID_BSP) { + // QC lacks pointers so we must save the old trace values + float oldtrace_fraction = trace_fraction; + vector oldtrace_plane_normal = trace_plane_normal; + entity oldtrace_ent = trace_ent; _Movetype_UnstickEntity(this); + trace_fraction = oldtrace_fraction; + trace_plane_normal = oldtrace_plane_normal; + trace_ent = oldtrace_ent; if(!_Movetype_PushEntity(this, move, true, true)) return; if (wasfreed(this)) diff --git a/qcsrc/common/weapons/weapon/electro.qc b/qcsrc/common/weapons/weapon/electro.qc index 9409819e9..1142bff9d 100644 --- a/qcsrc/common/weapons/weapon/electro.qc +++ b/qcsrc/common/weapons/weapon/electro.qc @@ -130,7 +130,7 @@ void W_Electro_TouchExplode(entity this, entity toucher) } -void sys_phys_update_single(entity this); +//void sys_phys_update_single(entity this); void W_Electro_Bolt_Think(entity this) { -- 2.39.2