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