1 #include "raptor_weapons.qh"
7 METHOD(RaptorCannon, wr_think, void(entity thiswep, entity actor, .entity weaponentity, int fire)) {
8 bool isPlayer = IS_PLAYER(actor);
9 entity player = isPlayer ? actor : actor.owner;
10 entity veh = player.vehicle;
11 // 1 [wait] 1 [wait] 2 [wait] 2 [wait] [wait]
12 float t = autocvar_g_vehicle_raptor_cannon_refire * (1 + veh.misc_bulletcounter == 4);
14 if (weapon_prepareattack(thiswep, player, weaponentity, false, t)) {
15 if (isPlayer) W_SetupShot_Dir(player, v_forward, false, 0, SND_Null, CH_WEAPON_B, 0);
16 vector org = w_shotorg;
17 vector dir = w_shotdir;
19 veh.misc_bulletcounter += 1;
20 org = (veh.misc_bulletcounter <= 2) ? gettaginfo(veh.gun1, gettagindex(veh.gun1, "fire1"))
21 : (((veh.misc_bulletcounter == 4) ? veh.misc_bulletcounter = 0 : 0), gettaginfo(veh.gun2, gettagindex(veh.gun2, "fire1")));
23 veh.vehicle_energy -= autocvar_g_vehicle_raptor_cannon_cost;
26 vehicles_projectile(veh, EFFECT_RAPTOR_MUZZLEFLASH.eent_eff_name, SND_LASERGUN_FIRE,
27 org, normalize(dir + randomvec() * autocvar_g_vehicle_raptor_cannon_spread) * autocvar_g_vehicle_raptor_cannon_speed,
28 autocvar_g_vehicle_raptor_cannon_damage, autocvar_g_vehicle_raptor_cannon_radius, autocvar_g_vehicle_raptor_cannon_force, 0,
29 DEATH_VH_RAPT_CANNON.m_id, PROJECTILE_RAPTORCANNON, 0, true, true, player);
30 weapon_thinkf(player, weaponentity, WFRAME_FIRE1, 0, w_ready);
33 METHOD(RaptorCannon, wr_checkammo1, bool(RacerAttack thiswep, entity actor)) {
34 bool isPlayer = IS_PLAYER(actor);
35 entity player = isPlayer ? actor : actor.owner;
36 entity veh = player.vehicle;
37 return isPlayer || veh.vehicle_energy >= autocvar_g_vehicle_raptor_cannon_cost;
41 void raptor_bombdrop();
42 METHOD(RaptorBomb, wr_think, void(entity thiswep, entity actor, .entity weaponentity, int fire)) {
43 bool isPlayer = IS_PLAYER(actor);
44 entity player = isPlayer ? actor : actor.owner;
45 entity veh = player.vehicle;
47 if (!isPlayer || weapon_prepareattack(thiswep, player, weaponentity, true, autocvar_g_vehicle_raptor_bombs_refire)) {
48 entity e = (veh) ? veh : player;
49 WITHSELF(e, raptor_bombdrop());
50 weapon_thinkf(player, weaponentity, WFRAME_FIRE2, 0, w_ready);
54 void raptor_flare_think(entity this);
55 void raptor_flare_damage(entity this, entity inflictor, entity attacker, float damage, int deathtype, vector hitloc, vector force);
56 void raptor_flare_touch(entity this);
58 METHOD(RaptorFlare, wr_think, void(entity thiswep, entity actor, .entity weaponentity, int fire)) {
59 bool isPlayer = IS_PLAYER(actor);
60 entity player = isPlayer ? actor : actor.owner;
61 entity veh = player.vehicle;
63 if (!isPlayer || weapon_prepareattack(thiswep, player, weaponentity, true, autocvar_g_vehicle_raptor_flare_refire)) {
64 for(int i = 0; i < 3; ++i) {
65 entity _flare = spawn();
66 setmodel(_flare, MDL_VEH_RAPTOR_FLARE);
67 _flare.effects = EF_LOWPRECISION | EF_FLAME;
69 setorigin(_flare, actor.origin - '0 0 16');
70 _flare.movetype = MOVETYPE_TOSS;
71 _flare.gravity = 0.15;
72 _flare.velocity = 0.25 * actor.velocity + (v_forward + randomvec() * 0.25)* -500;
73 setthink(_flare, raptor_flare_think);
74 _flare.nextthink = time;
75 _flare.owner = veh ? veh : player;
76 _flare.solid = SOLID_CORPSE;
77 _flare.takedamage = DAMAGE_YES;
78 _flare.event_damage = raptor_flare_damage;
80 _flare.tur_impacttime = time + autocvar_g_vehicle_raptor_flare_lifetime;
81 settouch(_flare, raptor_flare_touch);
83 weapon_thinkf(player, weaponentity, WFRAME_FIRE2, 0, w_ready);
88 void raptor_bomblet_boom(entity this)
90 RadiusDamage (self, self.realowner, autocvar_g_vehicle_raptor_bomblet_damage,
91 autocvar_g_vehicle_raptor_bomblet_edgedamage,
92 autocvar_g_vehicle_raptor_bomblet_radius, world, world,
93 autocvar_g_vehicle_raptor_bomblet_force, DEATH_VH_RAPT_BOMB.m_id, world);
97 void raptor_bomblet_touch(entity this)
99 if(other == self.owner)
102 PROJECTILE_TOUCH(this);
103 setthink(self, raptor_bomblet_boom);
104 self.nextthink = time + random() * autocvar_g_vehicle_raptor_bomblet_explode_delay;
107 void raptor_bomb_burst(entity this)
110 if(autocvar_g_vehicle_raptor_bomblet_alt)
112 self.nextthink = time;
113 traceline(self.origin, self.origin + (normalize(self.velocity) * autocvar_g_vehicle_raptor_bomblet_alt), MOVE_NORMAL, self);
114 if((trace_fraction == 1.0) || (vdist(self.origin - self.owner.origin, <, autocvar_g_vehicle_raptor_bomblet_radius)))
116 UpdateCSQCProjectile(self);
124 Damage_DamageInfo(self.origin, 0, 0, 0, '0 0 0', DEATH_VH_RAPT_FRAGMENT.m_id, 0, self);
126 for(i = 0; i < autocvar_g_vehicle_raptor_bomblets; ++i)
129 setorigin(bomblet, self.origin);
131 bomblet.movetype = MOVETYPE_TOSS;
132 settouch(bomblet, raptor_bomblet_touch);
133 setthink(bomblet, raptor_bomblet_boom);
134 bomblet.nextthink = time + 5;
135 bomblet.owner = self.owner;
136 bomblet.realowner = self.realowner;
137 bomblet.velocity = normalize(normalize(self.velocity) + (randomvec() * autocvar_g_vehicle_raptor_bomblet_spread)) * vlen(self.velocity);
139 PROJECTILE_MAKETRIGGER(bomblet);
140 CSQCProjectile(bomblet, true, PROJECTILE_RAPTORBOMBLET, true);
146 void raptor_bombdrop()
148 entity bomb_1, bomb_2;
153 vector org = gettaginfo(self, gettagindex(self, "bombmount_left"));
154 setorigin(bomb_1, org);
155 org = gettaginfo(self, gettagindex(self, "bombmount_right"));
156 setorigin(bomb_2, org);
158 bomb_1.movetype = bomb_2.movetype = MOVETYPE_BOUNCE;
159 bomb_1.velocity = bomb_2.velocity = self.velocity;
160 settouch(bomb_1, raptor_bomb_burst);
161 settouch(bomb_2, raptor_bomb_burst);
162 setthink(bomb_1, raptor_bomb_burst);
163 setthink(bomb_2, raptor_bomb_burst);
164 bomb_1.cnt = bomb_2.cnt = time + 10;
166 if(autocvar_g_vehicle_raptor_bomblet_alt)
167 bomb_1.nextthink = bomb_2.nextthink = time;
169 bomb_1.nextthink = bomb_2.nextthink = time + autocvar_g_vehicle_raptor_bomblet_time;
171 bomb_1.owner = bomb_2.owner = self;
172 bomb_1.realowner = bomb_2.realowner = self.owner;
173 bomb_1.solid = bomb_2.solid = SOLID_BBOX;
174 bomb_1.gravity = bomb_2.gravity = 1;
176 PROJECTILE_MAKETRIGGER(bomb_1);
177 PROJECTILE_MAKETRIGGER(bomb_2);
179 CSQCProjectile(bomb_1, true, PROJECTILE_RAPTORBOMB, true);
180 CSQCProjectile(bomb_2, true, PROJECTILE_RAPTORBOMB, true);
183 void raptor_flare_touch(entity this)
188 void raptor_flare_damage(entity this, entity inflictor, entity attacker, float damage, int deathtype, vector hitloc, vector force)
190 this.health -= damage;
195 void raptor_flare_think(entity this)
197 self.nextthink = time + 0.1;
198 entity _missile = findchainentity(enemy, self.owner);
201 if(_missile.flags & FL_PROJECTILE)
202 if(vdist(self.origin - _missile.origin, <, autocvar_g_vehicle_raptor_flare_range))
203 if(random() > autocvar_g_vehicle_raptor_flare_chase)
204 _missile.enemy = self;
205 _missile = _missile.chain;
208 if(self.tur_impacttime < time)
216 void RaptorCBShellfragDraw(entity this)
221 Movetype_Physics_MatchTicrate(this, autocvar_cl_gibs_ticrate, autocvar_cl_gibs_sloppy);
222 this.move_avelocity += randomvec() * 15;
223 this.renderflags = 0;
226 this.alpha = bound(0, this.nextthink - time, 1);
228 if(this.alpha < ALPHA_MIN_VISIBLE)
232 void RaptorCBShellfragToss(vector _org, vector _vel, vector _ang)
237 setmodel(sfrag, MDL_VEH_RAPTOR_CB_FRAGMENT);
238 setorigin(sfrag, _org);
240 sfrag.move_movetype = MOVETYPE_BOUNCE;
241 sfrag.gravity = 0.15;
242 sfrag.solid = SOLID_CORPSE;
244 sfrag.draw = RaptorCBShellfragDraw;
246 sfrag.move_origin = sfrag.origin = _org;
247 sfrag.move_velocity = _vel;
248 sfrag.move_avelocity = prandomvec() * vlen(sfrag.move_velocity);
249 sfrag.angles = self.move_angles = _ang;
251 sfrag.move_time = time;
252 sfrag.damageforcescale = 4;
254 sfrag.nextthink = time + 3;
255 sfrag.cnt = time + 2;
257 sfrag.drawmask = MASK_NORMAL;