]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/common/movetypes/toss.qc
Merge branch 'master' into Mario/vaporizer_damage
[xonotic/xonotic-data.pk3dir.git] / qcsrc / common / movetypes / toss.qc
1 #include "../physics.qh"
2
3 void _Movetype_Physics_Toss(float dt)  // SV_Physics_Toss
4 {
5         if (self.move_flags & FL_ONGROUND)
6         {
7                 if (self.move_velocity.z >= 1 / 32)
8                 {
9                         self.move_flags &= ~FL_ONGROUND;
10                 }
11                 else if (!self.move_groundentity)
12                 {
13                         return;
14                 }
15                 else if (self.move_suspendedinair && wasfreed(self.move_groundentity))
16                 {
17                         self.move_groundentity = world;
18                         return;
19                 }
20         }
21
22         self.move_suspendedinair = false;
23
24         _Movetype_CheckVelocity();
25
26         if (self.move_movetype == MOVETYPE_BOUNCE || self.move_movetype == MOVETYPE_TOSS)
27         {
28                 self.move_didgravity = 1;
29                 self.move_velocity_z -= (GRAVITY_UNAFFECTED_BY_TICRATE ? 0.5 : 1)
30                     * dt
31                     * (self.gravity ? self.gravity : 1)
32                     * PHYS_GRAVITY;
33         }
34
35         self.move_angles = self.move_angles + self.move_avelocity * dt;
36
37         float movetime = dt;
38         for (int bump = 0; bump < MAX_CLIP_PLANES && movetime > 0; ++bump)
39         {
40                 vector move = self.move_velocity * movetime;
41                 _Movetype_PushEntity(move, true);
42                 if (wasfreed(self))
43                         return;
44
45                 if (trace_startsolid)
46                 {
47                         _Movetype_UnstickEntity();
48                         _Movetype_PushEntity(move, false);
49                         if (wasfreed(self))
50                                 return;
51                 }
52
53                 if (trace_fraction == 1)
54                         break;
55
56                 movetime *= 1 - min(1, trace_fraction);
57
58                 if (self.move_movetype == MOVETYPE_BOUNCEMISSILE)
59                 {
60                         self.move_velocity = _Movetype_ClipVelocity(self.move_velocity, trace_plane_normal, 2.0);
61                         self.move_flags &= ~FL_ONGROUND;
62                 }
63                 else if (self.move_movetype == MOVETYPE_BOUNCE)
64                 {
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;
68
69                         self.move_velocity = _Movetype_ClipVelocity(self.move_velocity, trace_plane_normal, 1 + bouncefac);
70
71                         float d = trace_plane_normal * self.move_velocity;
72                         if (trace_plane_normal.z > 0.7 && d < bouncestop && d > -bouncestop)
73                         {
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';
78                         }
79                         else
80                         {
81                                 self.move_flags &= ~FL_ONGROUND;
82                         }
83                 }
84                 else
85                 {
86                         self.move_velocity = _Movetype_ClipVelocity(self.move_velocity, trace_plane_normal, 1.0);
87                         if (trace_plane_normal.z > 0.7)
88                         {
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';
95                         }
96                         else
97                         {
98                                 self.move_flags &= ~FL_ONGROUND;
99                         }
100                 }
101
102                 // DP revision 8905 (just, WHY...)
103                 if (self.move_movetype == MOVETYPE_BOUNCEMISSILE)
104                         break;
105
106                 // DP revision 8918 (WHY...)
107                 if (self.move_flags & FL_ONGROUND)
108                         break;
109         }
110
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;
113
114         _Movetype_CheckWaterTransition(self);
115 }