4 #include "../common/vehicles/all.qh"
8 const int ANTILAG_MAX_ORIGINS = 64;
9 .vector antilag_origins[ANTILAG_MAX_ORIGINS];
10 .float antilag_times[ANTILAG_MAX_ORIGINS];
12 .vector antilag_saved_origin;
13 .float antilag_takenback;
17 void antilag_record(entity e, float t)
19 if (e.vehicle && e.vehicle.vehicle_flags == VHF_PLAYERSLOT)
23 antilag_record(e.vehicle, t);
25 if(time < e.(antilag_times[e.antilag_index]))
27 e.antilag_index = e.antilag_index + 1;
28 if(e.antilag_index >= ANTILAG_MAX_ORIGINS)
30 e.(antilag_times[e.antilag_index]) = t;
31 e.(antilag_origins[e.antilag_index]) = e.origin;
34 te_spark(antilag_takebackorigin(e, t - e.antilag_debug), '0 0 0', 32);
38 // finds the index BEFORE t
39 float antilag_find(entity e, float t)
41 for(int i = e.antilag_index; i > 0; --i)
42 if(e.(antilag_times[i]) >= t)
43 if(e.(antilag_times[i - 1]) < t)
46 if(e.(antilag_times[0]) >= t)
47 if(e.(antilag_times[ANTILAG_MAX_ORIGINS - 1]) < t)
48 return ANTILAG_MAX_ORIGINS - 1;
50 for(int i = ANTILAG_MAX_ORIGINS - 1; i > e.antilag_index + 1; --i)
51 if(e.(antilag_times[i]) >= t)
52 if(e.(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, float t)
61 int i0 = antilag_find(e, t);
65 if(e.antilag_takenback)
66 return e.antilag_saved_origin;
71 if (i1 >= ANTILAG_MAX_ORIGINS)
74 return lerpv(e.(antilag_times[i0]), e.(antilag_origins[i0]), e.(antilag_times[i1]), e.(antilag_origins[i1]), t);
77 vector antilag_takebackavgvelocity(entity e, float t0, float t1)
83 o0 = antilag_takebackorigin(e, t0);
84 o1 = antilag_takebackorigin(e, t1);
85 return (o1 - o0) * (1 / (t1 - t0));
88 void antilag_takeback(entity e, float t)
91 if (e.vehicle && e.vehicle.vehicle_flags == VHF_PLAYERSLOT)
95 antilag_takeback(e.vehicle, t);
97 if(!e.antilag_takenback)
98 e.antilag_saved_origin = e.origin;
100 setorigin(e, antilag_takebackorigin(e, t));
101 e.antilag_takenback = true;
104 void antilag_restore(entity e)
106 if (e.vehicle && e.vehicle.vehicle_flags == VHF_PLAYERSLOT)
110 antilag_restore(e.vehicle);
112 if(!e.antilag_takenback)
115 setorigin(e, e.antilag_saved_origin);
116 e.antilag_takenback = false;
119 void antilag_clear(entity e)
122 for (int i = 0; i < ANTILAG_MAX_ORIGINS; ++i)
124 e.(antilag_times[i]) = -2342;
125 e.(antilag_origins[i]) = e.origin;
127 e.antilag_index = ANTILAG_MAX_ORIGINS - 1; // next one is 0