aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGalacticMoblin <100473309+GalacticMoblin@users.noreply.github.com>2023-10-17 14:36:46 +0100
committerGitHub <noreply@github.com>2023-10-17 15:36:46 +0200
commitbc4e4263e714f9b1eff58f2c39bb714a3564b2e6 (patch)
treecbc9d450fc7d36cb516fe83e1466ea8f824fcfc2
parent327e40edf85e9ad12b85256382123049d55fd07f (diff)
downloadNorthstarMods-bc4e4263e714f9b1eff58f2c39bb714a3564b2e6.tar.gz
NorthstarMods-bc4e4263e714f9b1eff58f2c39bb714a3564b2e6.zip
Fix a crash related to Arc Cannon (#681)v1.19.9-rc2
Fixes an issue where dying while the Arc Cannon beam is hurting someone would cause an error. Co-authored-by: Dinorush <62536724+Dinorush@users.noreply.github.com>
-rw-r--r--Northstar.Custom/mod/scripts/vscripts/weapons/_arc_cannon.nut62
1 files changed, 22 insertions, 40 deletions
diff --git a/Northstar.Custom/mod/scripts/vscripts/weapons/_arc_cannon.nut b/Northstar.Custom/mod/scripts/vscripts/weapons/_arc_cannon.nut
index 01138967..defb1a56 100644
--- a/Northstar.Custom/mod/scripts/vscripts/weapons/_arc_cannon.nut
+++ b/Northstar.Custom/mod/scripts/vscripts/weapons/_arc_cannon.nut
@@ -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
@@ -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() )
{
@@ -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 )
@@ -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
@@ -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() )
{