1 #include "../physics.qh"
3 void _Movetype_Physics_Toss(float dt) // SV_Physics_Toss
5 if (self.move_flags & FL_ONGROUND)
7 if (self.move_velocity.z >= 1 / 32)
9 self.move_flags &= ~FL_ONGROUND;
11 else if (!self.move_groundentity)
15 else if (self.move_suspendedinair && wasfreed(self.move_groundentity))
17 self.move_groundentity = world;
22 self.move_suspendedinair = false;
24 _Movetype_CheckVelocity();
26 if (self.move_movetype == MOVETYPE_BOUNCE || self.move_movetype == MOVETYPE_TOSS)
28 self.move_didgravity = 1;
29 self.move_velocity_z -= (GRAVITY_UNAFFECTED_BY_TICRATE ? 0.5 : 1)
31 * (self.gravity ? self.gravity : 1)
35 self.move_angles = self.move_angles + self.move_avelocity * dt;
38 for (int bump = 0; bump < MAX_CLIP_PLANES && movetime > 0; ++bump)
40 vector move = self.move_velocity * movetime;
41 _Movetype_PushEntity(move, true);
47 _Movetype_UnstickEntity();
48 _Movetype_PushEntity(move, false);
53 if (trace_fraction == 1)
56 movetime *= 1 - min(1, trace_fraction);
58 if (self.move_movetype == MOVETYPE_BOUNCEMISSILE)
60 self.move_velocity = _Movetype_ClipVelocity(self.move_velocity, trace_plane_normal, 2.0);
61 self.move_flags &= ~FL_ONGROUND;
63 else if (self.move_movetype == MOVETYPE_BOUNCE)
65 float bouncefac = self.move_bounce_factor; if (!bouncefac) bouncefac = 0.5;
66 float bouncestop = self.move_bounce_stopspeed; if (!bouncestop) bouncestop = 60 / 800;
67 bouncestop *= (self.gravity ? self.gravity : 1) * PHYS_GRAVITY;
69 self.move_velocity = _Movetype_ClipVelocity(self.move_velocity, trace_plane_normal, 1 + bouncefac);
71 float d = trace_plane_normal * self.move_velocity;
72 if (trace_plane_normal.z > 0.7 && d < bouncestop && d > -bouncestop)
74 self.move_flags |= FL_ONGROUND;
75 self.move_groundentity = trace_ent;
76 self.move_velocity = '0 0 0';
77 self.move_avelocity = '0 0 0';
81 self.move_flags &= ~FL_ONGROUND;
86 self.move_velocity = _Movetype_ClipVelocity(self.move_velocity, trace_plane_normal, 1.0);
87 if (trace_plane_normal.z > 0.7)
89 self.move_flags |= FL_ONGROUND;
90 self.move_groundentity = trace_ent;
91 if (trace_ent.solid == SOLID_BSP)
92 self.move_suspendedinair = true;
93 self.move_velocity = '0 0 0';
94 self.move_avelocity = '0 0 0';
98 self.move_flags &= ~FL_ONGROUND;
102 // DP revision 8905 (just, WHY...)
103 if (self.move_movetype == MOVETYPE_BOUNCEMISSILE)
106 // DP revision 8918 (WHY...)
107 if (self.move_flags & FL_ONGROUND)
111 if (GRAVITY_UNAFFECTED_BY_TICRATE && self.move_didgravity > 0 && !(self.move_flags & FL_ONGROUND))
112 self.move_velocity_z -= 0.5 * dt * (self.gravity ? self.gravity : 1) * PHYS_GRAVITY;
114 _Movetype_CheckWaterTransition(self);