Skip to content

Commit

Permalink
Fix a crash related to Arc Cannon (#681)
Browse files Browse the repository at this point in the history
Fixes an issue where dying while the Arc Cannon beam is hurting someone would cause an error.

Co-authored-by: Dinorush <[email protected]>
  • Loading branch information
GalacticMoblin and Dinorush authored Oct 17, 2023
1 parent 327e40e commit bc4e426
Showing 1 changed file with 22 additions and 40 deletions.
62 changes: 22 additions & 40 deletions Northstar.Custom/mod/scripts/vscripts/weapons/_arc_cannon.nut
Original file line number Diff line number Diff line change
Expand Up @@ -536,12 +536,6 @@ function ZapTarget( zapInfo, target, beamStartPos, beamEndPos, chainNum = 1 )
thread CreateArcCannonBeam( zapInfo.weapon, target, beamStartPos, beamEndPos, zapInfo.player, ARC_CANNON_BEAM_LIFETIME, zapInfo.radius, boltWidth, 5, true, firstBeam )

#if SERVER
local isMissile = ( target.GetClassName() == "rpg_missile" )
if ( !isMissile )
wait ARC_CANNON_FORK_DELAY
else
wait 0.05

local deathPackage = damageTypes.arcCannon

float damageAmount
Expand Down Expand Up @@ -569,40 +563,20 @@ function ZapTarget( zapInfo, target, beamStartPos, beamEndPos, chainNum = 1 )
bool hasFastPacitor = false
bool noArcing = false

if ( IsValid( zapInfo.weapon ) )
{
entity weap = expect entity( zapInfo.weapon )
hasFastPacitor = weap.GetWeaponInfoFileKeyField( "push_apart" ) != null && weap.GetWeaponInfoFileKeyField( "push_apart" ) == 1
noArcing = weap.GetWeaponInfoFileKeyField( "no_arcing" ) != null && weap.GetWeaponInfoFileKeyField( "no_arcing" ) == 1
}
entity weapon = expect entity( zapInfo.weapon )
hasFastPacitor = weapon.GetWeaponInfoFileKeyField( "push_apart" ) != null && weapon.GetWeaponInfoFileKeyField( "push_apart" ) == 1
noArcing = weapon.GetWeaponInfoFileKeyField( "no_arcing" ) != null && weapon.GetWeaponInfoFileKeyField( "no_arcing" ) == 1
float critScale = weapon.GetWeaponSettingFloat( eWeaponVar.critical_hit_damage_scale )

if ( target.GetArmorType() == ARMOR_TYPE_HEAVY )
{
if ( IsValid( zapInfo.weapon ) )
{
entity weapon = expect entity( zapInfo.weapon )
damageMin = weapon.GetWeaponSettingInt( damageFarValueTitanArmor )
damageMax = weapon.GetWeaponSettingInt( damageNearValueTitanArmor )
}
else
{
damageMin = 100
damageMax = zapInfo.player.IsNPC() ? 1200 : 800
}
damageMin = weapon.GetWeaponSettingInt( damageFarValueTitanArmor )
damageMax = weapon.GetWeaponSettingInt( damageNearValueTitanArmor )
}
else
{
if ( IsValid( zapInfo.weapon ) )
{
entity weapon = expect entity( zapInfo.weapon )
damageMin = weapon.GetWeaponSettingInt( damageFarValue )
damageMax = weapon.GetWeaponSettingInt( damageNearValue )
}
else
{
damageMin = 120
damageMax = zapInfo.player.IsNPC() ? 140 : 275
}
damageMin = weapon.GetWeaponSettingInt( damageFarValue )
damageMax = weapon.GetWeaponSettingInt( damageNearValue )

if ( target.IsNPC() )
{
Expand All @@ -612,11 +586,10 @@ function ZapTarget( zapInfo, target, beamStartPos, beamEndPos, chainNum = 1 )
}


local chargeRatio = GetArcCannonChargeFraction( zapInfo.weapon )
if ( IsValid( zapInfo.weapon ) && !zapInfo.weapon.GetWeaponSettingBool( eWeaponVar.charge_require_input ) )
local chargeRatio = GetArcCannonChargeFraction( weapon )
if ( !weapon.GetWeaponSettingBool( eWeaponVar.charge_require_input ) )
{
// use distance for damage if the weapon auto-fires
entity weapon = expect entity( zapInfo.weapon )
float nearDist = weapon.GetWeaponSettingFloat( damageNearDistance )
float farDist = weapon.GetWeaponSettingFloat( damageFarDistance )

Expand All @@ -629,10 +602,19 @@ function ZapTarget( zapInfo, target, beamStartPos, beamEndPos, chainNum = 1 )
damageAmount = GraphCapped( zapInfo.chargeFrac, 0, chargeRatio, damageMin, damageMax )
}
local damageFalloff = ARC_CANNON_DAMAGE_FALLOFF_SCALER
if ( IsValid( zapInfo.weapon ) && zapInfo.weapon.HasMod( "splitter" ) )
if ( weapon.HasMod( "splitter" ) )
damageFalloff = SPLITTER_DAMAGE_FALLOFF_SCALER
damageAmount *= pow( damageFalloff, chainNum - 1 )

local isMissile = ( target.GetClassName() == "rpg_missile" )
if ( !isMissile )
wait ARC_CANNON_FORK_DELAY
else
wait 0.05

if ( !IsValid( target ) || !IsValid( zapInfo.player ) )
return

local dmgSourceID = zapInfo.dmgSourceID

// Update Later - This shouldn't be done here, this is not where we determine if damage actually happened to the target
Expand Down Expand Up @@ -660,13 +642,13 @@ function ZapTarget( zapInfo, target, beamStartPos, beamEndPos, chainNum = 1 )
// Do 3rd person effect on the body
asset effect
string tag
target.TakeDamage( damageAmount, zapInfo.player, zapInfo.player, { origin = beamEndPos, force = Vector(0,0,0), scriptType = deathPackage, weapon = zapInfo.weapon, damageSourceId = dmgSourceID,criticalHitScale = zapInfo.weapon.GetWeaponSettingFloat( eWeaponVar.critical_hit_damage_scale ) } )
target.TakeDamage( damageAmount, zapInfo.player, zapInfo.player, { origin = beamEndPos, force = Vector(0,0,0), scriptType = deathPackage, weapon = zapInfo.weapon, damageSourceId = dmgSourceID,criticalHitScale = critScale } )
//vector dir = Normalize( beamEndPos - beamStartPos )
//vector velocity = dir * 600
//PushPlayerAway( target, velocity )
//PushPlayerAway( expect entity( zapInfo.player ), -velocity )

if ( IsValid( zapInfo.weapon ) && hasFastPacitor )
if ( IsValid( weapon ) && hasFastPacitor )
{
if ( IsAlive( target ) && IsAlive( expect entity( zapInfo.player ) ) && target.IsTitan() )
{
Expand Down

0 comments on commit bc4e426

Please sign in to comment.