]> de.git.xonotic.org Git - voretournament/voretournament.git/blob - data/qcsrc/server/antilag.qc
Less blurry crosshair ring
[voretournament/voretournament.git] / data / qcsrc / server / antilag.qc
1 #define ANTILAG_MAX_ORIGINS 64\r
2 .vector antilag_origins[ANTILAG_MAX_ORIGINS];\r
3 .float antilag_times[ANTILAG_MAX_ORIGINS];\r
4 .float antilag_index;\r
5 .vector antilag_saved_origin;\r
6 \r
7 .float antilag_debug;\r
8 \r
9 void antilag_dummy()\r
10 {\r
11         self.antilag_times = 0;\r
12         self.antilag_origins = '0 0 0';\r
13 }\r
14 \r
15 void antilag_record(entity e, float t)\r
16 {\r
17         if(time < e.(antilag_times[e.antilag_index]))\r
18                 return;\r
19         e.antilag_index = e.antilag_index + 1;\r
20         if(e.antilag_index >= ANTILAG_MAX_ORIGINS)\r
21                 e.antilag_index = 0;\r
22         e.(antilag_times[e.antilag_index]) = t;\r
23         e.(antilag_origins[e.antilag_index]) = e.origin;\r
24 \r
25         if(e.antilag_debug)\r
26                 te_spark(antilag_takebackorigin(e, t - e.antilag_debug), '0 0 0', 32);\r
27 }\r
28 \r
29 // finds the index BEFORE t\r
30 float antilag_find(entity e, float t)\r
31 {\r
32         float i;\r
33 \r
34         for(i = e.antilag_index; i > 0; --i)\r
35                 if(e.(antilag_times[i]) >= t)\r
36                         if(e.(antilag_times[i - 1]) < t)\r
37                                 return i - 1;\r
38 \r
39         if(e.(antilag_times[0]) >= t)\r
40                 if(e.(antilag_times[ANTILAG_MAX_ORIGINS - 1]) < t)\r
41                         return ANTILAG_MAX_ORIGINS - 1;\r
42 \r
43         for(i = ANTILAG_MAX_ORIGINS - 1; i > e.antilag_index + 1; --i)\r
44                 if(e.(antilag_times[i]) >= t)\r
45                         if(e.(antilag_times[i - 1]) < t)\r
46                                 return i - 1;\r
47 \r
48         // if we get here, t is sandwiched nowhere, so let's assume it's in the present\r
49         return -1;\r
50 }\r
51 \r
52 vector lerpv(float t0, vector v0, float t1, vector v1, float t)\r
53 {\r
54         return v0 + (v1 - v0) * ((t - t0) / (t1 - t0));\r
55 }\r
56 \r
57 vector antilag_takebackorigin(entity e, float t)\r
58 {\r
59         float i0, i1;\r
60 \r
61         i0 = antilag_find(e, t);\r
62         if(i0 < 0)\r
63         {\r
64                 i0 = e.antilag_index - 1;\r
65                 if(i0 < 0)\r
66                         i0 = ANTILAG_MAX_ORIGINS - 1;\r
67         }\r
68         i1 = i0 + 1;\r
69         if(i1 >= ANTILAG_MAX_ORIGINS)\r
70                 i1 = 0;\r
71 \r
72         return lerpv(e.(antilag_times[i0]), e.(antilag_origins[i0]), e.(antilag_times[i1]), e.(antilag_origins[i1]), t);\r
73 }\r
74 \r
75 vector antilag_takebackavgvelocity(entity e, float t0, float t1)\r
76 {\r
77         vector o0, o1;\r
78         if(t0 >= t1)\r
79                 return '0 0 0';\r
80         o0 = antilag_takebackorigin(e, t0);\r
81         o1 = antilag_takebackorigin(e, t1);\r
82         return (o1 - o0) * (1 / (t1 - t0));\r
83 }\r
84 \r
85 void antilag_takeback(entity e, float t)\r
86 {\r
87         e.antilag_saved_origin = e.origin;\r
88         setorigin(e, antilag_takebackorigin(e, t));\r
89 }\r
90 \r
91 void antilag_restore(entity e)\r
92 {\r
93         setorigin(e, e.antilag_saved_origin);\r
94 }\r