#include "raptor_weapons.qh" #ifdef SVQC METHOD(RaptorCannon, wr_think, void(entity thiswep, entity actor, .entity weaponentity, int fire)) { bool isPlayer = IS_PLAYER(actor); entity player = isPlayer ? actor : actor.owner; entity veh = player.vehicle; // 1 [wait] 1 [wait] 2 [wait] 2 [wait] [wait] float t = autocvar_g_vehicle_raptor_cannon_refire * (1 + veh.misc_bulletcounter == 4); if (fire & 1) if (weapon_prepareattack(thiswep, player, weaponentity, false, t)) { if (isPlayer) W_SetupShot_Dir(player, weaponentity, v_forward, false, 0, SND_Null, CH_WEAPON_B, 0); vector org = w_shotorg; vector dir = w_shotdir; if (veh) { veh.misc_bulletcounter += 1; org = (veh.misc_bulletcounter <= 2) ? gettaginfo(veh.gun1, gettagindex(veh.gun1, "fire1")) : (((veh.misc_bulletcounter == 4) ? veh.misc_bulletcounter = 0 : 0), gettaginfo(veh.gun2, gettagindex(veh.gun2, "fire1"))); dir = v_forward; veh.vehicle_energy -= autocvar_g_vehicle_raptor_cannon_cost; actor.cnt = time; } vehicles_projectile(veh, EFFECT_RAPTOR_MUZZLEFLASH.eent_eff_name, SND_LASERGUN_FIRE, org, normalize(dir + randomvec() * autocvar_g_vehicle_raptor_cannon_spread) * autocvar_g_vehicle_raptor_cannon_speed, autocvar_g_vehicle_raptor_cannon_damage, autocvar_g_vehicle_raptor_cannon_radius, autocvar_g_vehicle_raptor_cannon_force, 0, DEATH_VH_RAPT_CANNON.m_id, PROJECTILE_RAPTORCANNON, 0, true, true, player); weapon_thinkf(player, weaponentity, WFRAME_FIRE1, 0, w_ready); } } METHOD(RaptorCannon, wr_checkammo1, bool(RacerAttack thiswep, entity actor, .entity weaponentity)) { bool isPlayer = IS_PLAYER(actor); entity player = isPlayer ? actor : actor.owner; entity veh = player.vehicle; return isPlayer || veh.vehicle_energy >= autocvar_g_vehicle_raptor_cannon_cost; } void raptor_bombdrop(entity this); METHOD(RaptorBomb, wr_think, void(entity thiswep, entity actor, .entity weaponentity, int fire)) { bool isPlayer = IS_PLAYER(actor); entity player = isPlayer ? actor : actor.owner; entity veh = player.vehicle; if (fire & 2) if (!isPlayer || weapon_prepareattack(thiswep, player, weaponentity, true, autocvar_g_vehicle_raptor_bombs_refire)) { entity e = (veh) ? veh : player; raptor_bombdrop(e); weapon_thinkf(player, weaponentity, WFRAME_FIRE2, 0, w_ready); } } void raptor_flare_think(entity this); void raptor_flare_damage(entity this, entity inflictor, entity attacker, float damage, int deathtype, vector hitloc, vector force); void raptor_flare_touch(entity this, entity toucher); METHOD(RaptorFlare, wr_think, void(entity thiswep, entity actor, .entity weaponentity, int fire)) { bool isPlayer = IS_PLAYER(actor); entity player = isPlayer ? actor : actor.owner; entity veh = player.vehicle; if (fire & 2) if (!isPlayer || weapon_prepareattack(thiswep, player, weaponentity, true, autocvar_g_vehicle_raptor_flare_refire)) { for(int i = 0; i < 3; ++i) { entity _flare = spawn(); setmodel(_flare, MDL_VEH_RAPTOR_FLARE); _flare.effects = EF_LOWPRECISION | EF_FLAME; _flare.scale = 0.5; setorigin(_flare, actor.origin - '0 0 16'); set_movetype(_flare, MOVETYPE_TOSS); _flare.gravity = 0.15; _flare.velocity = 0.25 * actor.velocity + (v_forward + randomvec() * 0.25)* -500; setthink(_flare, raptor_flare_think); _flare.nextthink = time; _flare.owner = veh ? veh : player; _flare.solid = SOLID_CORPSE; _flare.takedamage = DAMAGE_YES; _flare.event_damage = raptor_flare_damage; _flare.health = 20; _flare.tur_impacttime = time + autocvar_g_vehicle_raptor_flare_lifetime; settouch(_flare, raptor_flare_touch); } weapon_thinkf(player, weaponentity, WFRAME_FIRE2, 0, w_ready); } } void raptor_bomblet_boom(entity this) { RadiusDamage (this, this.realowner, autocvar_g_vehicle_raptor_bomblet_damage, autocvar_g_vehicle_raptor_bomblet_edgedamage, autocvar_g_vehicle_raptor_bomblet_radius, NULL, NULL, autocvar_g_vehicle_raptor_bomblet_force, DEATH_VH_RAPT_BOMB.m_id, NULL); delete(this); } void raptor_bomblet_touch(entity this, entity toucher) { if(toucher == this.owner) return; PROJECTILE_TOUCH(this, toucher); setthink(this, raptor_bomblet_boom); this.nextthink = time + random() * autocvar_g_vehicle_raptor_bomblet_explode_delay; } void raptor_bomb_burst(entity this) { if(this.cnt > time) if(autocvar_g_vehicle_raptor_bomblet_alt) { this.nextthink = time; traceline(this.origin, this.origin + (normalize(this.velocity) * autocvar_g_vehicle_raptor_bomblet_alt), MOVE_NORMAL, this); if((trace_fraction == 1.0) || (vdist(this.origin - this.owner.origin, <, autocvar_g_vehicle_raptor_bomblet_radius))) { UpdateCSQCProjectile(this); return; } } entity bomblet; float i; Damage_DamageInfo(this.origin, 0, 0, 0, '0 0 0', DEATH_VH_RAPT_FRAGMENT.m_id, 0, this); for(i = 0; i < autocvar_g_vehicle_raptor_bomblets; ++i) { bomblet = spawn(); setorigin(bomblet, this.origin); set_movetype(bomblet, MOVETYPE_TOSS); settouch(bomblet, raptor_bomblet_touch); setthink(bomblet, raptor_bomblet_boom); bomblet.nextthink = time + 5; bomblet.owner = this.owner; bomblet.realowner = this.realowner; bomblet.velocity = normalize(normalize(this.velocity) + (randomvec() * autocvar_g_vehicle_raptor_bomblet_spread)) * vlen(this.velocity); PROJECTILE_MAKETRIGGER(bomblet); CSQCProjectile(bomblet, true, PROJECTILE_RAPTORBOMBLET, true); } delete(this); } void raptor_bomb_touch(entity this, entity toucher) { raptor_bomb_burst(this); } void raptor_bombdrop(entity this) { entity bomb_1, bomb_2; bomb_1 = spawn(); bomb_2 = spawn(); vector org = gettaginfo(this, gettagindex(this, "bombmount_left")); setorigin(bomb_1, org); org = gettaginfo(this, gettagindex(this, "bombmount_right")); setorigin(bomb_2, org); set_movetype(bomb_1, MOVETYPE_BOUNCE); set_movetype(bomb_2, MOVETYPE_BOUNCE); bomb_1.velocity = bomb_2.velocity = this.velocity; settouch(bomb_1, raptor_bomb_touch); settouch(bomb_2, raptor_bomb_touch); setthink(bomb_1, raptor_bomb_burst); setthink(bomb_2, raptor_bomb_burst); bomb_1.cnt = bomb_2.cnt = time + 10; if(autocvar_g_vehicle_raptor_bomblet_alt) bomb_1.nextthink = bomb_2.nextthink = time; else bomb_1.nextthink = bomb_2.nextthink = time + autocvar_g_vehicle_raptor_bomblet_time; bomb_1.owner = bomb_2.owner = this; bomb_1.realowner = bomb_2.realowner = this.owner; bomb_1.solid = bomb_2.solid = SOLID_BBOX; bomb_1.gravity = bomb_2.gravity = 1; PROJECTILE_MAKETRIGGER(bomb_1); PROJECTILE_MAKETRIGGER(bomb_2); CSQCProjectile(bomb_1, true, PROJECTILE_RAPTORBOMB, true); CSQCProjectile(bomb_2, true, PROJECTILE_RAPTORBOMB, true); } void raptor_flare_touch(entity this, entity toucher) { delete(this); } void raptor_flare_damage(entity this, entity inflictor, entity attacker, float damage, int deathtype, vector hitloc, vector force) { this.health -= damage; if(this.health <= 0) delete(this); } void raptor_flare_think(entity this) { this.nextthink = time + 0.1; IL_EACH(g_projectiles, it.enemy == this.owner, { if(vdist(this.origin - it.origin, <, autocvar_g_vehicle_raptor_flare_range)) if(random() > autocvar_g_vehicle_raptor_flare_chase) it.enemy = this; }); if(this.tur_impacttime < time) delete(this); } #endif #ifdef CSQC void RaptorCBShellfragDraw(entity this) { if(wasfreed(this)) return; Movetype_Physics_MatchTicrate(this, autocvar_cl_gibs_ticrate, autocvar_cl_gibs_sloppy); this.avelocity += randomvec() * 15; this.renderflags = 0; if(this.cnt < time) this.alpha = bound(0, this.nextthink - time, 1); if(this.alpha < ALPHA_MIN_VISIBLE) delete(this); } void RaptorCBShellfragToss(vector _org, vector _vel, vector _ang) { entity sfrag = spawn(); setmodel(sfrag, MDL_VEH_RAPTOR_CB_FRAGMENT); setorigin(sfrag, _org); set_movetype(sfrag, MOVETYPE_BOUNCE); sfrag.gravity = 0.15; sfrag.solid = SOLID_CORPSE; sfrag.draw = RaptorCBShellfragDraw; IL_PUSH(g_drawables, sfrag); sfrag.velocity = _vel; sfrag.avelocity = prandomvec() * vlen(sfrag.velocity); sfrag.angles = _ang; sfrag.move_time = time; sfrag.damageforcescale = 4; sfrag.nextthink = time + 3; sfrag.cnt = time + 2; sfrag.alpha = 1; sfrag.drawmask = MASK_NORMAL; } #endif