5 #include <server/defs.qh>
6 #include <common/state.qh>
7 #include <common/vehicles/all.qh>
11 const int ANTILAG_MAX_ORIGINS = 64;
12 .vector antilag_origins[ANTILAG_MAX_ORIGINS];
13 .float antilag_times[ANTILAG_MAX_ORIGINS];
15 .vector antilag_saved_origin;
16 .float antilag_takenback;
20 void antilag_record(entity e, entity store, float t)
23 if (e.vehicle.vehicle_flags == VHF_PLAYERSLOT) return;
24 antilag_record(e.vehicle, e.vehicle, t);
27 if (time < store.antilag_times[store.antilag_index]) return;
28 store.antilag_index += 1;
29 if (store.antilag_index >= ANTILAG_MAX_ORIGINS)
30 store.antilag_index = 0;
31 store.antilag_times[store.antilag_index] = t;
32 store.antilag_origins[store.antilag_index] = e.origin;
34 if (store.antilag_debug)
35 te_spark(antilag_takebackorigin(e, store, t - store.antilag_debug), '0 0 0', 32);
38 // finds the index BEFORE t
39 float antilag_find(entity e, entity store, float t)
41 for(int i = store.antilag_index; i > 0; --i)
42 if(store.antilag_times[i] >= t)
43 if(store.antilag_times[i - 1] < t)
46 if(store.antilag_times[0] >= t)
47 if(store.antilag_times[ANTILAG_MAX_ORIGINS - 1] < t)
48 return ANTILAG_MAX_ORIGINS - 1;
50 for(int i = ANTILAG_MAX_ORIGINS - 1; i > store.antilag_index + 1; --i)
51 if(store.antilag_times[i] >= t)
52 if(store.antilag_times[i - 1] < t)
55 // if we get here, t is sandwiched nowhere, so let's assume it's in the present
59 vector antilag_takebackorigin(entity e, entity store, float t)
61 int i0 = antilag_find(e, store, t);
65 if(store.antilag_takenback)
66 return store.antilag_saved_origin;
71 if (i1 >= ANTILAG_MAX_ORIGINS)
74 return lerpv(store.antilag_times[i0], store.antilag_origins[i0], store.antilag_times[i1], store.antilag_origins[i1], t);
77 vector antilag_takebackavgvelocity(entity e, entity store, float t0, float t1)
79 if (t0 >= t1) return '0 0 0';
80 vector o0 = antilag_takebackorigin(e, store, t0);
81 vector o1 = antilag_takebackorigin(e, store, t1);
82 return (o1 - o0) * (1 / (t1 - t0));
85 void antilag_takeback(entity e, entity store, float t)
88 if (e.vehicle.vehicle_flags == VHF_PLAYERSLOT) return;
89 antilag_takeback(e.vehicle, e.vehicle, t);
92 if (!store.antilag_takenback)
93 store.antilag_saved_origin = e.origin;
95 vector org = antilag_takebackorigin(e, store, t);
97 store.antilag_takenback = true;
100 void antilag_restore(entity e, entity store)
103 if (e.vehicle.vehicle_flags == VHF_PLAYERSLOT) return;
104 antilag_restore(e.vehicle, e.vehicle);
107 if (!store.antilag_takenback) return;
109 setorigin(e, store.antilag_saved_origin);
110 store.antilag_takenback = false;
113 void antilag_clear(entity e, entity store)
115 antilag_restore(e, store);
116 for (int i = 0; i < ANTILAG_MAX_ORIGINS; ++i) {
117 store.antilag_times[i] = -2342;
118 store.antilag_origins[i] = e.origin;
120 store.antilag_index = ANTILAG_MAX_ORIGINS - 1; // next one is 0