]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/server/antilag.qc
Merge remote-tracking branch 'origin/master' into terencehill/cursormode
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / antilag.qc
1 #define ANTILAG_MAX_ORIGINS 64
2 .vector antilag_origins[ANTILAG_MAX_ORIGINS];
3 .float antilag_times[ANTILAG_MAX_ORIGINS];
4 .float antilag_index;
5 .vector antilag_saved_origin;
6 .float antilag_takenback;
7
8 .float antilag_debug;
9
10 void antilag_dummy()
11 {
12         self.antilag_times = 0;
13         self.antilag_origins = '0 0 0';
14 }
15
16 void antilag_record(entity e, float t)
17 {
18     if (e.vehicle && e.vehicle.vehicle_flags == VHF_PLAYERSLOT)
19         return;
20         
21     if(e.vehicle)
22         antilag_record(e.vehicle, t);
23
24         if(time < e.(antilag_times[e.antilag_index]))
25                 return;
26         e.antilag_index = e.antilag_index + 1;
27         if(e.antilag_index >= ANTILAG_MAX_ORIGINS)
28                 e.antilag_index = 0;
29         e.(antilag_times[e.antilag_index]) = t;
30         e.(antilag_origins[e.antilag_index]) = e.origin;
31
32         if(e.antilag_debug)
33                 te_spark(antilag_takebackorigin(e, t - e.antilag_debug), '0 0 0', 32);
34
35 }
36
37 // finds the index BEFORE t
38 float antilag_find(entity e, float t)
39 {
40         float i;
41
42         for(i = e.antilag_index; i > 0; --i)
43                 if(e.(antilag_times[i]) >= t)
44                         if(e.(antilag_times[i - 1]) < t)
45                                 return i - 1;
46
47         if(e.(antilag_times[0]) >= t)
48                 if(e.(antilag_times[ANTILAG_MAX_ORIGINS - 1]) < t)
49                         return ANTILAG_MAX_ORIGINS - 1;
50
51         for(i = ANTILAG_MAX_ORIGINS - 1; i > e.antilag_index + 1; --i)
52                 if(e.(antilag_times[i]) >= t)
53                         if(e.(antilag_times[i - 1]) < t)
54                                 return i - 1;
55
56         // if we get here, t is sandwiched nowhere, so let's assume it's in the present
57         return -1;
58 }
59
60 vector lerpv(float t0, vector v0, float t1, vector v1, float t)
61 {
62         return v0 + (v1 - v0) * ((t - t0) / (t1 - t0));
63 }
64
65 vector antilag_takebackorigin(entity e, float t)
66 {
67         float i0, i1;
68
69         i0 = antilag_find(e, t);
70         if(i0 < 0)
71         {
72                 // IN THE PRESENT
73                 if(e.antilag_takenback)
74                         return e.antilag_saved_origin;
75                 else
76                         return e.origin;
77         }
78         i1 = i0 + 1;
79         if(i1 >= ANTILAG_MAX_ORIGINS)
80                 i1 = 0;
81
82         return lerpv(e.(antilag_times[i0]), e.(antilag_origins[i0]), e.(antilag_times[i1]), e.(antilag_origins[i1]), t);
83 }
84
85 vector antilag_takebackavgvelocity(entity e, float t0, float t1)
86 {
87         vector o0, o1;
88
89         if(t0 >= t1)
90                 return '0 0 0';
91         o0 = antilag_takebackorigin(e, t0);
92         o1 = antilag_takebackorigin(e, t1);
93         return (o1 - o0) * (1 / (t1 - t0));
94 }
95
96 void antilag_takeback(entity e, float t)
97 {
98
99     if (e.vehicle && e.vehicle.vehicle_flags == VHF_PLAYERSLOT)
100         return;
101
102         if(e.vehicle)
103                 antilag_takeback(e.vehicle, t);
104
105         if(!e.antilag_takenback)
106                 e.antilag_saved_origin = e.origin;
107
108         setorigin(e, antilag_takebackorigin(e, t));
109         e.antilag_takenback = TRUE;
110 }
111
112 void antilag_restore(entity e)
113 {
114     if (e.vehicle && e.vehicle.vehicle_flags == VHF_PLAYERSLOT)
115         return;
116
117         if(e.vehicle)
118                 antilag_restore(e.vehicle);
119
120         if(!e.antilag_takenback)
121                 return;
122
123         setorigin(e, e.antilag_saved_origin);
124         e.antilag_takenback = FALSE;
125 }
126
127 void antilag_clear(entity e)
128 {
129         float i;
130
131         antilag_restore(e);
132         for(i = 0; i < ANTILAG_MAX_ORIGINS; ++i)
133         {
134                 e.(antilag_times[i]) = -2342;
135                 e.(antilag_origins[i]) = e.origin;
136         }
137         e.antilag_index = ANTILAG_MAX_ORIGINS - 1; // next one is 0
138 }