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