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