]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/client/wall.qc
11b851f8a70e6b395f439f9acfd7e2fe9cd0e908
[xonotic/xonotic-data.pk3dir.git] / qcsrc / client / wall.qc
1 #include "wall.qh"
2
3 #include "autocvars.qh"
4 #include "bgmscript.qh"
5 #include "main.qh"
6 #include "../common/util.qh"
7 #include "../csqcmodellib/interpolate.qh"
8
9 .float alpha;
10 .float scale;
11 .vector movedir;
12
13 void Ent_Wall_Draw()
14 {
15         float f;
16         var .vector fld;
17
18         if(self.bgmscriptangular)
19                 fld = angles;
20         else
21                 fld = origin;
22         self.(fld) = self.saved;
23
24         if(self.lodmodelindex1)
25         {
26                 if(autocvar_cl_modeldetailreduction <= 0)
27                 {
28                         if(self.lodmodelindex2 && autocvar_cl_modeldetailreduction <= -2)
29                                 self.modelindex = self.lodmodelindex2;
30                         else if(autocvar_cl_modeldetailreduction <= -1)
31                                 self.modelindex = self.lodmodelindex1;
32                         else
33                                 self.modelindex = self.lodmodelindex0;
34                 }
35                 else
36                 {
37                         float distance = vlen(NearestPointOnBox(self, view_origin) - view_origin);
38                         f = (distance * current_viewzoom + 100.0) * autocvar_cl_modeldetailreduction;
39                         f *= 1.0 / bound(0.01, view_quality, 1);
40                         if(self.lodmodelindex2 && f > self.loddistance2)
41                                 self.modelindex = self.lodmodelindex2;
42                         else if(f > self.loddistance1)
43                                 self.modelindex = self.lodmodelindex1;
44                         else
45                                 self.modelindex = self.lodmodelindex0;
46                 }
47         }
48
49         InterpolateOrigin_Do();
50
51         self.saved = self.(fld);
52
53         f = BGMScript(self);
54         if(f >= 0)
55         {
56                 if(self.lip < 0) // < 0: alpha goes from 1 to 1-|lip| when toggled (toggling subtracts lip)
57                         self.alpha = 1 + self.lip * f;
58                 else // > 0: alpha goes from 1-|lip| to 1 when toggled (toggling adds lip)
59                         self.alpha = 1 - self.lip * (1 - f);
60                 self.(fld) = self.(fld) + self.movedir * f;
61         }
62         else
63                 self.alpha = 1;
64
65         if(self.alpha >= ALPHA_MIN_VISIBLE)
66                 self.drawmask = MASK_NORMAL;
67         else
68                 self.drawmask = 0;
69 }
70
71 void Ent_Wall_Remove()
72 {
73         if(self.bgmscript)
74                 strunzone(self.bgmscript);
75         self.bgmscript = string_null;
76 }
77
78 void Ent_Wall()
79 {
80         int f;
81         var .vector fld;
82
83         InterpolateOrigin_Undo();
84         self.iflags = IFLAG_ANGLES | IFLAG_ORIGIN;
85
86         if(self.bgmscriptangular)
87                 fld = angles;
88         else
89                 fld = origin;
90         self.(fld) = self.saved;
91
92         f = ReadByte();
93
94         if(f & 1)
95         {
96                 if(f & 0x40)
97                         self.colormap = ReadShort();
98                 else
99                         self.colormap = 0;
100         }
101
102         if(f & 2)
103         {
104                 self.origin_x = ReadCoord();
105                 self.origin_y = ReadCoord();
106                 self.origin_z = ReadCoord();
107                 setorigin(self, self.origin);
108         }
109
110         if(f & 4)
111         {
112                 if(f & 0x10)
113                 {
114                         self.angles_x = ReadAngle();
115                         self.angles_y = ReadAngle();
116                         self.angles_z = ReadAngle();
117                 }
118                 else
119                         self.angles = '0 0 0';
120         }
121
122         if(f & 8)
123         {
124                 if(f & 0x80)
125                 {
126                         self.lodmodelindex0 = ReadShort();
127                         self.loddistance1 = ReadShort();
128                         self.lodmodelindex1 = ReadShort();
129                         self.loddistance2 = ReadShort();
130                         self.lodmodelindex2 = ReadShort();
131                 }
132                 else
133                 {
134                         self.modelindex = ReadShort();
135                         self.loddistance1 = 0;
136                         self.loddistance2 = 0;
137                 }
138                 self.solid = ReadByte();
139                 self.scale = ReadShort() / 256.0;
140                 if(f & 0x20)
141                 {
142                         self.mins_x = ReadCoord();
143                         self.mins_y = ReadCoord();
144                         self.mins_z = ReadCoord();
145                         self.maxs_x = ReadCoord();
146                         self.maxs_y = ReadCoord();
147                         self.maxs_z = ReadCoord();
148                 }
149                 else
150                         self.mins = self.maxs = '0 0 0';
151                 setsize(self, self.mins, self.maxs);
152
153                 if(self.bgmscript)
154                         strunzone(self.bgmscript);
155                 self.bgmscript = ReadString();
156                 if(substring(self.bgmscript, 0, 1) == "<")
157                 {
158                         self.bgmscript = strzone(substring(self.bgmscript, 1, -1));
159                         self.bgmscriptangular = 1;
160                 }
161                 else
162                 {
163                         self.bgmscript = strzone(self.bgmscript);
164                         self.bgmscriptangular = 0;
165                 }
166                 if(self.bgmscript != "")
167                 {
168                         self.bgmscriptattack = ReadByte() / 64.0;
169                         self.bgmscriptdecay = ReadByte() / 64.0;
170                         self.bgmscriptsustain = ReadByte() / 255.0;
171                         self.bgmscriptrelease = ReadByte() / 64.0;
172                         self.movedir_x = ReadCoord();
173                         self.movedir_y = ReadCoord();
174                         self.movedir_z = ReadCoord();
175                         self.lip = ReadByte() / 255.0;
176                 }
177                 BGMScript_InitEntity(self);
178         }
179
180         InterpolateOrigin_Note();
181
182         self.saved = self.(fld);
183
184         self.entremove = Ent_Wall_Remove;
185         self.draw = Ent_Wall_Draw;
186 }