X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fcommon%2Fphysics%2Fmovetypes%2Ftoss.qc;h=67405a636498d0f0aef004f2b5236750e42dda4d;hb=9fdf55259f13c2b133fc0b4b6adbc31ebf607ac9;hp=71e7fa9d08c9032e14abe5bb9bdcd10824b84121;hpb=4645e628012c04435ba01fd6b4d10618ddf44e44;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/common/physics/movetypes/toss.qc b/qcsrc/common/physics/movetypes/toss.qc index 71e7fa9d0..67405a636 100644 --- a/qcsrc/common/physics/movetypes/toss.qc +++ b/qcsrc/common/physics/movetypes/toss.qc @@ -2,19 +2,26 @@ void _Movetype_Physics_Toss(entity this, float dt) // SV_Physics_Toss { - if (IS_ONGROUND(this)) + if(IS_ONGROUND(this)) { - if (this.velocity.z >= 1 / 32 && UPWARD_VELOCITY_CLEARS_ONGROUND(this)) + if(this.velocity.z >= (1 / 32) && UPWARD_VELOCITY_CLEARS_ONGROUND(this)) { + // don't stick to ground if onground and moving upward UNSET_ONGROUND(this); } - else if (!this.groundentity) + else if(!this.groundentity || !GAMEPLAYFIX_NOAIRBORNCORPSE(this)) { return; } - else if (this.move_suspendedinair && wasfreed(this.groundentity)) + else if(this.move_suspendedinair && wasfreed(this.groundentity)) { this.groundentity = NULL; + if(NOAIRBORNCORPSE_ALLOWSUSPENDED(this)) + return; + } + else if(boxesoverlap(this.absmin, this.absmax, this.groundentity.absmin, this.groundentity.absmax)) + { + // don't slide if still touching the groundentity return; } } @@ -23,35 +30,45 @@ void _Movetype_Physics_Toss(entity this, float dt) // SV_Physics_Toss _Movetype_CheckVelocity(this); - /*if (this.move_movetype == MOVETYPE_BOUNCE || this.move_movetype == MOVETYPE_TOSS) + if(this.move_movetype == MOVETYPE_BOUNCE || this.move_movetype == MOVETYPE_TOSS) { - this.move_didgravity = 1; + this.move_didgravity = true; this.velocity_z -= (GAMEPLAYFIX_GRAVITYUNAFFECTEDBYTICRATE ? 0.5 : 1) * dt - * (this.gravity ? this.gravity : 1) + * ((this.gravity) ? this.gravity : 1) * PHYS_GRAVITY(this); - }*/ + } - if (this.move_movetype == MOVETYPE_BOUNCE || this.move_movetype == MOVETYPE_TOSS) + /*if (this.move_movetype == MOVETYPE_BOUNCE || this.move_movetype == MOVETYPE_TOSS) { this.move_didgravity = true; this.velocity_z -= (((this.gravity) ? this.gravity : 1) * PHYS_GRAVITY(this) * dt); - } + }*/ this.angles = this.angles + this.avelocity * dt; float movetime = dt; - for (int bump = 0; bump < MAX_CLIP_PLANES && movetime > 0; ++bump) + for (int bump = 0; bump < MAX_CLIP_PLANES && movetime > 0; bump++) { vector move = this.velocity * movetime; - _Movetype_PushEntity(this, move, true); + if(!_Movetype_PushEntity(this, move, true, true)) + return; 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); - _Movetype_PushEntity(this, move, false); + 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)) return; } @@ -63,28 +80,36 @@ void _Movetype_Physics_Toss(entity this, float dt) // SV_Physics_Toss if (this.move_movetype == MOVETYPE_BOUNCEMISSILE) { - this.velocity = _Movetype_ClipVelocity(this.velocity, trace_plane_normal, 2.0); + float bouncefac = (!this.bouncefactor) ? 1.0 : this.bouncefactor; + this.velocity = _Movetype_ClipVelocity(this.velocity, trace_plane_normal, 1 + bouncefac); UNSET_ONGROUND(this); + if(!GAMEPLAYFIX_SLIDEMOVEPROJECTILES(this)) + movetime = 0; } else if (this.move_movetype == MOVETYPE_BOUNCE) { - float bouncefac = this.bouncefactor; if (!bouncefac) bouncefac = 0.5; - float bstop = this.bouncestop; if (!bstop) bstop = 60 / 800; - bstop *= (this.gravity ? this.gravity : 1) * PHYS_GRAVITY(this); + float bouncefac = (!this.bouncefactor) ? 0.5 : this.bouncefactor; + float bstop = (!this.bouncestop) ? (60 / 800) : this.bouncestop; + float grav = ((this.gravity) ? this.gravity : 1); this.velocity = _Movetype_ClipVelocity(this.velocity, trace_plane_normal, 1 + bouncefac); float d = trace_plane_normal * this.velocity; - if (trace_plane_normal.z > 0.7 && d < bstop && d > -bstop) + if(!GAMEPLAYFIX_GRENADEBOUNCESLOPES(this)) + d = this.velocity.z; + if (trace_plane_normal.z > 0.7 && d < PHYS_GRAVITY(this) * bstop * grav) { SET_ONGROUND(this); this.groundentity = trace_ent; this.velocity = '0 0 0'; this.avelocity = '0 0 0'; + movetime = 0; } else { UNSET_ONGROUND(this); + if(!GAMEPLAYFIX_SLIDEMOVEPROJECTILES(this)) + movetime = 0; } } else @@ -98,24 +123,27 @@ void _Movetype_Physics_Toss(entity this, float dt) // SV_Physics_Toss this.move_suspendedinair = true; this.velocity = '0 0 0'; this.avelocity = '0 0 0'; + movetime = 0; } else { UNSET_ONGROUND(this); + if(!GAMEPLAYFIX_SLIDEMOVEPROJECTILES(this)) + movetime = 0; } } // DP revision 8905 (just, WHY...) - if (this.move_movetype == MOVETYPE_BOUNCEMISSILE) - break; + //if (this.move_movetype == MOVETYPE_BOUNCEMISSILE) + //break; // DP revision 8918 (WHY...) - if (IS_ONGROUND(this)) - break; + //if (IS_ONGROUND(this)) + //break; } - //if (GAMEPLAYFIX_GRAVITYUNAFFECTEDBYTICRATE && this.move_didgravity > 0 && !IS_ONGROUND(this)) - // this.velocity_z -= 0.5 * dt * (this.gravity ? this.gravity : 1) * PHYS_GRAVITY(this); + if (GAMEPLAYFIX_GRAVITYUNAFFECTEDBYTICRATE && this.move_didgravity > 0 && !IS_ONGROUND(this)) + this.velocity_z -= 0.5 * dt * ((this.gravity) ? this.gravity : 1) * PHYS_GRAVITY(this); _Movetype_CheckWaterTransition(this); }