set g_balance_arc_bolt_bounce_count 0
set g_balance_arc_bolt_bounce_damage 0
set g_balance_arc_bolt_bounce_lifetime 0
+set g_balance_arc_bolt_count 1
set g_balance_arc_bolt_damage 25
set g_balance_arc_bolt_damageforcescale 0
set g_balance_arc_bolt_edgedamage 12.5
set g_balance_arc_bolt_lifetime 5
set g_balance_arc_bolt_radius 65
set g_balance_arc_bolt_refire 0.16667
+set g_balance_arc_bolt_refire2 0.16667
set g_balance_arc_bolt_speed 2300
set g_balance_arc_bolt_spread 0
set g_balance_arc_burst_ammo 15
set g_balance_arc_bolt_bounce_count 0
set g_balance_arc_bolt_bounce_damage 0
set g_balance_arc_bolt_bounce_lifetime 0
+set g_balance_arc_bolt_count 1
set g_balance_arc_bolt_damage 25
set g_balance_arc_bolt_damageforcescale 0
set g_balance_arc_bolt_edgedamage 12.5
set g_balance_arc_bolt_lifetime 5
set g_balance_arc_bolt_radius 65
set g_balance_arc_bolt_refire 0.16667
+set g_balance_arc_bolt_refire2 0.16667
set g_balance_arc_bolt_speed 2200
set g_balance_arc_bolt_spread 0.03
set g_balance_arc_burst_ammo 15
set g_balance_arc_bolt_bounce_count 0
set g_balance_arc_bolt_bounce_damage 0
set g_balance_arc_bolt_bounce_lifetime 0
+set g_balance_arc_bolt_count 1
set g_balance_arc_bolt_damage 25
set g_balance_arc_bolt_damageforcescale 0
set g_balance_arc_bolt_edgedamage 12.5
set g_balance_arc_bolt_lifetime 5
set g_balance_arc_bolt_radius 65
set g_balance_arc_bolt_refire 0.16667
+set g_balance_arc_bolt_refire2 0.16667
set g_balance_arc_bolt_speed 2200
set g_balance_arc_bolt_spread 0.03
set g_balance_arc_burst_ammo 0
set g_balance_arc_bolt_bounce_count 0
set g_balance_arc_bolt_bounce_damage 0
set g_balance_arc_bolt_bounce_lifetime 0
+set g_balance_arc_bolt_count 1
set g_balance_arc_bolt_damage 25
set g_balance_arc_bolt_damageforcescale 0
set g_balance_arc_bolt_edgedamage 12.5
set g_balance_arc_bolt_lifetime 5
set g_balance_arc_bolt_radius 65
set g_balance_arc_bolt_refire 0.033333
+set g_balance_arc_bolt_refire2 0.03333
set g_balance_arc_bolt_speed 2300
set g_balance_arc_bolt_spread 0
set g_balance_arc_burst_ammo 15
set g_balance_arc_bolt_bounce_count 0
set g_balance_arc_bolt_bounce_damage 0
set g_balance_arc_bolt_bounce_lifetime 0
+set g_balance_arc_bolt_count 1
set g_balance_arc_bolt_damage 25
set g_balance_arc_bolt_damageforcescale 0
set g_balance_arc_bolt_edgedamage 12.5
set g_balance_arc_bolt_lifetime 5
set g_balance_arc_bolt_radius 65
set g_balance_arc_bolt_refire 0.16667
+set g_balance_arc_bolt_refire2 0.16667
set g_balance_arc_bolt_speed 2300
set g_balance_arc_bolt_spread 0
set g_balance_arc_burst_ammo 15
}
}
-void W_Arc_Attack_Bolt(Weapon thiswep, entity actor, .entity weaponentity)
+void W_Arc_Attack_Bolt(Weapon thiswep, entity actor, .entity weaponentity, int fire)
{
- entity missile;
-
- W_DecreaseAmmo(thiswep, actor, WEP_CVAR(arc, bolt_ammo), weaponentity);
-
W_SetupShot(actor, weaponentity, false, 2, SND_ELECTRO_FIRE2, CH_WEAPON_A, WEP_CVAR(arc, bolt_damage), thiswep.m_id | HITTYPE_SECONDARY);
W_MuzzleFlash(thiswep, actor, weaponentity, w_shotorg, w_shotdir);
- missile = new(missile);
+ entity missile = new(missile);
missile.owner = missile.realowner = actor;
missile.bot_dodge = true;
IL_PUSH(g_bot_dodge, missile);
CSQCProjectile(missile, true, PROJECTILE_ARC_BOLT, true);
MUTATOR_CALLHOOK(EditProjectile, actor, missile);
+
+ actor.(weaponentity).misc_bulletcounter = actor.(weaponentity).misc_bulletcounter + 1;
+ if(actor.(weaponentity).misc_bulletcounter == 0)
+ {
+ ATTACK_FINISHED(actor, weaponentity) = time + WEP_CVAR(arc, bolt_refire2) * W_WeaponRateFactor(actor);
+ weapon_thinkf(actor, weaponentity, WFRAME_FIRE1, WEP_CVAR(arc, bolt_refire), w_ready);
+ }
+ else
+ {
+ weapon_thinkf(actor, weaponentity, WFRAME_FIRE1, WEP_CVAR(arc, bolt_refire), W_Arc_Attack_Bolt);
+ }
}
void W_Arc_Beam_Think(entity this)
}
else if(fire & 2)
{
- if(weapon_prepareattack(thiswep, actor, weaponentity, true, WEP_CVAR(arc, bolt_refire)))
+ if(weapon_prepareattack(thiswep, actor, weaponentity, true, 0))
{
- W_Arc_Attack_Bolt(thiswep, actor, weaponentity);
- weapon_thinkf(actor, weaponentity, WFRAME_FIRE1, WEP_CVAR(arc, bolt_refire), w_ready);
+ if(!thiswep.wr_checkammo2(thiswep, actor, weaponentity))
+ if(!(actor.items & IT_UNLIMITED_AMMO))
+ {
+ W_SwitchWeapon_Force(actor, w_getbestweapon(actor, weaponentity), weaponentity);
+ w_ready(thiswep, actor, weaponentity, fire);
+ return;
+ }
+ float ammo_available = GetResource(actor, thiswep.ammo_type);
+ // We don't want to shoot 3 rounds if there's 2 left in the mag, so we'll use a fraction.
+ // Also keep the fraction <= 1 otherwise we'd mag dump in one burst.
+ float burst_fraction = min(1, ammo_available / WEP_CVAR(arc, bolt_ammo));
+ int to_shoot = floor(WEP_CVAR(arc, bolt_count) * burst_fraction);
+
+ // We also don't want to use 3 rounds if there's only 2 left.
+ int to_use = min(WEP_CVAR(arc, bolt_ammo), ammo_available);
+ W_DecreaseAmmo(thiswep, actor, to_use, weaponentity);
+
+ // Bursting counts up to 0 from a negative.
+ actor.(weaponentity).misc_bulletcounter = -to_shoot;
+ W_Arc_Attack_Bolt(thiswep, actor, weaponentity, fire);
}
}
P(class, prefix, bolt_bounce_count, float, NONE) \
P(class, prefix, bolt_bounce_damage, float, NONE) \
P(class, prefix, bolt_bounce_lifetime, float, NONE) \
+ P(class, prefix, bolt_count, float, NONE) \
P(class, prefix, bolt_damageforcescale, float, NONE) \
P(class, prefix, bolt_damage, float, NONE) \
P(class, prefix, bolt_edgedamage, float, NONE) \
P(class, prefix, bolt_lifetime, float, NONE) \
P(class, prefix, bolt_radius, float, NONE) \
P(class, prefix, bolt_refire, float, NONE) \
+ P(class, prefix, bolt_refire2, float, NONE) \
P(class, prefix, bolt_speed, float, NONE) \
P(class, prefix, bolt_spread, float, NONE) \
P(class, prefix, beam_ammo, float, NONE) \
alias test_rocket_flying "settemp g_balance_devastator_remote_jump 1"
alias test_arc_bounce "settemp g_balance_arc_bolt_bounce_count 3 ; settemp g_balance_arc_bolt_bounce_lifetime 0.5 ; settemp g_balance_arc_bolt_bounce_damage 1 ; settemp g_balance_arc_bolt_ammo 2"
+alias test_arc_bounce_burst "settemp g_balance_arc_bolt_bounce_count 3 ; settemp g_balance_arc_bolt_bounce_lifetime 0.5 ; settemp g_balance_arc_bolt_bounce_damage 1 ; settemp g_balance_arc_bolt_ammo 3 ; settemp g_balance_arc_bolt_refire2 0.33333 ; settemp g_balance_arc_bolt_count 3"
// https://forums.xonotic.org/showthread.php?tid=8192
// https://gitlab.com/xonotic/xonotic-data.pk3dir/merge_requests/736
alias test_ctf_stalemate90 "settemp g_ctf_stalemate_time 90"
alias test_ctf_stalemate120 "settemp g_ctf_stalemate_time 120"
-alias testing_enable "addvote test_blaster_switch ; addvote test_crylink_sec_horizontal ; addvote test_rocket_flying ; addvote test_ctf_stalemate90 ; addvote test_ctf_stalemate120 ; addvote test_arc_bounce"
-alias testing_disable "delvote test_blaster_switch ; delvote test_crylink_sec_horizontal ; delvote test_rocket_flying ; delvote test_ctf_stalemate90 ; delvote test_ctf_stalemate120 ; delvote test_arc_bounce"
+alias testing_enable "addvote test_blaster_switch ; addvote test_crylink_sec_horizontal ; addvote test_rocket_flying ; addvote test_ctf_stalemate90 ; addvote test_ctf_stalemate120 ; addvote test_arc_bounce ; addvote test_arc_bounce_burst"
+alias testing_disable "delvote test_blaster_switch ; delvote test_crylink_sec_horizontal ; delvote test_rocket_flying ; delvote test_ctf_stalemate90 ; delvote test_ctf_stalemate120 ; delvote test_arc_bounce ; delvote test_arc_bounce_burst"