}
}
- int theframe = WFRAME_FIRE1;
+void W_Hagar_Attack_Auto(Weapon thiswep, entity actor, .entity weaponentity, int fire)
+{
+ if(!(fire & 1) || actor.hagar_load || actor.hagar_loadblock)
+ {
+ w_ready(thiswep, actor, weaponentity, fire);
+ return;
+ }
+
+ if(!thiswep.wr_checkammo1(thiswep))
+ if(!(actor.items & IT_UNLIMITED_WEAPON_AMMO))
+ {
+ W_SwitchWeapon_Force(actor, w_getbestweapon(actor));
+ w_ready(thiswep, actor, weaponentity, fire);
+ return;
+ }
+
+ W_Hagar_Attack(thiswep);
+
+ int slot = weaponslot(weaponentity);
- METHOD(Hagar, wr_aim, void(entity thiswep))
- {
- if(random()>0.15)
- self.BUTTON_ATCK = bot_aim(WEP_CVAR_PRI(hagar, speed), 0, WEP_CVAR_PRI(hagar, lifetime), false);
- else // not using secondary_speed since these are only 15% and should cause some ricochets without re-aiming
- self.BUTTON_ATCK2 = bot_aim(WEP_CVAR_PRI(hagar, speed), 0, WEP_CVAR_PRI(hagar, lifetime), false);
- }
- METHOD(Hagar, wr_think, void(entity thiswep, entity actor, .entity weaponentity, int fire))
- {
- float loadable_secondary;
- loadable_secondary = (WEP_CVAR_SEC(hagar, load) && WEP_CVAR(hagar, secondary));
-
- if(loadable_secondary)
- W_Hagar_Attack2_Load(thiswep, weaponentity); // must always run each frame
- if(autocvar_g_balance_hagar_reload_ammo && actor.clip_load < min(WEP_CVAR_PRI(hagar, ammo), WEP_CVAR_SEC(hagar, ammo))) { // forced reload
- thiswep.wr_reload(thiswep, actor, weaponentity);
- } else if((fire & 1) && !actor.hagar_load && !actor.hagar_loadblock) // not while secondary is loaded or awaiting reset
- {
- if(weapon_prepareattack(thiswep, actor, weaponentity, false, 0))
- W_Hagar_Attack_Auto(thiswep, actor, weaponentity, fire);
- }
- else if((fire & 2) && !loadable_secondary && WEP_CVAR(hagar, secondary))
- {
- if(weapon_prepareattack(thiswep, actor, weaponentity, true, WEP_CVAR_SEC(hagar, refire)))
- {
- W_Hagar_Attack2(thiswep);
- weapon_thinkf(actor, weaponentity, WFRAME_FIRE2, WEP_CVAR_SEC(hagar, refire), w_ready);
- }
- }
- }
- METHOD(Hagar, wr_gonethink, void(entity thiswep))
- {
- // we lost the weapon and want to prepare switching away
- if(self.hagar_load)
- {
- .entity weaponentity = weaponentities[0]; // TODO: unhardcode
- self.(weaponentity).state = WS_READY;
- W_Hagar_Attack2_Load_Release(weaponentity);
- }
- }
- METHOD(Hagar, wr_setup, void(entity thiswep))
- {
- self.hagar_loadblock = false;
-
- if(self.hagar_load)
- {
- W_DecreaseAmmo(thiswep, self, WEP_CVAR_SEC(hagar, ammo) * self.hagar_load * -1); // give back ammo if necessary
- self.hagar_load = 0;
- }
- }
- METHOD(Hagar, wr_checkammo1, bool(entity thiswep))
- {
- float ammo_amount = self.(thiswep.ammo_field) >= WEP_CVAR_PRI(hagar, ammo);
- ammo_amount += self.(weapon_load[WEP_HAGAR.m_id]) >= WEP_CVAR_PRI(hagar, ammo);
- return ammo_amount;
- }
- METHOD(Hagar, wr_checkammo2, bool(entity thiswep))
- {
- float ammo_amount = self.(thiswep.ammo_field) >= WEP_CVAR_SEC(hagar, ammo);
- ammo_amount += self.(weapon_load[WEP_HAGAR.m_id]) >= WEP_CVAR_SEC(hagar, ammo);
- return ammo_amount;
- }
- METHOD(Hagar, wr_resetplayer, void(entity thiswep))
- {
- self.hagar_load = 0;
- }
- METHOD(Hagar, wr_playerdeath, void(entity thiswep))
- {
- .entity weaponentity = weaponentities[0]; // TODO: unhardcode
- // if we have any rockets loaded when we die, release them
- if(self.hagar_load && WEP_CVAR_SEC(hagar, load_releasedeath))
- W_Hagar_Attack2_Load_Release(weaponentity);
- }
- METHOD(Hagar, wr_reload, void(entity thiswep, entity actor, .entity weaponentity))
- {
- if(!self.hagar_load) // require releasing loaded rockets first
- W_Reload(self, min(WEP_CVAR_PRI(hagar, ammo), WEP_CVAR_SEC(hagar, ammo)), SND(RELOAD));
- }
- METHOD(Hagar, wr_suicidemessage, int(entity thiswep))
- {
- return WEAPON_HAGAR_SUICIDE;
- }
- METHOD(Hagar, wr_killmessage, int(entity thiswep))
- {
- if(w_deathtype & HITTYPE_SECONDARY)
- return WEAPON_HAGAR_MURDER_BURST;
- else
- return WEAPON_HAGAR_MURDER_SPRAY;
- }
+ ATTACK_FINISHED(actor, slot) = time + WEP_CVAR_PRI(hagar, refire) * W_WeaponRateFactor();
++ int theframe = WFRAME_FIRE1;
+ entity this = actor.(weaponentity);
+ if(this)
+ {
+ if(this.wframe == WFRAME_FIRE1)
+ theframe = WFRAME_DONTCHANGE;
+ }
+ weapon_thinkf(actor, weaponentity, theframe, WEP_CVAR_PRI(hagar, refire), W_Hagar_Attack_Auto);
+}
+
- } else if((fire & 1) && !actor.hagar_load && !actor.hagar_loadblock) // not while secondary is loaded or awaiting reset
- {
- if(weapon_prepareattack(thiswep, actor, weaponentity, false, WEP_CVAR_PRI(hagar, refire)))
- {
- W_Hagar_Attack(thiswep);
- weapon_thinkf(actor, weaponentity, WFRAME_FIRE1, WEP_CVAR_PRI(hagar, refire), w_ready);
- }
+ METHOD(Hagar, wr_aim, void(entity thiswep))
+ {
+ SELFPARAM();
+ if(random()>0.15)
+ PHYS_INPUT_BUTTON_ATCK(self) = bot_aim(self, WEP_CVAR_PRI(hagar, speed), 0, WEP_CVAR_PRI(hagar, lifetime), false);
+ else // not using secondary_speed since these are only 15% and should cause some ricochets without re-aiming
+ PHYS_INPUT_BUTTON_ATCK2(self) = bot_aim(self, WEP_CVAR_PRI(hagar, speed), 0, WEP_CVAR_PRI(hagar, lifetime), false);
+ }
+ METHOD(Hagar, wr_think, void(entity thiswep, entity actor, .entity weaponentity, int fire))
+ {
+ float loadable_secondary;
+ loadable_secondary = (WEP_CVAR_SEC(hagar, load) && WEP_CVAR(hagar, secondary));
+
+ if(loadable_secondary)
+ W_Hagar_Attack2_Load(thiswep, weaponentity); // must always run each frame
+ if(autocvar_g_balance_hagar_reload_ammo && actor.clip_load < min(WEP_CVAR_PRI(hagar, ammo), WEP_CVAR_SEC(hagar, ammo))) { // forced reload
+ thiswep.wr_reload(thiswep, actor, weaponentity);
+ }
++ else if((fire & 1) && !actor.hagar_load && !actor.hagar_loadblock) // not while secondary is loaded or awaiting reset
++ {
++ if(weapon_prepareattack(thiswep, actor, weaponentity, false, 0))
++ W_Hagar_Attack_Auto(thiswep, actor, weaponentity, fire);
++ }
+ else if((fire & 2) && !loadable_secondary && WEP_CVAR(hagar, secondary))
+ {
+ if(weapon_prepareattack(thiswep, actor, weaponentity, true, WEP_CVAR_SEC(hagar, refire)))
+ {
+ W_Hagar_Attack2(thiswep);
+ weapon_thinkf(actor, weaponentity, WFRAME_FIRE2, WEP_CVAR_SEC(hagar, refire), w_ready);
+ }
+ }
+ }
+ METHOD(Hagar, wr_gonethink, void(entity thiswep))
+ {
+ SELFPARAM();
+ // we lost the weapon and want to prepare switching away
+ if(self.hagar_load)
+ {
+ .entity weaponentity = weaponentities[0]; // TODO: unhardcode
+ self.(weaponentity).state = WS_READY;
+ W_Hagar_Attack2_Load_Release(weaponentity);
+ }
+ }
+ METHOD(Hagar, wr_setup, void(entity thiswep))
+ {
+ SELFPARAM();
+ self.hagar_loadblock = false;
+
+ if(self.hagar_load)
+ {
+ W_DecreaseAmmo(thiswep, self, WEP_CVAR_SEC(hagar, ammo) * self.hagar_load * -1); // give back ammo if necessary
+ self.hagar_load = 0;
+ }
+ }
+ METHOD(Hagar, wr_checkammo1, bool(entity thiswep))
+ {
+ SELFPARAM();
+ float ammo_amount = self.(thiswep.ammo_field) >= WEP_CVAR_PRI(hagar, ammo);
+ ammo_amount += self.(weapon_load[WEP_HAGAR.m_id]) >= WEP_CVAR_PRI(hagar, ammo);
+ return ammo_amount;
+ }
+ METHOD(Hagar, wr_checkammo2, bool(entity thiswep))
+ {
+ SELFPARAM();
+ float ammo_amount = self.(thiswep.ammo_field) >= WEP_CVAR_SEC(hagar, ammo);
+ ammo_amount += self.(weapon_load[WEP_HAGAR.m_id]) >= WEP_CVAR_SEC(hagar, ammo);
+ return ammo_amount;
+ }
+ METHOD(Hagar, wr_resetplayer, void(entity thiswep))
+ {
+ SELFPARAM();
+ self.hagar_load = 0;
+ }
+ METHOD(Hagar, wr_playerdeath, void(entity thiswep))
+ {
+ SELFPARAM();
+ .entity weaponentity = weaponentities[0]; // TODO: unhardcode
+ // if we have any rockets loaded when we die, release them
+ if(self.hagar_load && WEP_CVAR_SEC(hagar, load_releasedeath))
+ W_Hagar_Attack2_Load_Release(weaponentity);
+ }
+ METHOD(Hagar, wr_reload, void(entity thiswep, entity actor, .entity weaponentity))
+ {
+ SELFPARAM();
+ if(!self.hagar_load) // require releasing loaded rockets first
+ W_Reload(self, min(WEP_CVAR_PRI(hagar, ammo), WEP_CVAR_SEC(hagar, ammo)), SND_RELOAD);
+ }
+ METHOD(Hagar, wr_suicidemessage, Notification(entity thiswep))
+ {
+ return WEAPON_HAGAR_SUICIDE;
+ }
+ METHOD(Hagar, wr_killmessage, Notification(entity thiswep))
+ {
+ if(w_deathtype & HITTYPE_SECONDARY)
+ return WEAPON_HAGAR_MURDER_BURST;
+ else
+ return WEAPON_HAGAR_MURDER_SPRAY;
+ }
#endif
#ifdef CSQC