6 /* spawnflags */ ATTRIB(Raptor, spawnflags, int, VHF_DMGSHAKE | VHF_DMGROLL);
7 /* mins */ ATTRIB(Raptor, mins, vector, '-80 -80 0');
8 /* maxs */ ATTRIB(Raptor, maxs, vector, '80 80 70');
9 /* model */ ATTRIB(Raptor, mdl, string, "models/vehicles/raptor.dpm");
10 /* model */ ATTRIB(Raptor, model, string, "models/vehicles/raptor.dpm");
11 /* head_model */ ATTRIB(Raptor, head_model, string, "");
12 /* hud_model */ ATTRIB(Raptor, hud_model, string, "models/vehicles/raptor_cockpit.dpm");
13 /* tags */ ATTRIB(Raptor, tag_head, string, "");
14 /* tags */ ATTRIB(Raptor, tag_hud, string, "tag_hud");
15 /* tags */ ATTRIB(Raptor, tag_hview, string, "tag_camera");
16 /* netname */ ATTRIB(Raptor, netname, string, "raptor");
17 /* fullname */ ATTRIB(Raptor, vehicle_name, string, _("Raptor"));
18 /* icon */ ATTRIB(Raptor, m_icon, string, "vehicle_raptor");
21 REGISTER_VEHICLE(RAPTOR, NEW(Raptor));
23 #include "../../weapons/all.qh"
25 CLASS(RaptorCannon, PortoLaunch)
26 /* flags */ ATTRIB(RaptorCannon, spawnflags, int, WEP_TYPE_OTHER);
27 /* impulse */ ATTRIB(RaptorCannon, impulse, int, 3);
28 /* refname */ ATTRIB(RaptorCannon, netname, string, "raptorcannon");
29 /* wepname */ ATTRIB(RaptorCannon, message, string, _("Raptor cannon"));
30 ENDCLASS(RaptorCannon)
31 REGISTER_WEAPON(RAPTOR, NEW(RaptorCannon));
33 CLASS(RaptorBomb, PortoLaunch)
34 /* flags */ ATTRIB(RaptorBomb, spawnflags, int, WEP_TYPE_OTHER);
35 /* impulse */ ATTRIB(RaptorBomb, impulse, int, 3);
36 /* refname */ ATTRIB(RaptorBomb, netname, string, "raptorbomb");
37 /* wepname */ ATTRIB(RaptorBomb, message, string, _("Raptor bomb"));
39 REGISTER_WEAPON(RAPTOR_BOMB, NEW(RaptorBomb));
41 CLASS(RaptorFlare, PortoLaunch)
42 /* flags */ ATTRIB(RaptorFlare, spawnflags, int, WEP_TYPE_OTHER);
43 /* impulse */ ATTRIB(RaptorFlare, impulse, int, 3);
44 /* refname */ ATTRIB(RaptorFlare, netname, string, "raptorflare");
45 /* wepname */ ATTRIB(RaptorFlare, message, string, _("Raptor flare"));
47 REGISTER_WEAPON(RAPTOR_FLARE, NEW(RaptorFlare));
54 float autocvar_g_vehicle_raptor_cannon_cost;
55 float autocvar_g_vehicle_raptor_cannon_damage;
56 float autocvar_g_vehicle_raptor_cannon_radius;
57 float autocvar_g_vehicle_raptor_cannon_refire;
58 float autocvar_g_vehicle_raptor_cannon_speed;
59 float autocvar_g_vehicle_raptor_cannon_spread;
60 float autocvar_g_vehicle_raptor_cannon_force;
62 METHOD(RaptorCannon, wr_think, bool(entity thiswep, bool fire1, bool fire2)) {
64 bool isPlayer = IS_PLAYER(self);
65 entity player = isPlayer ? self : self.owner;
66 entity veh = player.vehicle;
68 // 1 [wait] 1 [wait] 2 [wait] 2 [wait] [wait]
69 float t = autocvar_g_vehicle_raptor_cannon_refire * (1 + veh.misc_bulletcounter == 4);
71 if (weapon_prepareattack(false, t)) {
72 if (isPlayer) W_SetupShot_Dir(player, v_forward, false, 0, SND(Null), CH_WEAPON_B, 0);
73 vector org = w_shotorg;
74 vector dir = w_shotdir;
76 veh.misc_bulletcounter += 1;
77 org = (veh.misc_bulletcounter <= 2) ? gettaginfo(veh.gun1, gettagindex(veh.gun1, "fire1"))
78 : (((veh.misc_bulletcounter == 4) ? veh.misc_bulletcounter = 0 : 0), gettaginfo(veh.gun2, gettagindex(veh.gun2, "fire1")));
80 veh.vehicle_energy -= autocvar_g_vehicle_raptor_cannon_cost;
83 vehicles_projectile(EFFECT_RAPTOR_MUZZLEFLASH.eent_eff_name, SND(LASERGUN_FIRE),
84 org, normalize(dir + randomvec() * autocvar_g_vehicle_raptor_cannon_spread) * autocvar_g_vehicle_raptor_cannon_speed,
85 autocvar_g_vehicle_raptor_cannon_damage, autocvar_g_vehicle_raptor_cannon_radius, autocvar_g_vehicle_raptor_cannon_force, 0,
86 DEATH_VH_RAPT_CANNON, PROJECTILE_RAPTORCANNON, 0, true, true, player);
87 weapon_thinkf(WFRAME_FIRE1, 0, w_ready);
92 METHOD(RaptorCannon, wr_checkammo1, bool(RacerAttack thiswep)) {
94 bool isPlayer = IS_PLAYER(self);
95 entity player = isPlayer ? self : self.owner;
96 entity veh = player.vehicle;
97 return isPlayer || veh.vehicle_energy >= autocvar_g_vehicle_raptor_cannon_cost;
100 float autocvar_g_vehicle_raptor_bombs_refire;
102 void raptor_bombdrop();
103 METHOD(RaptorBomb, wr_think, bool(entity thiswep, bool fire1, bool fire2)) {
105 bool isPlayer = IS_PLAYER(self);
106 entity player = isPlayer ? self : self.owner;
109 if (weapon_prepareattack(false, autocvar_g_vehicle_raptor_bombs_refire)) {
111 weapon_thinkf(WFRAME_FIRE1, 0, w_ready);
117 float autocvar_g_vehicle_raptor_flare_refire;
118 float autocvar_g_vehicle_raptor_flare_lifetime;
119 float autocvar_g_vehicle_raptor_flare_chase;
120 float autocvar_g_vehicle_raptor_flare_range;
122 void raptor_flare_think();
123 void raptor_flare_damage(entity inflictor, entity attacker, float damage, int deathtype, vector hitloc, vector force);
124 void raptor_flare_touch();
126 METHOD(RaptorFlare, wr_think, bool(entity thiswep, bool fire1, bool fire2)) {
128 bool isPlayer = IS_PLAYER(self);
129 entity player = isPlayer ? self : self.owner;
132 if (weapon_prepareattack(true, autocvar_g_vehicle_raptor_flare_refire)) {
133 for(int i = 0; i < 3; ++i) {
134 entity _flare = spawn();
135 setmodel(_flare, MDL_VEH_RAPTOR_FLARE);
136 _flare.effects = EF_LOWPRECISION | EF_FLAME;
138 setorigin(_flare, self.origin - '0 0 16');
139 _flare.movetype = MOVETYPE_TOSS;
140 _flare.gravity = 0.15;
141 _flare.velocity = 0.25 * self.velocity + (v_forward + randomvec() * 0.25)* -500;
142 _flare.think = raptor_flare_think;
143 _flare.nextthink = time;
145 _flare.solid = SOLID_CORPSE;
146 _flare.takedamage = DAMAGE_YES;
147 _flare.event_damage = raptor_flare_damage;
149 _flare.tur_impacttime = time + autocvar_g_vehicle_raptor_flare_lifetime;
150 _flare.touch = raptor_flare_touch;
152 weapon_thinkf(WFRAME_FIRE2, 0, w_ready);
158 bool autocvar_g_vehicle_raptor;
160 float autocvar_g_vehicle_raptor_respawntime;
161 float autocvar_g_vehicle_raptor_takeofftime;
163 float autocvar_g_vehicle_raptor_movestyle;
164 float autocvar_g_vehicle_raptor_turnspeed;
165 float autocvar_g_vehicle_raptor_pitchspeed;
166 float autocvar_g_vehicle_raptor_pitchlimit;
168 float autocvar_g_vehicle_raptor_speed_forward;
169 float autocvar_g_vehicle_raptor_speed_strafe;
170 float autocvar_g_vehicle_raptor_speed_up;
171 float autocvar_g_vehicle_raptor_speed_down;
172 float autocvar_g_vehicle_raptor_friction;
174 float autocvar_g_vehicle_raptor_bomblets;
175 float autocvar_g_vehicle_raptor_bomblet_alt;
176 float autocvar_g_vehicle_raptor_bomblet_time;
177 float autocvar_g_vehicle_raptor_bomblet_damage;
178 float autocvar_g_vehicle_raptor_bomblet_spread;
179 float autocvar_g_vehicle_raptor_bomblet_edgedamage;
180 float autocvar_g_vehicle_raptor_bomblet_radius;
181 float autocvar_g_vehicle_raptor_bomblet_force;
182 float autocvar_g_vehicle_raptor_bomblet_explode_delay;
184 float autocvar_g_vehicle_raptor_cannon_turnspeed;
185 float autocvar_g_vehicle_raptor_cannon_turnlimit;
186 float autocvar_g_vehicle_raptor_cannon_pitchlimit_up;
187 float autocvar_g_vehicle_raptor_cannon_pitchlimit_down;
189 float autocvar_g_vehicle_raptor_cannon_locktarget;
190 float autocvar_g_vehicle_raptor_cannon_locking_time;
191 float autocvar_g_vehicle_raptor_cannon_locking_releasetime;
192 float autocvar_g_vehicle_raptor_cannon_locked_time;
193 float autocvar_g_vehicle_raptor_cannon_predicttarget;
195 float autocvar_g_vehicle_raptor_energy;
196 float autocvar_g_vehicle_raptor_energy_regen;
197 float autocvar_g_vehicle_raptor_energy_regen_pause;
199 float autocvar_g_vehicle_raptor_health;
200 float autocvar_g_vehicle_raptor_health_regen;
201 float autocvar_g_vehicle_raptor_health_regen_pause;
203 float autocvar_g_vehicle_raptor_shield;
204 float autocvar_g_vehicle_raptor_shield_regen;
205 float autocvar_g_vehicle_raptor_shield_regen_pause;
207 float autocvar_g_vehicle_raptor_bouncefactor;
208 float autocvar_g_vehicle_raptor_bouncestop;
209 vector autocvar_g_vehicle_raptor_bouncepain;
214 float raptor_altitude(float amax)
216 tracebox(self.origin, self.mins, self.maxs, self.origin - ('0 0 1' * amax), MOVE_WORLDONLY, self);
217 return vlen(self.origin - trace_endpos);
220 void raptor_bomblet_boom()
222 RadiusDamage (self, self.realowner, autocvar_g_vehicle_raptor_bomblet_damage,
223 autocvar_g_vehicle_raptor_bomblet_edgedamage,
224 autocvar_g_vehicle_raptor_bomblet_radius, world, world,
225 autocvar_g_vehicle_raptor_bomblet_force, DEATH_VH_RAPT_BOMB, world);
229 void raptor_bomblet_touch()
231 if(other == self.owner)
235 self.think = raptor_bomblet_boom;
236 self.nextthink = time + random() * autocvar_g_vehicle_raptor_bomblet_explode_delay;
239 void raptor_bomb_burst()
242 if(autocvar_g_vehicle_raptor_bomblet_alt)
244 self.nextthink = time;
245 traceline(self.origin, self.origin + (normalize(self.velocity) * autocvar_g_vehicle_raptor_bomblet_alt), MOVE_NORMAL, self);
246 if((trace_fraction == 1.0) || (vlen(self.origin - self.owner.origin) < autocvar_g_vehicle_raptor_bomblet_radius))
248 UpdateCSQCProjectile(self);
256 Damage_DamageInfo(self.origin, 0, 0, 0, '0 0 0', DEATH_VH_RAPT_FRAGMENT, 0, self);
258 for(i = 0; i < autocvar_g_vehicle_raptor_bomblets; ++i)
261 setorigin(bomblet, self.origin);
263 bomblet.movetype = MOVETYPE_TOSS;
264 bomblet.touch = raptor_bomblet_touch;
265 bomblet.think = raptor_bomblet_boom;
266 bomblet.nextthink = time + 5;
267 bomblet.owner = self.owner;
268 bomblet.realowner = self.realowner;
269 bomblet.velocity = normalize(normalize(self.velocity) + (randomvec() * autocvar_g_vehicle_raptor_bomblet_spread)) * vlen(self.velocity);
271 PROJECTILE_MAKETRIGGER(bomblet);
272 CSQCProjectile(bomblet, true, PROJECTILE_RAPTORBOMBLET, true);
278 void raptor_bombdrop()
280 entity bomb_1, bomb_2;
285 setorigin(bomb_1, gettaginfo(self, gettagindex(self, "bombmount_left")));
286 setorigin(bomb_2, gettaginfo(self, gettagindex(self, "bombmount_right")));
288 bomb_1.movetype = bomb_2.movetype = MOVETYPE_BOUNCE;
289 bomb_1.velocity = bomb_2.velocity = self.velocity;
290 bomb_1.touch = bomb_2.touch = raptor_bomb_burst;
291 bomb_1.think = bomb_2.think = raptor_bomb_burst;
292 bomb_1.cnt = bomb_2.cnt = time + 10;
294 if(autocvar_g_vehicle_raptor_bomblet_alt)
295 bomb_1.nextthink = bomb_2.nextthink = time;
297 bomb_1.nextthink = bomb_2.nextthink = time + autocvar_g_vehicle_raptor_bomblet_time;
299 bomb_1.owner = bomb_2.owner = self;
300 bomb_1.realowner = bomb_2.realowner = self.owner;
301 bomb_1.solid = bomb_2.solid = SOLID_BBOX;
302 bomb_1.gravity = bomb_2.gravity = 1;
304 PROJECTILE_MAKETRIGGER(bomb_1);
305 PROJECTILE_MAKETRIGGER(bomb_2);
307 CSQCProjectile(bomb_1, true, PROJECTILE_RAPTORBOMB, true);
308 CSQCProjectile(bomb_2, true, PROJECTILE_RAPTORBOMB, true);
316 hgt = raptor_altitude(512);
317 self.velocity = (self.velocity * 0.9) + ('0 0 -1800' * (hgt / 256) * sys_frametime);
318 self.angles_x *= 0.95;
319 self.angles_z *= 0.95;
323 self.frame = (hgt / 128) * 25;
325 self.bomb1.gun1.avelocity_y = 90 + ((self.frame / 25) * 2000);
326 self.bomb1.gun2.avelocity_y = -self.bomb1.gun1.avelocity_y;
330 self.movetype = MOVETYPE_TOSS;
331 self.think = vehicles_think;
335 self.nextthink = time;
337 CSQCMODEL_AUTOUPDATE(self);
340 void raptor_exit(float eject)
343 self.tur_head.exteriormodeltoclient = world;
345 if(self.deadflag == DEAD_NO)
347 self.think = raptor_land;
348 self.nextthink = time;
354 makevectors(self.angles);
357 spot = self.origin + v_forward * 100 + '0 0 64';
358 spot = vehicles_findgoodexit(spot);
359 setorigin(self.owner , spot);
360 self.owner.velocity = (v_up + v_forward * 0.25) * 750;
361 self.owner.oldvelocity = self.owner.velocity;
365 if(vlen(self.velocity) > 2 * autocvar_sv_maxairspeed)
367 self.owner.velocity = normalize(self.velocity) * autocvar_sv_maxairspeed * 2;
368 self.owner.velocity_z += 200;
369 spot = self.origin + v_forward * 32 + '0 0 64';
370 spot = vehicles_findgoodexit(spot);
374 self.owner.velocity = self.velocity * 0.5;
375 self.owner.velocity_z += 10;
376 spot = self.origin - v_forward * 200 + '0 0 64';
377 spot = vehicles_findgoodexit(spot);
379 self.owner.oldvelocity = self.owner.velocity;
380 setorigin(self.owner , spot);
383 antilag_clear(self.owner);
387 void raptor_flare_touch()
392 void raptor_flare_damage(entity inflictor, entity attacker, float damage, int deathtype, vector hitloc, vector force)
394 self.health -= damage;
399 void raptor_flare_think()
401 self.nextthink = time + 0.1;
402 entity _missile = findchainentity(enemy, self.owner);
405 if(_missile.flags & FL_PROJECTILE)
406 if(vlen(self.origin - _missile.origin) < autocvar_g_vehicle_raptor_flare_range)
407 if(random() > autocvar_g_vehicle_raptor_flare_chase)
408 _missile.enemy = self;
409 _missile = _missile.chain;
412 if(self.tur_impacttime < time)
418 entity player, raptor;
422 if(intermission_running)
424 self.vehicle.velocity = '0 0 0';
425 self.vehicle.avelocity = '0 0 0';
430 raptor = self.vehicle;
433 vehicles_painframe();
435 ftmp = vlen(self.velocity);
436 if(ftmp > autocvar_g_vehicle_raptor_speed_forward)
439 ftmp = ftmp / autocvar_g_vehicle_raptor_speed_forward;
442 if(self.sound_nexttime < time)
444 self.sound_nexttime = time + 7.955812;
445 //sound (self.tur_head, CH_TRIGGER_SINGLE, SND_VEH_RAPTOR_FLY, 1 - ftmp, ATTEN_NORM );
446 sound (self, CH_TRIGGER_SINGLE, SND_VEH_RAPTOR_SPEED, 1, ATTEN_NORM);
450 else if(fabs(ftmp - self.wait) > 0.2)
452 sound (self.tur_head, CH_TRIGGER_SINGLE, SND_Null, 1 - ftmp, ATTEN_NORM );
453 sound (self, CH_TRIGGER_SINGLE, SND_Null, ftmp, ATTEN_NORM);
458 if(raptor.deadflag != DEAD_NO)
461 player.BUTTON_ATCK = player.BUTTON_ATCK2 = 0;
464 crosshair_trace(player);
466 //if(time - self.lastteleporttime < 1)
468 if(raptor.angles_z > 50 || raptor.angles_z < -50)
470 if(player.BUTTON_JUMP)
472 player.BUTTON_CROUCH = true;
473 player.BUTTON_JUMP = false;
479 vang = raptor.angles;
480 df = vectoangles(normalize(trace_endpos - self.origin + '0 0 32'));
483 if(df_x > 180) df_x -= 360;
484 if(df_x < -180) df_x += 360;
485 if(df_y > 180) df_y -= 360;
486 if(df_y < -180) df_y += 360;
488 ftmp = shortangle_f(player.v_angle_y - vang_y, vang_y);
489 if(ftmp > 180) ftmp -= 360; if(ftmp < -180) ftmp += 360;
490 raptor.avelocity_y = bound(-autocvar_g_vehicle_raptor_turnspeed, ftmp + raptor.avelocity_y * 0.9, autocvar_g_vehicle_raptor_turnspeed);
494 if(player.movement_x > 0 && vang_x < autocvar_g_vehicle_raptor_pitchlimit) ftmp = 5;
495 else if(player.movement_x < 0 && vang_x > -autocvar_g_vehicle_raptor_pitchlimit) ftmp = -20;
497 df_x = bound(-autocvar_g_vehicle_raptor_pitchlimit, df_x , autocvar_g_vehicle_raptor_pitchlimit);
498 ftmp = vang_x - bound(-autocvar_g_vehicle_raptor_pitchlimit, df_x + ftmp, autocvar_g_vehicle_raptor_pitchlimit);
499 raptor.avelocity_x = bound(-autocvar_g_vehicle_raptor_pitchspeed, ftmp + raptor.avelocity_x * 0.9, autocvar_g_vehicle_raptor_pitchspeed);
501 raptor.angles_x = anglemods(raptor.angles_x);
502 raptor.angles_y = anglemods(raptor.angles_y);
503 raptor.angles_z = anglemods(raptor.angles_z);
505 if(autocvar_g_vehicle_raptor_movestyle == 1)
506 makevectors('0 1 0' * raptor.angles_y);
508 makevectors(player.v_angle);
510 df = raptor.velocity * -autocvar_g_vehicle_raptor_friction;
512 if(player.movement_x != 0)
514 if(player.movement_x > 0)
515 df += v_forward * autocvar_g_vehicle_raptor_speed_forward;
516 else if(player.movement_x < 0)
517 df -= v_forward * autocvar_g_vehicle_raptor_speed_forward;
520 if(player.movement_y != 0)
522 if(player.movement_y < 0)
523 df -= v_right * autocvar_g_vehicle_raptor_speed_strafe;
524 else if(player.movement_y > 0)
525 df += v_right * autocvar_g_vehicle_raptor_speed_strafe;
527 raptor.angles_z = bound(-30,raptor.angles_z + (player.movement_y / autocvar_g_vehicle_raptor_speed_strafe),30);
531 raptor.angles_z *= 0.95;
532 if(raptor.angles_z >= -1 && raptor.angles_z <= -1)
536 if(player.BUTTON_CROUCH)
537 df -= v_up * autocvar_g_vehicle_raptor_speed_down;
538 else if (player.BUTTON_JUMP)
539 df += v_up * autocvar_g_vehicle_raptor_speed_up;
541 raptor.velocity += df * frametime;
542 player.velocity = player.movement = raptor.velocity;
543 setorigin(player, raptor.origin + '0 0 32');
545 player.vehicle_weapon2mode = raptor.vehicle_weapon2mode;
548 // Target lock & predict
549 if(autocvar_g_vehicle_raptor_cannon_locktarget == 2)
551 if(raptor.gun1.lock_time < time || raptor.gun1.enemy.deadflag)
552 raptor.gun1.enemy = world;
555 if(trace_ent.movetype)
556 if(trace_ent.takedamage)
557 if(!trace_ent.deadflag)
561 if(trace_ent.team != player.team)
563 raptor.gun1.enemy = trace_ent;
564 raptor.gun1.lock_time = time + 5;
569 raptor.gun1.enemy = trace_ent;
570 raptor.gun1.lock_time = time + 0.5;
574 if(raptor.gun1.enemy)
576 float distance, impact_time;
578 vf = real_origin(raptor.gun1.enemy);
579 UpdateAuxiliaryXhair(player, vf, '1 0 0', 1);
580 vector _vel = raptor.gun1.enemy.velocity;
581 if(raptor.gun1.enemy.movetype == MOVETYPE_WALK)
584 if(autocvar_g_vehicle_raptor_cannon_predicttarget)
587 distance = vlen(ad - player.origin);
588 impact_time = distance / autocvar_g_vehicle_raptor_cannon_speed;
589 ad = vf + _vel * impact_time;
596 else if(autocvar_g_vehicle_raptor_cannon_locktarget == 1)
599 vehicles_locktarget((1 / autocvar_g_vehicle_raptor_cannon_locking_time) * frametime,
600 (1 / autocvar_g_vehicle_raptor_cannon_locking_releasetime) * frametime,
601 autocvar_g_vehicle_raptor_cannon_locked_time);
603 if(self.lock_target != world)
604 if(autocvar_g_vehicle_raptor_cannon_predicttarget)
605 if(self.lock_strength == 1)
607 float i, distance, impact_time;
609 vf = real_origin(raptor.lock_target);
611 for(i = 0; i < 4; ++i)
613 distance = vlen(ad - raptor.origin);
614 impact_time = distance / autocvar_g_vehicle_raptor_cannon_speed;
615 ad = vf + raptor.lock_target.velocity * impact_time;
622 if(raptor.lock_strength == 1)
623 UpdateAuxiliaryXhair(player, real_origin(raptor.lock_target), '1 0 0', 1);
624 else if(self.lock_strength > 0.5)
625 UpdateAuxiliaryXhair(player, real_origin(raptor.lock_target), '0 1 0', 1);
626 else if(self.lock_strength < 0.5)
627 UpdateAuxiliaryXhair(player, real_origin(raptor.lock_target), '0 0 1', 1);
632 vehicle_aimturret(raptor, trace_endpos, raptor.gun1, "fire1",
633 autocvar_g_vehicle_raptor_cannon_pitchlimit_down * -1, autocvar_g_vehicle_raptor_cannon_pitchlimit_up,
634 autocvar_g_vehicle_raptor_cannon_turnlimit * -1, autocvar_g_vehicle_raptor_cannon_turnlimit, autocvar_g_vehicle_raptor_cannon_turnspeed);
636 vehicle_aimturret(raptor, trace_endpos, raptor.gun2, "fire1",
637 autocvar_g_vehicle_raptor_cannon_pitchlimit_down * -1, autocvar_g_vehicle_raptor_cannon_pitchlimit_up,
638 autocvar_g_vehicle_raptor_cannon_turnlimit * -1, autocvar_g_vehicle_raptor_cannon_turnlimit, autocvar_g_vehicle_raptor_cannon_turnspeed);
642 v_forward = vf * 0.5;
643 traceline(ad, ad + v_forward * MAX_SHOT_DISTANCE, MOVE_NORMAL, raptor);
644 UpdateAuxiliaryXhair(player, trace_endpos, '0 1 0', 0);
647 Weapon wep1 = WEP_RAPTOR;
648 if(!forbidWeaponUse(player))
649 if(player.BUTTON_ATCK)
650 if (wep1.wr_checkammo1(wep1))
652 wep1.wr_think(wep1, true, false);
655 if(self.vehicle_flags & VHF_SHIELDREGEN)
656 vehicles_regen(raptor.dmg_time, vehicle_shield, autocvar_g_vehicle_raptor_shield, autocvar_g_vehicle_raptor_shield_regen_pause, autocvar_g_vehicle_raptor_shield_regen, frametime, true);
658 if(self.vehicle_flags & VHF_HEALTHREGEN)
659 vehicles_regen(raptor.dmg_time, vehicle_health, autocvar_g_vehicle_raptor_health, autocvar_g_vehicle_raptor_health_regen_pause, autocvar_g_vehicle_raptor_health_regen, frametime, false);
661 if(self.vehicle_flags & VHF_ENERGYREGEN)
662 vehicles_regen(raptor.cnt, vehicle_energy, autocvar_g_vehicle_raptor_energy, autocvar_g_vehicle_raptor_energy_regen_pause, autocvar_g_vehicle_raptor_energy_regen, frametime, false);
664 Weapon wep2a = WEP_RAPTOR_BOMB;
665 if(!forbidWeaponUse(player))
666 if(raptor.vehicle_weapon2mode == RSM_BOMB)
668 if(time > raptor.lip + autocvar_g_vehicle_raptor_bombs_refire)
669 if(player.BUTTON_ATCK2)
671 wep2a.wr_think(wep2a, false, true);
672 raptor.delay = time + autocvar_g_vehicle_raptor_bombs_refire;
678 Weapon wep2b = WEP_RAPTOR_FLARE;
679 if(time > raptor.lip + autocvar_g_vehicle_raptor_flare_refire)
680 if(player.BUTTON_ATCK2)
682 wep2b.wr_think(wep2b, false, true);
683 raptor.delay = time + autocvar_g_vehicle_raptor_flare_refire;
688 raptor.bomb1.alpha = raptor.bomb2.alpha = (time - raptor.lip) / (raptor.delay - raptor.lip);
689 player.vehicle_reload2 = bound(0, raptor.bomb1.alpha * 100, 100);
690 player.vehicle_ammo2 = (player.vehicle_reload2 == 100) ? 100 : 0;
692 if(self.bomb1.cnt < time)
694 entity _missile = findchainentity(enemy, raptor);
695 float _incomming = 0;
698 if(_missile.flags & FL_PROJECTILE)
699 if(MISSILE_IS_TRACKING(_missile))
700 if(vlen(self.origin - _missile.origin) < 2 * autocvar_g_vehicle_raptor_flare_range)
703 _missile = _missile.chain;
707 sound(self, CH_PAIN_SINGLE, SND_VEH_MISSILE_ALARM, VOL_BASE, ATTEN_NONE);
709 self.bomb1.cnt = time + 1;
713 VEHICLE_UPDATE_PLAYER(player, health, raptor);
714 VEHICLE_UPDATE_PLAYER(player, energy, raptor);
715 if(self.vehicle_flags & VHF_HASSHIELD)
716 VEHICLE_UPDATE_PLAYER(player, shield, raptor);
718 player.BUTTON_ATCK = player.BUTTON_ATCK2 = player.BUTTON_CROUCH = 0;
724 float raptor_takeoff()
726 entity player, raptor;
729 raptor = self.vehicle;
732 self.nextthink = time;
733 CSQCMODEL_AUTOUPDATE(self);
734 self.nextthink = 0; // will this work?
736 if(self.sound_nexttime < time)
738 self.sound_nexttime = time + 7.955812; //soundlength("vehicles/raptor_fly.wav");
739 sound (self, CH_TRIGGER_SINGLE, SND_VEH_RAPTOR_SPEED, VOL_VEHICLEENGINE, ATTEN_NORM);
743 if(raptor.frame < 25)
745 raptor.frame += 25 / (autocvar_g_vehicle_raptor_takeofftime / sys_frametime);
746 raptor.velocity_z = min(raptor.velocity_z * 1.5, 256);
747 self.bomb1.gun1.avelocity_y = 90 + ((raptor.frame / 25) * 25000);
748 self.bomb1.gun2.avelocity_y = -self.bomb1.gun1.avelocity_y;
749 player.BUTTON_ATCK = player.BUTTON_ATCK2 = player.BUTTON_CROUCH = 0;
751 setorigin(player, raptor.origin + '0 0 32');
754 player.PlayerPhysplug = raptor_frame;
756 if(self.vehicle_flags & VHF_SHIELDREGEN)
757 vehicles_regen(raptor.dmg_time, vehicle_shield, autocvar_g_vehicle_raptor_shield, autocvar_g_vehicle_raptor_shield_regen_pause, autocvar_g_vehicle_raptor_shield_regen, frametime, true);
759 if(self.vehicle_flags & VHF_HEALTHREGEN)
760 vehicles_regen(raptor.dmg_time, vehicle_health, autocvar_g_vehicle_raptor_health, autocvar_g_vehicle_raptor_health_regen_pause, autocvar_g_vehicle_raptor_health_regen, frametime, false);
762 if(self.vehicle_flags & VHF_ENERGYREGEN)
763 vehicles_regen(raptor.cnt, vehicle_energy, autocvar_g_vehicle_raptor_energy, autocvar_g_vehicle_raptor_energy_regen_pause, autocvar_g_vehicle_raptor_energy_regen, frametime, false);
766 raptor.bomb1.alpha = raptor.bomb2.alpha = (time - raptor.lip) / (raptor.delay - raptor.lip);
767 player.vehicle_reload2 = bound(0, raptor.bomb1.alpha * 100, 100);
768 player.vehicle_ammo2 = (player.vehicle_reload2 == 100) ? 100 : 0;
770 VEHICLE_UPDATE_PLAYER(player, health, raptor);
771 VEHICLE_UPDATE_PLAYER(player, energy, raptor);
772 if(self.vehicle_flags & VHF_HASSHIELD)
773 VEHICLE_UPDATE_PLAYER(player, shield, raptor);
775 player.BUTTON_ATCK = player.BUTTON_ATCK2 = player.BUTTON_CROUCH = 0;
782 self.deadflag = DEAD_DEAD;
783 self.vehicle_exit(VHEF_NORMAL);
784 RadiusDamage (self, self.enemy, 250, 15, 250, world, world, 250, DEATH_VH_RAPT_DEATH, world);
787 self.movetype = MOVETYPE_NONE;
788 self.effects = EF_NODRAW;
789 self.colormod = '0 0 0';
790 self.avelocity = '0 0 0';
791 self.velocity = '0 0 0';
793 setorigin(self, self.pos1);
794 self.touch = func_null;
798 void raptor_diethink()
800 if(time >= self.wait)
801 self.think = raptor_blowup;
805 sound (self, CH_SHOTS, SND_ROCKET_IMPACT, VOL_BASE, ATTEN_NORM);
806 Send_Effect(EFFECT_EXPLOSION_SMALL, randomvec() * 80 + (self.origin + '0 0 100'), '0 0 0', 1);
808 self.nextthink = time;
810 CSQCMODEL_AUTOUPDATE(self);
813 // If we dont do this ever now and then, the raptors rotors
814 // stop working, presumably due to angle overflow. cute.
815 void raptor_rotor_anglefix()
817 self.gun1.angles_y = anglemods(self.gun1.angles_y);
818 self.gun2.angles_y = anglemods(self.gun2.angles_y);
819 self.nextthink = time + 15;
822 float raptor_impulse(float _imp)
828 self.vehicle.vehicle_weapon2mode = RSM_BOMB;
829 CSQCVehicleSetup(self, 0);
833 self.vehicle.vehicle_weapon2mode = RSM_FLARE;
834 CSQCVehicleSetup(self, 0);
840 self.vehicle.vehicle_weapon2mode += 1;
841 if(self.vehicle.vehicle_weapon2mode > RSM_LAST)
842 self.vehicle.vehicle_weapon2mode = RSM_FIRST;
844 CSQCVehicleSetup(self, 0);
850 self.vehicle.vehicle_weapon2mode -= 1;
851 if(self.vehicle.vehicle_weapon2mode < RSM_FIRST)
852 self.vehicle.vehicle_weapon2mode = RSM_LAST;
854 CSQCVehicleSetup(self, 0);
858 case 17: // toss gun, could be used to exit?
860 case 20: // Manual minigun reload?
867 void spawnfunc_vehicle_raptor()
869 if(!autocvar_g_vehicle_raptor) { remove(self); return; }
870 if(!vehicle_initialize(VEH_RAPTOR, false)) { remove(self); return; }
873 METHOD(Raptor, vr_impact, bool(Raptor thisveh))
875 if(autocvar_g_vehicle_raptor_bouncepain)
876 vehicles_impact(autocvar_g_vehicle_raptor_bouncepain_x, autocvar_g_vehicle_raptor_bouncepain_y, autocvar_g_vehicle_raptor_bouncepain_z);
880 METHOD(Raptor, vr_enter, bool(Raptor thisveh))
882 self.vehicle_weapon2mode = RSM_BOMB;
883 self.owner.PlayerPhysplug = raptor_takeoff;
884 self.movetype = MOVETYPE_BOUNCEMISSILE;
885 self.solid = SOLID_SLIDEBOX;
886 self.owner.vehicle_health = (self.vehicle_health / autocvar_g_vehicle_raptor_health) * 100;
887 self.owner.vehicle_shield = (self.vehicle_shield / autocvar_g_vehicle_raptor_shield) * 100;
888 self.velocity_z = 1; // Nudge upwards to takeoff sequense can work.
889 self.tur_head.exteriormodeltoclient = self.owner;
891 self.delay = time + autocvar_g_vehicle_raptor_bombs_refire;
894 if(self.owner.flagcarried)
895 setorigin(self.owner.flagcarried, '-20 0 96');
897 CSQCVehicleSetup(self.owner, 0);
900 METHOD(Raptor, vr_think, bool(Raptor thisveh))
904 METHOD(Raptor, vr_death, bool(Raptor thisveh))
907 self.event_damage = func_null;
908 self.solid = SOLID_CORPSE;
909 self.takedamage = DAMAGE_NO;
910 self.deadflag = DEAD_DYING;
911 self.movetype = MOVETYPE_BOUNCE;
912 self.think = raptor_diethink;
913 self.nextthink = time;
914 self.wait = time + 5 + (random() * 5);
916 Send_Effect(EFFECT_EXPLOSION_MEDIUM, findbetterlocation (self.origin, 16), '0 0 0', 1);
918 self.velocity_z += 600;
920 self.avelocity = '0 0.5 1' * (random() * 400);
921 self.avelocity -= '0 0.5 1' * (random() * 400);
923 self.colormod = '-0.5 -0.5 -0.5';
924 self.touch = raptor_blowup;
927 METHOD(Raptor, vr_spawn, bool(Raptor thisveh))
934 //FIXME: Camera is in a bad place in HUD model.
935 //setorigin(self.vehicle_viewport, '25 0 5');
937 self.vehicles_impulse = raptor_impulse;
941 self.bomb1 = spawn();
942 self.bomb2 = spawn();
946 setmodel(self.bomb1, MDL_VEH_RAPTOR_CB_FOLDED);
947 setmodel(self.bomb2, MDL_VEH_RAPTOR_CB_FOLDED);
948 setmodel(self.gun1, MDL_VEH_RAPTOR_GUN);
949 setmodel(self.gun2, MDL_VEH_RAPTOR_GUN);
950 setmodel(self.tur_head, MDL_VEH_RAPTOR_TAIL);
952 setattachment(self.bomb1, self, "bombmount_left");
953 setattachment(self.bomb2, self, "bombmount_right");
954 setattachment(self.tur_head, self,"root");
956 // FIXMODEL Guns mounts to angled bones
957 self.bomb1.angles = self.angles;
958 self.angles = '0 0 0';
959 // This messes up gun-aim, so work arround it.
960 //setattachment(self.gun1, self, "gunmount_left");
961 ofs = gettaginfo(self, gettagindex(self, "gunmount_left"));
963 setattachment(self.gun1, self, "");
964 setorigin(self.gun1, ofs);
966 //setattachment(self.gun2, self, "gunmount_right");
967 ofs = gettaginfo(self, gettagindex(self, "gunmount_right"));
969 setattachment(self.gun2, self, "");
970 setorigin(self.gun2, ofs);
972 self.angles = self.bomb1.angles;
973 self.bomb1.angles = '0 0 0';
976 spinner.owner = self;
977 setmodel(spinner, MDL_VEH_RAPTOR_PROP);
978 setattachment(spinner, self, "engine_left");
979 spinner.movetype = MOVETYPE_NOCLIP;
980 spinner.avelocity = '0 90 0';
981 self.bomb1.gun1 = spinner;
984 spinner.owner = self;
985 setmodel(spinner, MDL_VEH_RAPTOR_PROP);
986 setattachment(spinner, self, "engine_right");
987 spinner.movetype = MOVETYPE_NOCLIP;
988 spinner.avelocity = '0 -90 0';
989 self.bomb1.gun2 = spinner;
992 self.bomb1.think = raptor_rotor_anglefix;
993 self.bomb1.nextthink = time;
999 self.vehicle_health = autocvar_g_vehicle_raptor_health;
1000 self.vehicle_shield = autocvar_g_vehicle_raptor_shield;
1001 self.movetype = MOVETYPE_TOSS;
1002 self.solid = SOLID_SLIDEBOX;
1003 self.vehicle_energy = 1;
1005 self.PlayerPhysplug = raptor_frame;
1007 self.bomb1.gun1.avelocity_y = 90;
1008 self.bomb1.gun2.avelocity_y = -90;
1012 self.bouncefactor = autocvar_g_vehicle_raptor_bouncefactor;
1013 self.bouncestop = autocvar_g_vehicle_raptor_bouncestop;
1014 self.damageforcescale = 0.25;
1015 self.vehicle_health = autocvar_g_vehicle_raptor_health;
1016 self.vehicle_shield = autocvar_g_vehicle_raptor_shield;
1019 METHOD(Raptor, vr_setup, bool(Raptor thisveh))
1021 if(autocvar_g_vehicle_raptor_shield)
1022 self.vehicle_flags |= VHF_HASSHIELD;
1024 if(autocvar_g_vehicle_raptor_shield_regen)
1025 self.vehicle_flags |= VHF_SHIELDREGEN;
1027 if(autocvar_g_vehicle_raptor_health_regen)
1028 self.vehicle_flags |= VHF_HEALTHREGEN;
1030 if(autocvar_g_vehicle_raptor_energy_regen)
1031 self.vehicle_flags |= VHF_ENERGYREGEN;
1033 self.vehicle_exit = raptor_exit;
1034 self.respawntime = autocvar_g_vehicle_raptor_respawntime;
1035 self.vehicle_health = autocvar_g_vehicle_raptor_health;
1036 self.vehicle_shield = autocvar_g_vehicle_raptor_shield;
1037 self.max_health = self.vehicle_health;
1041 METHOD(Raptor, vr_precache, bool(Raptor thisveh))
1049 void RaptorCBShellfragDraw()
1054 Movetype_Physics_MatchTicrate(autocvar_cl_gibs_ticrate, autocvar_cl_gibs_sloppy);
1055 self.move_avelocity += randomvec() * 15;
1056 self.renderflags = 0;
1059 self.alpha = bound(0, self.nextthink - time, 1);
1061 if(self.alpha < ALPHA_MIN_VISIBLE)
1065 void RaptorCBShellfragToss(vector _org, vector _vel, vector _ang)
1070 setmodel(sfrag, MDL_VEH_RAPTOR_CB_FRAGMENT);
1071 setorigin(sfrag, _org);
1073 sfrag.move_movetype = MOVETYPE_BOUNCE;
1074 sfrag.gravity = 0.15;
1075 sfrag.solid = SOLID_CORPSE;
1077 sfrag.draw = RaptorCBShellfragDraw;
1079 sfrag.move_origin = sfrag.origin = _org;
1080 sfrag.move_velocity = _vel;
1081 sfrag.move_avelocity = prandomvec() * vlen(sfrag.move_velocity);
1082 sfrag.angles = self.move_angles = _ang;
1084 sfrag.move_time = time;
1085 sfrag.damageforcescale = 4;
1087 sfrag.nextthink = time + 3;
1088 sfrag.cnt = time + 2;
1090 sfrag.drawmask = MASK_NORMAL;
1093 METHOD(Raptor, vr_hud, bool(Raptor thisveh))
1099 case RSM_FLARE: crosshair = vCROSS_RAIN; break;
1100 case RSM_BOMB: crosshair = vCROSS_BURST; break;
1101 default: crosshair = vCROSS_BURST;
1104 Vehicles_drawHUD(VEH_RAPTOR.m_icon, "vehicle_raptor_weapon1", "vehicle_raptor_weapon2",
1105 "vehicle_icon_ammo1", autocvar_hud_progressbar_vehicles_ammo1_color,
1106 "vehicle_icon_ammo2", autocvar_hud_progressbar_vehicles_ammo2_color,
1110 METHOD(Raptor, vr_setup, bool(Raptor thisveh))
1112 AuxiliaryXhair[1].axh_image = vCROSS_LOCK;
1115 METHOD(Raptor, vr_precache, bool(Raptor thisveh))
1121 #endif // REGISTER_VEHICLE