introduction of aggravated damage properties and modification of damage pathways such that 'aggravated' is treated as a unique damage type

This commit is contained in:
FateJH 2020-07-10 00:26:30 -04:00
parent cf9e4ea194
commit e5d0690c42
20 changed files with 696 additions and 371 deletions

View file

@ -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)
}

View file

@ -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
//}

View file

@ -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
// }
//}

View file

@ -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

View file

@ -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

View file

@ -10,11 +10,11 @@ import net.psforever.types.Vector3
/**
* A summation of weapon (`Tool`) discharge.
* @see `ProjectileDefinition`<br>
* `ToolDefinition`<br>
* `FireModeDefinition`<br>
* `SourceEntry`<br>
* `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

View file

@ -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,

View file

@ -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

View file

@ -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)
}

View file

@ -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
}

View file

@ -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

View file

@ -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
}
}

View file

@ -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

View file

@ -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,

View file

@ -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,

View file

@ -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,

View file

@ -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,

View file

@ -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

View file

@ -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)

View file

@ -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,