4 #include <common/state.qh>
5 #include <common/vehicles/all.qh>
9 const int ANTILAG_MAX_ORIGINS = 64;
10 .vector antilag_origins[ANTILAG_MAX_ORIGINS];
11 .float antilag_times[ANTILAG_MAX_ORIGINS];
13 .vector antilag_saved_origin;
14 .float antilag_takenback;
18 void antilag_record(entity e, entity store, float t)
21 if (e.vehicle.vehicle_flags == VHF_PLAYERSLOT) return;
22 antilag_record(e.vehicle, e.vehicle, t);
25 if (time < store.antilag_times[store.antilag_index]) return;
26 store.antilag_index += 1;
27 if (store.antilag_index >= ANTILAG_MAX_ORIGINS)
28 store.antilag_index = 0;
29 store.antilag_times[store.antilag_index] = t;
30 store.antilag_origins[store.antilag_index] = e.origin;
32 if (store.antilag_debug)
33 te_spark(antilag_takebackorigin(e, store, t - store.antilag_debug), '0 0 0', 32);
36 // finds the index BEFORE t
37 float antilag_find(entity e, entity store, float t)
39 for(int i = store.antilag_index; i > 0; --i)
40 if(store.antilag_times[i] >= t)
41 if(store.antilag_times[i - 1] < t)
44 if(store.antilag_times[0] >= t)
45 if(store.antilag_times[ANTILAG_MAX_ORIGINS - 1] < t)
46 return ANTILAG_MAX_ORIGINS - 1;
48 for(int i = ANTILAG_MAX_ORIGINS - 1; i > store.antilag_index + 1; --i)
49 if(store.antilag_times[i] >= t)
50 if(store.antilag_times[i - 1] < t)
53 // if we get here, t is sandwiched nowhere, so let's assume it's in the present
57 vector antilag_takebackorigin(entity e, entity store, float t)
59 int i0 = antilag_find(e, store, t);
63 if(store.antilag_takenback)
64 return store.antilag_saved_origin;
69 if (i1 >= ANTILAG_MAX_ORIGINS)
72 return lerpv(store.antilag_times[i0], store.antilag_origins[i0], store.antilag_times[i1], store.antilag_origins[i1], t);
75 vector antilag_takebackavgvelocity(entity e, entity store, float t0, float t1)
77 if (t0 >= t1) return '0 0 0';
78 vector o0 = antilag_takebackorigin(e, store, t0);
79 vector o1 = antilag_takebackorigin(e, store, t1);
80 return (o1 - o0) * (1 / (t1 - t0));
83 void antilag_takeback(entity e, entity store, float t)
86 if (e.vehicle.vehicle_flags == VHF_PLAYERSLOT) return;
87 antilag_takeback(e.vehicle, store, t);
90 if (!store.antilag_takenback)
91 store.antilag_saved_origin = e.origin;
93 vector org = antilag_takebackorigin(e, store, t);
95 store.antilag_takenback = true;
98 void antilag_restore(entity e, entity store)
101 if (e.vehicle.vehicle_flags == VHF_PLAYERSLOT) return;
102 antilag_restore(e.vehicle, e.vehicle);
105 if (!store.antilag_takenback) return;
107 setorigin(e, store.antilag_saved_origin);
108 store.antilag_takenback = false;
111 void antilag_clear(entity e, entity store)
113 antilag_restore(e, store);
114 for (int i = 0; i < ANTILAG_MAX_ORIGINS; ++i) {
115 store.antilag_times[i] = -2342;
116 store.antilag_origins[i] = e.origin;
118 store.antilag_index = ANTILAG_MAX_ORIGINS - 1; // next one is 0