]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/server/vehicles/bumblebee.qc
Merge remote branch 'origin/master' into tzork/vehicles-2
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / vehicles / bumblebee.qc
1 #ifdef SVQC
2 // Auto cvars
3 float autocvar_g_vehicle_bumblebee_speed_forward;
4 float autocvar_g_vehicle_bumblebee_speed_strafe;
5 float autocvar_g_vehicle_bumblebee_speed_up;
6 float autocvar_g_vehicle_bumblebee_speed_down;
7 float autocvar_g_vehicle_bumblebee_turnspeed;
8 float autocvar_g_vehicle_bumblebee_pitchspeed;
9 float autocvar_g_vehicle_bumblebee_pitchlimit;
10 float autocvar_g_vehicle_bumblebee_friction;
11
12 float autocvar_g_vehicle_bumblebee_energy;
13 float autocvar_g_vehicle_bumblebee_energy_regen;
14 float autocvar_g_vehicle_bumblebee_energy_regen_pause;
15
16 float autocvar_g_vehicle_bumblebee_health;
17 float autocvar_g_vehicle_bumblebee_health_regen;
18 float autocvar_g_vehicle_bumblebee_health_regen_pause;
19
20 float autocvar_g_vehicle_bumblebee_shield;
21 float autocvar_g_vehicle_bumblebee_shield_regen;
22 float autocvar_g_vehicle_bumblebee_shield_regen_pause;
23
24 float autocvar_g_vehicle_bumblebee_cannon_cost;
25 float autocvar_g_vehicle_bumblebee_cannon_damage;
26 float autocvar_g_vehicle_bumblebee_cannon_radius;
27 float autocvar_g_vehicle_bumblebee_cannon_refire;
28 float autocvar_g_vehicle_bumblebee_cannon_speed;
29 float autocvar_g_vehicle_bumblebee_cannon_spread;
30 float autocvar_g_vehicle_bumblebee_cannon_force;
31
32 float autocvar_g_vehicle_bumblebee_cannon_turnspeed;
33 float autocvar_g_vehicle_bumblebee_cannon_pitchlimit_down;
34 float autocvar_g_vehicle_bumblebee_cannon_pitchlimit_up;
35 float autocvar_g_vehicle_bumblebee_cannon_turnlimit_in;
36 float autocvar_g_vehicle_bumblebee_cannon_turnlimit_out;
37
38 float autocvar_g_vehicle_bumblebee_respawntime;
39
40 float autocvar_g_vehicle_bumblebee_blowup_radius;
41 float autocvar_g_vehicle_bumblebee_blowup_coredamage;
42 float autocvar_g_vehicle_bumblebee_blowup_edgedamage;
43 float autocvar_g_vehicle_bumblebee_blowup_forceintensity;
44
45 #define BUMB_MIN '-120 -120 -40'
46 #define BUMB_MAX '120 120 40'
47
48 .entity gunner1;
49 //.entity gunner2;
50 .vector lastaim;
51 float bumb_gunner_frame()
52 {
53     entity vehic, gun, gunner;
54     float ftmp, ftmp2;
55     vector vtmp;
56
57     vehic   = self.vehicle;
58     gun     = self.vehicle.gun1;
59     gunner  = self;
60
61     self    = vehic;
62     vehic.solid = SOLID_NOT;
63     crosshair_trace(gunner);
64
65     //vtmp = gettaginfo(vehic, gettagindexvehic, "tag_hardpoint01"));
66     vtmp = gettaginfo(gun, gettagindex(gun, "muzzle"));
67     vtmp = vectoangles(normalize(trace_endpos - vtmp)); // Find the direction & angle
68     vtmp = shortangle_vxy(vtmp - (vehic.angles + gun.angles), vehic.angles + gun.angles);     // Find aim offset
69
70     // Bind to aimspeed
71     ftmp2 = autocvar_g_vehicle_bumblebee_cannon_turnspeed * frametime; ftmp = -ftmp2;
72     vtmp_x = bound(ftmp, vtmp_x, ftmp2);
73     vtmp_y = bound(ftmp, vtmp_y, ftmp2);
74     // Bind to limts
75     gun.angles_x = bound(-autocvar_g_vehicle_bumblebee_cannon_pitchlimit_down, vtmp_x + gun.angles_x, autocvar_g_vehicle_bumblebee_cannon_pitchlimit_up);
76     gun.angles_y = bound(-autocvar_g_vehicle_bumblebee_cannon_turnlimit_in,  vtmp_y + gun.angles_y, autocvar_g_vehicle_bumblebee_cannon_turnlimit_out);
77
78     if(gunner.BUTTON_ATCK && gun.cnt <= time)
79     {
80         vtmp = gettaginfo(gun, gettagindex(gun, "muzzle"));
81         v_forward = normalize(v_forward);
82         vtmp += v_forward * 50;
83
84         fireBullet (vtmp, v_forward, autocvar_g_vehicle_spiderbot_minigun_spread, autocvar_g_vehicle_spiderbot_minigun_damage,
85             autocvar_g_vehicle_spiderbot_minigun_spread, DEATH_SBMINIGUN, 0);
86
87         gun.cnt = time + 0.1;
88     }
89
90     setorigin(gunner, vehic.origin);
91     gunner.velocity = vehic.velocity;
92
93     vehic.solid = SOLID_BBOX;
94     gunner.BUTTON_ATCK = gunner.BUTTON_ATCK2 = gunner.BUTTON_CROUCH = 0;
95     self = gunner;
96     return 1;
97 }
98
99 void bumb_gunner_enter()
100 {
101     if(self.gunner1 != world)
102         return;
103
104     self.gunner1         = other;
105     self.gunner1.vehicle = self;
106
107     msg_entity = other;
108     WriteByte (MSG_ONE, SVC_SETVIEWPORT);
109     WriteEntity(MSG_ONE, self.gun1);
110     WriteByte (MSG_ONE, SVC_SETVIEWANGLES);
111     if(self.tur_head)
112     {
113         WriteAngle(MSG_ONE, self.gun1.angles_x + self.angles_x); // tilt
114         WriteAngle(MSG_ONE, self.gun1.angles_y + self.angles_y); // yaw
115         WriteAngle(MSG_ONE, 0);                                  // roll
116     }
117     other.PlayerPhysplug = bumb_gunner_frame;
118 }
119
120 float bumb_pilot_frame()
121 {
122     entity pilot, gunner, vehic;
123     vector newvel;
124
125     pilot = self;
126     vehic = self.vehicle;
127     self   = vehic;
128
129     if(pilot.BUTTON_USE && vehic.deadflag == DEAD_NO)
130     {
131         self = vehic;
132         vehicles_exit(VHEF_NORMAL);
133         self = pilot;
134         return 0;
135     }
136
137     if(vehic.deadflag != DEAD_NO)
138     {
139         self = pilot;
140         pilot.BUTTON_ATCK = pilot.BUTTON_ATCK2 = 0;
141         return 1;
142     }
143
144     crosshair_trace(pilot);
145
146     vector vang;
147     float ftmp;
148
149     vang = vehic.angles;
150     newvel = vectoangles(normalize(trace_endpos - self.origin + '0 0 32'));
151     vang_x *= -1;
152     newvel_x *= -1;
153     if(newvel_x > 180)  newvel_x -= 360;
154     if(newvel_x < -180) newvel_x += 360;
155     if(newvel_y > 180)  newvel_y -= 360;
156     if(newvel_y < -180) newvel_y += 360;
157
158     ftmp = shortangle_f(pilot.v_angle_y - vang_y, vang_y);
159     if(ftmp > 180)  ftmp -= 360; if(ftmp < -180) ftmp += 360;
160     vehic.avelocity_y = bound(-autocvar_g_vehicle_bumblebee_turnspeed, ftmp + vehic.avelocity_y * 0.9, autocvar_g_vehicle_bumblebee_turnspeed);
161
162     // Pitch
163     ftmp = 0;
164     if(pilot.movement_x > 0 && vang_x < autocvar_g_vehicle_bumblebee_pitchlimit) ftmp = 5;
165     else if(pilot.movement_x < 0 && vang_x > -autocvar_g_vehicle_bumblebee_pitchlimit) ftmp = -20;
166
167     newvel_x = bound(-autocvar_g_vehicle_bumblebee_pitchlimit, newvel_x , autocvar_g_vehicle_bumblebee_pitchlimit);
168     ftmp = vang_x - bound(-autocvar_g_vehicle_bumblebee_pitchlimit, newvel_x + ftmp, autocvar_g_vehicle_bumblebee_pitchlimit);
169     vehic.avelocity_x = bound(-autocvar_g_vehicle_bumblebee_pitchspeed, ftmp + vehic.avelocity_x * 0.9, autocvar_g_vehicle_bumblebee_pitchspeed);
170
171     vehic.angles_x = anglemods(vehic.angles_x);
172     vehic.angles_y = anglemods(vehic.angles_y);
173     vehic.angles_z = anglemods(vehic.angles_z);
174
175     makevectors('0 1 0' * vehic.angles_y);
176     newvel = vehic.velocity * -autocvar_g_vehicle_bumblebee_friction;
177
178     if(pilot.movement_x != 0)
179     {
180         if(pilot.movement_x > 0)
181             newvel += v_forward  * autocvar_g_vehicle_bumblebee_speed_forward;
182         else if(pilot.movement_x < 0)
183             newvel -= v_forward  * autocvar_g_vehicle_bumblebee_speed_forward;
184     }
185
186     if(pilot.movement_y != 0)
187     {
188         if(pilot.movement_y < 0)
189             newvel -= v_right * autocvar_g_vehicle_bumblebee_speed_strafe;
190         else if(pilot.movement_y > 0)
191             newvel += v_right * autocvar_g_vehicle_bumblebee_speed_strafe;
192         ftmp = newvel * v_right;
193         ftmp *= frametime * 0.1;
194         vehic.angles_z = bound(-15, vehic.angles_z + ftmp, 15);
195     }
196     else
197     {
198         vehic.angles_z *= 0.95;
199         if(vehic.angles_z >= -1 && vehic.angles_z <= -1)
200             vehic.angles_z = 0;
201     }
202
203     if(pilot.BUTTON_CROUCH)
204         newvel -=   v_up * autocvar_g_vehicle_bumblebee_speed_down;
205     else if (pilot.BUTTON_JUMP)
206         newvel +=  v_up * autocvar_g_vehicle_bumblebee_speed_up;
207
208     vehic.velocity  += newvel * frametime;
209     pilot.velocity = pilot.movement  = vehic.velocity;
210     setorigin(pilot,vehic.origin + '0 0 32');
211
212
213     if(vehic.vehicle_flags  & VHF_SHIELDREGEN)
214         vehicles_regen(dmg_time, vehicle_shield, autocvar_g_vehicle_bumblebee_shield, autocvar_g_vehicle_bumblebee_shield_regen_pause, autocvar_g_vehicle_bumblebee_shield_regen, frametime);
215
216     if(vehic.vehicle_flags  & VHF_HEALTHREGEN)
217         vehicles_regen(dmg_time, vehicle_health, autocvar_g_vehicle_bumblebee_health, autocvar_g_vehicle_bumblebee_health_regen_pause, autocvar_g_vehicle_bumblebee_health_regen, frametime);
218
219     if(vehic.vehicle_flags  & VHF_ENERGYREGEN)
220         vehicles_regen(cnt, vehicle_energy, autocvar_g_vehicle_bumblebee_energy, autocvar_g_vehicle_bumblebee_energy_regen_pause, autocvar_g_vehicle_bumblebee_energy_regen, frametime);
221
222     VEHICLE_UPDATE_PLAYER(health, bumblebee);
223     VEHICLE_UPDATE_PLAYER(energy, bumblebee);
224     if(vehic.vehicle_flags & VHF_HASSHIELD)
225         VEHICLE_UPDATE_PLAYER(shield, bumblebee);
226
227     pilot.BUTTON_ATCK = pilot.BUTTON_ATCK2 = pilot.BUTTON_CROUCH = 0;
228     self = pilot;
229
230     return 1;
231 }
232
233 void bumb_think()
234 {
235     self.velocity = self.velocity * 0.99;
236     self.nextthink = time + 0.1;
237 }
238
239 void bumb_enter()
240 {
241     self.touch  = bumb_gunner_enter;
242 }
243
244 void bumb_exit(float eject)
245 {
246     self.owner = world;
247     self.touch = vehicles_touch;
248 }
249
250 void bumb_spawn()
251 {
252     self.vehicle_health = autocvar_g_vehicle_bumblebee_health;
253     self.vehicle_shield = autocvar_g_vehicle_bumblebee_shield;
254     self.movetype       = MOVETYPE_TOSS;
255     self.solid          = SOLID_BBOX;
256     //self.vehicle_energy = 1;
257     self.movetype = MOVETYPE_FLY;
258     setorigin(self, self.origin + '0 0 25');
259 }
260
261 void bumb_die()
262 {
263     self.health       = 0;
264     self.event_damage = SUB_Null;
265     self.iscreature   = FALSE;
266     self.solid        = SOLID_CORPSE;
267     self.takedamage   = DAMAGE_NO;
268     self.deadflag     = DEAD_DYING;
269     self.movetype     = MOVETYPE_BOUNCE;
270
271     pointparticles(particleeffectnum("rocket_explode"), findbetterlocation (self.origin, 16), '0 0 0', 1);
272 }
273
274 void bumb_dinit()
275 {
276     if not (vehicle_initialize(
277              "Bumblebee",
278              "models/vehicles/bumblebee_body.dpm",
279              "",
280              "models/vehicles/spiderbot_cockpit.dpm",
281              "", "", "tag_viewport",
282              HUD_BUMBLEBEE,
283              BUMB_MIN, BUMB_MAX,
284              FALSE,
285              bumb_spawn, autocvar_g_vehicle_bumblebee_respawntime,
286              bumb_pilot_frame,
287              bumb_enter, bumb_exit,
288              bumb_die,   bumb_think,
289              FALSE))
290     {
291         remove(self);
292         return;
293     }
294     self.gun1 = spawn();
295     setmodel(self.gun1, "models/vehicles/bumblebee_ray.dpm");
296     setattachment(self.gun1, self, "tag_hardpoint03");
297
298     self.gun1 = spawn();
299     self.gun2 = spawn();
300
301     self.gun1.owner = self;
302     self.gun2.owner = self;
303
304     setmodel(self.gun1, "models/vehicles/bumblebee_plasma_right.dpm");
305     setmodel(self.gun2, "models/vehicles/bumblebee_plasma_left.dpm");
306
307     setattachment(self.gun1, self, "tag_hardpoint01");
308     setattachment(self.gun2, self, "tag_hardpoint02");
309
310     vector ofs;
311     ofs = gettaginfo(self, gettagindex(self, "tag_hardpoint01"));
312     ofs -= self.origin;
313     setattachment(self.gun1, self, "");
314     setorigin(self.gun1, ofs);
315
316     ofs = gettaginfo(self, gettagindex(self, "tag_hardpoint02"));
317     ofs -= self.origin;
318     setattachment(self.gun2, self, "");
319     setorigin(self.gun2, ofs);
320
321
322 }
323
324 void spawnfunc_vehicle_bumblebee()
325 {
326
327     precache_model ("models/vehicles/bumblebee_body.dpm");
328     precache_model ("models/vehicles/bumblebee_plasma_left.dpm");
329     precache_model ("models/vehicles/bumblebee_plasma_right.dpm");
330     precache_model ("models/vehicles/bumblebee_ray.dpm");
331
332     //vehicles_configcheck("vehicle_bumblebee.cfg", autocvar_g_vehicle_bumblebee_health);
333
334     if(autocvar_g_vehicle_bumblebee_energy)
335         if(autocvar_g_vehicle_bumblebee_energy_regen)
336             self.vehicle_flags |= VHF_ENERGYREGEN;
337
338     if(autocvar_g_vehicle_bumblebee_shield)
339         self.vehicle_flags |= VHF_HASSHIELD;
340
341     if(autocvar_g_vehicle_bumblebee_shield_regen)
342         self.vehicle_flags |= VHF_SHIELDREGEN;
343
344     if(autocvar_g_vehicle_bumblebee_health_regen)
345         self.vehicle_flags |= VHF_HEALTHREGEN;
346
347     self.think = bumb_dinit;
348     self.nextthink = time + 1;
349 }
350 #endif // SVQC
351
352 #ifdef CSQC
353 void bumblebee_draw()
354 {
355
356 }
357
358 void bumblebee_draw2d()
359 {
360
361 }
362
363 void bumblebee_read_extra()
364 {
365
366 }
367
368 void vehicle_bumblebee_assemble()
369 {
370
371 }
372 #endif //CSQC