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