diff --git a/src/main/scala/net/psforever/objects/definition/converter/SmallDeployableConverter.scala b/src/main/scala/net/psforever/objects/definition/converter/SmallDeployableConverter.scala index b7b430737..8791b6397 100644 --- a/src/main/scala/net/psforever/objects/definition/converter/SmallDeployableConverter.scala +++ b/src/main/scala/net/psforever/objects/definition/converter/SmallDeployableConverter.scala @@ -9,15 +9,15 @@ import net.psforever.types.PlanetSideGUID import scala.util.{Failure, Success, Try} class SmallDeployableConverter extends ObjectCreateConverter[Deployable]() { - override def ConstructorData(obj: Deployable): Try[CommonFieldDataWithPlacement] = { + override def ConstructorData(obj: Deployable): Try[SmallDeployableData] = { Success( - CommonFieldDataWithPlacement( + SmallDeployableData(CommonFieldDataWithPlacement( PlacementData(obj.Position, obj.Orientation), CommonFieldData( obj.Faction, bops = false, alternate = obj.Destroyed, - false, + v1 = false, None, jammered = obj match { case o: JammableUnit => o.Jammed @@ -30,10 +30,10 @@ class SmallDeployableConverter extends ObjectCreateConverter[Deployable]() { case None => PlanetSideGUID(0) } ) - ) + )) ) } - override def DetailedConstructorData(obj: Deployable): Try[CommonFieldDataWithPlacement] = + override def DetailedConstructorData(obj: Deployable): Try[SmallDeployableData] = Failure(new Exception("converter should not be used to generate detailed small deployable data")) } diff --git a/src/main/scala/net/psforever/packet/game/objectcreate/ObjectClass.scala b/src/main/scala/net/psforever/packet/game/objectcreate/ObjectClass.scala index b4b2939ed..1be70996c 100644 --- a/src/main/scala/net/psforever/packet/game/objectcreate/ObjectClass.scala +++ b/src/main/scala/net/psforever/packet/game/objectcreate/ObjectClass.scala @@ -1216,11 +1216,11 @@ object ObjectClass { case ObjectClass.advanced_ace => DroppedItemData(HandheldData.codec, "advanced ace") case ObjectClass.router_telepad => DroppedItemData(HandheldData.codec, "router telepad") case ObjectClass.boomer_trigger => DroppedItemData(HandheldData.codec, "boomer trigger") - case ObjectClass.boomer => ConstructorData(CommonFieldDataWithPlacement.codec, "ace deployable") - case ObjectClass.he_mine => ConstructorData(CommonFieldDataWithPlacement.codec, "ace deployable") - case ObjectClass.jammer_mine => ConstructorData(CommonFieldDataWithPlacement.codec, "ace deployable") - case ObjectClass.motionalarmsensor => ConstructorData(CommonFieldDataWithPlacement.codec, "ace deployable") - case ObjectClass.sensor_shield => ConstructorData(CommonFieldDataWithPlacement.codec, "ace deployable") + case ObjectClass.boomer => ConstructorData(SmallDeployableData.codec, "ace deployable") + case ObjectClass.he_mine => ConstructorData(SmallDeployableData.codec, "ace deployable") + case ObjectClass.jammer_mine => ConstructorData(SmallDeployableData.codec, "ace deployable") + case ObjectClass.motionalarmsensor => ConstructorData(SmallDeployableData.codec, "ace deployable") + case ObjectClass.sensor_shield => ConstructorData(SmallDeployableData.codec, "ace deployable") case ObjectClass.spitfire_aa => ConstructorData(SmallTurretData.codec, "small turret") case ObjectClass.spitfire_cloaked => ConstructorData(SmallTurretData.codec, "small turret") case ObjectClass.spitfire_turret => ConstructorData(SmallTurretData.codec, "small turret") diff --git a/src/main/scala/net/psforever/packet/game/objectcreate/SmallDeployableData.scala b/src/main/scala/net/psforever/packet/game/objectcreate/SmallDeployableData.scala new file mode 100644 index 000000000..fb08485b1 --- /dev/null +++ b/src/main/scala/net/psforever/packet/game/objectcreate/SmallDeployableData.scala @@ -0,0 +1,32 @@ +// Copyright (c) 2024 PSForever +package net.psforever.packet.game.objectcreate + +import net.psforever.packet.Marshallable +import scodec.{Attempt, Codec, Err} +import scodec.codecs._ +import shapeless.{::, HNil} + +final case class SmallDeployableData(deploy: CommonFieldDataWithPlacement) extends ConstructorData { + override def bitsize: Long = { + deploy.bitsize + 1 + } +} + +object SmallDeployableData extends Marshallable[SmallDeployableData] { + implicit val codec: Codec[SmallDeployableData] = ( + ("deploy" | CommonFieldDataWithPlacement.codec) :: + ignore(size = 1) + ).exmap[SmallDeployableData]( + { + case deploy :: _ :: HNil => + Attempt.successful(SmallDeployableData(deploy)) + + case data => + Attempt.failure(Err(s"invalid small deployable data format - $data")) + }, + { + case SmallDeployableData(deploy) => + Attempt.successful(deploy :: () :: HNil) + } + ) +} diff --git a/src/test/scala/game/objectcreate/CommonFieldDataWithPlacementTest.scala b/src/test/scala/game/objectcreate/CommonFieldDataWithPlacementTest.scala index 59724e4fc..f3442112e 100644 --- a/src/test/scala/game/objectcreate/CommonFieldDataWithPlacementTest.scala +++ b/src/test/scala/game/objectcreate/CommonFieldDataWithPlacementTest.scala @@ -20,7 +20,7 @@ class CommonFieldDataWithPlacementTest extends Specification { guid mustEqual PlanetSideGUID(3840) parent.isDefined mustEqual false data match { - case CommonFieldDataWithPlacement(pos, com) => + case SmallDeployableData(CommonFieldDataWithPlacement(pos, com)) => pos.coord mustEqual Vector3(4704.172f, 5546.4375f, 82.234375f) pos.orient mustEqual Vector3.z(272.8125f) com match { @@ -46,10 +46,10 @@ class CommonFieldDataWithPlacementTest extends Specification { } "encode" in { - val obj = CommonFieldDataWithPlacement( + val obj = SmallDeployableData(CommonFieldDataWithPlacement( PlacementData(Vector3(4704.172f, 5546.4375f, 82.234375f), Vector3.z(272.8125f)), CommonFieldData(PlanetSideEmpire.TR, bops = false, alternate = false, v1 = false, None, jammered = false, None, None, PlanetSideGUID(4145)) - ) + )) val msg = ObjectCreateMessage(ObjectClass.boomer, PlanetSideGUID(3840), obj) val pkt = PacketCoding.encodePacket(msg).require.toByteVector pkt mustEqual string_boomer diff --git a/src/test/scala/objects/ConverterTest.scala b/src/test/scala/objects/ConverterTest.scala index 422d9a294..e25352925 100644 --- a/src/test/scala/objects/ConverterTest.scala +++ b/src/test/scala/objects/ConverterTest.scala @@ -32,9 +32,9 @@ class ConverterTest extends Specification { PlanetSideEmpire.NEUTRAL, bops = false, alternate = false, - true, + v1 = true, None, - false, + jammered = false, None, None, PlanetSideGUID(0) @@ -50,9 +50,9 @@ class ConverterTest extends Specification { PlanetSideEmpire.NEUTRAL, bops = false, alternate = false, - false, + v1 = false, None, - false, + jammered = false, Some(false), None, PlanetSideGUID(0) @@ -71,7 +71,7 @@ class ConverterTest extends Specification { obj.Definition.Packet.DetailedConstructorData(obj) match { case Success(pkt) => pkt mustEqual DetailedWeaponData( - CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, true, None, false, None, None, PlanetSideGUID(0)), + CommonFieldData(PlanetSideEmpire.NEUTRAL, bops = false, alternate = false, v1 = true, None, jammered = false, None, None, PlanetSideGUID(0)), 0, List(InternalSlot(Ammo.shotgun_shell.id, PlanetSideGUID(90), 0, DetailedAmmoBoxData(8, 12))) ) @@ -81,7 +81,7 @@ class ConverterTest extends Specification { obj.Definition.Packet.ConstructorData(obj) match { case Success(pkt) => pkt mustEqual WeaponData( - CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, true, None, false, None, None, PlanetSideGUID(0)), + CommonFieldData(PlanetSideEmpire.NEUTRAL, bops = false, alternate = false, v1 = true, None, jammered = false, None, None, PlanetSideGUID(0)), 0, List( InternalSlot( @@ -90,11 +90,11 @@ class ConverterTest extends Specification { 0, CommonFieldData( PlanetSideEmpire.NEUTRAL, - false, - false, - false, + bops = false, + alternate = false, + v1 = false, None, - false, + jammered = false, Some(false), None, PlanetSideGUID(0) @@ -115,7 +115,7 @@ class ConverterTest extends Specification { obj.Definition.Packet.DetailedConstructorData(obj) match { case Success(pkt) => pkt mustEqual DetailedWeaponData( - CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, true, None, false, None, None, PlanetSideGUID(0)), + CommonFieldData(PlanetSideEmpire.NEUTRAL, bops = false, alternate = false, v1 = true, None, jammered = false, None, None, PlanetSideGUID(0)), 0, List( InternalSlot(Ammo.bullet_9mm.id, PlanetSideGUID(90), 0, DetailedAmmoBoxData(8, 30)), @@ -132,17 +132,17 @@ class ConverterTest extends Specification { PlanetSideEmpire.NEUTRAL, //TODO need faction affinity bops = false, alternate = false, - true, + v1 = true, None, - false, + jammered = false, None, None, PlanetSideGUID(0) ), 0, List( - InternalSlot(Ammo.bullet_9mm.id, PlanetSideGUID(90), 0, CommonFieldData()(false)), - InternalSlot(Ammo.rocket.id, PlanetSideGUID(91), 1, CommonFieldData()(false)) + InternalSlot(Ammo.bullet_9mm.id, PlanetSideGUID(90), 0, CommonFieldData()(flag = false)), + InternalSlot(Ammo.rocket.id, PlanetSideGUID(91), 1, CommonFieldData()(flag = false)) ) ) case _ => @@ -164,7 +164,7 @@ class ConverterTest extends Specification { } obj.Definition.Packet.ConstructorData(obj) match { case Success(pkt) => - pkt mustEqual CommonFieldData()(false) + pkt mustEqual CommonFieldData()(flag = false) case _ => ko } @@ -177,7 +177,7 @@ class ConverterTest extends Specification { obj.Definition.Packet.DetailedConstructorData(obj) match { case Success(pkt) => pkt mustEqual DetailedConstructionToolData( - CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, true, None, false, None, None, PlanetSideGUID(0)) + CommonFieldData(PlanetSideEmpire.NEUTRAL, bops = false, alternate = false, v1 = true, None, jammered = false, None, None, PlanetSideGUID(0)) ) case _ => ko @@ -188,11 +188,11 @@ class ConverterTest extends Specification { pkt mustEqual HandheldData( CommonFieldData( PlanetSideEmpire.NEUTRAL, - false, - false, - true, + bops = false, + alternate = false, + v1 = true, None, - false, + jammered = false, None, None, PlanetSideGUID(0) @@ -216,11 +216,11 @@ class ConverterTest extends Specification { pkt mustEqual DetailedREKData( CommonFieldData( PlanetSideEmpire.NEUTRAL, //TODO faction affinity - false, - false, - true, + bops = false, + alternate = false, + v1 = true, None, - false, + jammered = false, Some(false), None, PlanetSideGUID(0) @@ -234,11 +234,11 @@ class ConverterTest extends Specification { pkt mustEqual REKData( CommonFieldData( PlanetSideEmpire.NEUTRAL, - false, - false, - true, + bops = false, + alternate = false, + v1 = true, None, - false, + jammered = false, Some(false), None, PlanetSideGUID(0) @@ -257,7 +257,7 @@ class ConverterTest extends Specification { obj.Definition.Packet.DetailedConstructorData(obj) match { case Success(pkt) => pkt mustEqual DetailedConstructionToolData( - CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, true, None, false, None, None, PlanetSideGUID(0)) + CommonFieldData(PlanetSideEmpire.NEUTRAL, bops = false, alternate = false, v1 = true, None, jammered = false, None, None, PlanetSideGUID(0)) ) case _ => ko @@ -265,7 +265,7 @@ class ConverterTest extends Specification { obj.Definition.Packet.ConstructorData(obj) match { case Success(pkt) => pkt mustEqual HandheldData( - CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, false, None, false, None, None, PlanetSideGUID(0)) + CommonFieldData(PlanetSideEmpire.NEUTRAL, bops = false, alternate = false, v1 = false, None, jammered = false, None, None, PlanetSideGUID(0)) ) case _ => ko @@ -282,11 +282,11 @@ class ConverterTest extends Specification { pkt mustEqual HandheldData( CommonFieldData( PlanetSideEmpire.NEUTRAL, - false, - false, - false, + bops = false, + alternate = false, + v1 = false, None, - false, + jammered = false, None, Some(1001), PlanetSideGUID(0) @@ -301,11 +301,11 @@ class ConverterTest extends Specification { pkt mustEqual DetailedConstructionToolData( CommonFieldData( PlanetSideEmpire.NEUTRAL, - false, - false, - true, + bops = false, + alternate = false, + v1 = true, None, - false, + jammered = false, None, Some(1001), PlanetSideGUID(0) @@ -333,20 +333,20 @@ class ConverterTest extends Specification { obj.Definition.Packet.ConstructorData(obj) match { case Success(pkt) => - pkt mustEqual CommonFieldDataWithPlacement( + pkt mustEqual SmallDeployableData(CommonFieldDataWithPlacement( PlacementData(Vector3.Zero, Vector3.Zero), CommonFieldData( PlanetSideEmpire.TR, - false, - false, - false, + bops = false, + alternate = false, + v1 = false, None, - false, + jammered = false, Some(false), None, PlanetSideGUID(0) ) - ) + )) case _ => ko } @@ -369,11 +369,11 @@ class ConverterTest extends Specification { PlacementData(Vector3.Zero, Vector3.Zero), CommonFieldData( PlanetSideEmpire.TR, - false, - false, - true, + bops = false, + alternate = false, + v1 = true, None, - false, + jammered = false, None, None, PlanetSideGUID(0) @@ -389,11 +389,11 @@ class ConverterTest extends Specification { WeaponData( CommonFieldData( PlanetSideEmpire.NEUTRAL, - false, - false, - true, + bops = false, + alternate = false, + v1 = true, None, - false, + jammered = false, None, None, PlanetSideGUID(0) @@ -406,11 +406,11 @@ class ConverterTest extends Specification { 0, CommonFieldData( PlanetSideEmpire.NEUTRAL, - false, - false, - false, + bops = false, + alternate = false, + v1 = false, None, - false, + jammered = false, Some(false), None, PlanetSideGUID(0) @@ -444,11 +444,11 @@ class ConverterTest extends Specification { PlacementData(Vector3.Zero, Vector3.Zero), CommonFieldData( PlanetSideEmpire.TR, - false, - false, - true, + bops = false, + alternate = false, + v1 = true, None, - false, + jammered = false, Some(false), None, PlanetSideGUID(0) @@ -464,11 +464,11 @@ class ConverterTest extends Specification { WeaponData( CommonFieldData( PlanetSideEmpire.NEUTRAL, - false, - false, - true, + bops = false, + alternate = false, + v1 = true, None, - false, + jammered = false, None, None, PlanetSideGUID(0) @@ -481,11 +481,11 @@ class ConverterTest extends Specification { 0, CommonFieldData( PlanetSideEmpire.NEUTRAL, - false, - false, - false, + bops = false, + alternate = false, + v1 = false, None, - false, + jammered = false, Some(false), None, PlanetSideGUID(0) @@ -519,9 +519,9 @@ class ConverterTest extends Specification { PlanetSideEmpire.TR, bops = false, alternate = false, - true, + v1 = true, None, - false, + jammered = false, None, None, PlanetSideGUID(0) @@ -584,9 +584,9 @@ class ConverterTest extends Specification { PlanetSideEmpire.TR, bops = false, alternate = false, - true, + v1 = true, None, - false, + jammered = false, None, Some(1001), PlanetSideGUID(5001) @@ -616,9 +616,9 @@ class ConverterTest extends Specification { PlanetSideEmpire.TR, bops = false, alternate = true, - true, + v1 = true, None, - false, + jammered = false, None, Some(1001), PlanetSideGUID(0) @@ -751,7 +751,7 @@ class ConverterTest extends Specification { obj.Definition.Packet.DetailedConstructorData(obj) match { case Success(pkt) => pkt mustEqual DetailedLockerContainerData( - CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, false, None, false, None, None, PlanetSideGUID(0)), + CommonFieldData(PlanetSideEmpire.NEUTRAL, bops = false, alternate = false, v1 = false, None, jammered = false, None, None, PlanetSideGUID(0)), None ) case _ => @@ -783,11 +783,11 @@ class ConverterTest extends Specification { DetailedREKData( CommonFieldData( PlanetSideEmpire.NEUTRAL, - false, - false, - true, + bops = false, + alternate = false, + v1 = true, None, - false, + jammered = false, Some(false), None, PlanetSideGUID(0) @@ -809,11 +809,11 @@ class ConverterTest extends Specification { REKData( CommonFieldData( PlanetSideEmpire.NEUTRAL, - false, - false, - true, + bops = false, + alternate = false, + v1 = true, None, - false, + jammered = false, Some(false), None, PlanetSideGUID(0) @@ -841,7 +841,7 @@ class ConverterTest extends Specification { obj.Definition.Packet.ConstructorData(obj) match { case Success(pkt) => - pkt mustEqual CommonFieldData(PlanetSideEmpire.NEUTRAL)(false) + pkt mustEqual CommonFieldData(PlanetSideEmpire.NEUTRAL)(flag = false) case _ => ko } @@ -861,7 +861,7 @@ class ConverterTest extends Specification { obj.Definition.Packet.ConstructorData(obj) match { case Success(pkt) => - pkt mustEqual CommonFieldData(PlanetSideEmpire.NEUTRAL)(false) + pkt mustEqual CommonFieldData(PlanetSideEmpire.NEUTRAL)(flag = false) case _ => ko } diff --git a/src/test/scala/objects/InteractsWithZoneEnvironmentTest.scala b/src/test/scala/objects/InteractsWithZoneEnvironmentTest.scala index 64a57a085..19bd9eeba 100644 --- a/src/test/scala/objects/InteractsWithZoneEnvironmentTest.scala +++ b/src/test/scala/objects/InteractsWithZoneEnvironmentTest.scala @@ -104,11 +104,11 @@ class InteractsWithZoneEnvironmentTest extends ActorTest { obj.Position = Vector3(1, 3, 2.7f) obj.zoneInteractions() -// val msg2 = testProbe.receiveOne(4.seconds) -// msg2 match { -// case RespondsToZoneEnvironment.Timer(EnvironmentAttribute.Water, _, _, _) => () -// case _ => assert(false, "") -// } + val msg2 = testProbe.receiveOne(4.seconds) + msg2 match { + case RespondsToZoneEnvironment.Timer(EnvironmentAttribute.Water, _, _, _) => () + case _ => assert(false, "") + } testProbe.expectNoMessage() } @@ -130,19 +130,19 @@ class InteractsWithZoneEnvironmentTest extends ActorTest { obj.zoneInteractions() val msgs = testProbe.receiveN(4, 4.seconds) msgs.head match { - case Vitality.Damage(_) => () + case RespondsToZoneEnvironment.StopTimer(EnvironmentAttribute.Water) => () case _ => assert(InteractsWithZoneEnvironmentTest.fail, "") } msgs(1) match { - case AuraEffectBehavior.StartEffect(Aura.Fire, _) => () + case Vitality.Damage(_) => () case _ => assert(InteractsWithZoneEnvironmentTest.fail, "") } msgs(2) match { - case RespondsToZoneEnvironment.Timer(EnvironmentAttribute.Lava, _, _, _) => () + case AuraEffectBehavior.StartEffect(Aura.Fire, _) => () case _ => assert(InteractsWithZoneEnvironmentTest.fail, "") } msgs(3) match { - case RespondsToZoneEnvironment.StopTimer(EnvironmentAttribute.Water) => () + case RespondsToZoneEnvironment.Timer(EnvironmentAttribute.Lava, _, _, _) => () case _ => assert(InteractsWithZoneEnvironmentTest.fail, "") } } diff --git a/src/test/scala/objects/TelepadRouterTest.scala b/src/test/scala/objects/TelepadRouterTest.scala index 224ef5f59..7eff27c37 100644 --- a/src/test/scala/objects/TelepadRouterTest.scala +++ b/src/test/scala/objects/TelepadRouterTest.scala @@ -15,7 +15,6 @@ import net.psforever.objects.vehicles.{Utility, UtilityType} import net.psforever.objects.zones.{Zone, ZoneDeployableActor, ZoneMap} import net.psforever.packet.game.objectcreate.ObjectCreateMessageParent import net.psforever.packet.game._ -import net.psforever.services.avatar.{AvatarAction, AvatarServiceMessage} import net.psforever.services.local.{LocalAction, LocalServiceMessage} import net.psforever.types.{DriveState, PlanetSideGUID, Vector3} diff --git a/src/test/scala/objects/VehicleControlTest.scala b/src/test/scala/objects/VehicleControlTest.scala index e6ca71a6d..a386ed4cb 100644 --- a/src/test/scala/objects/VehicleControlTest.scala +++ b/src/test/scala/objects/VehicleControlTest.scala @@ -14,7 +14,7 @@ import net.psforever.objects.guid.NumberPoolHub import net.psforever.objects.guid.source.MaxNumberSource import net.psforever.objects.serverobject.CommonMessages import net.psforever.objects.serverobject.environment._ -import net.psforever.objects.serverobject.environment.interaction.{EscapeFromEnvironment, InteractingWithEnvironment, RespondsToZoneEnvironment} +import net.psforever.objects.serverobject.environment.interaction.{InteractingWithEnvironment, RespondsToZoneEnvironment} import net.psforever.objects.serverobject.environment.interaction.common.Watery.OxygenStateTarget import net.psforever.objects.serverobject.mount.Mountable import net.psforever.objects.sourcing.VehicleSource