]> git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/server/vehicles/bumblebee.qc
91f47dbefa62411560742b0b345be99dceb1b52e
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / vehicles / bumblebee.qc
1 // Auto cvars
2 float autocvar_g_vehicle_bumblebee_speed_forward;
3 float autocvar_g_vehicle_bumblebee_speed_strafe;
4 float autocvar_g_vehicle_bumblebee_speed_up;
5 float autocvar_g_vehicle_bumblebee_speed_down;
6 float autocvar_g_vehicle_bumblebee_turnspeed;
7 float autocvar_g_vehicle_bumblebee_pitchspeed;
8 float autocvar_g_vehicle_bumblebee_pitchlimit;
9 float autocvar_g_vehicle_bumblebee_friction;
10
11 float autocvar_g_vehicle_bumblebee_energy;
12 float autocvar_g_vehicle_bumblebee_energy_regen;
13 float autocvar_g_vehicle_bumblebee_energy_regen_pause;
14
15 float autocvar_g_vehicle_bumblebee_health;
16 float autocvar_g_vehicle_bumblebee_health_regen;
17 float autocvar_g_vehicle_bumblebee_health_regen_pause;
18
19 float autocvar_g_vehicle_bumblebee_shield;
20 float autocvar_g_vehicle_bumblebee_shield_regen;
21 float autocvar_g_vehicle_bumblebee_shield_regen_pause;
22
23 float autocvar_g_vehicle_bumblebee_cannon_cost;
24 float autocvar_g_vehicle_bumblebee_cannon_damage;
25 float autocvar_g_vehicle_bumblebee_cannon_radius;
26 float autocvar_g_vehicle_bumblebee_cannon_refire;
27 float autocvar_g_vehicle_bumblebee_cannon_speed;
28 float autocvar_g_vehicle_bumblebee_cannon_spread;
29 float autocvar_g_vehicle_bumblebee_cannon_force;
30
31 float autocvar_g_vehicle_bumblebee_cannon_turnspeed;
32 float autocvar_g_vehicle_bumblebee_cannon_pitchlimit_down;
33 float autocvar_g_vehicle_bumblebee_cannon_pitchlimit_up;
34 float autocvar_g_vehicle_bumblebee_cannon_turnlimit_in;
35 float autocvar_g_vehicle_bumblebee_cannon_turnlimit_out;
36
37 float autocvar_g_vehicle_bumblebee_respawntime;
38
39 float autocvar_g_vehicle_bumblebee_blowup_radius;
40 float autocvar_g_vehicle_bumblebee_blowup_coredamage;
41 float autocvar_g_vehicle_bumblebee_blowup_edgedamage;
42 float autocvar_g_vehicle_bumblebee_blowup_forceintensity;
43
44 #define BUMB_MIN '-120 -120 -40'
45 #define BUMB_MAX '120 120 40'
46
47 .entity gunner1;
48 //.entity gunner2;
49 .vector lastaim;
50 float bumb_gunner_frame()
51 {
52     entity vehic, gun, gunner;
53     float ftmp, ftmp2;
54     vector vtmp;
55     
56     vehic   = self.vehicle;
57     gun     = self.vehicle.gun1;
58     gunner  = self;
59     
60     self    = vehic;
61     vehic.solid = SOLID_NOT;    
62     crosshair_trace(gunner);
63     
64     //vtmp = gettaginfo(vehic, gettagindexvehic, "tag_hardpoint01"));
65     vtmp = gettaginfo(gun, gettagindex(gun, "muzzle"));
66     vtmp = vectoangles(normalize(trace_endpos - vtmp)); // Find the direction & angle
67     vtmp = shortangle_vxy(vtmp - (vehic.angles + gun.angles), vehic.angles + gun.angles);     // Find aim offset
68     
69     // Bind to aimspeed
70     ftmp2 = autocvar_g_vehicle_bumblebee_cannon_turnspeed * frametime; ftmp = -ftmp2;
71     vtmp_x = bound(ftmp, vtmp_x, ftmp2);
72     vtmp_y = bound(ftmp, vtmp_y, ftmp2);
73     // Bind to limts
74     gun.angles_x = bound(-autocvar_g_vehicle_bumblebee_cannon_pitchlimit_down, vtmp_x + gun.angles_x, autocvar_g_vehicle_bumblebee_cannon_pitchlimit_up);
75     gun.angles_y = bound(-autocvar_g_vehicle_bumblebee_cannon_turnlimit_in,  vtmp_y + gun.angles_y, autocvar_g_vehicle_bumblebee_cannon_turnlimit_out);    
76
77     if(gunner.BUTTON_ATCK && gun.cnt <= time)
78     {
79         vtmp = gettaginfo(gun, gettagindex(gun, "muzzle"));
80         v_forward = normalize(v_forward);
81         vtmp += v_forward * 50;
82
83         fireBullet (vtmp, v_forward, autocvar_g_vehicle_spiderbot_minigun_spread, autocvar_g_vehicle_spiderbot_minigun_damage,
84             autocvar_g_vehicle_spiderbot_minigun_spread, DEATH_SBMINIGUN, 0);
85         
86         gun.cnt = time + 0.1;
87     }
88     
89     setorigin(gunner, vehic.origin);
90     gunner.velocity = vehic.velocity;
91     
92     vehic.solid = SOLID_BBOX;    
93     gunner.BUTTON_ATCK = gunner.BUTTON_ATCK2 = gunner.BUTTON_CROUCH = 0;
94     self = gunner;
95     return 1;
96 }
97
98 void bumb_gunner_enter()
99 {
100     if(self.gunner1 != world)
101         return;
102     
103     self.gunner1         = other;
104     self.gunner1.vehicle = self;
105
106     msg_entity = other;
107     WriteByte (MSG_ONE, SVC_SETVIEWPORT);
108     WriteEntity(MSG_ONE, self.gun1);
109     WriteByte (MSG_ONE, SVC_SETVIEWANGLES);
110     if(self.tur_head)
111     {
112         WriteAngle(MSG_ONE, self.gun1.angles_x + self.angles_x); // tilt
113         WriteAngle(MSG_ONE, self.gun1.angles_y + self.angles_y); // yaw
114         WriteAngle(MSG_ONE, 0);                                  // roll
115     }
116     other.PlayerPhysplug = bumb_gunner_frame;
117 }
118
119 float bumb_pilot_frame()
120 {
121     entity pilot, gunner, vehic;
122     vector newvel;
123     
124     pilot = self;
125     vehic = self.vehicle;
126     self   = vehic;
127
128     if(pilot.BUTTON_USE && vehic.deadflag == DEAD_NO)
129     {
130         self = vehic;
131         vehicles_exit(VHEF_NORMAL);
132         self = pilot;
133         return 0;
134     }
135
136     if(vehic.deadflag != DEAD_NO)
137     {
138         self = pilot;
139         pilot.BUTTON_ATCK = pilot.BUTTON_ATCK2 = 0;
140         return 1;
141     }
142
143     crosshair_trace(pilot);
144     
145     vector vang;
146     float ftmp;
147     
148     vang = vehic.angles;
149     newvel = vectoangles(normalize(trace_endpos - self.origin + '0 0 32'));
150     vang_x *= -1;
151     newvel_x *= -1;
152     if(newvel_x > 180)  newvel_x -= 360;
153     if(newvel_x < -180) newvel_x += 360;
154     if(newvel_y > 180)  newvel_y -= 360;
155     if(newvel_y < -180) newvel_y += 360;
156
157     ftmp = shortangle_f(pilot.v_angle_y - vang_y, vang_y);
158     if(ftmp > 180)  ftmp -= 360; if(ftmp < -180) ftmp += 360;
159     vehic.avelocity_y = bound(-autocvar_g_vehicle_bumblebee_turnspeed, ftmp + vehic.avelocity_y * 0.9, autocvar_g_vehicle_bumblebee_turnspeed);
160
161     // Pitch
162     ftmp = 0;
163     if(pilot.movement_x > 0 && vang_x < autocvar_g_vehicle_bumblebee_pitchlimit) ftmp = 5;
164     else if(pilot.movement_x < 0 && vang_x > -autocvar_g_vehicle_bumblebee_pitchlimit) ftmp = -20;
165
166     newvel_x = bound(-autocvar_g_vehicle_bumblebee_pitchlimit, newvel_x , autocvar_g_vehicle_bumblebee_pitchlimit);
167     ftmp = vang_x - bound(-autocvar_g_vehicle_bumblebee_pitchlimit, newvel_x + ftmp, autocvar_g_vehicle_bumblebee_pitchlimit);
168     vehic.avelocity_x = bound(-autocvar_g_vehicle_bumblebee_pitchspeed, ftmp + vehic.avelocity_x * 0.9, autocvar_g_vehicle_bumblebee_pitchspeed);
169
170     vehic.angles_x = anglemods(vehic.angles_x);
171     vehic.angles_y = anglemods(vehic.angles_y);
172     vehic.angles_z = anglemods(vehic.angles_z);
173
174     makevectors('0 1 0' * vehic.angles_y);
175     newvel = vehic.velocity * -autocvar_g_vehicle_bumblebee_friction;
176
177     if(pilot.movement_x != 0)
178     {
179         if(pilot.movement_x > 0)
180             newvel += v_forward  * autocvar_g_vehicle_bumblebee_speed_forward;
181         else if(pilot.movement_x < 0)
182             newvel -= v_forward  * autocvar_g_vehicle_bumblebee_speed_forward;
183     }
184
185     if(pilot.movement_y != 0)
186     {
187         if(pilot.movement_y < 0)
188             newvel -= v_right * autocvar_g_vehicle_bumblebee_speed_strafe;
189         else if(pilot.movement_y > 0)
190             newvel += v_right * autocvar_g_vehicle_bumblebee_speed_strafe;
191         ftmp = newvel * v_right;        
192         ftmp *= frametime * 0.1;
193         vehic.angles_z = bound(-15, vehic.angles_z + ftmp, 15);
194     }
195     else
196     {
197         vehic.angles_z *= 0.95;
198         if(vehic.angles_z >= -1 && vehic.angles_z <= -1)
199             vehic.angles_z = 0;
200     }
201
202     if(pilot.BUTTON_CROUCH)
203         newvel -=   v_up * autocvar_g_vehicle_bumblebee_speed_down;
204     else if (pilot.BUTTON_JUMP)
205         newvel +=  v_up * autocvar_g_vehicle_bumblebee_speed_up;
206
207     vehic.velocity  += newvel * frametime;
208     pilot.velocity = pilot.movement  = vehic.velocity;
209     setorigin(pilot,vehic.origin + '0 0 32');
210
211
212     if(vehic.vehicle_flags  & VHF_SHIELDREGEN)
213         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);
214
215     if(vehic.vehicle_flags  & VHF_HEALTHREGEN)
216         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);
217
218     if(vehic.vehicle_flags  & VHF_ENERGYREGEN)
219         vehicles_regen(cnt, vehicle_energy, autocvar_g_vehicle_bumblebee_energy, autocvar_g_vehicle_bumblebee_energy_regen_pause, autocvar_g_vehicle_bumblebee_energy_regen, frametime);
220
221     VEHICLE_UPDATE_PLAYER(health, bumblebee);
222     VEHICLE_UPDATE_PLAYER(energy, bumblebee);
223     if(vehic.vehicle_flags & VHF_HASSHIELD)
224         VEHICLE_UPDATE_PLAYER(shield, bumblebee);
225
226     pilot.BUTTON_ATCK = pilot.BUTTON_ATCK2 = pilot.BUTTON_CROUCH = 0;
227     self = pilot;
228     
229     return 1;
230 }
231
232 void bumb_think()
233 {
234     self.velocity = self.velocity * 0.99;
235     self.nextthink = time + 0.1;
236 }
237
238 void bumb_enter()
239 {
240     self.touch  = bumb_gunner_enter;
241 }
242
243 void bumb_exit(float eject)
244 {
245     self.owner = world;
246     self.touch = vehicles_touch;
247 }
248
249 void bumb_spawn()
250 {    
251     self.vehicle_health = autocvar_g_vehicle_bumblebee_health;
252     self.vehicle_shield = autocvar_g_vehicle_bumblebee_shield;
253     self.movetype       = MOVETYPE_TOSS;
254     self.solid          = SOLID_BBOX;
255     //self.vehicle_energy = 1;
256     self.movetype = MOVETYPE_FLY;
257     setorigin(self, self.origin + '0 0 25');
258 }
259
260 void bumb_die()
261 {
262     self.health       = 0;
263     self.event_damage = SUB_Null;
264     self.iscreature   = FALSE;
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 }