]> de.git.xonotic.org Git - voretournament/voretournament.git/blob - data/qcsrc/server/antilag.qc
Initial checkout of Vore Tournament 0.1.alpha.
[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 lerp(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 lerp(e.(antilag_times[i0]), e.(antilag_origins[i0]), e.(antilag_times[i1]), e.(antilag_origins[i1]), t);\r
73 }\r
74 \r
75 void antilag_takeback(entity e, float t)\r
76 {\r
77         e.antilag_saved_origin = e.origin;\r
78         setorigin(e, antilag_takebackorigin(e, t));\r
79 }\r
80 \r
81 void antilag_restore(entity e)\r
82 {\r
83         setorigin(e, e.antilag_saved_origin);\r
84 }\r