set g_balance_arc_beam_tightness 0.6
set g_balance_arc_bolt 1
set g_balance_arc_bolt_ammo 1
+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_damage 25
set g_balance_arc_bolt_damageforcescale 0
set g_balance_arc_bolt_edgedamage 12.5
set g_balance_arc_beam_tightness 0.5
set g_balance_arc_bolt 0
set g_balance_arc_bolt_ammo 1
+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_damage 25
set g_balance_arc_bolt_damageforcescale 0
set g_balance_arc_bolt_edgedamage 12.5
set g_balance_arc_beam_tightness 0.5
set g_balance_arc_bolt 0
set g_balance_arc_bolt_ammo 1
+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_damage 25
set g_balance_arc_bolt_damageforcescale 0
set g_balance_arc_bolt_edgedamage 12.5
set g_balance_arc_beam_tightness 0.5
set g_balance_arc_bolt 1
set g_balance_arc_bolt_ammo 1
+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_damage 25
set g_balance_arc_bolt_damageforcescale 0
set g_balance_arc_bolt_edgedamage 12.5
set g_balance_arc_beam_tightness 0.6
set g_balance_arc_bolt 1
set g_balance_arc_bolt_ammo 1
+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_damage 25
set g_balance_arc_bolt_damageforcescale 0
set g_balance_arc_bolt_edgedamage 12.5
HANDLE(GRENADE_BOUNCING) this.traileffect = EFFECT_TR_GRENADE.m_id; break;
HANDLE(MINE) this.traileffect = EFFECT_TR_GRENADE.m_id; break;
HANDLE(BLASTER) this.traileffect = EFFECT_Null.m_id; break;
- HANDLE(ARC_BOLT) this.traileffect = EFFECT_Null.m_id; break;
+ HANDLE(ARC_BOLT) this.traileffect = EFFECT_TR_WIZSPIKE.m_id; break;
HANDLE(HLAC) this.traileffect = EFFECT_Null.m_id; break;
HANDLE(PORTO_RED) this.traileffect = EFFECT_TR_WIZSPIKE.m_id; this.scale = 4; break;
HANDLE(PORTO_BLUE) this.traileffect = EFFECT_TR_WIZSPIKE.m_id; this.scale = 4; break;
this.mins = '-4 -4 -4';
this.maxs = '4 4 4';
break;
+ case PROJECTILE_ARC_BOLT:
+ set_movetype(this, MOVETYPE_BOUNCE);
+ settouch(this, func_null);
+ break;
case PROJECTILE_RAPTORBOMB:
this.mins = '-3 -3 -3';
this.maxs = '3 3 3';
EFFECT(0, SMOKE_LARGE, "smoke_large")
-EFFECT(0, ARC_MUZZLEFLASH, "arc_muzzleflash")
+EFFECT(0, ARC_MUZZLEFLASH, "electro_muzzleflash")
EFFECT(0, BLASTER_IMPACT, "laser_impact")
EFFECT(0, BLASTER_MUZZLEFLASH, "laser_muzzleflash")
EFFECT(0, ARC_BEAM_HEAL, "arc_beam_heal")
EFFECT(0, ARC_BEAM_HEAL_IMPACT, "arc_beam_healimpact")
EFFECT(0, ARC_BEAM_HEAL_IMPACT2, "healray_impact")
-EFFECT(0, ARC_BOLT_EXPLODE, "arc_bolt_explode")
EFFECT(0, ARC_OVERHEAT, "arc_overheat")
EFFECT(0, ARC_OVERHEAT_FIRE, "arc_overheat_fire")
EFFECT(0, ARC_SMOKE, "arc_smoke")
MODEL(PROJECTILE_HAGAR, "models/hagarmissile.mdl");
MODEL(PROJECTILE_HAGAR_BOUNCING, "models/hagarmissile.mdl");
-MODEL(PROJECTILE_ARC_BOLT, "models/arctrail.mdl");
+MODEL(PROJECTILE_ARC_BOLT, "models/ebomb.mdl");
// napalm grenade
MODEL(PROJECTILE_NAPALM_FOUNTAIN, "null");
void W_Arc_Bolt_Touch(entity this, entity toucher)
{
PROJECTILE_TOUCH(this, toucher);
- this.use(this, NULL, toucher);
+ if(this.cnt > WEP_CVAR(arc, bolt_bounce_count) || !WEP_CVAR(arc, bolt_bounce_count) || toucher.takedamage == DAMAGE_AIM) {
+ this.use(this, NULL, toucher);
+ } else {
+ if(!this.cnt && WEP_CVAR(arc, bolt_bounce_lifetime))
+ this.nextthink = min(this.nextthink, time + WEP_CVAR(arc, bolt_bounce_lifetime));
+ this.cnt++;
+ Send_Effect(EFFECT_BALL_SPARKS, this.origin, this.velocity, 1);
+ this.angles = vectoangles(this.velocity);
+ this.owner = NULL;
+ // initial blast doesn't count as bounce damage!
+ if(WEP_CVAR(arc, bolt_bounce_damage))
+ RadiusDamage(this, this.realowner, WEP_CVAR(arc, bolt_damage), WEP_CVAR(arc, bolt_edgedamage), WEP_CVAR(arc, bolt_radius), NULL, NULL, WEP_CVAR(arc, bolt_force), this.projectiledeathtype, this.weaponentity_fld, toucher);
+ this.projectiledeathtype |= HITTYPE_BOUNCE;
+ }
}
void W_Arc_Attack_Bolt(Weapon thiswep, entity actor, .entity weaponentity)
W_DecreaseAmmo(thiswep, actor, WEP_CVAR(arc, bolt_ammo), weaponentity);
- W_SetupShot(actor, weaponentity, false, 2, SND_LASERGUN_FIRE, CH_WEAPON_A, WEP_CVAR(arc, bolt_damage), WEP_ARC.m_id | HITTYPE_SECONDARY);
+ 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);
IL_PUSH(g_damagedbycontents, missile);
settouch(missile, W_Arc_Bolt_Touch);
+ missile.cnt = 0;
missile.use = W_Arc_Bolt_Explode_use;
setthink(missile, adaptor_think2use_hittype_splash);
missile.nextthink = time + WEP_CVAR(arc, bolt_lifetime);
PROJECTILE_MAKETRIGGER(missile);
- missile.projectiledeathtype = WEP_ARC.m_id | HITTYPE_SECONDARY;
+ missile.projectiledeathtype = thiswep.m_id | HITTYPE_SECONDARY;
missile.weaponentity_fld = weaponentity;
setorigin(missile, w_shotorg);
setsize(missile, '0 0 0', '0 0 0');
- set_movetype(missile, MOVETYPE_FLY);
+ set_movetype(missile, MOVETYPE_BOUNCEMISSILE);
W_SetupProjVelocity_PRE(missile, arc, bolt_);
missile.angles = vectoangles(missile.velocity);
missile.flags = FL_PROJECTILE;
+ IL_PUSH(g_projectiles, missile);
missile.missile_flags = MIF_SPLASH;
CSQCProjectile(missile, true, PROJECTILE_ARC_BOLT, true);
{
vector org2;
org2 = w_org + w_backoff * 6;
- pointparticles(EFFECT_ARC_BOLT_EXPLODE, org2, w_backoff * 1000, 1);
- if(!w_issilent) { sound(actor, CH_SHOTS, SND_LASERIMPACT, VOL_BASE, ATTN_NORM); }
+ pointparticles(EFFECT_ELECTRO_IMPACT, org2, w_backoff * 1000, 1);
+ if(!w_issilent) { sound(actor, CH_SHOTS, SND_ELECTRO_IMPACT, VOL_BASE, ATTN_NORM); }
}
}
BEGIN(class) \
P(class, prefix, bolt, float, NONE) \
P(class, prefix, bolt_ammo, float, NONE) \
+ 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_damageforcescale, float, NONE) \
P(class, prefix, bolt_damage, float, NONE) \
P(class, prefix, bolt_edgedamage, 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"
+
// 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"
-alias testing_disable "delvote test_blaster_switch ; delvote test_crylink_sec_horizontal ; delvote test_rocket_flying ; delvote test_ctf_stalemate90 ; delvote test_ctf_stalemate120"
+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"