mirror of
https://github.com/2revoemag/PSF-BotServer.git
synced 2026-03-18 03:20:38 +00:00
working comet calculations
This commit is contained in:
parent
80c1a34fb0
commit
a79fc6bd2f
5 changed files with 107 additions and 26 deletions
|
|
@ -4,6 +4,14 @@ import net.psforever.objects.equipment.TargetValidation
|
||||||
import net.psforever.objects.serverobject.aggravated.Aura
|
import net.psforever.objects.serverobject.aggravated.Aura
|
||||||
import net.psforever.objects.vital.DamageType
|
import net.psforever.objects.vital.DamageType
|
||||||
|
|
||||||
|
final case class AggravatedTiming(duration: Long, ticks: Option[Int])
|
||||||
|
|
||||||
|
object AggravatedTiming {
|
||||||
|
def apply(duration: Long): AggravatedTiming = AggravatedTiming(duration, None)
|
||||||
|
|
||||||
|
def apply(duration: Long, ticks: Int): AggravatedTiming = AggravatedTiming(duration, Some(ticks))
|
||||||
|
}
|
||||||
|
|
||||||
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) {
|
||||||
|
|
@ -12,13 +20,44 @@ final case class AggravatedInfo(damage_type: DamageType.Value,
|
||||||
|
|
||||||
final case class AggravatedDamage(info: List[AggravatedInfo],
|
final case class AggravatedDamage(info: List[AggravatedInfo],
|
||||||
effect_type: Aura,
|
effect_type: Aura,
|
||||||
duration: Long,
|
timing: AggravatedTiming,
|
||||||
max_factor: Float,
|
max_factor: Float,
|
||||||
cumulative_damage_degrade: Boolean,
|
cumulative_damage_degrade: Boolean,
|
||||||
vanu_aggravated: Boolean,
|
vanu_aggravated: Boolean,
|
||||||
targets: List[TargetValidation])
|
targets: List[TargetValidation])
|
||||||
|
|
||||||
object AggravatedDamage {
|
object AggravatedDamage {
|
||||||
|
def apply(info: AggravatedInfo,
|
||||||
|
effect_type: Aura,
|
||||||
|
timing: AggravatedTiming,
|
||||||
|
max_factor: Float,
|
||||||
|
targets: List[TargetValidation]): AggravatedDamage =
|
||||||
|
AggravatedDamage(
|
||||||
|
List(info),
|
||||||
|
effect_type,
|
||||||
|
timing,
|
||||||
|
max_factor,
|
||||||
|
cumulative_damage_degrade = true,
|
||||||
|
vanu_aggravated = false,
|
||||||
|
targets
|
||||||
|
)
|
||||||
|
|
||||||
|
def apply(info: AggravatedInfo,
|
||||||
|
effect_type: Aura,
|
||||||
|
timing: AggravatedTiming,
|
||||||
|
max_factor: Float,
|
||||||
|
vanu_aggravated: Boolean,
|
||||||
|
targets: List[TargetValidation]): AggravatedDamage =
|
||||||
|
AggravatedDamage(
|
||||||
|
List(info),
|
||||||
|
effect_type,
|
||||||
|
timing,
|
||||||
|
max_factor,
|
||||||
|
cumulative_damage_degrade = true,
|
||||||
|
vanu_aggravated,
|
||||||
|
targets
|
||||||
|
)
|
||||||
|
|
||||||
def apply(info: AggravatedInfo,
|
def apply(info: AggravatedInfo,
|
||||||
effect_type: Aura,
|
effect_type: Aura,
|
||||||
duration: Long,
|
duration: Long,
|
||||||
|
|
@ -27,7 +66,7 @@ object AggravatedDamage {
|
||||||
AggravatedDamage(
|
AggravatedDamage(
|
||||||
List(info),
|
List(info),
|
||||||
effect_type,
|
effect_type,
|
||||||
duration,
|
AggravatedTiming(duration),
|
||||||
max_factor,
|
max_factor,
|
||||||
cumulative_damage_degrade = true,
|
cumulative_damage_degrade = true,
|
||||||
vanu_aggravated = false,
|
vanu_aggravated = false,
|
||||||
|
|
@ -43,7 +82,7 @@ object AggravatedDamage {
|
||||||
AggravatedDamage(
|
AggravatedDamage(
|
||||||
List(info),
|
List(info),
|
||||||
effect_type,
|
effect_type,
|
||||||
duration,
|
AggravatedTiming(duration),
|
||||||
max_factor,
|
max_factor,
|
||||||
cumulative_damage_degrade = true,
|
cumulative_damage_degrade = true,
|
||||||
vanu_aggravated,
|
vanu_aggravated,
|
||||||
|
|
|
||||||
|
|
@ -122,19 +122,27 @@ trait AuraEffectBehavior {
|
||||||
case Some(list) => effectToEntryId -> (list :+ id)
|
case Some(list) => effectToEntryId -> (list :+ id)
|
||||||
}
|
}
|
||||||
//setup timer data
|
//setup timer data
|
||||||
val tick = 1000 //each second
|
val timing = aggravation.timing
|
||||||
val duration = aggravation.duration
|
val duration = timing.duration
|
||||||
val iterations = (duration / tick).toInt
|
val (tick: Long, iterations: Int) = timing.ticks match {
|
||||||
val leftoverTime = duration - (iterations * tick)
|
case Some(n) if n < 1 =>
|
||||||
|
val rate = info.infliction_rate
|
||||||
|
(rate, (duration / rate).toInt)
|
||||||
|
case Some(ticks) =>
|
||||||
|
(duration / ticks, ticks)
|
||||||
|
case None =>
|
||||||
|
(1000, (duration / 1000).toInt)
|
||||||
|
}
|
||||||
|
val leftoverTime = duration - (tick * iterations)
|
||||||
//quality per tick
|
//quality per tick
|
||||||
val totalPower = (duration.toFloat / info.infliction_rate).toInt - 1
|
val totalPower = (duration.toFloat / info.infliction_rate).toInt - 1
|
||||||
val averagePowerPerTick = math.max(1, totalPower.toFloat / iterations).toInt
|
val averagePowerPerTick = totalPower.toFloat / iterations
|
||||||
val lastTickRemainder = totalPower - averagePowerPerTick * iterations
|
val lastTickRemainder = totalPower - averagePowerPerTick * iterations
|
||||||
val qualityPerTick: List[Int] = if (lastTickRemainder > 0) {
|
val qualityPerTick: List[Float] = if (lastTickRemainder > 0) {
|
||||||
0 +: List.fill[Int](iterations - 1)(averagePowerPerTick) :+ (lastTickRemainder + averagePowerPerTick)
|
0f +: List.fill[Float](iterations - 1)(averagePowerPerTick) :+ (lastTickRemainder + averagePowerPerTick)
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
0 +: List.fill[Int](iterations)(averagePowerPerTick)
|
0f +: List.fill[Float](iterations)(averagePowerPerTick)
|
||||||
}
|
}
|
||||||
//pair id with entry
|
//pair id with entry
|
||||||
PairIdWithAggravationEntry(id, effect, tick, data, data.target, qualityPerTick)
|
PairIdWithAggravationEntry(id, effect, tick, data, data.target, qualityPerTick)
|
||||||
|
|
@ -150,7 +158,7 @@ trait AuraEffectBehavior {
|
||||||
retime: Long,
|
retime: Long,
|
||||||
data: ResolvedProjectile,
|
data: ResolvedProjectile,
|
||||||
target: SourceEntry,
|
target: SourceEntry,
|
||||||
powerOffset: List[Int]
|
powerOffset: List[Float]
|
||||||
): AuraEffectBehavior.Entry = {
|
): AuraEffectBehavior.Entry = {
|
||||||
val aggravatedDamageInfo = ResolvedProjectile(
|
val aggravatedDamageInfo = ResolvedProjectile(
|
||||||
AuraEffectBehavior.burning(data.resolution),
|
AuraEffectBehavior.burning(data.resolution),
|
||||||
|
|
@ -224,21 +232,22 @@ trait AuraEffectBehavior {
|
||||||
|
|
||||||
private def PerformAggravation(entry: AuraEffectBehavior.Entry, tick: Int = 0) : Unit = {
|
private def PerformAggravation(entry: AuraEffectBehavior.Entry, tick: Int = 0) : Unit = {
|
||||||
val data = entry.data
|
val data = entry.data
|
||||||
val info = ResolvedProjectile(
|
val model = data.damage_model
|
||||||
|
val aggravatedProjectileData = ResolvedProjectile(
|
||||||
data.resolution,
|
data.resolution,
|
||||||
data.projectile.quality(entry.qualityPerTick(tick).toFloat),
|
data.projectile.quality(entry.qualityPerTick(tick)),
|
||||||
data.target,
|
data.target,
|
||||||
data.damage_model,
|
model,
|
||||||
data.hit_pos
|
data.hit_pos
|
||||||
)
|
)
|
||||||
TakesDamage.apply(Vitality.Damage(info.damage_model.Calculate(info)))
|
TakesDamage.apply(Vitality.Damage(model.Calculate(aggravatedProjectileData)))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
object AuraEffectBehavior {
|
object AuraEffectBehavior {
|
||||||
type Target = PlanetSideServerObject with Vitality with AuraContainer
|
type Target = PlanetSideServerObject with Vitality with AuraContainer
|
||||||
|
|
||||||
private case class Entry(id: Long, effect: Aura, retime: Long, data: ResolvedProjectile, qualityPerTick: List[Int])
|
private case class Entry(id: Long, effect: Aura, retime: Long, data: ResolvedProjectile, qualityPerTick: List[Float])
|
||||||
|
|
||||||
private case class Aggravate(id: Long, iterations: Int, leftover: Long)
|
private case class Aggravate(id: Long, iterations: Int, leftover: Long)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
package net.psforever.objects
|
package net.psforever.objects
|
||||||
|
|
||||||
import net.psforever.objects.avatar.Certification
|
import net.psforever.objects.avatar.Certification
|
||||||
import net.psforever.objects.ballistics.{AggravatedDamage, AggravatedInfo, Projectiles}
|
import net.psforever.objects.ballistics.{AggravatedDamage, AggravatedInfo, AggravatedTiming, 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._
|
||||||
|
|
@ -2454,7 +2454,7 @@ object GlobalDefinitions {
|
||||||
comet_projectile.Aggravated = AggravatedDamage(
|
comet_projectile.Aggravated = AggravatedDamage(
|
||||||
AggravatedInfo(DamageType.Direct, 0.2f, 500),
|
AggravatedInfo(DamageType.Direct, 0.2f, 500),
|
||||||
Aura.Comet,
|
Aura.Comet,
|
||||||
2000,
|
AggravatedTiming(2000, 4),
|
||||||
10f,
|
10f,
|
||||||
List(
|
List(
|
||||||
TargetValidation(EffectTarget.Category.Player, EffectTarget.Validation.Player),
|
TargetValidation(EffectTarget.Category.Player, EffectTarget.Validation.Player),
|
||||||
|
|
@ -2464,6 +2464,10 @@ object GlobalDefinitions {
|
||||||
comet_projectile.InitialVelocity = 80
|
comet_projectile.InitialVelocity = 80
|
||||||
comet_projectile.Lifespan = 3.1f
|
comet_projectile.Lifespan = 3.1f
|
||||||
ProjectileDefinition.CalculateDerivedFields(comet_projectile)
|
ProjectileDefinition.CalculateDerivedFields(comet_projectile)
|
||||||
|
comet_projectile.Modifiers = List(
|
||||||
|
DamageModifiers.CometAggravated,
|
||||||
|
DamageModifiers.CometAggravatedBurn
|
||||||
|
)
|
||||||
|
|
||||||
dualcycler_projectile.Name = "dualcycler_projectile"
|
dualcycler_projectile.Name = "dualcycler_projectile"
|
||||||
dualcycler_projectile.Damage0 = 18
|
dualcycler_projectile.Damage0 = 18
|
||||||
|
|
@ -2611,7 +2615,7 @@ object GlobalDefinitions {
|
||||||
flamethrower_fireball.Aggravated = AggravatedDamage(
|
flamethrower_fireball.Aggravated = AggravatedDamage(
|
||||||
List(AggravatedInfo(DamageType.Direct, 0.9f, 500), AggravatedInfo(DamageType.Splash, 0.9f, 500)),
|
List(AggravatedInfo(DamageType.Direct, 0.9f, 500), AggravatedInfo(DamageType.Splash, 0.9f, 500)),
|
||||||
Aura.Fire,
|
Aura.Fire,
|
||||||
5000,
|
AggravatedTiming(5000),
|
||||||
0.1f,
|
0.1f,
|
||||||
false,
|
false,
|
||||||
false,
|
false,
|
||||||
|
|
@ -2641,7 +2645,7 @@ object GlobalDefinitions {
|
||||||
flamethrower_projectile.Aggravated = AggravatedDamage(
|
flamethrower_projectile.Aggravated = AggravatedDamage(
|
||||||
List(AggravatedInfo(DamageType.Direct, 0.5f, 500)),
|
List(AggravatedInfo(DamageType.Direct, 0.5f, 500)),
|
||||||
Aura.Fire,
|
Aura.Fire,
|
||||||
5000,
|
AggravatedTiming(5000),
|
||||||
0.5f,
|
0.5f,
|
||||||
false,
|
false,
|
||||||
false,
|
false,
|
||||||
|
|
@ -3507,7 +3511,7 @@ 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,
|
||||||
3000,
|
AggravatedTiming(3000),
|
||||||
1.5f,
|
1.5f,
|
||||||
true,
|
true,
|
||||||
false,
|
false,
|
||||||
|
|
@ -3535,7 +3539,7 @@ 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,
|
||||||
3000,
|
AggravatedTiming(3000),
|
||||||
1.5f,
|
1.5f,
|
||||||
true,
|
true,
|
||||||
false,
|
false,
|
||||||
|
|
@ -3562,7 +3566,7 @@ 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,
|
||||||
3000,
|
AggravatedTiming(3000),
|
||||||
1.5f,
|
1.5f,
|
||||||
true,
|
true,
|
||||||
false,
|
false,
|
||||||
|
|
@ -3590,7 +3594,7 @@ 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,
|
||||||
3000,
|
AggravatedTiming(3000),
|
||||||
1.5f,
|
1.5f,
|
||||||
true,
|
true,
|
||||||
false,
|
false,
|
||||||
|
|
|
||||||
|
|
@ -59,7 +59,7 @@ object Damageable {
|
||||||
*/
|
*/
|
||||||
def CanDamage(obj: Vitality with FactionAffinity, damage: Int, data: ResolvedProjectile): Boolean = {
|
def CanDamage(obj: Vitality with FactionAffinity, damage: Int, data: ResolvedProjectile): Boolean = {
|
||||||
val definition = obj.Definition
|
val definition = obj.Definition
|
||||||
damage > 0 &&
|
(damage > 0 || data.projectile.profile.Aggravated.nonEmpty) &&
|
||||||
definition.Damageable &&
|
definition.Damageable &&
|
||||||
(definition.DamageableByFriendlyFire ||
|
(definition.DamageableByFriendlyFire ||
|
||||||
(data.projectile.owner.Faction != obj.Faction ||
|
(data.projectile.owner.Faction != obj.Faction ||
|
||||||
|
|
|
||||||
|
|
@ -269,4 +269,33 @@ object DamageModifiers {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case object CometAggravated extends Mod {
|
||||||
|
def Calculate: DamageModifiers.Format = formula
|
||||||
|
|
||||||
|
private def formula(damage: Int, data: ResolvedProjectile): Int = {
|
||||||
|
if (data.resolution == ProjectileResolution.AggravatedDirect) {
|
||||||
|
0
|
||||||
|
} else {
|
||||||
|
damage
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
case object CometAggravatedBurn extends Mod {
|
||||||
|
def Calculate: DamageModifiers.Format = formula
|
||||||
|
|
||||||
|
private def formula(damage: Int, data: ResolvedProjectile): Int = {
|
||||||
|
if (data.resolution == ProjectileResolution.AggravatedDirectBurn) {
|
||||||
|
data.projectile.profile.Aggravated match {
|
||||||
|
case Some(_) =>
|
||||||
|
(damage * data.projectile.quality) toInt
|
||||||
|
case _ =>
|
||||||
|
0
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
damage
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue