mirror of
https://github.com/2revoemag/PSF-BotServer.git
synced 2026-07-14 07:55:07 +00:00
work on starfire damage profile; moved aura behavior into own folder and creates an aura container object; extended aura behavior to vehicles; applied target-control to aggravation effect
This commit is contained in:
parent
97e64d5edc
commit
66eb3b5b95
11 changed files with 241 additions and 104 deletions
|
|
@ -1,33 +1,52 @@
|
||||||
// Copyright (c) 2017 PSForever
|
// Copyright (c) 2017 PSForever
|
||||||
package net.psforever.objects.ballistics
|
package net.psforever.objects.ballistics
|
||||||
|
import net.psforever.objects.equipment.TargetValidation
|
||||||
import net.psforever.objects.avatar.Aura
|
import net.psforever.objects.serverobject.aggravated.Aura
|
||||||
import net.psforever.objects.vital.DamageType
|
import net.psforever.objects.vital.DamageType
|
||||||
|
|
||||||
final case class AggravatedInfo(damage_type : DamageType.Value,
|
final case class AggravatedInfo(damage_type: DamageType.Value,
|
||||||
degradation_percentage : Float,
|
degradation_percentage: Float,
|
||||||
infliction_rate : Long) {
|
infliction_rate: Long) {
|
||||||
assert(damage_type == DamageType.Direct || damage_type == DamageType.Splash, s"aggravated damage is an unsupported type - $damage_type")
|
assert(damage_type == DamageType.Direct || damage_type == DamageType.Splash, s"aggravated damage is an unsupported type - $damage_type")
|
||||||
}
|
}
|
||||||
|
|
||||||
final case class AggravatedDamage(info : List[AggravatedInfo],
|
final case class AggravatedDamage(info: List[AggravatedInfo],
|
||||||
effect_type : Aura.Value,
|
effect_type: Aura.Value,
|
||||||
duration : Long,
|
duration: Long,
|
||||||
max_factor : Float,
|
max_factor: Float,
|
||||||
cumulative_damage_degrade : Boolean,
|
cumulative_damage_degrade: Boolean,
|
||||||
vanu_aggravated : Boolean)
|
vanu_aggravated: Boolean,
|
||||||
|
targets: List[TargetValidation])
|
||||||
|
|
||||||
object AggravatedDamage {
|
object AggravatedDamage {
|
||||||
def apply(info : AggravatedInfo,
|
def apply(info: AggravatedInfo,
|
||||||
effect_type : Aura.Value,
|
effect_type: Aura.Value,
|
||||||
duration : Long,
|
duration: Long,
|
||||||
max_factor : Float) : AggravatedDamage =
|
max_factor: Float,
|
||||||
AggravatedDamage(List(info), effect_type, duration, max_factor, cumulative_damage_degrade = true, vanu_aggravated = false)
|
targets: List[TargetValidation]): AggravatedDamage =
|
||||||
|
AggravatedDamage(
|
||||||
|
List(info),
|
||||||
|
effect_type,
|
||||||
|
duration,
|
||||||
|
max_factor,
|
||||||
|
cumulative_damage_degrade = true,
|
||||||
|
vanu_aggravated = false,
|
||||||
|
targets
|
||||||
|
)
|
||||||
|
|
||||||
def apply(info : AggravatedInfo,
|
def apply(info: AggravatedInfo,
|
||||||
effect_type : Aura.Value,
|
effect_type: Aura.Value,
|
||||||
duration : Long,
|
duration: Long,
|
||||||
max_factor : Float,
|
max_factor: Float,
|
||||||
vanu_aggravated : Boolean) : AggravatedDamage =
|
vanu_aggravated: Boolean,
|
||||||
AggravatedDamage(List(info), effect_type, duration, max_factor, cumulative_damage_degrade = true, vanu_aggravated)
|
targets: List[TargetValidation]): AggravatedDamage =
|
||||||
|
AggravatedDamage(
|
||||||
|
List(info),
|
||||||
|
effect_type,
|
||||||
|
duration,
|
||||||
|
max_factor,
|
||||||
|
cumulative_damage_degrade = true,
|
||||||
|
vanu_aggravated,
|
||||||
|
targets
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,4 @@
|
||||||
// Copyright (c) 2020 PSForever
|
package net.psforever.objects.serverobject.aggravated
|
||||||
package net.psforever.objects.avatar
|
|
||||||
|
|
||||||
object Aura extends Enumeration {
|
object Aura extends Enumeration {
|
||||||
final val None = Value(0)
|
final val None = Value(0)
|
||||||
|
|
@ -0,0 +1,21 @@
|
||||||
|
package net.psforever.objects.serverobject.aggravated
|
||||||
|
|
||||||
|
import net.psforever.objects.serverobject.aggravated.{Aura => AuraEffect}
|
||||||
|
|
||||||
|
trait AuraContainer {
|
||||||
|
private var aura : Set[AuraEffect.Value] = Set.empty[AuraEffect.Value]
|
||||||
|
|
||||||
|
def Aura : Set[AuraEffect.Value] = aura
|
||||||
|
|
||||||
|
def AddEffectToAura(effect : AuraEffect.Value) : Set[AuraEffect.Value] = {
|
||||||
|
if(effect != AuraEffect.None) {
|
||||||
|
aura = aura + effect
|
||||||
|
}
|
||||||
|
Aura
|
||||||
|
}
|
||||||
|
|
||||||
|
def RemoveEffectFromAura(effect : AuraEffect.Value) : Set[AuraEffect.Value] = {
|
||||||
|
aura = aura - effect
|
||||||
|
Aura
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1,16 +1,16 @@
|
||||||
// Copyright (c) 2020 PSForever
|
// Copyright (c) 2020 PSForever
|
||||||
package net.psforever.objects.avatar
|
package net.psforever.objects.serverobject.aggravated
|
||||||
|
|
||||||
import akka.actor.{Actor, Cancellable}
|
import akka.actor.{Actor, Cancellable}
|
||||||
import net.psforever.objects.Player
|
|
||||||
import net.psforever.objects.ballistics._
|
import net.psforever.objects.ballistics._
|
||||||
|
import net.psforever.objects.serverobject.PlanetSideServerObject
|
||||||
import net.psforever.objects.serverobject.damage.Damageable
|
import net.psforever.objects.serverobject.damage.Damageable
|
||||||
import net.psforever.objects.vital.{DamageType, Vitality}
|
import net.psforever.objects.vital.{DamageType, Vitality}
|
||||||
import net.psforever.types.Vector3
|
import net.psforever.types.Vector3
|
||||||
|
|
||||||
import scala.collection.mutable
|
import scala.collection.mutable
|
||||||
import scala.concurrent.duration._
|
|
||||||
import scala.concurrent.ExecutionContext.Implicits.global
|
import scala.concurrent.ExecutionContext.Implicits.global
|
||||||
|
import scala.concurrent.duration._
|
||||||
|
|
||||||
trait AuraEffectBehavior {
|
trait AuraEffectBehavior {
|
||||||
_ : Actor with Damageable =>
|
_ : Actor with Damageable =>
|
||||||
|
|
@ -22,7 +22,7 @@ trait AuraEffectBehavior {
|
||||||
private val entryIdToEntry: mutable.LongMap[AuraEffectBehavior.Entry] =
|
private val entryIdToEntry: mutable.LongMap[AuraEffectBehavior.Entry] =
|
||||||
mutable.LongMap.empty[AuraEffectBehavior.Entry]
|
mutable.LongMap.empty[AuraEffectBehavior.Entry]
|
||||||
|
|
||||||
def AuraTargetObject : Player
|
def AuraTargetObject : AuraEffectBehavior.Target
|
||||||
|
|
||||||
val auraBehavior : Receive = {
|
val auraBehavior : Receive = {
|
||||||
case AuraEffectBehavior.Aggravate(id, 0, 0) =>
|
case AuraEffectBehavior.Aggravate(id, 0, 0) =>
|
||||||
|
|
@ -93,7 +93,8 @@ trait AuraEffectBehavior {
|
||||||
data.projectile.profile.Aggravated match {
|
data.projectile.profile.Aggravated match {
|
||||||
case Some(damage)
|
case Some(damage)
|
||||||
if data.projectile.profile.ProjectileDamageTypes.contains(DamageType.Aggravated) &&
|
if data.projectile.profile.ProjectileDamageTypes.contains(DamageType.Aggravated) &&
|
||||||
damage.effect_type != Aura.None =>
|
damage.effect_type != Aura.None && //TODO aphelion starfire
|
||||||
|
damage.targets.exists(validation => validation.test(AuraTargetObject)) =>
|
||||||
TryAggravationEffect(damage, data)
|
TryAggravationEffect(damage, data)
|
||||||
case _ => ;
|
case _ => ;
|
||||||
}
|
}
|
||||||
|
|
@ -104,7 +105,7 @@ trait AuraEffectBehavior {
|
||||||
val obj = AuraTargetObject
|
val obj = AuraTargetObject
|
||||||
if(CheckForUniqueUnqueuedProjectile(data.projectile)) {
|
if(CheckForUniqueUnqueuedProjectile(data.projectile)) {
|
||||||
val auraEffects = obj.Aura
|
val auraEffects = obj.Aura
|
||||||
if(auraEffects.contains(effect) && aggravation.cumulative_damage_degrade) { //TODO cumulative?
|
if(auraEffects.contains(effect) && aggravation.cumulative_damage_degrade) {
|
||||||
SetupAggravationEntry(aggravation, data)
|
SetupAggravationEntry(aggravation, data)
|
||||||
}
|
}
|
||||||
else if(obj.AddEffectToAura(effect).diff(auraEffects).contains(effect)) {
|
else if(obj.AddEffectToAura(effect).diff(auraEffects).contains(effect)) {
|
||||||
|
|
@ -131,9 +132,9 @@ trait AuraEffectBehavior {
|
||||||
case Some(list) => effectToEntryId -> (list :+ id)
|
case Some(list) => effectToEntryId -> (list :+ id)
|
||||||
}
|
}
|
||||||
//pair id with timer
|
//pair id with timer
|
||||||
val inflictionRate = info.infliction_rate
|
val inflictionRate = 1000 //info.infliction_rate
|
||||||
val iterations = (aggravation.duration / inflictionRate).toInt
|
val iterations = (aggravation.duration / inflictionRate).toInt
|
||||||
val leftoverTime = aggravation.duration % inflictionRate
|
val leftoverTime = aggravation.duration - (iterations * inflictionRate)
|
||||||
entryIdToTimer += id -> context.system.scheduler.scheduleOnce(inflictionRate milliseconds, self, AuraEffectBehavior.Aggravate(id, iterations, leftoverTime))
|
entryIdToTimer += id -> context.system.scheduler.scheduleOnce(inflictionRate milliseconds, self, AuraEffectBehavior.Aggravate(id, iterations, leftoverTime))
|
||||||
//pair id with entry
|
//pair id with entry
|
||||||
PairIdWithAggravationEntry(id, effect, inflictionRate, data, data.target, Vector3.Zero)
|
PairIdWithAggravationEntry(id, effect, inflictionRate, data, data.target, Vector3.Zero)
|
||||||
|
|
@ -212,7 +213,7 @@ trait AuraEffectBehavior {
|
||||||
UpdateAggravatedEffect(AuraTargetObject)
|
UpdateAggravatedEffect(AuraTargetObject)
|
||||||
}
|
}
|
||||||
|
|
||||||
def UpdateAggravatedEffect(target: Player) : Unit = {
|
def UpdateAggravatedEffect(target: AuraEffectBehavior.Target) : Unit = {
|
||||||
import services.avatar.{AvatarAction, AvatarServiceMessage}
|
import services.avatar.{AvatarAction, AvatarServiceMessage}
|
||||||
val zone = target.Zone
|
val zone = target.Zone
|
||||||
val value = target.Aura.foldLeft(0)(_ + _.id)
|
val value = target.Aura.foldLeft(0)(_ + _.id)
|
||||||
|
|
@ -225,6 +226,8 @@ trait AuraEffectBehavior {
|
||||||
}
|
}
|
||||||
|
|
||||||
object AuraEffectBehavior {
|
object AuraEffectBehavior {
|
||||||
|
type Target = PlanetSideServerObject with Vitality with AuraContainer
|
||||||
|
|
||||||
private case class Entry(id: Long, effect: Aura.Value, retime: Long, data: ResolvedProjectile)
|
private case class Entry(id: Long, effect: Aura.Value, retime: Long, data: ResolvedProjectile)
|
||||||
|
|
||||||
private case class Aggravate(id: Long, iterations: Int, leftover: Long)
|
private case class Aggravate(id: Long, iterations: Int, leftover: Long)
|
||||||
|
|
@ -2,13 +2,13 @@
|
||||||
package net.psforever.objects
|
package net.psforever.objects
|
||||||
|
|
||||||
import net.psforever.objects.avatar.Certification
|
import net.psforever.objects.avatar.Certification
|
||||||
import net.psforever.objects.avatar.Aura
|
|
||||||
import net.psforever.objects.ballistics.{AggravatedDamage, AggravatedInfo, Projectiles}
|
import net.psforever.objects.ballistics.{AggravatedDamage, AggravatedInfo, Projectiles}
|
||||||
import net.psforever.objects.ce.{DeployableCategory, DeployedItem}
|
import net.psforever.objects.ce.{DeployableCategory, DeployedItem}
|
||||||
import net.psforever.objects.definition._
|
import net.psforever.objects.definition._
|
||||||
import net.psforever.objects.definition.converter._
|
import net.psforever.objects.definition.converter._
|
||||||
import net.psforever.objects.equipment._
|
import net.psforever.objects.equipment._
|
||||||
import net.psforever.objects.inventory.InventoryTile
|
import net.psforever.objects.inventory.InventoryTile
|
||||||
|
import net.psforever.objects.serverobject.aggravated.Aura
|
||||||
import net.psforever.objects.serverobject.doors.DoorDefinition
|
import net.psforever.objects.serverobject.doors.DoorDefinition
|
||||||
import net.psforever.objects.serverobject.generator.GeneratorDefinition
|
import net.psforever.objects.serverobject.generator.GeneratorDefinition
|
||||||
import net.psforever.objects.serverobject.implantmech.ImplantTerminalMechDefinition
|
import net.psforever.objects.serverobject.implantmech.ImplantTerminalMechDefinition
|
||||||
|
|
@ -2323,7 +2323,8 @@ object GlobalDefinitions {
|
||||||
Aura.None,
|
Aura.None,
|
||||||
0,
|
0,
|
||||||
0f,
|
0f,
|
||||||
true
|
true,
|
||||||
|
List(TargetValidation(EffectTarget.Category.Aircraft, EffectTarget.Validation.Aircraft))
|
||||||
)
|
)
|
||||||
aphelion_starfire_projectile.ExistsOnRemoteClients = true
|
aphelion_starfire_projectile.ExistsOnRemoteClients = true
|
||||||
aphelion_starfire_projectile.RemoteClientData = (39577, 249) //starfire_projectile data
|
aphelion_starfire_projectile.RemoteClientData = (39577, 249) //starfire_projectile data
|
||||||
|
|
@ -2454,7 +2455,11 @@ object GlobalDefinitions {
|
||||||
AggravatedInfo(DamageType.Direct, 0.2f, 500),
|
AggravatedInfo(DamageType.Direct, 0.2f, 500),
|
||||||
Aura.Comet,
|
Aura.Comet,
|
||||||
0,
|
0,
|
||||||
10f
|
10f,
|
||||||
|
List(
|
||||||
|
TargetValidation(EffectTarget.Category.Player, EffectTarget.Validation.Player),
|
||||||
|
TargetValidation(EffectTarget.Category.Vehicle, EffectTarget.Validation.Vehicle)
|
||||||
|
)
|
||||||
)
|
)
|
||||||
comet_projectile.InitialVelocity = 80
|
comet_projectile.InitialVelocity = 80
|
||||||
comet_projectile.Lifespan = 3.1f
|
comet_projectile.Lifespan = 3.1f
|
||||||
|
|
@ -2609,16 +2614,17 @@ object GlobalDefinitions {
|
||||||
5000,
|
5000,
|
||||||
0.1f,
|
0.1f,
|
||||||
false,
|
false,
|
||||||
false
|
false,
|
||||||
|
List(TargetValidation(EffectTarget.Category.Player, EffectTarget.Validation.Player))
|
||||||
)
|
)
|
||||||
flamethrower_fireball.InitialVelocity = 15
|
flamethrower_fireball.InitialVelocity = 15
|
||||||
flamethrower_fireball.Lifespan = 1.2f
|
flamethrower_fireball.Lifespan = 1.2f
|
||||||
ProjectileDefinition.CalculateDerivedFields(flamethrower_fireball)
|
ProjectileDefinition.CalculateDerivedFields(flamethrower_fireball)
|
||||||
flamethrower_fireball.Modifiers = List(
|
flamethrower_fireball.Modifiers = List(
|
||||||
DamageModifiers.AggravatedDirect,
|
DamageModifiers.InfantryAggravatedDirect,
|
||||||
DamageModifiers.AggravatedDirectBurn,
|
DamageModifiers.InfantryAggravatedDirectBurn,
|
||||||
DamageModifiers.AggravatedSplash,
|
DamageModifiers.InfantryAggravatedSplash,
|
||||||
DamageModifiers.AggravatedSplashBurn,
|
DamageModifiers.InfantryAggravatedSplashBurn,
|
||||||
DamageModifiers.RadialDegrade
|
DamageModifiers.RadialDegrade
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -2638,7 +2644,8 @@ object GlobalDefinitions {
|
||||||
5000,
|
5000,
|
||||||
0.5f,
|
0.5f,
|
||||||
false,
|
false,
|
||||||
false
|
false,
|
||||||
|
List(TargetValidation(EffectTarget.Category.Player, EffectTarget.Validation.Player))
|
||||||
)
|
)
|
||||||
flamethrower_projectile.DegradeDelay = 1.0f
|
flamethrower_projectile.DegradeDelay = 1.0f
|
||||||
flamethrower_projectile.DegradeMultiplier = 0.5f
|
flamethrower_projectile.DegradeMultiplier = 0.5f
|
||||||
|
|
@ -2646,8 +2653,8 @@ object GlobalDefinitions {
|
||||||
flamethrower_projectile.Lifespan = 2.0f
|
flamethrower_projectile.Lifespan = 2.0f
|
||||||
ProjectileDefinition.CalculateDerivedFields(flamethrower_projectile)
|
ProjectileDefinition.CalculateDerivedFields(flamethrower_projectile)
|
||||||
flamethrower_projectile.Modifiers = List(
|
flamethrower_projectile.Modifiers = List(
|
||||||
DamageModifiers.AggravatedDirect,
|
DamageModifiers.InfantryAggravatedDirect,
|
||||||
DamageModifiers.AggravatedDirectBurn,
|
DamageModifiers.InfantryAggravatedDirectBurn,
|
||||||
DamageModifiers.MaxDistanceCutoff
|
DamageModifiers.MaxDistanceCutoff
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -3500,19 +3507,20 @@ object GlobalDefinitions {
|
||||||
plasma_cartridge_projectile.Aggravated = AggravatedDamage(
|
plasma_cartridge_projectile.Aggravated = AggravatedDamage(
|
||||||
List(AggravatedInfo(DamageType.Direct, 0.25f, 750), AggravatedInfo(DamageType.Splash, 0.25f, 1000)),
|
List(AggravatedInfo(DamageType.Direct, 0.25f, 750), AggravatedInfo(DamageType.Splash, 0.25f, 1000)),
|
||||||
Aura.Plasma,
|
Aura.Plasma,
|
||||||
4000, //hard-coded default?
|
3000,
|
||||||
1.5f,
|
1.5f,
|
||||||
true,
|
true,
|
||||||
false
|
false,
|
||||||
|
List(TargetValidation(EffectTarget.Category.Player, EffectTarget.Validation.Player))
|
||||||
)
|
)
|
||||||
plasma_cartridge_projectile.InitialVelocity = 30
|
plasma_cartridge_projectile.InitialVelocity = 30
|
||||||
plasma_cartridge_projectile.Lifespan = 15f
|
plasma_cartridge_projectile.Lifespan = 15f
|
||||||
ProjectileDefinition.CalculateDerivedFields(plasma_cartridge_projectile)
|
ProjectileDefinition.CalculateDerivedFields(plasma_cartridge_projectile)
|
||||||
plasma_cartridge_projectile.Modifiers = List(
|
plasma_cartridge_projectile.Modifiers = List(
|
||||||
DamageModifiers.AggravatedDirect,
|
DamageModifiers.InfantryAggravatedDirect,
|
||||||
DamageModifiers.AggravatedDirectBurn,
|
DamageModifiers.InfantryAggravatedDirectBurn,
|
||||||
DamageModifiers.AggravatedSplash,
|
DamageModifiers.InfantryAggravatedSplash,
|
||||||
DamageModifiers.AggravatedSplashBurn,
|
DamageModifiers.InfantryAggravatedSplashBurn,
|
||||||
DamageModifiers.RadialDegrade
|
DamageModifiers.RadialDegrade
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -3527,19 +3535,20 @@ object GlobalDefinitions {
|
||||||
plasma_cartridge_projectile_b.Aggravated = AggravatedDamage(
|
plasma_cartridge_projectile_b.Aggravated = AggravatedDamage(
|
||||||
List(AggravatedInfo(DamageType.Direct, 0.25f, 750), AggravatedInfo(DamageType.Splash, 0.25f, 1000)),
|
List(AggravatedInfo(DamageType.Direct, 0.25f, 750), AggravatedInfo(DamageType.Splash, 0.25f, 1000)),
|
||||||
Aura.Plasma,
|
Aura.Plasma,
|
||||||
4000, //hard-coded default?
|
3000,
|
||||||
1.5f,
|
1.5f,
|
||||||
true,
|
true,
|
||||||
false
|
false,
|
||||||
|
List(TargetValidation(EffectTarget.Category.Player, EffectTarget.Validation.Player))
|
||||||
)
|
)
|
||||||
plasma_cartridge_projectile_b.InitialVelocity = 30
|
plasma_cartridge_projectile_b.InitialVelocity = 30
|
||||||
plasma_cartridge_projectile_b.Lifespan = 2f
|
plasma_cartridge_projectile_b.Lifespan = 2f
|
||||||
ProjectileDefinition.CalculateDerivedFields(plasma_cartridge_projectile_b)
|
ProjectileDefinition.CalculateDerivedFields(plasma_cartridge_projectile_b)
|
||||||
plasma_cartridge_projectile_b.Modifiers = List(
|
plasma_cartridge_projectile_b.Modifiers = List(
|
||||||
DamageModifiers.AggravatedDirect,
|
DamageModifiers.InfantryAggravatedDirect,
|
||||||
DamageModifiers.AggravatedDirectBurn,
|
DamageModifiers.InfantryAggravatedDirectBurn,
|
||||||
DamageModifiers.AggravatedSplash,
|
DamageModifiers.InfantryAggravatedSplash,
|
||||||
DamageModifiers.AggravatedSplashBurn,
|
DamageModifiers.InfantryAggravatedSplashBurn,
|
||||||
DamageModifiers.RadialDegrade
|
DamageModifiers.RadialDegrade
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -3553,19 +3562,20 @@ object GlobalDefinitions {
|
||||||
plasma_grenade_projectile.Aggravated = AggravatedDamage(
|
plasma_grenade_projectile.Aggravated = AggravatedDamage(
|
||||||
List(AggravatedInfo(DamageType.Direct, 0.25f, 750), AggravatedInfo(DamageType.Splash, 0.25f, 1000)),
|
List(AggravatedInfo(DamageType.Direct, 0.25f, 750), AggravatedInfo(DamageType.Splash, 0.25f, 1000)),
|
||||||
Aura.Plasma,
|
Aura.Plasma,
|
||||||
4000, //hard-coded default?
|
3000,
|
||||||
1.5f,
|
1.5f,
|
||||||
true,
|
true,
|
||||||
false
|
false,
|
||||||
|
List(TargetValidation(EffectTarget.Category.Player, EffectTarget.Validation.Player))
|
||||||
)
|
)
|
||||||
plasma_grenade_projectile.InitialVelocity = 30
|
plasma_grenade_projectile.InitialVelocity = 30
|
||||||
plasma_grenade_projectile.Lifespan = 15f
|
plasma_grenade_projectile.Lifespan = 15f
|
||||||
ProjectileDefinition.CalculateDerivedFields(plasma_grenade_projectile)
|
ProjectileDefinition.CalculateDerivedFields(plasma_grenade_projectile)
|
||||||
plasma_grenade_projectile.Modifiers = List(
|
plasma_grenade_projectile.Modifiers = List(
|
||||||
DamageModifiers.AggravatedDirect,
|
DamageModifiers.InfantryAggravatedDirect,
|
||||||
DamageModifiers.AggravatedDirectBurn,
|
DamageModifiers.InfantryAggravatedDirectBurn,
|
||||||
DamageModifiers.AggravatedSplash,
|
DamageModifiers.InfantryAggravatedSplash,
|
||||||
DamageModifiers.AggravatedSplashBurn,
|
DamageModifiers.InfantryAggravatedSplashBurn,
|
||||||
DamageModifiers.RadialDegrade
|
DamageModifiers.RadialDegrade
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -3580,19 +3590,20 @@ object GlobalDefinitions {
|
||||||
plasma_grenade_projectile_B.Aggravated = AggravatedDamage(
|
plasma_grenade_projectile_B.Aggravated = AggravatedDamage(
|
||||||
List(AggravatedInfo(DamageType.Direct, 0.25f, 750), AggravatedInfo(DamageType.Splash, 0.25f, 1000)),
|
List(AggravatedInfo(DamageType.Direct, 0.25f, 750), AggravatedInfo(DamageType.Splash, 0.25f, 1000)),
|
||||||
Aura.Plasma,
|
Aura.Plasma,
|
||||||
4000, //hard-coded default?
|
3000,
|
||||||
1.5f,
|
1.5f,
|
||||||
true,
|
true,
|
||||||
false
|
false,
|
||||||
|
List(TargetValidation(EffectTarget.Category.Player, EffectTarget.Validation.Player))
|
||||||
)
|
)
|
||||||
plasma_grenade_projectile_B.InitialVelocity = 30
|
plasma_grenade_projectile_B.InitialVelocity = 30
|
||||||
plasma_grenade_projectile_B.Lifespan = 3f
|
plasma_grenade_projectile_B.Lifespan = 3f
|
||||||
ProjectileDefinition.CalculateDerivedFields(plasma_grenade_projectile_B)
|
ProjectileDefinition.CalculateDerivedFields(plasma_grenade_projectile_B)
|
||||||
plasma_grenade_projectile_B.Modifiers = List(
|
plasma_grenade_projectile_B.Modifiers = List(
|
||||||
DamageModifiers.AggravatedDirect,
|
DamageModifiers.InfantryAggravatedDirect,
|
||||||
DamageModifiers.AggravatedDirectBurn,
|
DamageModifiers.InfantryAggravatedDirectBurn,
|
||||||
DamageModifiers.AggravatedSplash,
|
DamageModifiers.InfantryAggravatedSplash,
|
||||||
DamageModifiers.AggravatedSplashBurn,
|
DamageModifiers.InfantryAggravatedSplashBurn,
|
||||||
DamageModifiers.RadialDegrade
|
DamageModifiers.RadialDegrade
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -3899,9 +3910,10 @@ object GlobalDefinitions {
|
||||||
starfire_projectile.Aggravated = AggravatedDamage(
|
starfire_projectile.Aggravated = AggravatedDamage(
|
||||||
AggravatedInfo(DamageType.Direct, 0.25f, 250),
|
AggravatedInfo(DamageType.Direct, 0.25f, 250),
|
||||||
Aura.Comet,
|
Aura.Comet,
|
||||||
0,
|
3000,
|
||||||
0f,
|
0f,
|
||||||
true
|
true,
|
||||||
|
List(TargetValidation(EffectTarget.Category.Aircraft, EffectTarget.Validation.Aircraft))
|
||||||
)
|
)
|
||||||
starfire_projectile.InitialVelocity = 45
|
starfire_projectile.InitialVelocity = 45
|
||||||
starfire_projectile.Lifespan = 7.8f
|
starfire_projectile.Lifespan = 7.8f
|
||||||
|
|
@ -3910,6 +3922,11 @@ object GlobalDefinitions {
|
||||||
starfire_projectile.AutoLock = true
|
starfire_projectile.AutoLock = true
|
||||||
starfire_projectile.Packet = projectileConverter
|
starfire_projectile.Packet = projectileConverter
|
||||||
ProjectileDefinition.CalculateDerivedFields(starfire_projectile)
|
ProjectileDefinition.CalculateDerivedFields(starfire_projectile)
|
||||||
|
starfire_projectile.Modifiers = List(
|
||||||
|
DamageModifiers.StarfireAggravated,
|
||||||
|
DamageModifiers.StarfireAggravatedBurn,
|
||||||
|
DamageModifiers.RadialDegrade
|
||||||
|
)
|
||||||
|
|
||||||
striker_missile_projectile.Name = "striker_missile_projectile"
|
striker_missile_projectile.Name = "striker_missile_projectile"
|
||||||
striker_missile_projectile.Damage0 = 35
|
striker_missile_projectile.Damage0 = 35
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,6 @@ package net.psforever.objects
|
||||||
|
|
||||||
import net.psforever.objects.avatar.{
|
import net.psforever.objects.avatar.{
|
||||||
Avatar,
|
Avatar,
|
||||||
Aura => AuraEffect,
|
|
||||||
LoadoutManager
|
LoadoutManager
|
||||||
}
|
}
|
||||||
import net.psforever.objects.definition.{
|
import net.psforever.objects.definition.{
|
||||||
|
|
@ -15,6 +14,7 @@ import net.psforever.objects.equipment.{Equipment, EquipmentSize, EquipmentSlot,
|
||||||
import net.psforever.objects.inventory.{Container, GridInventory, InventoryItem}
|
import net.psforever.objects.inventory.{Container, GridInventory, InventoryItem}
|
||||||
import net.psforever.objects.serverobject.PlanetSideServerObject
|
import net.psforever.objects.serverobject.PlanetSideServerObject
|
||||||
import net.psforever.objects.serverobject.affinity.FactionAffinity
|
import net.psforever.objects.serverobject.affinity.FactionAffinity
|
||||||
|
import net.psforever.objects.serverobject.aggravated.AuraContainer
|
||||||
import net.psforever.objects.vital.resistance.ResistanceProfile
|
import net.psforever.objects.vital.resistance.ResistanceProfile
|
||||||
import net.psforever.objects.vital.{DamageResistanceModel, Vitality}
|
import net.psforever.objects.vital.{DamageResistanceModel, Vitality}
|
||||||
import net.psforever.objects.zones.ZoneAware
|
import net.psforever.objects.zones.ZoneAware
|
||||||
|
|
@ -30,7 +30,8 @@ class Player(var avatar: Avatar)
|
||||||
with ResistanceProfile
|
with ResistanceProfile
|
||||||
with Container
|
with Container
|
||||||
with JammableUnit
|
with JammableUnit
|
||||||
with ZoneAware {
|
with ZoneAware
|
||||||
|
with AuraContainer {
|
||||||
Health = 0 //player health is artificially managed as a part of their lifecycle; start entity as dead
|
Health = 0 //player health is artificially managed as a part of their lifecycle; start entity as dead
|
||||||
Destroyed = true //see isAlive
|
Destroyed = true //see isAlive
|
||||||
private var backpack: Boolean = false
|
private var backpack: Boolean = false
|
||||||
|
|
@ -57,8 +58,6 @@ class Player(var avatar: Avatar)
|
||||||
|
|
||||||
private var vehicleSeated: Option[PlanetSideGUID] = None
|
private var vehicleSeated: Option[PlanetSideGUID] = None
|
||||||
|
|
||||||
private var aura : Set[AuraEffect.Value] = Set.empty[AuraEffect.Value]
|
|
||||||
|
|
||||||
Continent = "home2" //the zone id
|
Continent = "home2" //the zone id
|
||||||
|
|
||||||
var spectator: Boolean = false
|
var spectator: Boolean = false
|
||||||
|
|
@ -356,20 +355,6 @@ class Player(var avatar: Avatar)
|
||||||
AwayFromKeyboard
|
AwayFromKeyboard
|
||||||
}
|
}
|
||||||
|
|
||||||
def Aura : Set[AuraEffect.Value] = aura
|
|
||||||
|
|
||||||
def AddEffectToAura(effect : AuraEffect.Value) : Set[AuraEffect.Value] = {
|
|
||||||
if(effect != AuraEffect.None) {
|
|
||||||
aura = aura + effect
|
|
||||||
}
|
|
||||||
Aura
|
|
||||||
}
|
|
||||||
|
|
||||||
def RemoveEffectFromAura(effect : AuraEffect.Value) : Set[AuraEffect.Value] = {
|
|
||||||
aura = aura - effect
|
|
||||||
Aura
|
|
||||||
}
|
|
||||||
|
|
||||||
private var usingSpecial: SpecialExoSuitDefinition.Mode.Value => SpecialExoSuitDefinition.Mode.Value =
|
private var usingSpecial: SpecialExoSuitDefinition.Mode.Value => SpecialExoSuitDefinition.Mode.Value =
|
||||||
DefaultUsingSpecial
|
DefaultUsingSpecial
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,7 @@ import net.psforever.objects.inventory.{Container, GridInventory, InventoryItem,
|
||||||
import net.psforever.objects.serverobject.mount.Mountable
|
import net.psforever.objects.serverobject.mount.Mountable
|
||||||
import net.psforever.objects.serverobject.PlanetSideServerObject
|
import net.psforever.objects.serverobject.PlanetSideServerObject
|
||||||
import net.psforever.objects.serverobject.affinity.FactionAffinity
|
import net.psforever.objects.serverobject.affinity.FactionAffinity
|
||||||
|
import net.psforever.objects.serverobject.aggravated.AuraContainer
|
||||||
import net.psforever.objects.serverobject.deploy.Deployment
|
import net.psforever.objects.serverobject.deploy.Deployment
|
||||||
import net.psforever.objects.serverobject.hackable.Hackable
|
import net.psforever.objects.serverobject.hackable.Hackable
|
||||||
import net.psforever.objects.serverobject.structures.AmenityOwner
|
import net.psforever.objects.serverobject.structures.AmenityOwner
|
||||||
|
|
@ -78,7 +79,8 @@ class Vehicle(private val vehicleDef: VehicleDefinition)
|
||||||
with StandardResistanceProfile
|
with StandardResistanceProfile
|
||||||
with JammableUnit
|
with JammableUnit
|
||||||
with CommonNtuContainer
|
with CommonNtuContainer
|
||||||
with Container {
|
with Container
|
||||||
|
with AuraContainer {
|
||||||
private var faction: PlanetSideEmpire.Value = PlanetSideEmpire.NEUTRAL
|
private var faction: PlanetSideEmpire.Value = PlanetSideEmpire.NEUTRAL
|
||||||
private var shields: Int = 0
|
private var shields: Int = 0
|
||||||
private var decal: Int = 0
|
private var decal: Int = 0
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,7 @@ import net.psforever.objects.ballistics.{PlayerSource, ResolvedProjectile}
|
||||||
import net.psforever.objects.equipment._
|
import net.psforever.objects.equipment._
|
||||||
import net.psforever.objects.inventory.{GridInventory, InventoryItem}
|
import net.psforever.objects.inventory.{GridInventory, InventoryItem}
|
||||||
import net.psforever.objects.loadouts.Loadout
|
import net.psforever.objects.loadouts.Loadout
|
||||||
|
import net.psforever.objects.serverobject.aggravated.AuraEffectBehavior
|
||||||
import net.psforever.objects.serverobject.containable.{Containable, ContainableBehavior}
|
import net.psforever.objects.serverobject.containable.{Containable, ContainableBehavior}
|
||||||
import net.psforever.objects.vital.{PlayerSuicide, Vitality}
|
import net.psforever.objects.vital.{PlayerSuicide, Vitality}
|
||||||
import net.psforever.objects.serverobject.{CommonMessages, PlanetSideServerObject}
|
import net.psforever.objects.serverobject.{CommonMessages, PlanetSideServerObject}
|
||||||
|
|
|
||||||
|
|
@ -89,10 +89,10 @@ object EffectTarget {
|
||||||
false
|
false
|
||||||
}
|
}
|
||||||
|
|
||||||
def AMS(target: PlanetSideGameObject): Boolean =
|
def Vehicle(target: PlanetSideGameObject): Boolean =
|
||||||
target match {
|
target match {
|
||||||
case v: Vehicle =>
|
case v: Vehicle =>
|
||||||
v.Health > 0 && v.Definition == GlobalDefinitions.ams
|
v.Health > 0
|
||||||
case _ =>
|
case _ =>
|
||||||
false
|
false
|
||||||
}
|
}
|
||||||
|
|
@ -104,5 +104,21 @@ object EffectTarget {
|
||||||
case _ =>
|
case _ =>
|
||||||
false
|
false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
def AMS(target: PlanetSideGameObject): Boolean =
|
||||||
|
target match {
|
||||||
|
case v: Vehicle =>
|
||||||
|
v.Health > 0 && v.Definition == GlobalDefinitions.ams
|
||||||
|
case _ =>
|
||||||
|
false
|
||||||
|
}
|
||||||
|
|
||||||
|
def Aircraft(target: PlanetSideGameObject): Boolean =
|
||||||
|
target match {
|
||||||
|
case v: Vehicle =>
|
||||||
|
GlobalDefinitions.isFlightVehicle(v.Definition) && v.Health > 0
|
||||||
|
case _ =>
|
||||||
|
false
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,9 @@ import net.psforever.objects.inventory.{GridInventory, InventoryItem}
|
||||||
import net.psforever.objects.serverobject.CommonMessages
|
import net.psforever.objects.serverobject.CommonMessages
|
||||||
import net.psforever.objects.serverobject.mount.{Mountable, MountableBehavior}
|
import net.psforever.objects.serverobject.mount.{Mountable, MountableBehavior}
|
||||||
import net.psforever.objects.serverobject.affinity.{FactionAffinity, FactionAffinityBehavior}
|
import net.psforever.objects.serverobject.affinity.{FactionAffinity, FactionAffinityBehavior}
|
||||||
|
import net.psforever.objects.serverobject.aggravated.AuraEffectBehavior
|
||||||
import net.psforever.objects.serverobject.containable.{Containable, ContainableBehavior}
|
import net.psforever.objects.serverobject.containable.{Containable, ContainableBehavior}
|
||||||
|
import net.psforever.objects.serverobject.damage.Damageable.Target
|
||||||
import net.psforever.objects.serverobject.damage.DamageableVehicle
|
import net.psforever.objects.serverobject.damage.DamageableVehicle
|
||||||
import net.psforever.objects.serverobject.deploy.Deployment.DeploymentObject
|
import net.psforever.objects.serverobject.deploy.Deployment.DeploymentObject
|
||||||
import net.psforever.objects.serverobject.deploy.{Deployment, DeploymentBehavior}
|
import net.psforever.objects.serverobject.deploy.{Deployment, DeploymentBehavior}
|
||||||
|
|
@ -51,7 +53,8 @@ class VehicleControl(vehicle: Vehicle)
|
||||||
with RepairableVehicle
|
with RepairableVehicle
|
||||||
with JammableMountedWeapons
|
with JammableMountedWeapons
|
||||||
with ContainableBehavior
|
with ContainableBehavior
|
||||||
with AntTransferBehavior {
|
with AntTransferBehavior
|
||||||
|
with AuraEffectBehavior {
|
||||||
|
|
||||||
//make control actors belonging to utilities when making control actor belonging to vehicle
|
//make control actors belonging to utilities when making control actor belonging to vehicle
|
||||||
vehicle.Utilities.foreach({ case (_, util) => util.Setup })
|
vehicle.Utilities.foreach({ case (_, util) => util.Setup })
|
||||||
|
|
@ -74,7 +77,9 @@ class VehicleControl(vehicle: Vehicle)
|
||||||
|
|
||||||
def ChargeTransferObject = vehicle
|
def ChargeTransferObject = vehicle
|
||||||
|
|
||||||
if (vehicle.Definition == GlobalDefinitions.ant) {
|
def AuraTargetObject = vehicle
|
||||||
|
|
||||||
|
if(vehicle.Definition == GlobalDefinitions.ant) {
|
||||||
findChargeTargetFunc = Vehicles.FindANTChargingSource
|
findChargeTargetFunc = Vehicles.FindANTChargingSource
|
||||||
findDischargeTargetFunc = Vehicles.FindANTDischargingTarget
|
findDischargeTargetFunc = Vehicles.FindANTDischargingTarget
|
||||||
}
|
}
|
||||||
|
|
@ -95,6 +100,7 @@ class VehicleControl(vehicle: Vehicle)
|
||||||
context.stop(util().Actor)
|
context.stop(util().Actor)
|
||||||
util().Actor = Default.Actor
|
util().Actor = Default.Actor
|
||||||
}
|
}
|
||||||
|
EndAllEffects()
|
||||||
}
|
}
|
||||||
|
|
||||||
def Enabled: Receive =
|
def Enabled: Receive =
|
||||||
|
|
@ -103,6 +109,7 @@ class VehicleControl(vehicle: Vehicle)
|
||||||
.orElse(cargoBehavior)
|
.orElse(cargoBehavior)
|
||||||
.orElse(jammableBehavior)
|
.orElse(jammableBehavior)
|
||||||
.orElse(takesDamage)
|
.orElse(takesDamage)
|
||||||
|
.orElse(auraBehavior)
|
||||||
.orElse(canBeRepairedByNanoDispenser)
|
.orElse(canBeRepairedByNanoDispenser)
|
||||||
.orElse(containerBehavior)
|
.orElse(containerBehavior)
|
||||||
.orElse(antBehavior)
|
.orElse(antBehavior)
|
||||||
|
|
@ -579,6 +586,24 @@ class VehicleControl(vehicle: Vehicle)
|
||||||
}
|
}
|
||||||
out
|
out
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override def DamageAwareness(
|
||||||
|
target: Target,
|
||||||
|
cause: ResolvedProjectile,
|
||||||
|
amount: Int
|
||||||
|
): Unit = {
|
||||||
|
TryAggravationEffect(cause)
|
||||||
|
super.DamageAwareness(target, cause, amount)
|
||||||
|
}
|
||||||
|
|
||||||
|
override def DestructionAwareness(
|
||||||
|
target: Target,
|
||||||
|
cause: ResolvedProjectile
|
||||||
|
): Unit = {
|
||||||
|
//aura effects cancel
|
||||||
|
EndAllEffects()
|
||||||
|
super.DestructionAwareness(target, cause)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
object VehicleControl {
|
object VehicleControl {
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,8 @@
|
||||||
// Copyright (c) 2020 PSForever
|
// Copyright (c) 2020 PSForever
|
||||||
package net.psforever.objects.vital.damage
|
package net.psforever.objects.vital.damage
|
||||||
|
|
||||||
import net.psforever.objects.ballistics.{PlayerSource, ProjectileResolution, ResolvedProjectile}
|
import net.psforever.objects.GlobalDefinitions
|
||||||
|
import net.psforever.objects.ballistics.{PlayerSource, ProjectileResolution, ResolvedProjectile, VehicleSource}
|
||||||
import net.psforever.objects.vital.DamageType
|
import net.psforever.objects.vital.DamageType
|
||||||
import net.psforever.types.{ExoSuitType, Vector3}
|
import net.psforever.types.{ExoSuitType, Vector3}
|
||||||
|
|
||||||
|
|
@ -134,22 +135,22 @@ object DamageModifiers {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
case object AggravatedDirect extends Mod {
|
case object InfantryAggravatedDirect extends Mod {
|
||||||
def Calculate: DamageModifiers.Format =
|
def Calculate: DamageModifiers.Format =
|
||||||
BaseAggravatedFormula(ProjectileResolution.AggravatedDirect, DamageType.Direct)
|
BaseAggravatedFormula(ProjectileResolution.AggravatedDirect, DamageType.Direct)
|
||||||
}
|
}
|
||||||
|
|
||||||
case object AggravatedSplash extends Mod {
|
case object InfantryAggravatedSplash extends Mod {
|
||||||
def Calculate: DamageModifiers.Format =
|
def Calculate: DamageModifiers.Format =
|
||||||
BaseAggravatedFormula(ProjectileResolution.AggravatedSplash, DamageType.Splash)
|
BaseAggravatedFormula(ProjectileResolution.AggravatedSplash, DamageType.Splash)
|
||||||
}
|
}
|
||||||
|
|
||||||
case object AggravatedDirectBurn extends Mod {
|
case object InfantryAggravatedDirectBurn extends Mod {
|
||||||
def Calculate: DamageModifiers.Format =
|
def Calculate: DamageModifiers.Format =
|
||||||
BaseAggravatedBurnFormula(ProjectileResolution.AggravatedDirectBurn, DamageType.Direct)
|
BaseAggravatedBurnFormula(ProjectileResolution.AggravatedDirectBurn, DamageType.Direct)
|
||||||
}
|
}
|
||||||
|
|
||||||
case object AggravatedSplashBurn extends Mod {
|
case object InfantryAggravatedSplashBurn extends Mod {
|
||||||
def Calculate: DamageModifiers.Format =
|
def Calculate: DamageModifiers.Format =
|
||||||
BaseAggravatedBurnFormula(ProjectileResolution.AggravatedSplashBurn, DamageType.Splash)
|
BaseAggravatedBurnFormula(ProjectileResolution.AggravatedSplashBurn, DamageType.Splash)
|
||||||
}
|
}
|
||||||
|
|
@ -164,14 +165,18 @@ object DamageModifiers {
|
||||||
): Int = {
|
): Int = {
|
||||||
if (data.resolution == resolution) {
|
if (data.resolution == resolution) {
|
||||||
(data.projectile.profile.Aggravated, data.target) match {
|
(data.projectile.profile.Aggravated, data.target) match {
|
||||||
case (Some(aggravation), p: PlayerSource) if p.ExoSuit == ExoSuitType.MAX =>
|
case (Some(aggravation), p: PlayerSource) =>
|
||||||
val aggravatedDirectDamage = (aggravation.info.find(_.damage_type == damageType) match {
|
val aggravatedDamage = aggravation.info.find(_.damage_type == damageType) match {
|
||||||
case Some(infos) =>
|
case Some(infos) =>
|
||||||
damage * infos.degradation_percentage
|
damage * infos.degradation_percentage + damage
|
||||||
case _ =>
|
case _ =>
|
||||||
damage toFloat
|
damage toFloat
|
||||||
}) * aggravation.max_factor
|
}
|
||||||
damage + aggravatedDirectDamage toInt
|
if(p.ExoSuit == ExoSuitType.MAX) {
|
||||||
|
(aggravatedDamage * aggravation.max_factor) toInt
|
||||||
|
} else {
|
||||||
|
aggravatedDamage toInt
|
||||||
|
}
|
||||||
case _ =>
|
case _ =>
|
||||||
damage
|
damage
|
||||||
}
|
}
|
||||||
|
|
@ -214,10 +219,54 @@ object DamageModifiers {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
case _ =>
|
case _ =>
|
||||||
damage
|
0
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
damage
|
damage
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case object StarfireAggravated extends Mod {
|
||||||
|
def Calculate: DamageModifiers.Format = formula
|
||||||
|
|
||||||
|
private def formula(damage: Int, data: ResolvedProjectile): Int = {
|
||||||
|
if (data.resolution == ProjectileResolution.AggravatedDirect) {
|
||||||
|
(data.projectile.profile.Aggravated, data.target) match {
|
||||||
|
case (Some(aggravation), v : VehicleSource) if GlobalDefinitions.isFlightVehicle(v.Definition) =>
|
||||||
|
aggravation.info.find(_.damage_type == DamageType.Direct) match {
|
||||||
|
case Some(infos) =>
|
||||||
|
(damage * infos.degradation_percentage + damage) toInt
|
||||||
|
case _ =>
|
||||||
|
damage
|
||||||
|
}
|
||||||
|
case _ =>
|
||||||
|
damage
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
damage
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
case object StarfireAggravatedBurn extends Mod {
|
||||||
|
def Calculate: DamageModifiers.Format = formula
|
||||||
|
|
||||||
|
private def formula(damage: Int, data: ResolvedProjectile): Int = {
|
||||||
|
if (data.resolution == ProjectileResolution.AggravatedDirectBurn) {
|
||||||
|
(data.projectile.profile.Aggravated, data.target) match {
|
||||||
|
case (Some(aggravation), v : VehicleSource) if GlobalDefinitions.isFlightVehicle(v.Definition) =>
|
||||||
|
aggravation.info.find(_.damage_type == DamageType.Direct) match {
|
||||||
|
case Some(infos) =>
|
||||||
|
(damage * infos.degradation_percentage) toInt
|
||||||
|
case _ =>
|
||||||
|
damage
|
||||||
|
}
|
||||||
|
case _ =>
|
||||||
|
0
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
damage
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue