5 #include <common/state.qh>
6 #include <common/vehicles/all.qh>
10 const int ANTILAG_MAX_ORIGINS = 64;
11 .vector antilag_origins[ANTILAG_MAX_ORIGINS];
12 .float antilag_times[ANTILAG_MAX_ORIGINS];
14 .vector antilag_saved_origin;
15 .float antilag_takenback;
19 void antilag_record(entity e, entity store, float t)
22 if (e.vehicle.vehicle_flags == VHF_PLAYERSLOT) return;
23 antilag_record(e.vehicle, e.vehicle, t);
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;
33 if (store.antilag_debug)
34 te_spark(antilag_takebackorigin(e, store, t - store.antilag_debug), '0 0 0', 32);
37 // finds the index BEFORE t
38 float antilag_find(entity e, entity store, float t)
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)
45 if(store.antilag_times[0] >= t)
46 if(store.antilag_times[ANTILAG_MAX_ORIGINS - 1] < t)
47 return ANTILAG_MAX_ORIGINS - 1;
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)
54 // if we get here, t is sandwiched nowhere, so let's assume it's in the present
58 vector antilag_takebackorigin(entity e, entity store, float t)
60 int i0 = antilag_find(e, store, t);
64 if(store.antilag_takenback)
65 return store.antilag_saved_origin;
70 if (i1 >= ANTILAG_MAX_ORIGINS)
73 return lerpv(store.antilag_times[i0], store.antilag_origins[i0], store.antilag_times[i1], store.antilag_origins[i1], t);
76 vector antilag_takebackavgvelocity(entity e, entity store, float t0, float t1)
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));
84 void antilag_takeback(entity e, entity store, float t)
87 if (e.vehicle.vehicle_flags == VHF_PLAYERSLOT) return;
88 antilag_takeback(e.vehicle, e.vehicle, t);
91 if (!store.antilag_takenback)
92 store.antilag_saved_origin = e.origin;
94 vector org = antilag_takebackorigin(e, store, t);
96 store.antilag_takenback = true;
99 void antilag_restore(entity e, entity store)
102 if (e.vehicle.vehicle_flags == VHF_PLAYERSLOT) return;
103 antilag_restore(e.vehicle, e.vehicle);
106 if (!store.antilag_takenback) return;
108 setorigin(e, store.antilag_saved_origin);
109 store.antilag_takenback = false;
112 void antilag_clear(entity e, entity store)
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;
119 store.antilag_index = ANTILAG_MAX_ORIGINS - 1; // next one is 0