the question of one extra bit for small deployables; also, all tests pass successfully, tho resource silo use remains coin flip; what sorcery is this

This commit is contained in:
Fate-JH 2024-08-31 09:43:04 -04:00
parent af118be24d
commit ab1933ea76
8 changed files with 141 additions and 110 deletions

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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