if(pushed_entity && pushed_entity.gravity)
grav *= pushed_entity.gravity;
+ // Q3 has frametime-dependent gravity, but its trigger_push velocity calculation doesn't account for that.
+ // This discrepancy can be simulated accurately which ensures that all entities will arrive
+ // where they would in Q3 with gravity 800 at 125fps, even if entity-specific gravity is applied.
+ // This can be hard-coded because we don't support the Q3 world.gravity field at this time.
+ // See physicsCPMA.cfg for maths and test results.
+ if (Q3COMPAT_COMMON)
+ grav /= 750/800; // exact float, unlike 800/750
+
zdist = torg.z - org.z;
sdist = vlen(torg - org - zdist * '0 0 1');
sdir = normalize(torg - org - zdist * '0 0 1');
and ti.
*/
- // push him so high...
+ // push them so high...
vz = sqrt(fabs(2 * grav * jumpheight)); // NOTE: sqrt(positive)!
// we start with downwards velocity only if it's a downjump and the jump apex should be outside the jump!
return false;
vector org = targ.origin;
-#ifdef SVQC
- if(autocvar_sv_q3defragcompat)
-#elif defined(CSQC)
- if(STAT(Q3DEFRAGCOMPAT))
-#endif
- {
- org.z += targ.mins_z;
- org.z += 1; // off by 1!
- }
+
+ if(Q3COMPAT_COMMON || this.spawnflags & PUSH_STATIC)
+ org = (this.absmin + this.absmax) * 0.5;
if(this.enemy)
{
// reset tracking of oldvelocity for impact damage (sudden velocity changes)
targ.oldvelocity = targ.velocity;
- if(this.pushltime < time) // prevent "snorring" sound when a player hits the jumppad more than once
+ // prevent sound spam when a player hits the jumppad more than once
+ // or when a dead player gets stuck in the jumppad for some reason
+ if(this.pushltime < time && !(IS_DEAD(targ) && targ.velocity == '0 0 0'))
{
// flash when activated
Send_Effect(EFFECT_JUMPPAD, targ.origin, targ.velocity, 1);
{
SetMovedir(this);
- trigger_init(this);
-
+ WarpZoneLib_ExactTrigger_Init(this, false);
+ BITSET_ASSIGN(this.effects, EF_NODEPTHTEST);
this.active = ACTIVE_ACTIVE;
this.use = trigger_push_use;
settouch(this, trigger_push_touch);