]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/client/controlpoint.qc
c01835c9f86da5d3a7cdb177143b312afc5f25b2
[xonotic/xonotic-data.pk3dir.git] / qcsrc / client / controlpoint.qc
1 float cpicon_precached;
2 .float count;
3 .float pain_finished;
4
5 .float iscaptured;
6
7 .vector cp_origin, cp_bob_origin;
8 .float cp_bob_spd;
9
10 .vector cp_bob_dmg;
11
12 .vector punchangle;
13
14 .float max_health;
15
16 .entity icon_realmodel;
17
18 void cpicon_precache()
19 {
20         if(cpicon_precached)
21                 return; // already precached
22
23         precache_model("models/onslaught/controlpoint_icon_dmg3.md3");
24         precache_model("models/onslaught/controlpoint_icon_dmg2.md3");
25         precache_model("models/onslaught/controlpoint_icon_dmg1.md3");
26         precache_model("models/onslaught/controlpoint_icon.md3");
27
28         cpicon_precached = TRUE;
29 }
30
31 void cpicon_draw()
32 {
33         if(time < self.move_time) { return; }
34
35         if(self.cp_bob_dmg_z > 0)
36                 self.cp_bob_dmg_z = self.cp_bob_dmg_z - 3 * frametime;
37         else
38                 self.cp_bob_dmg_z = 0;
39         self.cp_bob_origin_z = 4 * PI * (1 - cos(self.cp_bob_spd));
40         self.cp_bob_spd = self.cp_bob_spd + 1.875 * frametime;
41         self.colormod = '1 1 1' * (2 - bound(0, (self.pain_finished - time) / 10, 1));
42         
43         if(!self.iscaptured) self.alpha = self.health / self.max_health;
44         
45         if(self.iscaptured)
46         {
47                 if (self.punchangle_x > 0)
48                 {
49                         self.punchangle_x = self.punchangle_x - 60 * frametime;
50                         if (self.punchangle_x < 0)
51                                 self.punchangle_x = 0;
52                 }
53                 else if (self.punchangle_x < 0)
54                 {
55                         self.punchangle_x = self.punchangle_x + 60 * frametime;
56                         if (self.punchangle_x > 0)
57                                 self.punchangle_x = 0;
58                 }
59
60                 if (self.punchangle_y > 0)
61                 {
62                         self.punchangle_y = self.punchangle_y - 60 * frametime;
63                         if (self.punchangle_y < 0)
64                                 self.punchangle_y = 0;
65                 }
66                 else if (self.punchangle_y < 0)
67                 {
68                         self.punchangle_y = self.punchangle_y + 60 * frametime;
69                         if (self.punchangle_y > 0)
70                                 self.punchangle_y = 0;
71                 }
72
73                 if (self.punchangle_z > 0)
74                 {
75                         self.punchangle_z = self.punchangle_z - 60 * frametime;
76                         if (self.punchangle_z < 0)
77                                 self.punchangle_z = 0;
78                 }
79                 else if (self.punchangle_z < 0)
80                 {
81                         self.punchangle_z = self.punchangle_z + 60 * frametime;
82                         if (self.punchangle_z > 0)
83                                 self.punchangle_z = 0;
84                 }
85
86                 self.angles_x = self.punchangle_x;
87                 self.angles_y = self.punchangle_y + self.move_angles_y;
88                 self.angles_z = self.punchangle_z;
89                 self.move_angles_y = self.move_angles_y + 45 * frametime;
90         }
91         
92         setorigin(self, self.cp_origin + self.cp_bob_origin + self.cp_bob_dmg);
93 }
94
95 void cpicon_damage(float hp)
96 {
97         if(!self.iscaptured) { return; }
98
99         if(hp < self.max_health * 0.25)
100                 setmodel(self, "models/onslaught/controlpoint_icon_dmg3.md3");
101         else if(hp < self.max_health * 0.50)
102                 setmodel(self, "models/onslaught/controlpoint_icon_dmg2.md3");
103         else if(hp < self.max_health * 0.75)
104                 setmodel(self, "models/onslaught/controlpoint_icon_dmg1.md3");
105         else if(hp <= self.max_health || hp >= self.max_health)
106                 setmodel(self, "models/onslaught/controlpoint_icon.md3");
107                 
108         self.punchangle = (2 * randomvec() - '1 1 1') * 45;
109
110         self.cp_bob_dmg_z = (2 * random() - 1) * 15;
111         self.pain_finished = time + 1;
112         self.colormod = '2 2 2';
113
114         setsize(self, CPICON_MIN, CPICON_MAX);
115 }
116
117 void cpicon_construct()
118 {
119         self.netname = "Control Point Icon";
120
121         setmodel(self, "models/onslaught/controlpoint_icon.md3");
122         setsize(self, CPICON_MIN, CPICON_MAX);
123         
124         if(self.icon_realmodel == world)
125         {
126                 self.icon_realmodel = spawn();
127                 setmodel(self.icon_realmodel, "null");
128                 setorigin(self.icon_realmodel, self.origin);
129                 setsize(self.icon_realmodel, CPICON_MIN, CPICON_MAX);
130                 self.icon_realmodel.movetype = MOVETYPE_NOCLIP;
131                 self.icon_realmodel.solid = SOLID_NOT;
132                 self.icon_realmodel.move_origin = self.icon_realmodel.origin;
133         }
134         
135         if(self.iscaptured) { self.icon_realmodel.solid = SOLID_BBOX; }
136
137         self.move_movetype      = MOVETYPE_NOCLIP;
138         self.solid                      = SOLID_NOT;
139         self.movetype           = MOVETYPE_NOCLIP;
140         self.move_origin        = self.origin;
141         self.move_time          = time;
142         self.drawmask           = MASK_NORMAL;
143         self.alpha                      = 1;
144         self.draw                       = cpicon_draw;
145         self.cp_origin          = self.origin;
146         self.cp_bob_origin      = '0 0 0.1';
147         self.cp_bob_spd         = 0;
148 }
149
150 .vector glowmod;
151 void cpicon_changeteam()
152 {
153         if(self.team)
154         {
155                 self.glowmod = Team_ColorRGB(self.team - 1);
156                 self.teamradar_color = Team_ColorRGB(self.team - 1);
157                 self.colormap = 1024 + (self.team - 1) * 17;
158         }
159         else
160         {
161                 self.colormap = 1024;
162                 self.glowmod = '1 1 0';
163                 self.teamradar_color = '1 1 0';
164         }
165 }
166
167 void ent_cpicon()
168 {
169         float sf;
170         sf = ReadByte();
171
172         if(sf & CPSF_SETUP)
173         {
174                 self.origin_x = ReadCoord();
175                 self.origin_y = ReadCoord();
176                 self.origin_z = ReadCoord();
177                 setorigin(self, self.origin);
178
179                 self.health = ReadByte();
180                 self.max_health = ReadByte();
181                 self.count = ReadByte();
182                 self.team = ReadByte();
183                 self.iscaptured = ReadByte();
184
185                 if(!self.count)
186                         self.count = (self.health - self.max_health) * frametime;
187
188                 cpicon_changeteam();
189                 cpicon_precache();
190                 cpicon_construct();
191         }
192
193         if(sf & CPSF_STATUS)
194         {
195                 float _tmp;
196                 _tmp = ReadByte();
197                 if(_tmp != self.team)
198                 {
199                         self.team = _tmp;
200                         cpicon_changeteam();
201                 }
202
203                 _tmp = ReadByte();
204
205                 if(_tmp != self.health)
206                         cpicon_damage(_tmp);
207
208                 self.health = _tmp;
209         }
210 }