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, float t)
20 if (e.vehicle && e.vehicle.vehicle_flags == VHF_PLAYERSLOT)
24 antilag_record(e.vehicle, t);
26 if(time < CS(e).antilag_times[CS(e).antilag_index])
28 CS(e).antilag_index += 1;
29 if(CS(e).antilag_index >= ANTILAG_MAX_ORIGINS)
30 CS(e).antilag_index = 0;
31 CS(e).antilag_times[CS(e).antilag_index] = t;
32 CS(e).antilag_origins[CS(e).antilag_index] = e.origin;
34 if(CS(e).antilag_debug)
35 te_spark(antilag_takebackorigin(e, t - CS(e).antilag_debug), '0 0 0', 32);
39 // finds the index BEFORE t
40 float antilag_find(entity e, float t)
42 for(int i = CS(e).antilag_index; i > 0; --i)
43 if(CS(e).antilag_times[i] >= t)
44 if(CS(e).antilag_times[i - 1] < t)
47 if(CS(e).antilag_times[0] >= t)
48 if(CS(e).antilag_times[ANTILAG_MAX_ORIGINS - 1] < t)
49 return ANTILAG_MAX_ORIGINS - 1;
51 for(int i = ANTILAG_MAX_ORIGINS - 1; i > CS(e).antilag_index + 1; --i)
52 if(CS(e).antilag_times[i] >= t)
53 if(CS(e).antilag_times[i - 1] < t)
56 // if we get here, t is sandwiched nowhere, so let's assume it's in the present
60 vector antilag_takebackorigin(entity e, float t)
62 int i0 = antilag_find(e, t);
66 if(CS(e).antilag_takenback)
67 return CS(e).antilag_saved_origin;
72 if (i1 >= ANTILAG_MAX_ORIGINS)
75 return lerpv(CS(e).antilag_times[i0], CS(e).antilag_origins[i0], CS(e).antilag_times[i1], CS(e).antilag_origins[i1], t);
78 vector antilag_takebackavgvelocity(entity e, float t0, float t1)
84 o0 = antilag_takebackorigin(e, t0);
85 o1 = antilag_takebackorigin(e, t1);
86 return (o1 - o0) * (1 / (t1 - t0));
89 void antilag_takeback(entity e, float t)
92 if (e.vehicle && e.vehicle.vehicle_flags == VHF_PLAYERSLOT)
96 antilag_takeback(e.vehicle, t);
98 if(!CS(e).antilag_takenback)
99 CS(e).antilag_saved_origin = e.origin;
101 vector org = antilag_takebackorigin(e, t);
103 CS(e).antilag_takenback = true;
106 void antilag_restore(entity e)
108 if (e.vehicle && e.vehicle.vehicle_flags == VHF_PLAYERSLOT)
112 antilag_restore(e.vehicle);
114 if(!CS(e).antilag_takenback)
117 setorigin(e, CS(e).antilag_saved_origin);
118 CS(e).antilag_takenback = false;
121 void antilag_clear(entity e)
124 for (int i = 0; i < ANTILAG_MAX_ORIGINS; ++i)
126 CS(e).antilag_times[i] = -2342;
127 CS(e).antilag_origins[i] = e.origin;
129 CS(e).antilag_index = ANTILAG_MAX_ORIGINS - 1; // next one is 0