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