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