]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/server/attic/vehicles/bumblebee.qc
get rid of SUB_Null
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / attic / 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 = func_null;
265     self.solid        = SOLID_CORPSE;
266     self.takedamage   = DAMAGE_NO;
267     self.deadflag     = DEAD_DYING;
268     self.movetype     = MOVETYPE_BOUNCE;
269
270     pointparticles(particleeffectnum("rocket_explode"), findbetterlocation (self.origin, 16), '0 0 0', 1);
271 }
272
273 void bumb_dinit()
274 {
275     if not (vehicle_initialize(
276              "Bumblebee",
277              "models/vehicles/bumblebee_body.dpm",
278              "",
279              "models/vehicles/spiderbot_cockpit.dpm",
280              "", "", "tag_viewport",
281              HUD_BUMBLEBEE,
282              BUMB_MIN, BUMB_MAX,
283              FALSE,
284              bumb_spawn, autocvar_g_vehicle_bumblebee_respawntime,
285              bumb_pilot_frame,
286              bumb_enter, bumb_exit,
287              bumb_die,   bumb_think,
288              FALSE))
289     {
290         remove(self);
291         return;
292     }
293     self.gun1 = spawn();
294     setmodel(self.gun1, "models/vehicles/bumblebee_ray.dpm");
295     setattachment(self.gun1, self, "tag_hardpoint03");
296
297     self.gun1 = spawn();
298     self.gun2 = spawn();
299
300     self.gun1.owner = self;
301     self.gun2.owner = self;
302
303     setmodel(self.gun1, "models/vehicles/bumblebee_plasma_right.dpm");
304     setmodel(self.gun2, "models/vehicles/bumblebee_plasma_left.dpm");
305
306     setattachment(self.gun1, self, "tag_hardpoint01");
307     setattachment(self.gun2, self, "tag_hardpoint02");
308
309     vector ofs;
310     ofs = gettaginfo(self, gettagindex(self, "tag_hardpoint01"));
311     ofs -= self.origin;
312     setattachment(self.gun1, self, "");
313     setorigin(self.gun1, ofs);
314
315     ofs = gettaginfo(self, gettagindex(self, "tag_hardpoint02"));
316     ofs -= self.origin;
317     setattachment(self.gun2, self, "");
318     setorigin(self.gun2, ofs);
319
320
321 }
322
323 void spawnfunc_vehicle_bumblebee()
324 {
325
326     precache_model ("models/vehicles/bumblebee_body.dpm");
327     precache_model ("models/vehicles/bumblebee_plasma_left.dpm");
328     precache_model ("models/vehicles/bumblebee_plasma_right.dpm");
329     precache_model ("models/vehicles/bumblebee_ray.dpm");
330
331     //vehicles_configcheck("vehicle_bumblebee.cfg", autocvar_g_vehicle_bumblebee_health);
332
333     if(autocvar_g_vehicle_bumblebee_energy)
334         if(autocvar_g_vehicle_bumblebee_energy_regen)
335             self.vehicle_flags |= VHF_ENERGYREGEN;
336
337     if(autocvar_g_vehicle_bumblebee_shield)
338         self.vehicle_flags |= VHF_HASSHIELD;
339
340     if(autocvar_g_vehicle_bumblebee_shield_regen)
341         self.vehicle_flags |= VHF_SHIELDREGEN;
342
343     if(autocvar_g_vehicle_bumblebee_health_regen)
344         self.vehicle_flags |= VHF_HEALTHREGEN;
345
346     self.think = bumb_dinit;
347     self.nextthink = time + 1;
348 }
349 #endif // SVQC
350
351 #ifdef CSQC
352 void bumblebee_draw()
353 {
354
355 }
356
357 void bumblebee_draw2d()
358 {
359
360 }
361
362 void bumblebee_read_extra()
363 {
364
365 }
366
367 void vehicle_bumblebee_assemble()
368 {
369
370 }
371 #endif //CSQC