3 void _Movetype_Physics_Toss(entity this, float dt) // SV_Physics_Toss
7 if(this.velocity.z >= (1 / 32) && UPWARD_VELOCITY_CLEARS_ONGROUND(this))
9 // don't stick to ground if onground and moving upward
12 else if(!this.groundentity || !GAMEPLAYFIX_NOAIRBORNCORPSE(this))
16 else if(this.move_suspendedinair && wasfreed(this.groundentity))
18 this.groundentity = NULL;
19 if(NOAIRBORNCORPSE_ALLOWSUSPENDED(this))
22 else if(boxesoverlap(this.absmin, this.absmax, this.groundentity.absmin, this.groundentity.absmax))
24 // don't slide if still touching the groundentity
29 this.move_suspendedinair = false;
31 _Movetype_CheckVelocity(this);
33 if(this.move_movetype == MOVETYPE_BOUNCE || this.move_movetype == MOVETYPE_TOSS)
35 this.move_didgravity = true;
36 this.velocity_z -= (GAMEPLAYFIX_GRAVITYUNAFFECTEDBYTICRATE ? 0.5 : 1)
38 * ((this.gravity) ? this.gravity : 1)
42 /*if (this.move_movetype == MOVETYPE_BOUNCE || this.move_movetype == MOVETYPE_TOSS)
44 this.move_didgravity = true;
45 this.velocity_z -= (((this.gravity) ? this.gravity : 1) * PHYS_GRAVITY(this) * dt);
48 this.angles = this.angles + this.avelocity * dt;
51 for (int bump = 0; bump < MAX_CLIP_PLANES && movetime > 0; bump++)
53 vector move = this.velocity * movetime;
54 if(!_Movetype_PushEntity(this, move, true, true))
61 _Movetype_UnstickEntity(this);
62 if(!_Movetype_PushEntity(this, move, true, true))
68 if (trace_fraction == 1)
71 movetime *= 1 - min(1, trace_fraction);
73 if (this.move_movetype == MOVETYPE_BOUNCEMISSILE)
75 float bouncefac = (!this.bouncefactor) ? 1.0 : this.bouncefactor;
76 this.velocity = _Movetype_ClipVelocity(this.velocity, trace_plane_normal, 1 + bouncefac);
78 if(!GAMEPLAYFIX_SLIDEMOVEPROJECTILES(this))
81 else if (this.move_movetype == MOVETYPE_BOUNCE)
83 float bouncefac = (!this.bouncefactor) ? 0.5 : this.bouncefactor;
84 float bstop = (!this.bouncestop) ? (60 / 800) : this.bouncestop;
85 float grav = ((this.gravity) ? this.gravity : 1);
87 this.velocity = _Movetype_ClipVelocity(this.velocity, trace_plane_normal, 1 + bouncefac);
89 float d = trace_plane_normal * this.velocity;
90 if(!GAMEPLAYFIX_GRENADEBOUNCESLOPES(this))
92 if (trace_plane_normal.z > 0.7 && d < PHYS_GRAVITY(this) * bstop * grav)
95 this.groundentity = trace_ent;
96 this.velocity = '0 0 0';
97 this.avelocity = '0 0 0';
102 UNSET_ONGROUND(this);
103 if(!GAMEPLAYFIX_SLIDEMOVEPROJECTILES(this))
109 this.velocity = _Movetype_ClipVelocity(this.velocity, trace_plane_normal, 1.0);
110 if (trace_plane_normal.z > 0.7)
113 this.groundentity = trace_ent;
114 if (trace_ent.solid == SOLID_BSP)
115 this.move_suspendedinair = true;
116 this.velocity = '0 0 0';
117 this.avelocity = '0 0 0';
122 UNSET_ONGROUND(this);
123 if(!GAMEPLAYFIX_SLIDEMOVEPROJECTILES(this))
128 // DP revision 8905 (just, WHY...)
129 //if (this.move_movetype == MOVETYPE_BOUNCEMISSILE)
132 // DP revision 8918 (WHY...)
133 //if (IS_ONGROUND(this))
137 if (GAMEPLAYFIX_GRAVITYUNAFFECTEDBYTICRATE && this.move_didgravity > 0 && !IS_ONGROUND(this))
138 this.velocity_z -= 0.5 * dt * ((this.gravity) ? this.gravity : 1) * PHYS_GRAVITY(this);
140 _Movetype_CheckWaterTransition(this);