diff --git a/common/src/main/scala/net/psforever/objects/ballistics/AggravatedDamage.scala b/common/src/main/scala/net/psforever/objects/ballistics/AggravatedDamage.scala
new file mode 100644
index 00000000..67a217cc
--- /dev/null
+++ b/common/src/main/scala/net/psforever/objects/ballistics/AggravatedDamage.scala
@@ -0,0 +1,37 @@
+// Copyright (c) 2017 PSForever
+package net.psforever.objects.ballistics
+
+import net.psforever.objects.vital.DamageType
+
+object AggravatedEffect extends Enumeration {
+ type Type = Value
+ val Comet, Fire, Plasma, Napalm, None = Value
+}
+
+final case class AggravatedInfo(damage_type : DamageType.Value,
+ degradation_percentage : Float,
+ infliction_rate : Long) {
+ 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],
+ effect_type : AggravatedEffect.Value,
+ duration : Long,
+ max_factor : Float,
+ cumulative_damage_degrade : Boolean,
+ vanu_aggravated : Boolean)
+
+object AggravatedDamage {
+ def apply(info : AggravatedInfo,
+ effect_type : AggravatedEffect.Value,
+ duration : Long,
+ max_factor : Float) : AggravatedDamage =
+ AggravatedDamage(List(info), effect_type, duration, max_factor, cumulative_damage_degrade = true, vanu_aggravated = false)
+
+ def apply(info : AggravatedInfo,
+ effect_type : AggravatedEffect.Value,
+ duration : Long,
+ max_factor : Float,
+ vanu_aggravated : Boolean) : AggravatedDamage =
+ AggravatedDamage(List(info), effect_type, duration, max_factor, cumulative_damage_degrade = true, vanu_aggravated)
+}
diff --git a/common/src/main/scala/net/psforever/objects/vital/StandardDamages.scala b/common/src/main/scala/net/psforever/objects/vital/StandardDamages.scala
new file mode 100644
index 00000000..7e460c58
--- /dev/null
+++ b/common/src/main/scala/net/psforever/objects/vital/StandardDamages.scala
@@ -0,0 +1,176 @@
+// Copyright (c) 2017 PSForever
+//package net.psforever.objects.vital
+//
+//import net.psforever.objects.vital.StandardAmenityDamage.None
+//import net.psforever.objects.vital.StandardDeployableDamage.None
+//import net.psforever.objects.vital.damage._
+//import net.psforever.objects.vital.damage.DamageCalculations._
+//import net.psforever.objects.vital.projectile.ProjectileCalculations
+//
+///**
+// * A protected super class for calculating "no damage."
+// * Used for `NoDamage` but also for the base of `*LashDamage` calculation objects
+// * to maintain the polymorphic identity of `DamageCalculations`.
+// */
+//protected class NoDamageBase
+// extends DamageCalculations(
+// DamageCalculations.NoDamage,
+// DamageWithModifiers(NoDamageAgainst),
+// TooFar
+// )
+//
+//object NoDamage extends NoDamageBase
+//
+//object InfantryHitDamage
+// extends DamageCalculations(
+// DirectHitDamageWithDegrade,
+// DamageWithModifiers(DamageAgainstExoSuit),
+// DistanceBetweenTargetandSource
+// )
+//
+//object MaxHitDamage
+// extends DamageCalculations(
+// DirectHitDamageWithDegrade,
+// DamageWithModifiers(DamageAgainstMaxSuit),
+// DistanceBetweenTargetandSource
+// )
+//
+//object VehicleHitDamage
+// extends DamageCalculations(
+// DirectHitDamageWithDegrade,
+// DamageWithModifiers(DamageAgainstVehicle),
+// DistanceBetweenTargetandSource
+// )
+//
+//object AircraftHitDamage
+// extends DamageCalculations(
+// DirectHitDamageWithDegrade,
+// DamageWithModifiers(DamageAgainstAircraft),
+// DistanceBetweenTargetandSource
+// )
+//
+//object InfantrySplashDamage
+// extends DamageCalculations(
+// SplashDamageWithRadialDegrade,
+// DamageWithModifiers(DamageAgainstExoSuit),
+// DistanceFromExplosionToTarget
+// )
+//
+//object MaxSplashDamage
+// extends DamageCalculations(
+// SplashDamageWithRadialDegrade,
+// DamageWithModifiers(DamageAgainstMaxSuit),
+// DistanceFromExplosionToTarget
+// )
+//
+//object VehicleSplashDamage
+// extends DamageCalculations(
+// SplashDamageWithRadialDegrade,
+// DamageWithModifiers(DamageAgainstVehicle),
+// DistanceFromExplosionToTarget
+// )
+//
+//object AircraftSplashDamage
+// extends DamageCalculations(
+// SplashDamageWithRadialDegrade,
+// DamageWithModifiers(DamageAgainstAircraft),
+// DistanceFromExplosionToTarget
+// )
+//
+//object InfantrySplashDamageDirect
+// extends DamageCalculations(
+// SplashDamageWithRadialDegrade,
+// DamageWithModifiers(DamageAgainstAircraft),
+// NoDistance
+// )
+//
+//object InfantryLashDamage
+// extends DamageCalculations(
+// LashDamage,
+// DamageWithModifiers(DamageAgainstExoSuit),
+// DistanceBetweenTargetandSource
+// )
+//
+//object MaxLashDamage
+// extends DamageCalculations(
+// LashDamage,
+// DamageWithModifiers(DamageAgainstMaxSuit),
+// DistanceBetweenTargetandSource
+// )
+//
+//object VehicleLashDamage
+// extends DamageCalculations(
+// LashDamage,
+// DamageWithModifiers(DamageAgainstVehicle),
+// DistanceBetweenTargetandSource
+// )
+//
+//object AircraftLashDamage
+// extends DamageCalculations(
+// LashDamage,
+// DamageWithModifiers(DamageAgainstAircraft),
+// DistanceBetweenTargetandSource
+// )
+//
+//object AmenityHitDamage
+// extends DamageCalculations(
+// DirectHitDamageWithDegrade,
+// DamageWithModifiers(DamageAgainstVehicle),
+// DistanceBetweenTargetandSource
+// )
+//
+//object AmenitySplashDamage
+// extends DamageCalculations(
+// SplashDamageWithRadialDegrade,
+// DamageWithModifiers(DamageAgainstVehicle),
+// DistanceFromExplosionToTarget
+// )
+//
+//object NoDamageSelection extends DamageSelection {
+// def Direct = None
+// def Splash = None
+// def Lash = None
+// def Aggravated : ProjectileCalculations.Form = None
+//}
+//
+//object StandardInfantryDamage extends DamageSelection {
+// def Direct : ProjectileCalculations.Form = InfantryHitDamage.Calculate
+// def Splash : ProjectileCalculations.Form = InfantrySplashDamage.Calculate
+// def Lash : ProjectileCalculations.Form = InfantryLashDamage.Calculate
+// def Aggravated : ProjectileCalculations.Form = InfantrySplashDamage.Calculate
+//}
+//
+//object StandardMaxDamage extends DamageSelection {
+// def Direct : ProjectileCalculations.Form = MaxHitDamage.Calculate
+// def Splash : ProjectileCalculations.Form = MaxSplashDamage.Calculate
+// def Lash : ProjectileCalculations.Form = MaxLashDamage.Calculate
+// def Aggravated : ProjectileCalculations.Form = None
+//}
+//
+//object StandardVehicleDamage extends DamageSelection {
+// def Direct : ProjectileCalculations.Form = VehicleHitDamage.Calculate
+// def Splash : ProjectileCalculations.Form = VehicleSplashDamage.Calculate
+// def Lash : ProjectileCalculations.Form = VehicleLashDamage.Calculate
+// def Aggravated : ProjectileCalculations.Form = None
+//}
+//
+//object StandardAircraftDamage extends DamageSelection {
+// def Direct : ProjectileCalculations.Form = AircraftHitDamage.Calculate
+// def Splash : ProjectileCalculations.Form = AircraftSplashDamage.Calculate
+// def Lash : ProjectileCalculations.Form = AircraftLashDamage.Calculate
+// def Aggravated : ProjectileCalculations.Form = None
+//}
+//
+//object StandardDeployableDamage extends DamageSelection {
+// def Direct : ProjectileCalculations.Form = VehicleHitDamage.Calculate
+// def Splash : ProjectileCalculations.Form = VehicleSplashDamage.Calculate
+// def Lash : ProjectileCalculations.Form = NoDamage.Calculate
+// def Aggravated : ProjectileCalculations.Form = None
+//}
+//
+//object StandardAmenityDamage extends DamageSelection {
+// def Direct : ProjectileCalculations.Form = AmenityHitDamage.Calculate
+// def Splash : ProjectileCalculations.Form = AmenitySplashDamage.Calculate
+// def Lash : ProjectileCalculations.Form = NoDamage.Calculate
+// def Aggravated : ProjectileCalculations.Form = None
+//}
diff --git a/common/src/main/scala/net/psforever/objects/vital/damage/DamageSelection.scala b/common/src/main/scala/net/psforever/objects/vital/damage/DamageSelection.scala
new file mode 100644
index 00000000..8b15c500
--- /dev/null
+++ b/common/src/main/scala/net/psforever/objects/vital/damage/DamageSelection.scala
@@ -0,0 +1,35 @@
+// Copyright (c) 2017 PSForever
+//package net.psforever.objects.vital.damage
+//
+//import net.psforever.objects.ballistics.ResolvedProjectile
+//import net.psforever.objects.vital.{DamageType, NoDamage}
+//import net.psforever.objects.vital.projectile.ProjectileCalculations
+//
+///**
+// * Maintain information about three primary forms of damage calculation
+// * and a means to test which calculation is valid in a given situation.
+// */
+//trait DamageSelection {
+// final def None: ProjectileCalculations.Form = NoDamage
+//
+// def Direct : ProjectileCalculations.Form
+// def Splash : ProjectileCalculations.Form
+// def Lash : ProjectileCalculations.Form
+// def Aggravated : ProjectileCalculations.Form
+//
+// def apply(data : ResolvedProjectile) : ProjectileCalculations.Form = data.projectile.profile.ProjectileDamageType match {
+// case DamageType.Direct => Direct
+// case DamageType.Splash => Splash
+// case DamageType.Lash => Lash
+// case DamageType.Aggravated => Aggravated
+// case _ => None
+// }
+//
+// def apply(res : DamageType.Value) : ProjectileCalculations.Form = res match {
+// case DamageType.Direct => Direct
+// case DamageType.Splash => Splash
+// case DamageType.Lash => Lash
+// case DamageType.Aggravated => Aggravated
+// case _ => None
+// }
+//}
diff --git a/src/main/scala/net/psforever/actors/session/SessionActor.scala b/src/main/scala/net/psforever/actors/session/SessionActor.scala
index 692c4d4d..0c1c76b4 100644
--- a/src/main/scala/net/psforever/actors/session/SessionActor.scala
+++ b/src/main/scala/net/psforever/actors/session/SessionActor.scala
@@ -744,7 +744,7 @@ class SessionActor extends Actor with MDCContextAware {
unk7 = 0
)
) //repeat of our entry
- val playerGuid = player.GUID
+ val playerGuid = player.GUID
//turn lfs off
val factionChannel = s"${player.Faction}"
if (avatar.lookingForSquad) {
@@ -897,7 +897,7 @@ class SessionActor extends Actor with MDCContextAware {
SquadUIElement(element.name, element.index, entry.zone_number, entry.health, entry.armor, entry.pos)
entry
case (entry, element)
- if entry.health != element.health || entry.armor != element.armor || entry.pos != element.position =>
+ if entry.health != element.health || entry.armor != element.armor || entry.pos != element.position =>
//other elements that need to be updated
squadUI(entry.char_id) =
SquadUIElement(element.name, element.index, entry.zone_number, entry.health, entry.armor, entry.pos)
@@ -1291,6 +1291,49 @@ class SessionActor extends Actor with MDCContextAware {
taskResolver ! RegisterNewAvatar(player)
}
+ case msg @ Zoning.InstantAction.Located(zone, _, spawn_point) =>
+ //in between subsequent reply messages, it does not matter if the destination changes
+ //so long as there is at least one destination at all (including the fallback)
+ if (ContemplateZoningResponse(Zoning.InstantAction.Request(player.Faction), cluster)) {
+ val (pos, ori) = spawn_point.SpecificPoint(player)
+ SpawnThroughZoningProcess(zone, pos, ori)
+ } else if (zoningStatus != Zoning.Status.None) {
+ instantActionFallbackDestination = Some(msg)
+ }
+
+ case Zoning.InstantAction.NotLocated() =>
+ instantActionFallbackDestination match {
+ case Some(Zoning.InstantAction.Located(zone, _, spawn_point))
+ if spawn_point.Owner.Faction == player.Faction && !spawn_point.Offline =>
+ if (ContemplateZoningResponse(Zoning.InstantAction.Request(player.Faction), cluster)) {
+ val (pos, ori) = spawn_point.SpecificPoint(player)
+ SpawnThroughZoningProcess(zone, pos, ori)
+ } else if (zoningCounter == 0) {
+ CancelZoningProcessWithReason("@InstantActionNoHotspotsAvailable")
+ }
+ case _ =>
+ //no instant action available
+ CancelZoningProcessWithReason("@InstantActionNoHotspotsAvailable")
+ }
+
+ case Zoning.Recall.Located(zone, spawn_point) =>
+ if (ContemplateZoningResponse(Zoning.Recall.Request(player.Faction, zone.Id), cluster)) {
+ val (pos, ori) = spawn_point.SpecificPoint(player)
+ SpawnThroughZoningProcess(zone, pos, ori)
+ }
+
+ case Zoning.Recall.Denied(reason) =>
+ CancelZoningProcessWithReason(s"@norecall_sanctuary_$reason", Some(ChatMessageType.CMT_QUIT))
+
+ case Zoning.Quit() =>
+ if (ContemplateZoningResponse(Zoning.Quit(), self)) {
+ log.info("Good-bye")
+ ImmediateDisconnect()
+ }
+
+ case ZoningReset() =>
+ CancelZoningProcess()
+
case NewPlayerLoaded(tplayer) =>
//new zone
log.info(s"Player ${tplayer.Name} has been loaded")
@@ -1402,7 +1445,7 @@ class SessionActor extends Actor with MDCContextAware {
} else if (tplayer.isAlive) {
if (
zoneLoaded.contains(true) &&
- tplayer.HasGUID && tplayer.Actor != Default.Actor && (continent.GUID(tplayer.VehicleSeated) match {
+ tplayer.HasGUID && tplayer.Actor != Default.Actor && (continent.GUID(tplayer.VehicleSeated) match {
case Some(o: Vehicle) => o.HasGUID && o.Actor != Default.Actor && !o.Destroyed
case _ => true
})
@@ -1566,11 +1609,11 @@ class SessionActor extends Actor with MDCContextAware {
}
case msg @ Containable.ItemPutInSlot(
- _: PlanetSideServerObject with Container,
- _: Equipment,
- _: Int,
- _: Option[Equipment]
- ) =>
+ _: PlanetSideServerObject with Container,
+ _: Equipment,
+ _: Int,
+ _: Option[Equipment]
+ ) =>
log.info(s"$msg")
case msg @ Containable.CanNotPutItemInSlot(_: PlanetSideServerObject with Container, _: Equipment, _: Int) =>
@@ -1972,19 +2015,19 @@ class SessionActor extends Actor with MDCContextAware {
}
case AvatarResponse.PlayerState(
- pos,
- vel,
- yaw,
- pitch,
- yaw_upper,
- seq_time,
- is_crouching,
- is_jumping,
- jump_thrust,
- is_cloaking,
- spectating,
- weaponInHand
- ) =>
+ pos,
+ vel,
+ yaw,
+ pitch,
+ yaw_upper,
+ seq_time,
+ is_crouching,
+ is_jumping,
+ jump_thrust,
+ is_cloaking,
+ spectating,
+ weaponInHand
+ ) =>
if (tplayer_guid != guid) {
val now = System.currentTimeMillis()
val (location, time, distanceSq): (Vector3, Long, Float) = if (spectating) {
@@ -2815,18 +2858,18 @@ class SessionActor extends Actor with MDCContextAware {
}
case VehicleResponse.VehicleState(
- vehicle_guid,
- unk1,
- pos,
- ang,
- vel,
- unk2,
- unk3,
- unk4,
- wheel_direction,
- unk5,
- unk6
- ) =>
+ vehicle_guid,
+ unk1,
+ pos,
+ ang,
+ vel,
+ unk2,
+ unk3,
+ unk4,
+ wheel_direction,
+ unk5,
+ unk6
+ ) =>
if (tplayer_guid != guid) {
sendResponse(
VehicleStateMessage(vehicle_guid, unk1, pos, ang, vel, unk2, unk3, unk4, wheel_direction, unk5, unk6)
@@ -2960,10 +3003,10 @@ class SessionActor extends Actor with MDCContextAware {
* @return a tuple composed of an `ObjectAttachMessage` packet and a `CargoMountPointStatusMessage` packet
*/
def CargoMountBehaviorForUs(
- carrier: Vehicle,
- cargo: Vehicle,
- mountPoint: Int
- ): (ObjectAttachMessage, CargoMountPointStatusMessage) = {
+ carrier: Vehicle,
+ cargo: Vehicle,
+ mountPoint: Int
+ ): (ObjectAttachMessage, CargoMountPointStatusMessage) = {
val msgs @ (attachMessage, mountPointStatusMessage) = CargoBehavior.CargoMountMessages(carrier, cargo, mountPoint)
CargoMountMessagesForUs(attachMessage, mountPointStatusMessage)
msgs
@@ -2977,9 +3020,9 @@ class SessionActor extends Actor with MDCContextAware {
* @param mountPointStatusMessage a `CargoMountPointStatusMessage` packet suitable for initializing cargo operations
*/
def CargoMountMessagesForUs(
- attachMessage: ObjectAttachMessage,
- mountPointStatusMessage: CargoMountPointStatusMessage
- ): Unit = {
+ attachMessage: ObjectAttachMessage,
+ mountPointStatusMessage: CargoMountPointStatusMessage
+ ): Unit = {
sendResponse(attachMessage)
sendResponse(mountPointStatusMessage)
}
@@ -3743,21 +3786,21 @@ class SessionActor extends Actor with MDCContextAware {
zoneLoaded = Some(true)
case msg @ PlayerStateMessageUpstream(
- avatar_guid,
- pos,
- vel,
- yaw,
- pitch,
- yaw_upper,
- seq_time,
- unk3,
- is_crouching,
- is_jumping,
- jump_thrust,
- is_cloaking,
- unk5,
- unk6
- ) =>
+ avatar_guid,
+ pos,
+ vel,
+ yaw,
+ pitch,
+ yaw_upper,
+ seq_time,
+ unk3,
+ is_crouching,
+ is_jumping,
+ jump_thrust,
+ is_cloaking,
+ unk5,
+ unk6
+ ) =>
//log.info(s"$msg")
persist()
turnCounterFunc(avatar_guid)
@@ -3872,18 +3915,18 @@ class SessionActor extends Actor with MDCContextAware {
}
case msg @ VehicleStateMessage(
- vehicle_guid,
- unk1,
- pos,
- ang,
- vel,
- flying,
- unk6,
- unk7,
- wheels,
- is_decelerating,
- is_cloaked
- ) =>
+ vehicle_guid,
+ unk1,
+ pos,
+ ang,
+ vel,
+ flying,
+ unk6,
+ unk7,
+ wheels,
+ is_decelerating,
+ is_cloaked
+ ) =>
//log.info(s"$msg")
GetVehicleAndSeat() match {
case (Some(obj), Some(0)) =>
@@ -4107,7 +4150,7 @@ class SessionActor extends Actor with MDCContextAware {
//the decimator does not send a ChangeFireState_Start on the last shot
if (
tool.Definition == GlobalDefinitions.phoenix &&
- tool.Projectile != GlobalDefinitions.phoenix_missile_guided_projectile
+ tool.Projectile != GlobalDefinitions.phoenix_missile_guided_projectile
) {
//suppress the decimator's alternate fire mode, however
continent.AvatarEvents ! AvatarServiceMessage(
@@ -4232,12 +4275,12 @@ class SessionActor extends Actor with MDCContextAware {
}
val sumReloadValue: Int = box.Capacity + tailReloadValue
val actualReloadValue = (if (sumReloadValue <= reloadValue) {
- deleteFunc(box)
- sumReloadValue
- } else {
- modifyFunc(box, reloadValue - tailReloadValue)
- reloadValue
- }) + currentMagazine
+ deleteFunc(box)
+ sumReloadValue
+ } else {
+ modifyFunc(box, reloadValue - tailReloadValue)
+ reloadValue
+ }) + currentMagazine
log.info(s"ReloadMessage: success, $tool <- $actualReloadValue ${tool.AmmoType}")
tool.Magazine = actualReloadValue
sendResponse(ReloadMessage(item_guid, actualReloadValue, unk1))
@@ -4450,10 +4493,10 @@ class SessionActor extends Actor with MDCContextAware {
log.info(s"MoveItem: $msg")
(continent.GUID(source_guid), continent.GUID(destination_guid), ValidObject(item_guid)) match {
case (
- Some(source: PlanetSideServerObject with Container),
- Some(destination: PlanetSideServerObject with Container),
- Some(item: Equipment)
- ) =>
+ Some(source: PlanetSideServerObject with Container),
+ Some(destination: PlanetSideServerObject with Container),
+ Some(item: Equipment)
+ ) =>
source.Actor ! Containable.MoveItem(destination, item, dest)
case (None, _, _) =>
log.error(s"MoveItem: wanted to move $item_guid from $source_guid, but could not find source object")
@@ -4524,18 +4567,18 @@ class SessionActor extends Actor with MDCContextAware {
}
case msg @ UseItemMessage(
- avatar_guid,
- item_used_guid,
- object_guid,
- unk2,
- unk3,
- unk4,
- unk5,
- unk6,
- unk7,
- unk8,
- itemType
- ) =>
+ avatar_guid,
+ item_used_guid,
+ object_guid,
+ unk2,
+ unk3,
+ unk4,
+ unk5,
+ unk6,
+ unk7,
+ unk8,
+ itemType
+ ) =>
//log.info("UseItem: " + msg)
// TODO: Not all fields in the response are identical to source in real packet logs (but seems to be ok)
// TODO: Not all incoming UseItemMessage's respond with another UseItemMessage (i.e. doors only send out GenericObjectStateMsg)
@@ -4812,8 +4855,8 @@ class SessionActor extends Actor with MDCContextAware {
//access to trunk
if (
obj.AccessingTrunk.isEmpty &&
- (!obj.PermissionGroup(AccessPermissionGroup.Trunk.id).contains(VehicleLockState.Locked) || obj.Owner
- .contains(player.GUID))
+ (!obj.PermissionGroup(AccessPermissionGroup.Trunk.id).contains(VehicleLockState.Locked) || obj.Owner
+ .contains(player.GUID))
) {
CancelZoningProcessWithDescriptiveReason("cancel_use")
obj.AccessingTrunk = player.GUID
@@ -4846,7 +4889,7 @@ class SessionActor extends Actor with MDCContextAware {
terminal.Actor ! CommonMessages.Use(player, Some(item))
case None
- if terminal.Owner == Building.NoBuilding || terminal.Faction == player.Faction || terminal.HackedBy.nonEmpty =>
+ if terminal.Owner == Building.NoBuilding || terminal.Faction == player.Faction || terminal.HackedBy.nonEmpty =>
val tdef = terminal.Definition
if (tdef.isInstanceOf[MatrixTerminalDefinition]) {
//TODO matrix spawn point; for now, just blindly bind to show work (and hope nothing breaks)
@@ -4856,7 +4899,7 @@ class SessionActor extends Actor with MDCContextAware {
)
} else if (
tdef == GlobalDefinitions.multivehicle_rearm_terminal || tdef == GlobalDefinitions.bfr_rearm_terminal ||
- tdef == GlobalDefinitions.air_rearm_terminal || tdef == GlobalDefinitions.ground_rearm_terminal
+ tdef == GlobalDefinitions.air_rearm_terminal || tdef == GlobalDefinitions.ground_rearm_terminal
) {
FindLocalVehicle match {
case Some(vehicle) =>
@@ -5225,7 +5268,6 @@ class SessionActor extends Actor with MDCContextAware {
case msg @ FavoritesRequest(player_guid, loadoutType, action, line, label) =>
CancelZoningProcessWithDescriptiveReason("cancel_use")
log.info(s"FavoritesRequest: $msg")
-
action match {
case FavoritesAction.Save => avatarActor ! AvatarActor.SaveLoadout(player, loadoutType, label, line)
case FavoritesAction.Delete => avatarActor ! AvatarActor.DeleteLoadout(player, loadoutType, line)
@@ -5247,18 +5289,18 @@ class SessionActor extends Actor with MDCContextAware {
}
case msg @ WeaponFireMessage(
- seq_time,
- weapon_guid,
- projectile_guid,
- shot_origin,
- unk1,
- unk2,
- unk3,
- unk4,
- unk5,
- unk6,
- unk7
- ) =>
+ seq_time,
+ weapon_guid,
+ projectile_guid,
+ shot_origin,
+ unk1,
+ unk2,
+ unk3,
+ unk4,
+ unk5,
+ unk6,
+ unk7
+ ) =>
//log.info(s"WeaponFire: $msg")
HandleWeaponFire(weapon_guid, projectile_guid, shot_origin)
@@ -5347,15 +5389,15 @@ class SessionActor extends Actor with MDCContextAware {
}
case msg @ SplashHitMessage(
- seq_time,
- projectile_guid,
- explosion_pos,
- direct_victim_uid,
- unk3,
- projectile_vel,
- unk4,
- targets
- ) =>
+ seq_time,
+ projectile_guid,
+ explosion_pos,
+ direct_victim_uid,
+ unk3,
+ projectile_vel,
+ unk4,
+ targets
+ ) =>
log.info(s"Splash: $msg")
FindProjectileEntry(projectile_guid) match {
case Some(projectile) =>
@@ -5426,11 +5468,11 @@ class SessionActor extends Actor with MDCContextAware {
if (deadState != DeadState.RespawnTime) {
continent.Buildings.values.find(building => building.GUID == building_guid) match {
case Some(wg: WarpGate) if (wg.Active && (GetKnownVehicleAndSeat() match {
- case (Some(vehicle), _) =>
- wg.Definition.VehicleAllowance && !wg.Definition.NoWarp.contains(vehicle.Definition)
- case _ =>
- true
- })) =>
+ case (Some(vehicle), _) =>
+ wg.Definition.VehicleAllowance && !wg.Definition.NoWarp.contains(vehicle.Definition)
+ case _ =>
+ true
+ })) =>
deadState = DeadState.RespawnTime
cluster ! InterstellarClusterService.GetSpawnPoint(
destinationZoneGuid.guid,
@@ -5588,17 +5630,17 @@ class SessionActor extends Actor with MDCContextAware {
log.debug("Ouch! " + msg)
case msg @ BugReportMessage(
- version_major,
- version_minor,
- version_date,
- bug_type,
- repeatable,
- location,
- zone,
- pos,
- summary,
- desc
- ) =>
+ version_major,
+ version_minor,
+ version_date,
+ bug_type,
+ repeatable,
+ location,
+ zone,
+ pos,
+ summary,
+ desc
+ ) =>
log.info("BugReportMessage: " + msg)
case msg @ BindPlayerMessage(action, bindDesc, unk1, logging, unk2, unk3, unk4, pos) =>
@@ -6305,7 +6347,7 @@ class SessionActor extends Actor with MDCContextAware {
sendResponse(ObjectDetachMessage(tool.GUID, previousBox.GUID, Vector3.Zero, 0f))
sendResponse(ObjectDetachMessage(player.GUID, box.GUID, Vector3.Zero, 0f))
obj.Inventory -= x.start //remove replacement ammo from inventory
- val ammoSlotIndex = tool.FireMode.AmmoSlotIndex
+ val ammoSlotIndex = tool.FireMode.AmmoSlotIndex
tool.AmmoSlots(ammoSlotIndex).Box = box //put replacement ammo in tool
sendResponse(ObjectAttachMessage(tool.GUID, box.GUID, ammoSlotIndex))
@@ -6330,16 +6372,16 @@ class SessionActor extends Actor with MDCContextAware {
//handle inventory contents
box.Capacity = (if (sumReloadValue <= fullMagazine) {
- sumReloadValue
- } else {
- val splitReloadAmmo: Int = sumReloadValue - fullMagazine
- log.info(
- s"ChangeAmmo: taking ${originalBoxCapacity - splitReloadAmmo} from a box of ${originalBoxCapacity} $requestedAmmoType"
- )
- val boxForInventory = AmmoBox(box.Definition, splitReloadAmmo)
- taskResolver ! stowNewFunc(boxForInventory)
- fullMagazine
- })
+ sumReloadValue
+ } else {
+ val splitReloadAmmo: Int = sumReloadValue - fullMagazine
+ log.info(
+ s"ChangeAmmo: taking ${originalBoxCapacity - splitReloadAmmo} from a box of ${originalBoxCapacity} $requestedAmmoType"
+ )
+ val boxForInventory = AmmoBox(box.Definition, splitReloadAmmo)
+ taskResolver ! stowNewFunc(boxForInventory)
+ fullMagazine
+ })
sendResponse(
InventoryStateMessage(box.GUID, tool.GUID, box.Capacity)
) //should work for both players and vehicles
@@ -6453,12 +6495,12 @@ class SessionActor extends Actor with MDCContextAware {
else { xs.map(_.obj.asInstanceOf[Tool].Magazine).reduce(_ + _) }
val sumReloadValue: Int = box.Magazine + tailReloadValue
val actualReloadValue = (if (sumReloadValue <= 3) {
- RemoveOldEquipmentFromInventory(player, taskResolver)(x.obj)
- sumReloadValue
- } else {
- ModifyAmmunition(player)(box.AmmoSlot.Box, 3 - tailReloadValue)
- 3
- })
+ RemoveOldEquipmentFromInventory(player, taskResolver)(x.obj)
+ sumReloadValue
+ } else {
+ ModifyAmmunition(player)(box.AmmoSlot.Box, 3 - tailReloadValue)
+ 3
+ })
log.info(s"found $actualReloadValue more $ammoType grenades to throw")
ModifyAmmunition(player)(
tool.AmmoSlot.Box,
@@ -6480,8 +6522,8 @@ class SessionActor extends Actor with MDCContextAware {
* the second value is the slot position of the object
*/
def FindInLocalContainer(
- object_guid: PlanetSideGUID
- )(parent: PlanetSideServerObject with Container): Option[(PlanetSideServerObject with Container, Option[Int])] = {
+ object_guid: PlanetSideGUID
+ )(parent: PlanetSideServerObject with Container): Option[(PlanetSideServerObject with Container, Option[Int])] = {
val slot: Option[Int] = parent.Find(object_guid)
slot match {
case place @ Some(_) =>
@@ -6498,10 +6540,10 @@ class SessionActor extends Actor with MDCContextAware {
* @param reason a string explaining why the state can not or will not change
*/
def CanNotChangeDeployment(
- obj: PlanetSideServerObject with Deployment,
- state: DriveState.Value,
- reason: String
- ): Unit = {
+ obj: PlanetSideServerObject with Deployment,
+ state: DriveState.Value,
+ reason: String
+ ): Unit = {
val mobileShift: String = if (obj.DeploymentState != DriveState.Mobile) {
obj.DeploymentState = DriveState.Mobile
sendResponse(DeployRequestMessage(player.GUID, obj.GUID, DriveState.Mobile, 0, false, Vector3.Zero))
@@ -6943,10 +6985,10 @@ class SessionActor extends Actor with MDCContextAware {
* `(None, None)`, otherwise (even if the vehicle can be determined)
*/
def GetMountableAndSeat(
- direct: Option[PlanetSideGameObject with Mountable],
- occupant: Player,
- zone: Zone
- ): (Option[PlanetSideGameObject with Mountable], Option[Int]) =
+ direct: Option[PlanetSideGameObject with Mountable],
+ occupant: Player,
+ zone: Zone
+ ): (Option[PlanetSideGameObject with Mountable], Option[Int]) =
direct.orElse(zone.GUID(occupant.VehicleSeated)) match {
case Some(obj: PlanetSideGameObject with Mountable) =>
obj.PassengerInSeat(occupant) match {
@@ -7623,11 +7665,11 @@ class SessionActor extends Actor with MDCContextAware {
* @return the projectile
*/
def ResolveProjectileEntry(
- projectile_guid: PlanetSideGUID,
- resolution: ProjectileResolution.Value,
- target: PlanetSideGameObject with FactionAffinity with Vitality,
- pos: Vector3
- ): Option[ResolvedProjectile] = {
+ projectile_guid: PlanetSideGUID,
+ resolution: ProjectileResolution.Value,
+ target: PlanetSideGameObject with FactionAffinity with Vitality,
+ pos: Vector3
+ ): Option[ResolvedProjectile] = {
FindProjectileEntry(projectile_guid) match {
case Some(projectile) =>
ResolveProjectileEntry(projectile, resolution, target, pos)
@@ -7645,12 +7687,12 @@ class SessionActor extends Actor with MDCContextAware {
* @return a copy of the projectile
*/
def ResolveProjectileEntry(
- projectile: Projectile,
- index: Int,
- resolution: ProjectileResolution.Value,
- target: PlanetSideGameObject with FactionAffinity with Vitality,
- pos: Vector3
- ): Option[ResolvedProjectile] = {
+ projectile: Projectile,
+ index: Int,
+ resolution: ProjectileResolution.Value,
+ target: PlanetSideGameObject with FactionAffinity with Vitality,
+ pos: Vector3
+ ): Option[ResolvedProjectile] = {
if (!projectiles(index).contains(projectile)) {
log.error(s"expected projectile could not be found at $index; can not resolve")
None
@@ -7666,11 +7708,11 @@ class SessionActor extends Actor with MDCContextAware {
* @return a copy of the projectile
*/
def ResolveProjectileEntry(
- projectile: Projectile,
- resolution: ProjectileResolution.Value,
- target: PlanetSideGameObject with FactionAffinity with Vitality,
- pos: Vector3
- ): Option[ResolvedProjectile] = {
+ projectile: Projectile,
+ resolution: ProjectileResolution.Value,
+ target: PlanetSideGameObject with FactionAffinity with Vitality,
+ pos: Vector3
+ ): Option[ResolvedProjectile] = {
if (projectile.isMiss) {
log.error("expected projectile was already counted as a missed shot; can not resolve any further")
None
@@ -7762,11 +7804,11 @@ class SessionActor extends Actor with MDCContextAware {
* @return a `DestroyDisplayMessage` packet that is properly formatted
*/
def DestroyDisplayMessage(
- killer: SourceEntry,
- victim: SourceEntry,
- method: Int,
- unk: Int = 121
- ): DestroyDisplayMessage = {
+ killer: SourceEntry,
+ victim: SourceEntry,
+ method: Int,
+ unk: Int = 121
+ ): DestroyDisplayMessage = {
val killer_seated = killer match {
case obj: PlayerSource => obj.Seated
case _ => false
@@ -7926,12 +7968,12 @@ class SessionActor extends Actor with MDCContextAware {
* @return `true`, if the desired certification requirements are met; `false`, otherwise
*/
def ConstructionItemPermissionComparison(
- sample: Set[Certification],
- test: Set[Certification]
- ): Boolean = {
- import Certification._
- val engineeringCerts: Set[Certification] = Set(AssaultEngineering, FortificationEngineering)
- val testDiff: Set[Certification] = test diff (engineeringCerts ++ Set(AdvancedEngineering))
+ sample: Set[CertificationType.Value],
+ test: Set[CertificationType.Value]
+ ): Boolean = {
+ import CertificationType._
+ val engineeringCerts: Set[CertificationType.Value] = Set(AssaultEngineering, FortificationEngineering)
+ val testDiff: Set[CertificationType.Value] = test diff (engineeringCerts ++ Set(AdvancedEngineering))
//substitute `AssaultEngineering` and `FortificationEngineering` for `AdvancedEngineering`
val sampleIntersect = if (sample contains AdvancedEngineering) {
engineeringCerts
@@ -8073,10 +8115,10 @@ class SessionActor extends Actor with MDCContextAware {
* `false`, otherwise
*/
def SafelyRemoveConstructionItemFromSlot(
- tool: ConstructionItem,
- index: Int,
- logDecorator: String = "SafelyRemoveConstructionItemFromSlot"
- ): Boolean = {
+ tool: ConstructionItem,
+ index: Int,
+ logDecorator: String = "SafelyRemoveConstructionItemFromSlot"
+ ): Boolean = {
if ({
val holster = player.Slot(index)
if (holster.Equipment.contains(tool)) {
@@ -8175,7 +8217,7 @@ class SessionActor extends Actor with MDCContextAware {
*/
def FindEquipmentToDelete(object_guid: PlanetSideGUID, obj: Equipment): Boolean = {
val findFunc
- : PlanetSideServerObject with Container => Option[(PlanetSideServerObject with Container, Option[Int])] =
+ : PlanetSideServerObject with Container => Option[(PlanetSideServerObject with Container, Option[Int])] =
FindInLocalContainer(object_guid)
findFunc(player.avatar.locker)
@@ -8242,12 +8284,12 @@ class SessionActor extends Actor with MDCContextAware {
* @param deletionType the value passed to `ObjectDeleteMessage` concerning the deconstruction animation
*/
def DeconstructDeployable(
- obj: PlanetSideGameObject with Deployable,
- guid: PlanetSideGUID,
- pos: Vector3,
- orient: Vector3,
- deletionType: Int
- ): Unit = {
+ obj: PlanetSideGameObject with Deployable,
+ guid: PlanetSideGUID,
+ pos: Vector3,
+ orient: Vector3,
+ deletionType: Int
+ ): Unit = {
StartBundlingPackets()
sendResponse(SetEmpireMessage(guid, PlanetSideEmpire.NEUTRAL)) //for some, removes the green marker circle
sendResponse(TriggerEffectMessage("spawn_object_failed_effect", pos, orient))
@@ -8511,17 +8553,17 @@ class SessionActor extends Actor with MDCContextAware {
player.Continent = zoneId //forward-set the continent id to perform a test
interstellarFerryTopLevelGUID =
(if (
- manifest.passengers.isEmpty && manifest.cargo.count { case (name, _) => !name.equals("MISSING_DRIVER") } == 0
- ) {
- //do not delete if vehicle has passengers or cargo
- continent.VehicleEvents ! VehicleServiceMessage(
- continent.id,
- VehicleAction.UnloadVehicle(pguid, continent, vehicle, topLevel)
- )
- None
- } else {
- Some(topLevel)
- })
+ manifest.passengers.isEmpty && manifest.cargo.count { case (name, _) => !name.equals("MISSING_DRIVER") } == 0
+ ) {
+ //do not delete if vehicle has passengers or cargo
+ continent.VehicleEvents ! VehicleServiceMessage(
+ continent.Id,
+ VehicleAction.UnloadVehicle(pguid, continent, vehicle, topLevel)
+ )
+ None
+ } else {
+ Some(topLevel)
+ })
//unregister vehicle and driver whole + GiveWorld
continent.Transport ! Zone.Vehicle.Despawn(vehicle)
taskThenZoneChange(
@@ -8685,10 +8727,10 @@ class SessionActor extends Actor with MDCContextAware {
* @param remoteTelepad the endpoint of the teleportation system that exists in the environment
*/
def LinkRouterToRemoteTelepad(
- router: Vehicle,
- internalTelepad: Utility.InternalTelepad,
- remoteTelepad: TelepadDeployable
- ): Unit = {
+ router: Vehicle,
+ internalTelepad: Utility.InternalTelepad,
+ remoteTelepad: TelepadDeployable
+ ): Unit = {
internalTelepad.Telepad = remoteTelepad.GUID //necessary; backwards link to the (new) telepad
CreateRouterInternalTelepad(router, internalTelepad)
LinkRemoteTelepad(remoteTelepad.GUID)
@@ -8749,12 +8791,12 @@ class SessionActor extends Actor with MDCContextAware {
* @param dest the destination of the teleportation (where the player is going)
*/
def UseRouterTelepadSystem(
- router: Vehicle,
- internalTelepad: InternalTelepad,
- remoteTelepad: TelepadDeployable,
- src: PlanetSideGameObject with TelepadLike,
- dest: PlanetSideGameObject with TelepadLike
- ) = {
+ router: Vehicle,
+ internalTelepad: InternalTelepad,
+ remoteTelepad: TelepadDeployable,
+ src: PlanetSideGameObject with TelepadLike,
+ dest: PlanetSideGameObject with TelepadLike
+ ) = {
val time = System.nanoTime
if (
time - recentTeleportAttempt > (2 seconds).toNanos && router.DeploymentState == DriveState.Deployed && internalTelepad.Active && remoteTelepad.Active
@@ -9003,7 +9045,7 @@ class SessionActor extends Actor with MDCContextAware {
// Charge
else if (
player.Capacitor < player.ExoSuitDef.MaxCapacitor
- && (player.CapacitorState == CapacitorStateType.Idle || player.CapacitorState == CapacitorStateType.Charging || (player.CapacitorState == CapacitorStateType.ChargeDelay && System
+ && (player.CapacitorState == CapacitorStateType.Idle || player.CapacitorState == CapacitorStateType.Charging || (player.CapacitorState == CapacitorStateType.ChargeDelay && System
.currentTimeMillis() - player.CapacitorLastUsedMillis > player.ExoSuitDef.CapacitorRechargeDelayMillis))
) {
if (player.CapacitorState == CapacitorStateType.Charging) {
@@ -9137,10 +9179,10 @@ class SessionActor extends Actor with MDCContextAware {
}
def CheckForHitPositionDiscrepancy(
- projectile_guid: PlanetSideGUID,
- hitPos: Vector3,
- target: PlanetSideGameObject with FactionAffinity with Vitality
- ): Unit = {
+ projectile_guid: PlanetSideGUID,
+ hitPos: Vector3,
+ target: PlanetSideGameObject with FactionAffinity with Vitality
+ ): Unit = {
val hitPositionDiscrepancy = Vector3.DistanceSquared(hitPos, target.Position)
if (hitPositionDiscrepancy > Config.app.antiCheat.hitPositionDiscrepancyThreshold) {
// If the target position on the server does not match the position where the projectile landed within reason there may be foul play
@@ -9350,18 +9392,18 @@ class SessionActor extends Actor with MDCContextAware {
s"WeaponFireMessage: ${projectile_info.Name} is a remote projectile"
)
taskResolver ! (if (projectile.HasGUID) {
- continent.AvatarEvents ! AvatarServiceMessage(
- continent.id,
- AvatarAction.ProjectileExplodes(
- player.GUID,
- projectile.GUID,
- projectile
- )
- )
- ReregisterProjectile(projectile)
- } else {
- RegisterProjectile(projectile)
- })
+ continent.AvatarEvents ! AvatarServiceMessage(
+ continent.Id,
+ AvatarAction.ProjectileExplodes(
+ player.GUID,
+ projectile.GUID,
+ projectile
+ )
+ )
+ ReregisterProjectile(projectile)
+ } else {
+ RegisterProjectile(projectile)
+ })
}
projectilesToCleanUp(projectileIndex) = false
diff --git a/src/main/scala/net/psforever/objects/GlobalDefinitions.scala b/src/main/scala/net/psforever/objects/GlobalDefinitions.scala
index 1f8415d2..561484b6 100644
--- a/src/main/scala/net/psforever/objects/GlobalDefinitions.scala
+++ b/src/main/scala/net/psforever/objects/GlobalDefinitions.scala
@@ -2,7 +2,7 @@
package net.psforever.objects
import net.psforever.objects.avatar.Certification
-import net.psforever.objects.ballistics.Projectiles
+import net.psforever.objects.ballistics.{AggravatedDamage, AggravatedEffect, AggravatedInfo, Projectiles}
import net.psforever.objects.ce.{DeployableCategory, DeployedItem}
import net.psforever.objects.definition._
import net.psforever.objects.definition.converter._
@@ -207,6 +207,8 @@ object GlobalDefinitions {
val flail_projectile = ProjectileDefinition(Projectiles.flail_projectile)
+ val flamethrower_fire_cloud = ProjectileDefinition(Projectiles.flamethrower_projectile) //flamethrower_fire_cloud
+
val flamethrower_fireball = ProjectileDefinition(Projectiles.flamethrower_fireball)
val flamethrower_projectile = ProjectileDefinition(Projectiles.flamethrower_projectile)
@@ -2269,6 +2271,7 @@ object GlobalDefinitions {
ProjectileDefinition.CalculateDerivedFields(aphelion_laser_projectile)
aphelion_plasma_rocket_projectile.Name = "aphelion_plasma_rocket_projectile"
+ //has property aggravated_damage_max_factor, but it's the aphelion_plasma_cloud that performs aggravated damage
aphelion_plasma_rocket_projectile.Damage0 = 38
aphelion_plasma_rocket_projectile.Damage1 = 70
aphelion_plasma_rocket_projectile.Damage2 = 95
@@ -2313,6 +2316,13 @@ object GlobalDefinitions {
aphelion_starfire_projectile.InitialVelocity = 45
aphelion_starfire_projectile.Lifespan = 7f
aphelion_starfire_projectile.ProjectileDamageType = DamageType.Aggravated
+ aphelion_starfire_projectile.Aggravated = AggravatedDamage(
+ AggravatedInfo(DamageType.Direct, 0.25f, 250),
+ AggravatedEffect.None,
+ 0,
+ 0f,
+ true
+ )
aphelion_starfire_projectile.ExistsOnRemoteClients = true
aphelion_starfire_projectile.RemoteClientData = (39577, 249) //starfire_projectile data
aphelion_starfire_projectile.AutoLock = true
@@ -2437,6 +2447,12 @@ object GlobalDefinitions {
comet_projectile.DamageAtEdge = 0.45f
comet_projectile.DamageRadius = 1.0f
comet_projectile.ProjectileDamageType = DamageType.Aggravated
+ comet_projectile.Aggravated = AggravatedDamage(
+ AggravatedInfo(DamageType.Direct, 0.2f, 500),
+ AggravatedEffect.Comet,
+ 0,
+ 10f
+ )
comet_projectile.InitialVelocity = 80
comet_projectile.Lifespan = 3.1f
ProjectileDefinition.CalculateDerivedFields(comet_projectile)
@@ -2582,6 +2598,14 @@ object GlobalDefinitions {
flamethrower_fireball.DamageAtEdge = 0.15f
flamethrower_fireball.DamageRadius = 5f
flamethrower_fireball.ProjectileDamageType = DamageType.Aggravated
+ flamethrower_fireball.Aggravated = AggravatedDamage(
+ List(AggravatedInfo(DamageType.Direct, 0.9f, 500), AggravatedInfo(DamageType.Splash, 0.9f, 500)),
+ AggravatedEffect.Fire,
+ 5000,
+ 0.1f,
+ false,
+ false
+ )
flamethrower_fireball.InitialVelocity = 15
flamethrower_fireball.Lifespan = 1.2f
ProjectileDefinition.CalculateDerivedFields(flamethrower_fireball)
@@ -2595,6 +2619,14 @@ object GlobalDefinitions {
flamethrower_projectile.Acceleration = -5
flamethrower_projectile.AccelerationUntil = 2f
flamethrower_projectile.ProjectileDamageType = DamageType.Aggravated
+ flamethrower_projectile.Aggravated = AggravatedDamage(
+ List(AggravatedInfo(DamageType.Direct, 0.5f, 500)),
+ AggravatedEffect.Fire,
+ 5000,
+ 0.5f,
+ false,
+ false
+ )
flamethrower_projectile.DegradeDelay = 1.0f
flamethrower_projectile.DegradeMultiplier = 0.5f
flamethrower_projectile.InitialVelocity = 10
@@ -3423,6 +3455,14 @@ object GlobalDefinitions {
plasma_cartridge_projectile.DamageAtEdge = 0.2f
plasma_cartridge_projectile.DamageRadius = 7f
plasma_cartridge_projectile.ProjectileDamageType = DamageType.Aggravated
+ plasma_cartridge_projectile.Aggravated = AggravatedDamage(
+ List(AggravatedInfo(DamageType.Direct, 0.25f, 750), AggravatedInfo(DamageType.Splash, 0.25f, 1000)),
+ AggravatedEffect.Plasma,
+ 0,
+ 1.5f,
+ true,
+ false
+ )
plasma_cartridge_projectile.InitialVelocity = 30
plasma_cartridge_projectile.Lifespan = 15f
ProjectileDefinition.CalculateDerivedFields(plasma_cartridge_projectile)
@@ -3434,6 +3474,14 @@ object GlobalDefinitions {
plasma_cartridge_projectile_b.DamageAtEdge = 0.2f
plasma_cartridge_projectile_b.DamageRadius = 7f
plasma_cartridge_projectile_b.ProjectileDamageType = DamageType.Aggravated
+ plasma_cartridge_projectile_b.Aggravated = AggravatedDamage(
+ List(AggravatedInfo(DamageType.Direct, 0.25f, 750), AggravatedInfo(DamageType.Splash, 0.25f, 1000)),
+ AggravatedEffect.Plasma,
+ 0,
+ 1.5f,
+ true,
+ false
+ )
plasma_cartridge_projectile_b.InitialVelocity = 30
plasma_cartridge_projectile_b.Lifespan = 2f
ProjectileDefinition.CalculateDerivedFields(plasma_cartridge_projectile_b)
@@ -3444,6 +3492,14 @@ object GlobalDefinitions {
plasma_grenade_projectile.DamageAtEdge = 0.1f
plasma_grenade_projectile.DamageRadius = 7f
plasma_grenade_projectile.ProjectileDamageType = DamageType.Aggravated
+ plasma_grenade_projectile.Aggravated = AggravatedDamage(
+ List(AggravatedInfo(DamageType.Direct, 0.25f, 750), AggravatedInfo(DamageType.Splash, 0.25f, 1000)),
+ AggravatedEffect.Plasma,
+ 0,
+ 1.5f,
+ true,
+ false
+ )
plasma_grenade_projectile.InitialVelocity = 30
plasma_grenade_projectile.Lifespan = 15f
ProjectileDefinition.CalculateDerivedFields(plasma_grenade_projectile)
@@ -3455,6 +3511,14 @@ object GlobalDefinitions {
plasma_grenade_projectile_B.DamageAtEdge = 0.1f
plasma_grenade_projectile_B.DamageRadius = 7f
plasma_grenade_projectile_B.ProjectileDamageType = DamageType.Aggravated
+ plasma_grenade_projectile_B.Aggravated = AggravatedDamage(
+ List(AggravatedInfo(DamageType.Direct, 0.25f, 750), AggravatedInfo(DamageType.Splash, 0.25f, 1000)),
+ AggravatedEffect.Plasma,
+ 0,
+ 1.5f,
+ true,
+ false
+ )
plasma_grenade_projectile_B.InitialVelocity = 30
plasma_grenade_projectile_B.Lifespan = 3f
ProjectileDefinition.CalculateDerivedFields(plasma_grenade_projectile_B)
@@ -3756,6 +3820,13 @@ object GlobalDefinitions {
starfire_projectile.Acceleration = 12
starfire_projectile.AccelerationUntil = 5f
starfire_projectile.ProjectileDamageType = DamageType.Aggravated
+ starfire_projectile.Aggravated = AggravatedDamage(
+ AggravatedInfo(DamageType.Direct, 0.25f, 250),
+ AggravatedEffect.Comet,
+ 0,
+ 0f,
+ true
+ )
starfire_projectile.InitialVelocity = 45
starfire_projectile.Lifespan = 7.8f
starfire_projectile.ExistsOnRemoteClients = true
diff --git a/src/main/scala/net/psforever/objects/ballistics/Projectile.scala b/src/main/scala/net/psforever/objects/ballistics/Projectile.scala
index 05705de3..57b6de22 100644
--- a/src/main/scala/net/psforever/objects/ballistics/Projectile.scala
+++ b/src/main/scala/net/psforever/objects/ballistics/Projectile.scala
@@ -10,11 +10,11 @@ import net.psforever.types.Vector3
/**
* A summation of weapon (`Tool`) discharge.
- * @see `ProjectileDefinition`
- * `ToolDefinition`
- * `FireModeDefinition`
- * `SourceEntry`
- * `PlayerSource`
+ * @see `ProjectileDefinition`
+ * @see `ToolDefinition`
+ * @see `FireModeDefinition`
+ * @see `SourceEntry`
+ * @see `PlayerSource`
* @param profile an explanation of the damage that can be performed by this discharge
* @param tool_def the weapon that caused this discharge
* @param fire_mode the current fire mode of the tool used
diff --git a/src/main/scala/net/psforever/objects/ballistics/ResolvedProjectile.scala b/src/main/scala/net/psforever/objects/ballistics/ResolvedProjectile.scala
index a51fb03f..c06e3e16 100644
--- a/src/main/scala/net/psforever/objects/ballistics/ResolvedProjectile.scala
+++ b/src/main/scala/net/psforever/objects/ballistics/ResolvedProjectile.scala
@@ -9,14 +9,13 @@ import net.psforever.types.Vector3
* about the interaction of weapons discharge and a target
* to the point that the original event might be reconstructed.
* Reenacting the calculations of this entry should always produce the same values.
- * @param resolution how the projectile hit was executed
* @param projectile the original projectile
* @param target what the projectile hit
* @param damage_model the kind of damage model to which the `target` is/was subject
* @param hit_pos where the projectile hit
*/
final case class ResolvedProjectile(
- resolution: ProjectileResolution.Value,
+ resolution : ProjectileResolution.Value,
projectile: Projectile,
target: SourceEntry,
damage_model: DamageResistanceModel,
diff --git a/src/main/scala/net/psforever/objects/definition/ProjectileDefinition.scala b/src/main/scala/net/psforever/objects/definition/ProjectileDefinition.scala
index 69c6ed51..5b83ab1c 100644
--- a/src/main/scala/net/psforever/objects/definition/ProjectileDefinition.scala
+++ b/src/main/scala/net/psforever/objects/definition/ProjectileDefinition.scala
@@ -1,7 +1,7 @@
// Copyright (c) 2017 PSForever
package net.psforever.objects.definition
-import net.psforever.objects.ballistics.Projectiles
+import net.psforever.objects.ballistics.{AggravatedDamage, Projectiles}
import net.psforever.objects.equipment.JammingUnit
import net.psforever.objects.vital.damage.DamageModifiers
import net.psforever.objects.vital.{DamageType, StandardDamageProfile}
@@ -36,6 +36,7 @@ class ProjectileDefinition(objectId: Int)
private var autoLock: Boolean = false
private var additionalEffect: Boolean = false
private var jammerProjectile: Boolean = false
+ private var aggravated_damage : Option[AggravatedDamage] = None
//derived calculations
private var distanceMax: Float = 0f
private var distanceFromAcceleration: Float = 0f
@@ -174,7 +175,16 @@ class ProjectileDefinition(objectId: Int)
JammerProjectile
}
- def DistanceMax: Float = distanceMax //accessor only
+ def Aggravated : Option[AggravatedDamage] = aggravated_damage
+
+ def Aggravated_=(damage : AggravatedDamage) : Option[AggravatedDamage] = Aggravated_=(Some(damage))
+
+ def Aggravated_=(damage : Option[AggravatedDamage]) : Option[AggravatedDamage] = {
+ aggravated_damage = damage
+ Aggravated
+ }
+
+ def DistanceMax : Float = distanceMax //accessor only
def DistanceFromAcceleration: Float = distanceFromAcceleration //accessor only
diff --git a/src/main/scala/net/psforever/objects/vital/DamageResistanceModel.scala b/src/main/scala/net/psforever/objects/vital/DamageResistanceModel.scala
index 1fd9efc7..56140883 100644
--- a/src/main/scala/net/psforever/objects/vital/DamageResistanceModel.scala
+++ b/src/main/scala/net/psforever/objects/vital/DamageResistanceModel.scala
@@ -1,8 +1,8 @@
// Copyright (c) 2017 PSForever
package net.psforever.objects.vital
-import net.psforever.objects.ballistics.{ProjectileResolution, ResolvedProjectile}
import net.psforever.objects.vital.damage.DamageCalculations
+import net.psforever.objects.ballistics.ResolvedProjectile
import net.psforever.objects.vital.projectile.ProjectileCalculations
import net.psforever.objects.vital.resistance.ResistanceSelection
import net.psforever.objects.vital.resolution.ResolutionCalculations
@@ -72,7 +72,7 @@ trait DamageResistanceModel {
* @param resolution an explicit damage resolution overriding the one in the `ResolvedProjectile` object
* @return a function literal that encapsulates delayed modification instructions for certain objects
*/
- def Calculate(data: ResolvedProjectile, resolution: ProjectileResolution.Value): ResolutionCalculations.Output = {
+ def Calculate(data: ResolvedProjectile, resolution: DamageType.Value): ResolutionCalculations.Output = {
val res: ProjectileCalculations.Form = ResistUsing(resolution)
Model(DamageUsing, res, data)
}
diff --git a/src/main/scala/net/psforever/objects/vital/DamageType.scala b/src/main/scala/net/psforever/objects/vital/DamageType.scala
index c34a6ea2..5f5edb65 100644
--- a/src/main/scala/net/psforever/objects/vital/DamageType.scala
+++ b/src/main/scala/net/psforever/objects/vital/DamageType.scala
@@ -9,5 +9,5 @@ package net.psforever.objects.vital
object DamageType extends Enumeration(1) {
type Type = Value
- final val Direct, Splash, Radiation, Aggravated, Plasma, Comet, None = Value
+ final val Direct, Splash, Lash, Radiation, Aggravated, Plasma, Comet, None = Value
}
diff --git a/src/main/scala/net/psforever/objects/vital/StandardResistances.scala b/src/main/scala/net/psforever/objects/vital/StandardResistances.scala
index 34b0e454..c8a5a74f 100644
--- a/src/main/scala/net/psforever/objects/vital/StandardResistances.scala
+++ b/src/main/scala/net/psforever/objects/vital/StandardResistances.scala
@@ -6,70 +6,70 @@ import net.psforever.objects.vital.projectile.ProjectileCalculations
import net.psforever.objects.vital.resistance.{ResistanceCalculations, ResistanceSelection}
object NoResistance
- extends ResistanceCalculations[SourceEntry](
- ResistanceCalculations.ValidInfantryTarget,
- ResistanceCalculations.NoResistExtractor
- )
+ extends ResistanceCalculations[SourceEntry](
+ ResistanceCalculations.ValidInfantryTarget,
+ ResistanceCalculations.NoResistExtractor
+ )
object InfantryHitResistance
- extends ResistanceCalculations[PlayerSource](
- ResistanceCalculations.ValidInfantryTarget,
- ResistanceCalculations.ExoSuitDirectExtractor
- )
+ extends ResistanceCalculations[PlayerSource](
+ ResistanceCalculations.ValidInfantryTarget,
+ ResistanceCalculations.ExoSuitDirectExtractor
+ )
object InfantrySplashResistance
- extends ResistanceCalculations[PlayerSource](
- ResistanceCalculations.ValidInfantryTarget,
- ResistanceCalculations.ExoSuitSplashExtractor
- )
+ extends ResistanceCalculations[PlayerSource](
+ ResistanceCalculations.ValidInfantryTarget,
+ ResistanceCalculations.ExoSuitSplashExtractor
+ )
object InfantryLashResistance
- extends ResistanceCalculations[PlayerSource](
- ResistanceCalculations.ValidInfantryTarget,
- ResistanceCalculations.MaximumResistance
- )
+ extends ResistanceCalculations[PlayerSource](
+ ResistanceCalculations.ValidInfantryTarget,
+ ResistanceCalculations.MaximumResistance
+ )
object InfantryAggravatedResistance
- extends ResistanceCalculations[PlayerSource](
- ResistanceCalculations.ValidInfantryTarget,
- ResistanceCalculations.ExoSuitAggravatedExtractor
- )
+ extends ResistanceCalculations[PlayerSource](
+ ResistanceCalculations.ValidInfantryTarget,
+ ResistanceCalculations.ExoSuitAggravatedExtractor
+ )
object VehicleHitResistance
- extends ResistanceCalculations[VehicleSource](
- ResistanceCalculations.ValidVehicleTarget,
- ResistanceCalculations.VehicleDirectExtractor
- )
+ extends ResistanceCalculations[VehicleSource](
+ ResistanceCalculations.ValidVehicleTarget,
+ ResistanceCalculations.VehicleDirectExtractor
+ )
object VehicleSplashResistance
- extends ResistanceCalculations[VehicleSource](
- ResistanceCalculations.ValidVehicleTarget,
- ResistanceCalculations.VehicleSplashExtractor
- )
+ extends ResistanceCalculations[VehicleSource](
+ ResistanceCalculations.ValidVehicleTarget,
+ ResistanceCalculations.VehicleSplashExtractor
+ )
object VehicleLashResistance
- extends ResistanceCalculations[VehicleSource](
- ResistanceCalculations.ValidVehicleTarget,
- ResistanceCalculations.NoResistExtractor
- )
+ extends ResistanceCalculations[VehicleSource](
+ ResistanceCalculations.ValidVehicleTarget,
+ ResistanceCalculations.NoResistExtractor
+ )
object VehicleAggravatedResistance
- extends ResistanceCalculations[VehicleSource](
- ResistanceCalculations.ValidVehicleTarget,
- ResistanceCalculations.VehicleAggravatedExtractor
- )
+ extends ResistanceCalculations[VehicleSource](
+ ResistanceCalculations.ValidVehicleTarget,
+ ResistanceCalculations.VehicleAggravatedExtractor
+ )
object AmenityHitResistance
- extends ResistanceCalculations[ObjectSource](
- ResistanceCalculations.ValidAmenityTarget,
- ResistanceCalculations.OtherDirectExtractor
- )
+ extends ResistanceCalculations[ObjectSource](
+ ResistanceCalculations.ValidAmenityTarget,
+ ResistanceCalculations.OtherDirectExtractor
+ )
-object AMenitySplashResistance
- extends ResistanceCalculations[ObjectSource](
- ResistanceCalculations.ValidAmenityTarget,
- ResistanceCalculations.OtherSplashExtractor
- )
+object AmenitySplashResistance
+ extends ResistanceCalculations[ObjectSource](
+ ResistanceCalculations.ValidAmenityTarget,
+ ResistanceCalculations.OtherSplashExtractor
+ )
object NoResistanceSelection extends ResistanceSelection {
def Direct: ProjectileCalculations.Form = None
diff --git a/src/main/scala/net/psforever/objects/vital/resistance/ResistanceSelection.scala b/src/main/scala/net/psforever/objects/vital/resistance/ResistanceSelection.scala
index ea889e1b..0e7c466d 100644
--- a/src/main/scala/net/psforever/objects/vital/resistance/ResistanceSelection.scala
+++ b/src/main/scala/net/psforever/objects/vital/resistance/ResistanceSelection.scala
@@ -2,7 +2,7 @@
package net.psforever.objects.vital.resistance
import net.psforever.objects.ballistics._
-import net.psforever.objects.vital.NoResistance
+import net.psforever.objects.vital.{DamageType, NoResistance}
import net.psforever.objects.vital.projectile.ProjectileCalculations
/**
@@ -17,19 +17,19 @@ trait ResistanceSelection {
def Lash: ProjectileCalculations.Form
def Aggravated: ProjectileCalculations.Form
- def apply(data: ResolvedProjectile): ProjectileCalculations.Form =
- data.resolution match {
- case ProjectileResolution.Hit => Direct
- case ProjectileResolution.Splash => Splash
- case ProjectileResolution.Lash => Lash
- case _ => None
- }
+ def apply(data : ResolvedProjectile) : ProjectileCalculations.Form = data.projectile.profile.ProjectileDamageType match {
+ case DamageType.Direct => Direct
+ case DamageType.Splash => Splash
+ case DamageType.Lash => Lash
+ case DamageType.Aggravated => Aggravated
+ case _ => None
+ }
- def apply(res: ProjectileResolution.Value): ProjectileCalculations.Form =
- res match {
- case ProjectileResolution.Hit => Direct
- case ProjectileResolution.Splash => Splash
- case ProjectileResolution.Lash => Lash
- case _ => None
- }
+ def apply(res : DamageType.Value) : ProjectileCalculations.Form = res match {
+ case DamageType.Direct => Direct
+ case DamageType.Splash => Splash
+ case DamageType.Lash => Lash
+ case DamageType.Aggravated => Aggravated
+ case _ => None
+ }
}
diff --git a/src/test/scala/objects/DamageModelTests.scala b/src/test/scala/objects/DamageModelTests.scala
index 06f461a3..c9de3554 100644
--- a/src/test/scala/objects/DamageModelTests.scala
+++ b/src/test/scala/objects/DamageModelTests.scala
@@ -28,7 +28,7 @@ class DamageCalculationsTests extends Specification {
val target = Vehicle(GlobalDefinitions.fury)
target.Position = Vector3(10, 0, 0)
val resprojectile = ResolvedProjectile(
- ProjectileResolution.Splash,
+ ProjectileResolution.Hit,
projectile,
SourceEntry(target),
target.DamageModel,
@@ -180,7 +180,7 @@ class ResistanceCalculationsTests extends Specification {
"ignore all targets" in {
val target = Vehicle(GlobalDefinitions.fury)
val resprojectile = ResolvedProjectile(
- ProjectileResolution.Splash,
+ ProjectileResolution.Hit,
projectile,
SourceEntry(target),
target.DamageModel,
@@ -192,7 +192,7 @@ class ResistanceCalculationsTests extends Specification {
"discern standard infantry targets" in {
val target = player
val resprojectile = ResolvedProjectile(
- ProjectileResolution.Splash,
+ ProjectileResolution.Hit,
projectile,
SourceEntry(target),
target.DamageModel,
@@ -208,7 +208,7 @@ class ResistanceCalculationsTests extends Specification {
val target = Player(Avatar(0, "TestCharacter", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute))
target.ExoSuit = ExoSuitType.MAX
val resprojectile = ResolvedProjectile(
- ProjectileResolution.Splash,
+ ProjectileResolution.Hit,
projectile,
SourceEntry(target),
target.DamageModel,
@@ -223,7 +223,7 @@ class ResistanceCalculationsTests extends Specification {
"discern ground vehicle targets" in {
val target = Vehicle(GlobalDefinitions.fury)
val resprojectile = ResolvedProjectile(
- ProjectileResolution.Splash,
+ ProjectileResolution.Hit,
projectile,
SourceEntry(target),
target.DamageModel,
@@ -238,7 +238,7 @@ class ResistanceCalculationsTests extends Specification {
"discern flying vehicle targets" in {
val target = Vehicle(GlobalDefinitions.mosquito)
val resprojectile = ResolvedProjectile(
- ProjectileResolution.Splash,
+ ProjectileResolution.Hit,
projectile,
SourceEntry(target),
target.DamageModel,
@@ -284,7 +284,7 @@ class ResolutionCalculationsTests extends Specification {
"calculate no damage" in {
val target = player
val resprojectile = ResolvedProjectile(
- ProjectileResolution.Splash,
+ ProjectileResolution.Hit,
projectile,
SourceEntry(target),
target.DamageModel,
@@ -296,7 +296,7 @@ class ResolutionCalculationsTests extends Specification {
"calculate no infantry damage for vehicles" in {
val target1 = Vehicle(GlobalDefinitions.fury) //!
val resprojectile1 = ResolvedProjectile(
- ProjectileResolution.Splash,
+ ProjectileResolution.Hit,
projectile,
SourceEntry(target1),
target1.DamageModel,
@@ -306,7 +306,7 @@ class ResolutionCalculationsTests extends Specification {
val target2 = player
val resprojectile2 = ResolvedProjectile(
- ProjectileResolution.Splash,
+ ProjectileResolution.Hit,
projectile,
SourceEntry(target2),
target2.DamageModel,
@@ -340,7 +340,7 @@ class ResolutionCalculationsTests extends Specification {
"calculate no max damage for vehicles" in {
val target1 = Vehicle(GlobalDefinitions.fury) //!
val resprojectile1 = ResolvedProjectile(
- ProjectileResolution.Splash,
+ ProjectileResolution.Hit,
projectile,
SourceEntry(target1),
target1.DamageModel,
@@ -350,7 +350,7 @@ class ResolutionCalculationsTests extends Specification {
val target2 = player2
val resprojectile2 = ResolvedProjectile(
- ProjectileResolution.Splash,
+ ProjectileResolution.Hit,
projectile,
SourceEntry(target2),
target2.DamageModel,
@@ -376,7 +376,7 @@ class ResolutionCalculationsTests extends Specification {
"do not care if target is infantry for vehicle calculations" in {
val target1 = player
val resprojectile1 = ResolvedProjectile(
- ProjectileResolution.Splash,
+ ProjectileResolution.Hit,
projectile,
SourceEntry(target1),
target1.DamageModel,
@@ -386,7 +386,7 @@ class ResolutionCalculationsTests extends Specification {
val target2 = Vehicle(GlobalDefinitions.fury) //!
val resprojectile2 = ResolvedProjectile(
- ProjectileResolution.Splash,
+ ProjectileResolution.Hit,
projectile,
SourceEntry(target2),
target2.DamageModel,
@@ -450,7 +450,6 @@ class DamageModelTests extends Specification {
Vector3.Zero
)
val func: Any => ResolvedProjectile = resprojectile.damage_model.Calculate(resprojectile)
-
func(tplayer)
tplayer.Health mustEqual 54
tplayer.Armor mustEqual 46
@@ -471,8 +470,7 @@ class DamageModelTests extends Specification {
Vector3.Zero
)
val func: Any => ResolvedProjectile =
- resprojectile.damage_model.Calculate(resprojectile, ProjectileResolution.Splash)
-
+ resprojectile.damage_model.Calculate(resprojectile, DamageType.Splash)
func(tplayer)
tplayer.Health mustEqual 65
tplayer.Armor mustEqual 35
@@ -572,7 +570,7 @@ class DamageModelTests extends Specification {
Vector3.Zero
)
val func: Any => ResolvedProjectile =
- resprojectile.damage_model.Calculate(resprojectile, ProjectileResolution.Splash)
+ resprojectile.damage_model.Calculate(resprojectile, DamageType.Splash)
func(vehicle)
vehicle.Health mustEqual 518
diff --git a/src/test/scala/objects/DamageableTest.scala b/src/test/scala/objects/DamageableTest.scala
index 6cce2e8b..554e6887 100644
--- a/src/test/scala/objects/DamageableTest.scala
+++ b/src/test/scala/objects/DamageableTest.scala
@@ -40,7 +40,6 @@ class DamageableTest extends Specification {
"permit damage" in {
val target = new SensorDeployable(GlobalDefinitions.motionalarmsensor)
val resolved = ResolvedProjectile(
- ProjectileResolution.Splash,
Projectile(projectileA, weaponA.Definition, weaponA.FireMode, pSource, 0, Vector3.Zero, Vector3.Zero),
SourceEntry(target),
target.DamageModel,
@@ -53,7 +52,6 @@ class DamageableTest extends Specification {
"ignore attempts at non-zero damage" in {
val target = new SensorDeployable(GlobalDefinitions.motionalarmsensor)
val resolved = ResolvedProjectile(
- ProjectileResolution.Splash,
Projectile(
projectileA,
weaponA.Definition,
@@ -78,7 +76,6 @@ class DamageableTest extends Specification {
Faction = player1.Faction
}
val resolved = ResolvedProjectile(
- ProjectileResolution.Splash,
Projectile(projectileA, weaponA.Definition, weaponA.FireMode, pSource, 0, Vector3.Zero, Vector3.Zero),
SourceEntry(target),
target.DamageModel,
@@ -101,7 +98,6 @@ class DamageableTest extends Specification {
Faction = PlanetSideEmpire.NC
}
val resolved = ResolvedProjectile(
- ProjectileResolution.Splash,
Projectile(projectileA, weaponA.Definition, weaponA.FireMode, pSource, 0, Vector3.Zero, Vector3.Zero),
SourceEntry(target),
target.DamageModel,
@@ -128,7 +124,6 @@ class DamageableTest extends Specification {
Faction = player1.Faction
}
val resolved = ResolvedProjectile(
- ProjectileResolution.Splash,
Projectile(projectileA, weaponA.Definition, weaponA.FireMode, pSource, 0, Vector3.Zero, Vector3.Zero),
SourceEntry(target),
target.DamageModel,
@@ -152,7 +147,6 @@ class DamageableTest extends Specification {
"permit jamming" in {
val target = new SensorDeployable(GlobalDefinitions.motionalarmsensor)
val resolved = ResolvedProjectile(
- ProjectileResolution.Splash,
Projectile(projectileB, weaponB.Definition, weaponB.FireMode, pSource, 0, Vector3.Zero, Vector3.Zero),
SourceEntry(target),
target.DamageModel,
@@ -166,7 +160,6 @@ class DamageableTest extends Specification {
"ignore attempts at jamming if the projectile is does not cause the effect" in {
val target = new SensorDeployable(GlobalDefinitions.motionalarmsensor)
val resolved = ResolvedProjectile(
- ProjectileResolution.Splash,
Projectile(projectileA, weaponA.Definition, weaponA.FireMode, pSource, 0, Vector3.Zero, Vector3.Zero),
SourceEntry(target),
target.DamageModel,
@@ -181,7 +174,6 @@ class DamageableTest extends Specification {
val target = new SensorDeployable(GlobalDefinitions.motionalarmsensor)
target.Faction = player1.Faction
val resolved = ResolvedProjectile(
- ProjectileResolution.Splash,
Projectile(projectileB, weaponB.Definition, weaponB.FireMode, pSource, 0, Vector3.Zero, Vector3.Zero),
SourceEntry(target),
target.DamageModel,
@@ -196,7 +188,6 @@ class DamageableTest extends Specification {
"ignore attempts at jamming targets that are not jammable" in {
val target = new TrapDeployable(GlobalDefinitions.tank_traps)
val resolved = ResolvedProjectile(
- ProjectileResolution.Splash,
Projectile(projectileB, weaponB.Definition, weaponB.FireMode, pSource, 0, Vector3.Zero, Vector3.Zero),
SourceEntry(target),
target.DamageModel,
@@ -216,7 +207,6 @@ class DamageableTest extends Specification {
val target = new SensorDeployable(GlobalDefinitions.motionalarmsensor)
target.Faction = player1.Faction
val resolved = ResolvedProjectile(
- ProjectileResolution.Splash,
Projectile(projectileB, weaponB.Definition, weaponB.FireMode, pSource, 0, Vector3.Zero, Vector3.Zero),
SourceEntry(target),
target.DamageModel,
@@ -271,7 +261,6 @@ class DamageableEntityDamageTest extends ActorTest {
val weapon = Tool(GlobalDefinitions.phoenix) //decimator
val projectile = weapon.Projectile
val resolved = ResolvedProjectile(
- ProjectileResolution.Splash,
Projectile(
projectile,
weapon.Definition,
@@ -342,7 +331,6 @@ class DamageableEntityDestroyedTest extends ActorTest {
val weapon = Tool(GlobalDefinitions.phoenix) //decimator
val projectile = weapon.Projectile
val resolved = ResolvedProjectile(
- ProjectileResolution.Splash,
Projectile(
projectile,
weapon.Definition,
@@ -416,7 +404,6 @@ class DamageableEntityNotDestroyTwice extends ActorTest {
val weapon = Tool(GlobalDefinitions.phoenix) //decimator
val projectile = weapon.Projectile
val resolved = ResolvedProjectile(
- ProjectileResolution.Splash,
Projectile(
projectile,
weapon.Definition,
@@ -487,7 +474,6 @@ class DamageableAmenityTest extends ActorTest {
val weapon = Tool(GlobalDefinitions.phoenix) //decimator
val projectile = weapon.Projectile
val resolved = ResolvedProjectile(
- ProjectileResolution.Splash,
Projectile(
projectile,
weapon.Definition,
@@ -580,7 +566,6 @@ class DamageableMountableDamageTest extends ActorTest {
val weapon = Tool(GlobalDefinitions.phoenix) //decimator
val projectile = weapon.Projectile
val resolved = ResolvedProjectile(
- ProjectileResolution.Splash,
Projectile(
projectile,
weapon.Definition,
@@ -675,7 +660,6 @@ class DamageableMountableDestroyTest extends ActorTest {
val weapon = Tool(GlobalDefinitions.phoenix) //decimator
val projectile = weapon.Projectile
val resolved = ResolvedProjectile(
- ProjectileResolution.Splash,
Projectile(
projectile,
weapon.Definition,
@@ -764,7 +748,6 @@ class DamageableWeaponTurretDamageTest extends ActorTest {
val projectile = weapon.Projectile
val turretSource = SourceEntry(turret)
val resolved = ResolvedProjectile(
- ProjectileResolution.Hit,
Projectile(
projectile,
weapon.Definition,
@@ -862,7 +845,6 @@ class DamageableWeaponTurretJammerTest extends ActorTest {
val projectile = weapon.Projectile
val turretSource = SourceEntry(turret)
val resolved = ResolvedProjectile(
- ProjectileResolution.Splash,
Projectile(
projectile,
weapon.Definition,
@@ -964,7 +946,6 @@ class DamageableWeaponTurretDestructionTest extends ActorTest {
val weaponA = Tool(GlobalDefinitions.jammer_grenade)
val projectileA = weaponA.Projectile
val resolvedA = ResolvedProjectile(
- ProjectileResolution.Splash,
Projectile(
projectileA,
weaponA.Definition,
@@ -983,7 +964,6 @@ class DamageableWeaponTurretDestructionTest extends ActorTest {
val weaponB = Tool(GlobalDefinitions.phoenix) //decimator
val projectileB = weaponB.Projectile
val resolvedB = ResolvedProjectile(
- ProjectileResolution.Splash,
Projectile(
projectileB,
weaponB.Definition,
@@ -1046,8 +1026,8 @@ class DamageableWeaponTurretDestructionTest extends ActorTest {
)
assert(
msg56.head match {
- case VehicleServiceMessage.TurretUpgrade(SupportActor.ClearSpecific(List(t), _)) if t eq turret => true
- case _ => false
+ case VehicleServiceMessage.TurretUpgrade(SupportActor.ClearSpecific(List(t), _)) if turret eq t => true
+ case _ => false
}
)
assert(
@@ -1105,7 +1085,6 @@ class DamageableVehicleDamageTest extends ActorTest {
val projectile = weapon.Projectile
val vehicleSource = SourceEntry(atv)
val resolved = ResolvedProjectile(
- ProjectileResolution.Hit,
Projectile(
projectile,
weapon.Definition,
@@ -1237,7 +1216,6 @@ class DamageableVehicleDamageMountedTest extends ActorTest {
val projectile = weapon.Projectile
val vehicleSource = SourceEntry(lodestar)
val resolved = ResolvedProjectile(
- ProjectileResolution.Hit,
Projectile(
projectile,
weapon.Definition,
@@ -1385,7 +1363,6 @@ class DamageableVehicleJammeringMountedTest extends ActorTest {
val weapon = Tool(GlobalDefinitions.jammer_grenade)
val projectile = weapon.Projectile
val resolved = ResolvedProjectile(
- ProjectileResolution.Splash,
Projectile(
projectile,
weapon.Definition,
@@ -1475,7 +1452,6 @@ class DamageableVehicleDestroyTest extends ActorTest {
val projectile = weapon.Projectile
val vehicleSource = SourceEntry(atv)
val resolved = ResolvedProjectile(
- ProjectileResolution.Hit,
Projectile(
projectile,
weapon.Definition,
@@ -1601,7 +1577,6 @@ class DamageableVehicleDestroyMountedTest extends ActorTest {
val weaponA = Tool(GlobalDefinitions.jammer_grenade)
val projectileA = weaponA.Projectile
val resolvedA = ResolvedProjectile(
- ProjectileResolution.Splash,
Projectile(
projectileA,
weaponA.Definition,
@@ -1620,7 +1595,6 @@ class DamageableVehicleDestroyMountedTest extends ActorTest {
val weaponB = Tool(GlobalDefinitions.phoenix) //decimator
val projectileB = weaponB.Projectile
val resolvedB = ResolvedProjectile(
- ProjectileResolution.Splash,
Projectile(
projectileB,
weaponB.Definition,
diff --git a/src/test/scala/objects/DeployableTest.scala b/src/test/scala/objects/DeployableTest.scala
index e96e4cfe..63e99a62 100644
--- a/src/test/scala/objects/DeployableTest.scala
+++ b/src/test/scala/objects/DeployableTest.scala
@@ -334,7 +334,6 @@ class ExplosiveDeployableJammerTest extends ActorTest {
val pSource = PlayerSource(player1)
val projectile = weapon.Projectile
val resolved = ResolvedProjectile(
- ProjectileResolution.Splash,
Projectile(projectile, weapon.Definition, weapon.FireMode, pSource, 0, Vector3.Zero, Vector3.Zero),
jMineSource,
j_mine.DamageModel,
@@ -432,7 +431,6 @@ class ExplosiveDeployableJammerExplodeTest extends ActorTest {
val pSource = PlayerSource(player1)
val projectile = weapon.Projectile
val resolved = ResolvedProjectile(
- ProjectileResolution.Splash,
Projectile(projectile, weapon.Definition, weapon.FireMode, pSource, 0, Vector3.Zero, Vector3.Zero),
hMineSource,
h_mine.DamageModel,
@@ -542,7 +540,6 @@ class ExplosiveDeployableDestructionTest extends ActorTest {
val pSource = PlayerSource(player1)
val projectile = weapon.Projectile
val resolved = ResolvedProjectile(
- ProjectileResolution.Splash,
Projectile(projectile, weapon.Definition, weapon.FireMode, pSource, 0, Vector3.Zero, Vector3.Zero),
hMineSource,
h_mine.DamageModel,
diff --git a/src/test/scala/objects/GeneratorTest.scala b/src/test/scala/objects/GeneratorTest.scala
index d334f156..48c98756 100644
--- a/src/test/scala/objects/GeneratorTest.scala
+++ b/src/test/scala/objects/GeneratorTest.scala
@@ -80,7 +80,6 @@ class GeneratorControlDamageTest extends ActorTest {
val weapon = Tool(GlobalDefinitions.phoenix) //decimator
val projectile = weapon.Projectile
val resolved = ResolvedProjectile(
- ProjectileResolution.Splash,
Projectile(
projectile,
weapon.Definition,
@@ -162,7 +161,6 @@ class GeneratorControlCriticalTest extends ActorTest {
val weapon = Tool(GlobalDefinitions.phoenix) //decimator
val projectile = weapon.Projectile
val resolved = ResolvedProjectile(
- ProjectileResolution.Splash,
Projectile(
projectile,
weapon.Definition,
@@ -253,7 +251,6 @@ class GeneratorControlDestroyedTest extends ActorTest {
val weapon = Tool(GlobalDefinitions.phoenix) //decimator
val projectile = weapon.Projectile
val resolved = ResolvedProjectile(
- ProjectileResolution.Splash,
Projectile(
projectile,
weapon.Definition,
@@ -384,7 +381,6 @@ class GeneratorControlKillsTest extends ActorTest {
val weapon = Tool(GlobalDefinitions.phoenix) //decimator
val projectile = weapon.Projectile
val resolved = ResolvedProjectile(
- ProjectileResolution.Splash,
Projectile(
projectile,
weapon.Definition,
@@ -507,7 +503,6 @@ class GeneratorControlNotDestroyTwice extends ActorTest {
val weapon = Tool(GlobalDefinitions.phoenix) //decimator
val projectile = weapon.Projectile
val resolved = ResolvedProjectile(
- ProjectileResolution.Splash,
Projectile(
projectile,
weapon.Definition,
@@ -597,7 +592,6 @@ class GeneratorControlNotDamageIfExplodingTest extends ActorTest {
val weapon = Tool(GlobalDefinitions.phoenix) //decimator
val projectile = weapon.Projectile
val resolved = ResolvedProjectile(
- ProjectileResolution.Splash,
Projectile(
projectile,
weapon.Definition,
@@ -691,7 +685,6 @@ class GeneratorControlNotRepairIfExplodingTest extends ActorTest {
val weapon = Tool(GlobalDefinitions.phoenix) //decimator
val projectile = weapon.Projectile
val resolved = ResolvedProjectile(
- ProjectileResolution.Splash,
Projectile(
projectile,
weapon.Definition,
diff --git a/src/test/scala/objects/PlayerControlTest.scala b/src/test/scala/objects/PlayerControlTest.scala
index 56b34460..06a528f2 100644
--- a/src/test/scala/objects/PlayerControlTest.scala
+++ b/src/test/scala/objects/PlayerControlTest.scala
@@ -378,7 +378,6 @@ class PlayerControlDamageTest extends ActorTest {
val projectile = tool.Projectile
val playerSource = SourceEntry(player2)
val resolved = ResolvedProjectile(
- ProjectileResolution.Hit,
Projectile(
projectile,
tool.Definition,
@@ -478,7 +477,6 @@ class PlayerControlDeathStandingTest extends ActorTest {
val projectile = tool.Projectile
val player1Source = SourceEntry(player1)
val resolved = ResolvedProjectile(
- ProjectileResolution.Hit,
Projectile(projectile, tool.Definition, tool.FireMode, player1Source, 0, Vector3(2, 0, 0), Vector3(-1, 0, 0)),
SourceEntry(player2),
player2.DamageModel,
@@ -607,7 +605,6 @@ class PlayerControlDeathSeatedTest extends ActorTest {
val projectile = tool.Projectile
val player1Source = SourceEntry(player1)
val resolved = ResolvedProjectile(
- ProjectileResolution.Hit,
Projectile(projectile, tool.Definition, tool.FireMode, player1Source, 0, Vector3(2, 0, 0), Vector3(-1, 0, 0)),
SourceEntry(player2),
player2.DamageModel,
diff --git a/src/test/scala/objects/ProjectileTest.scala b/src/test/scala/objects/ProjectileTest.scala
index 414e7d85..44638010 100644
--- a/src/test/scala/objects/ProjectileTest.scala
+++ b/src/test/scala/objects/ProjectileTest.scala
@@ -352,13 +352,11 @@ class ProjectileTest extends Specification {
"construct" in {
val obj = ResolvedProjectile(
- ProjectileResolution.Hit,
projectile,
PlayerSource(player2),
fury_dm,
Vector3(1.2f, 3.4f, 5.6f)
)
- obj.resolution mustEqual ProjectileResolution.Hit
obj.projectile mustEqual projectile
obj.target mustEqual p2_source
obj.damage_model mustEqual fury.DamageModel
diff --git a/src/test/scala/objects/VehicleTest.scala b/src/test/scala/objects/VehicleTest.scala
index 9992e8fb..7bd0fbf7 100644
--- a/src/test/scala/objects/VehicleTest.scala
+++ b/src/test/scala/objects/VehicleTest.scala
@@ -997,7 +997,7 @@ class VehicleControlShieldsNotChargingTooEarlyTest extends ActorTest {
// val p_source = PlayerSource( Player(Avatar(0, "TestTarget", PlanetSideEmpire.NC, CharacterGender.Female, 1, CharacterVoice.Mute)) )
// val projectile = Projectile(beamer_wep.Projectile, GlobalDefinitions.beamer, beamer_wep.FireMode, p_source, GlobalDefinitions.beamer.ObjectId, Vector3.Zero, Vector3.Zero)
// val fury_dm = Vehicle(GlobalDefinitions.fury).DamageModel
-// val obj = ResolvedProjectile(ProjectileResolution.Hit, projectile, p_source, fury_dm, Vector3(1.2f, 3.4f, 5.6f))
+// val obj = ResolvedProjectile(projectile, p_source, fury_dm, Vector3(1.2f, 3.4f, 5.6f))
//
// "not charge vehicle shields if recently damaged" in {
// assert(vehicle.Shields == 0)
diff --git a/src/test/scala/objects/VitalityTest.scala b/src/test/scala/objects/VitalityTest.scala
index f5b1a74e..750ca986 100644
--- a/src/test/scala/objects/VitalityTest.scala
+++ b/src/test/scala/objects/VitalityTest.scala
@@ -21,7 +21,6 @@ class VitalityTest extends Specification {
val pSource = PlayerSource(player)
val projectile = Projectile(proj, wep, wep_fmode, player, Vector3(2, 2, 0), Vector3.Zero)
val resprojectile = ResolvedProjectile(
- ProjectileResolution.Splash,
projectile,
SourceEntry(player),
player.DamageModel,
@@ -69,7 +68,6 @@ class VitalityTest extends Specification {
val pSource = PlayerSource(player)
val projectile = Projectile(proj, wep, wep_fmode, player, Vector3(2, 2, 0), Vector3.Zero)
val resprojectile = ResolvedProjectile(
- ProjectileResolution.Splash,
projectile,
SourceEntry(player),
player.DamageModel,