X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fcommon%2Fmutators%2Fmutator%2Foverkill%2Fokshotgun.qc;h=da4c4749d04763e4fab32d8624e00ab11e1430d3;hb=b137896768ee22017cd43bf7614b8c01f99acd9c;hp=1e34e41a58f301f5bbdf59cc9992e374fa36ef1d;hpb=93828285050f4c7c88bec2a5aa12da41538e5075;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/common/mutators/mutator/overkill/okshotgun.qc b/qcsrc/common/mutators/mutator/overkill/okshotgun.qc index 1e34e41a5..da4c4749d 100644 --- a/qcsrc/common/mutators/mutator/overkill/okshotgun.qc +++ b/qcsrc/common/mutators/mutator/overkill/okshotgun.qc @@ -1,10 +1,6 @@ #include "okshotgun.qh" #ifdef SVQC -spawnfunc(weapon_okshotgun) { weapon_defaultspawnfunc(this, WEP_OVERKILL_SHOTGUN); } - -.float okshotgun_primarytime; - METHOD(OverkillShotgun, wr_aim, void(entity thiswep, entity actor, .entity weaponentity)) { if (vdist(actor.origin - actor.enemy.origin, >, WEP_CVAR_PRI(okshotgun, bot_range))) @@ -19,74 +15,69 @@ METHOD(OverkillShotgun, wr_aim, void(entity thiswep, entity actor, .entity weapo METHOD(OverkillShotgun, wr_think, void(entity thiswep, entity actor, .entity weaponentity, int fire)) { - if (WEP_CVAR(okshotgun, reload_ammo) && actor.(weaponentity).clip_load < WEP_CVAR_PRI(okshotgun, ammo)) // forced reload + if ((WEP_CVAR_SEC(okshotgun, refire_type) == 1) && (fire & 2) && (time >= actor.jump_interval)) + { + // Secondary uses it's own refire timer if refire_type is 1. + actor.jump_interval = time + WEP_CVAR_SEC(okshotgun, refire) * W_WeaponRateFactor(actor); + BLASTER_SECONDARY_ATTACK(okshotgun, actor, weaponentity); + if ((actor.(weaponentity).wframe == WFRAME_IDLE) || + (actor.(weaponentity).wframe == WFRAME_FIRE2)) + { + // Set secondary fire animation. + actor.(weaponentity).wframe = WFRAME_FIRE2; + FOREACH_CLIENT(true, LAMBDA( + if (it == actor || (IS_SPEC(it) && it.enemy == actor)) + { + wframe_send(it, actor.(weaponentity), WFRAME_FIRE2, g_weaponratefactor, true); + } + )); + animdecide_setaction(actor, ANIMACTION_SHOOT, true); + } + } + if (WEP_CVAR(okshotgun, reload_ammo) && actor.(weaponentity).clip_load < WEP_CVAR_PRI(okshotgun, ammo)) { + // Forced reload thiswep.wr_reload(thiswep, actor, weaponentity); return; } if (fire & 1) // Primary attack { - if (time >= actor.(weaponentity).okshotgun_primarytime) // handle refire separately so the secondary can be fired straight after a primary + if (!weapon_prepareattack(thiswep, actor, weaponentity, false, WEP_CVAR_PRI(okshotgun, refire))) { - if (weapon_prepareattack(thiswep, actor, weaponentity, false, WEP_CVAR_PRI(okshotgun, animtime))) - { - W_Shotgun_Attack(thiswep, actor, weaponentity, true, - WEP_CVAR_PRI(okshotgun, ammo), - WEP_CVAR_PRI(okshotgun, damage), - WEP_CVAR_PRI(okshotgun, bullets), - WEP_CVAR_PRI(okshotgun, spread), - WEP_CVAR_PRI(okshotgun, solidpenetration), - WEP_CVAR_PRI(okshotgun, force)); - actor.(weaponentity).okshotgun_primarytime = time + WEP_CVAR_PRI(okshotgun, refire) * W_WeaponRateFactor(actor); - weapon_thinkf(actor, weaponentity, WFRAME_FIRE1, WEP_CVAR_PRI(okshotgun, animtime), w_ready); - } + return; } + W_Shotgun_Attack(thiswep, actor, weaponentity, true, + WEP_CVAR_PRI(okshotgun, ammo), + WEP_CVAR_PRI(okshotgun, damage), + WEP_CVAR_PRI(okshotgun, bullets), + WEP_CVAR_PRI(okshotgun, spread), + WEP_CVAR_PRI(okshotgun, solidpenetration), + WEP_CVAR_PRI(okshotgun, force), + EFFECT_RIFLE_WEAK); + weapon_thinkf(actor, weaponentity, WFRAME_FIRE1, WEP_CVAR_PRI(okshotgun, animtime), w_ready); + return; } - else if (fire & 2) // Secondary attack + if ((fire & 2) && (WEP_CVAR_SEC(okshotgun, refire_type) == 0)) // Secondary attack { if (!weapon_prepareattack(thiswep, actor, weaponentity, false, WEP_CVAR_SEC(okshotgun, refire))) { return; } - // ugly instagib hack to reuse the fire mode of the laser - makevectors(actor.v_angle); - Weapon oldwep = actor.(weaponentity).m_weapon; // we can't avoid this hack - actor.(weaponentity).m_weapon = WEP_BLASTER; - W_Blaster_Attack( - actor, - weaponentity, - WEP_BLASTER.m_id | HITTYPE_SECONDARY, - WEP_CVAR_SEC(okshotgun, shotangle), - WEP_CVAR_SEC(okshotgun, damage), - WEP_CVAR_SEC(okshotgun, edgedamage), - WEP_CVAR_SEC(okshotgun, radius), - WEP_CVAR_SEC(okshotgun, force), - WEP_CVAR_SEC(okshotgun, speed), - WEP_CVAR_SEC(okshotgun, spread), - WEP_CVAR_SEC(okshotgun, delay), - WEP_CVAR_SEC(okshotgun, lifetime) - ); - actor.(weaponentity).m_weapon = oldwep; + BLASTER_SECONDARY_ATTACK(okshotgun, actor, weaponentity); weapon_thinkf(actor, weaponentity, WFRAME_FIRE2, WEP_CVAR_SEC(okshotgun, animtime), w_ready); } } METHOD(OverkillShotgun, wr_checkammo1, bool(entity thiswep, entity actor, .entity weaponentity)) { - float ammo_amount = actor.(thiswep.ammo_field) >= WEP_CVAR_PRI(okshotgun, ammo); + float ammo_amount = GetResource(actor, thiswep.ammo_type) >= WEP_CVAR_PRI(okshotgun, ammo); ammo_amount += actor.(weaponentity).(weapon_load[WEP_OVERKILL_SHOTGUN.m_id]) >= WEP_CVAR_PRI(okshotgun, ammo); return ammo_amount; } METHOD(OverkillShotgun, wr_checkammo2, bool(entity thiswep, entity actor, .entity weaponentity)) { - if (WEP_CVAR_SEC(okshotgun, ammo) == 0) - { - return true; - } - float ammo_amount = actor.(thiswep.ammo_field) >= WEP_CVAR_SEC(okshotgun, ammo); - ammo_amount += actor.(weaponentity).(weapon_load[WEP_OVERKILL_SHOTGUN.m_id]) >= WEP_CVAR_SEC(okshotgun, ammo); - return ammo_amount; + return true; // Blaster secondary is unlimited. } METHOD(OverkillShotgun, wr_reload, void(entity thiswep, entity actor, .entity weaponentity)) @@ -101,10 +92,7 @@ METHOD(OverkillShotgun, wr_suicidemessage, Notification(entity thiswep)) METHOD(OverkillShotgun, wr_killmessage, Notification(entity thiswep)) { - if(w_deathtype & HITTYPE_SECONDARY) - return WEAPON_BLASTER_MURDER; - else - return WEAPON_SHOTGUN_MURDER; + return WEAPON_OVERKILL_SHOTGUN_MURDER; } #endif