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