- METHOD(Crylink, wr_aim, void(entity thiswep))
- {
- SELFPARAM();
- if(random() < 0.10)
- self.BUTTON_ATCK = bot_aim(WEP_CVAR_PRI(crylink, speed), 0, WEP_CVAR_PRI(crylink, middle_lifetime), false);
- else
- self.BUTTON_ATCK2 = bot_aim(WEP_CVAR_SEC(crylink, speed), 0, WEP_CVAR_SEC(crylink, middle_lifetime), false);
- }
- METHOD(Crylink, wr_think, void(entity thiswep, entity actor, .entity weaponentity, int fire))
- {
- if(autocvar_g_balance_crylink_reload_ammo && actor.clip_load < min(WEP_CVAR_PRI(crylink, ammo), WEP_CVAR_SEC(crylink, ammo))) { // forced reload
- thiswep.wr_reload(thiswep, actor, weaponentity);
- }
-
- if(fire & 1)
- {
- if(actor.crylink_waitrelease != 1)
- if(weapon_prepareattack(thiswep, actor, weaponentity, false, WEP_CVAR_PRI(crylink, refire)))
- {
- W_Crylink_Attack(thiswep);
- weapon_thinkf(actor, weaponentity, WFRAME_FIRE1, WEP_CVAR_PRI(crylink, animtime), w_ready);
- }
- }
+METHOD(Crylink, wr_aim, void(entity thiswep, entity actor))
+{
+ if(random() < 0.10)
+ PHYS_INPUT_BUTTON_ATCK(actor) = bot_aim(actor, WEP_CVAR_PRI(crylink, speed), 0, WEP_CVAR_PRI(crylink, middle_lifetime), false);
+ else
+ PHYS_INPUT_BUTTON_ATCK2(actor) = bot_aim(actor, WEP_CVAR_SEC(crylink, speed), 0, WEP_CVAR_SEC(crylink, middle_lifetime), false);
+}
+METHOD(Crylink, wr_think, void(entity thiswep, entity actor, .entity weaponentity, int fire))
+{
+ if(autocvar_g_balance_crylink_reload_ammo && actor.clip_load < min(WEP_CVAR_PRI(crylink, ammo), WEP_CVAR_SEC(crylink, ammo))) { // forced reload
+ thiswep.wr_reload(thiswep, actor, weaponentity);
+ }
+
+ if(fire & 1)
+ {
+ if(actor.crylink_waitrelease != 1)
+ if(weapon_prepareattack(thiswep, actor, weaponentity, false, WEP_CVAR_PRI(crylink, refire)))
+ {
+ W_Crylink_Attack(thiswep, actor);
+ weapon_thinkf(actor, weaponentity, WFRAME_FIRE1, WEP_CVAR_PRI(crylink, animtime), w_ready);
+ }
+ }
+
+ if((fire & 2) && autocvar_g_balance_crylink_secondary)
+ {
+ if(actor.crylink_waitrelease != 2)
+ if(weapon_prepareattack(thiswep, actor, weaponentity, true, WEP_CVAR_SEC(crylink, refire)))
+ {
+ W_Crylink_Attack2(thiswep, actor);
+ weapon_thinkf(actor, weaponentity, WFRAME_FIRE2, WEP_CVAR_SEC(crylink, animtime), w_ready);
+ }
+ }
+
+ if((actor.crylink_waitrelease == 1 && !(fire & 1)) || (actor.crylink_waitrelease == 2 && !(fire & 2)))
+ {
+ if(!actor.crylink_lastgroup || time > actor.crylink_lastgroup.teleport_time)
+ {
+ // fired and released now!
+ if(actor.crylink_lastgroup)
+ {
+ vector pos;
+ entity linkjoineffect;
+ float isprimary = (actor.crylink_waitrelease == 1);
+
+ pos = W_Crylink_LinkJoin(actor.crylink_lastgroup, WEP_CVAR_BOTH(crylink, isprimary, joinspread) * WEP_CVAR_BOTH(crylink, isprimary, speed));
+
+ linkjoineffect = new(linkjoineffect);
+ setthink(linkjoineffect, W_Crylink_LinkJoinEffect_Think);
+ linkjoineffect.nextthink = time + w_crylink_linkjoin_time;
+ linkjoineffect.owner = actor;
+ setorigin(linkjoineffect, pos);
+ }
+ actor.crylink_waitrelease = 0;
+ if(!thiswep.wr_checkammo1(thiswep, actor) && !thiswep.wr_checkammo2(thiswep, actor))
+ if(!(actor.items & IT_UNLIMITED_WEAPON_AMMO))
+ {
+ // ran out of ammo!
+ actor.cnt = WEP_CRYLINK.m_id;
+ PS(actor).m_switchweapon = w_getbestweapon(actor);
+ }
+ }
+ }
+}
+METHOD(Crylink, wr_checkammo1, bool(entity thiswep, entity actor))
+{
+ // don't "run out of ammo" and switch weapons while waiting for release
+ if(actor.crylink_lastgroup && actor.crylink_waitrelease)
+ return true;