X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fcommon%2Fphysics%2Fmovetypes%2Ftoss.qc;h=67405a636498d0f0aef004f2b5236750e42dda4d;hb=9fdf55259f13c2b133fc0b4b6adbc31ebf607ac9;hp=5bea38c5b806d97f49594f911be68d64636ceeda;hpb=fd6e61d095d67bd7ff6a8996024c4cb4e4446024;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/common/physics/movetypes/toss.qc b/qcsrc/common/physics/movetypes/toss.qc index 5bea38c5b..67405a636 100644 --- a/qcsrc/common/physics/movetypes/toss.qc +++ b/qcsrc/common/physics/movetypes/toss.qc @@ -1,20 +1,27 @@ -#include "../player.qh" +#include "toss.qh" void _Movetype_Physics_Toss(entity this, float dt) // SV_Physics_Toss { - if (this.move_flags & FL_ONGROUND) + if(IS_ONGROUND(this)) { - if (this.move_velocity.z >= 1 / 32 && UPWARD_VELOCITY_CLEARS_ONGROUND(this)) + if(this.velocity.z >= (1 / 32) && UPWARD_VELOCITY_CLEARS_ONGROUND(this)) { - this.move_flags &= ~FL_ONGROUND; + // don't stick to ground if onground and moving upward + UNSET_ONGROUND(this); } - else if (!this.move_groundentity) + else if(!this.groundentity || !GAMEPLAYFIX_NOAIRBORNCORPSE(this)) { return; } - else if (this.move_suspendedinair && wasfreed(this.move_groundentity)) + else if(this.move_suspendedinair && wasfreed(this.groundentity)) { - this.move_groundentity = NULL; + 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_velocity_z -= (GAMEPLAYFIX_GRAVITYUNAFFECTEDBYTICRATE ? 0.5 : 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.move_velocity_z -= (((this.gravity) ? this.gravity : 1) * PHYS_GRAVITY(this) * dt); - } + this.velocity_z -= (((this.gravity) ? this.gravity : 1) * PHYS_GRAVITY(this) * dt); + }*/ - this.move_angles = this.move_angles + this.move_avelocity * 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.move_velocity * movetime; - _Movetype_PushEntity(this, move, true); + vector move = this.velocity * movetime; + 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,59 +80,70 @@ void _Movetype_Physics_Toss(entity this, float dt) // SV_Physics_Toss if (this.move_movetype == MOVETYPE_BOUNCEMISSILE) { - this.move_velocity = _Movetype_ClipVelocity(this.move_velocity, trace_plane_normal, 2.0); - this.move_flags &= ~FL_ONGROUND; + 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.move_bounce_factor; if (!bouncefac) bouncefac = 0.5; - float bouncestop = this.move_bounce_stopspeed; if (!bouncestop) bouncestop = 60 / 800; - bouncestop *= (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.move_velocity = _Movetype_ClipVelocity(this.move_velocity, trace_plane_normal, 1 + bouncefac); + this.velocity = _Movetype_ClipVelocity(this.velocity, trace_plane_normal, 1 + bouncefac); - float d = trace_plane_normal * this.move_velocity; - if (trace_plane_normal.z > 0.7 && d < bouncestop && d > -bouncestop) + float d = trace_plane_normal * this.velocity; + if(!GAMEPLAYFIX_GRENADEBOUNCESLOPES(this)) + d = this.velocity.z; + if (trace_plane_normal.z > 0.7 && d < PHYS_GRAVITY(this) * bstop * grav) { - this.move_flags |= FL_ONGROUND; - this.move_groundentity = trace_ent; - this.move_velocity = '0 0 0'; - this.move_avelocity = '0 0 0'; + SET_ONGROUND(this); + this.groundentity = trace_ent; + this.velocity = '0 0 0'; + this.avelocity = '0 0 0'; + movetime = 0; } else { - this.move_flags &= ~FL_ONGROUND; + UNSET_ONGROUND(this); + if(!GAMEPLAYFIX_SLIDEMOVEPROJECTILES(this)) + movetime = 0; } } else { - this.move_velocity = _Movetype_ClipVelocity(this.move_velocity, trace_plane_normal, 1.0); + this.velocity = _Movetype_ClipVelocity(this.velocity, trace_plane_normal, 1.0); if (trace_plane_normal.z > 0.7) { - this.move_flags |= FL_ONGROUND; - this.move_groundentity = trace_ent; + SET_ONGROUND(this); + this.groundentity = trace_ent; if (trace_ent.solid == SOLID_BSP) this.move_suspendedinair = true; - this.move_velocity = '0 0 0'; - this.move_avelocity = '0 0 0'; + this.velocity = '0 0 0'; + this.avelocity = '0 0 0'; + movetime = 0; } else { - this.move_flags &= ~FL_ONGROUND; + 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 (this.move_flags & FL_ONGROUND) - break; + //if (IS_ONGROUND(this)) + //break; } - //if (GAMEPLAYFIX_GRAVITYUNAFFECTEDBYTICRATE && this.move_didgravity > 0 && !(this.move_flags & FL_ONGROUND)) - // this.move_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); }