synchronized change fire mode; addsupport for fire mode in DetailedWeaponData; corrected bug with LastDrawnSlot/ObjectHeldMessage

This commit is contained in:
FateJH 2018-01-10 14:19:45 -05:00
parent 9e51e33246
commit 1f04c840d2
22 changed files with 333 additions and 224 deletions

View file

@ -1032,10 +1032,12 @@ object GlobalDefinitions {
chainblade.FireModes.head.AmmoTypeIndices += 0
chainblade.FireModes.head.AmmoSlotIndex = 0
chainblade.FireModes.head.Magazine = 1
chainblade.FireModes.head.Chamber = 0
chainblade.FireModes += new FireModeDefinition
chainblade.FireModes(1).AmmoTypeIndices += 0
chainblade.FireModes(1).AmmoSlotIndex = 0
chainblade.FireModes(1).Magazine = 1
chainblade.FireModes.head.Chamber = 0
magcutter.Size = EquipmentSize.Melee
magcutter.AmmoTypes += melee_ammo
@ -1043,10 +1045,12 @@ object GlobalDefinitions {
magcutter.FireModes.head.AmmoTypeIndices += 0
magcutter.FireModes.head.AmmoSlotIndex = 0
magcutter.FireModes.head.Magazine = 1
magcutter.FireModes.head.Chamber = 0
magcutter.FireModes += new FireModeDefinition
magcutter.FireModes(1).AmmoTypeIndices += 0
magcutter.FireModes(1).AmmoSlotIndex = 0
magcutter.FireModes(1).Magazine = 1
magcutter.FireModes.head.Chamber = 0
forceblade.Size = EquipmentSize.Melee
forceblade.AmmoTypes += melee_ammo
@ -1583,7 +1587,8 @@ object GlobalDefinitions {
trek.FireModes += new FireModeDefinition
trek.FireModes(1).AmmoTypeIndices += 0
trek.FireModes(1).AmmoSlotIndex = 0
trek.FireModes(1).Magazine = 0
trek.FireModes(1).Magazine = 1
trek.FireModes(1).Chamber = 0
trek.Tile = InventoryTile.Tile33
flail_targeting_laser.Packet = new CommandDetonaterConverter

View file

@ -31,7 +31,7 @@ class Player(private val name : String,
private val fifthSlot : EquipmentSlot = new OffhandEquipmentSlot(EquipmentSize.Inventory)
private val inventory : GridInventory = GridInventory()
private var drawnSlot : Int = Player.HandsDownSlot
private var lastDrawnSlot : Int = 0
private var lastDrawnSlot : Int = Player.HandsDownSlot
private val loadouts : Array[Option[Loadout]] = Array.fill[Option[Loadout]](10)(None)
@ -325,16 +325,15 @@ class Player(private val name : String,
def DrawnSlot : Int = drawnSlot
def DrawnSlot_=(slot : Int = Player.HandsDownSlot) : Int = {
def DrawnSlot_=(slot : Int) : Int = {
if(slot != drawnSlot) {
val origDrawnSlot : Int = drawnSlot
if(slot == Player.HandsDownSlot) {
drawnSlot = slot
}
else if(-1 < slot && slot < 5 && holsters(slot).Equipment.isDefined) {
else if(VisibleSlots.contains(slot) && holsters(slot).Equipment.isDefined) {
drawnSlot = slot
lastDrawnSlot = slot
}
lastDrawnSlot = if(-1 < origDrawnSlot && origDrawnSlot < 5) { origDrawnSlot } else { lastDrawnSlot }
}
DrawnSlot
}

View file

@ -1,7 +1,7 @@
// Copyright (c) 2017 PSForever
package net.psforever.objects
import net.psforever.objects.definition.ToolDefinition
import net.psforever.objects.definition.{AmmoBoxDefinition, ToolDefinition}
import net.psforever.objects.equipment.{Ammo, Equipment, FireModeDefinition, FireModeSwitch}
import scala.annotation.tailrec
@ -126,7 +126,7 @@ object Tool {
*/
private var ammoTypeIndex : Int = 0
/** a reference to the actual `AmmoBox` of this slot */
private var box : AmmoBox = AmmoBox(tdef.AmmoTypes(ammoTypeIndex), fdef.Magazine)
private var box : AmmoBox = AmmoBox(AmmoDefinition, fdef.Magazine)
def AmmoTypeIndex : Int = ammoTypeIndex
@ -135,13 +135,17 @@ object Tool {
AmmoTypeIndex
}
private def AmmoDefinition : AmmoBoxDefinition = {
tdef.AmmoTypes(fdef.AmmoTypeIndices(ammoTypeIndex))
}
/**
* This is a reference to the `Ammo.Value` whose `AmmoBoxDefinition` should be loaded into `box`.
* It may not be the correct `Ammo.Value` whose `AmmoBoxDefinition` is loaded into `box` such as is the case during ammunition swaps.
* Generally, convert from this index, to the index in the fire mode's ammunition list, to the index in the `ToolDefinition`'s ammunition list.
* @return the `Ammo` type that should be loaded into the magazine right now
*/
def AmmoType : Ammo.Value = tdef.AmmoTypes(fdef.AmmoTypeIndices(ammoTypeIndex)).AmmoType
def AmmoType : Ammo.Value = AmmoDefinition.AmmoType
def AllAmmoTypes : List[Ammo.Value] = {
fdef.AmmoTypeIndices.map(index => tdef.AmmoTypes(fdef.AmmoTypeIndices(index)).AmmoType).toList

View file

@ -10,7 +10,7 @@ class AmmoBoxDefinition(objectId : Int) extends EquipmentDefinition(objectId) {
private var capacity : Int = 1
Name = "ammo box"
Size = EquipmentSize.Inventory
Packet = new AmmoBoxConverter()
Packet = AmmoBoxDefinition.converter
def AmmoType : Ammo.Value = ammoType
@ -23,6 +23,8 @@ class AmmoBoxDefinition(objectId : Int) extends EquipmentDefinition(objectId) {
}
object AmmoBoxDefinition {
private val converter = new AmmoBoxConverter()
def apply(objectId: Int) : AmmoBoxDefinition = {
new AmmoBoxDefinition(objectId)
}

View file

@ -10,10 +10,12 @@ import net.psforever.objects.definition.converter.AvatarConverter
*/
class AvatarDefinition(objectId : Int) extends ObjectDefinition(objectId) {
Avatars(objectId) //let throw NoSuchElementException
Packet = new AvatarConverter()
Packet = AvatarDefinition.converter
}
object AvatarDefinition {
private val converter = new AvatarConverter()
def apply(objectId: Int) : AvatarDefinition = {
new AvatarDefinition(objectId)
}

View file

@ -15,10 +15,12 @@ class KitDefinition(objectId : Int) extends EquipmentDefinition(objectId) {
Size = EquipmentSize.Inventory
Tile = InventoryTile.Tile42
Name = "kit"
Packet = new KitConverter()
Packet = KitDefinition.converter
}
object KitDefinition {
private val converter = new KitConverter()
def apply(objectId: Int) : KitDefinition = {
new KitDefinition(objectId)
}

View file

@ -10,7 +10,7 @@ class ToolDefinition(objectId : Int) extends EquipmentDefinition(objectId) {
private val ammoTypes : mutable.ListBuffer[AmmoBoxDefinition] = new mutable.ListBuffer[AmmoBoxDefinition]
private val fireModes : mutable.ListBuffer[FireModeDefinition] = new mutable.ListBuffer[FireModeDefinition]
Name = "tool"
Packet = new ToolConverter()
Packet = ToolDefinition.converter
def AmmoTypes : mutable.ListBuffer[AmmoBoxDefinition] = ammoTypes
@ -18,6 +18,8 @@ class ToolDefinition(objectId : Int) extends EquipmentDefinition(objectId) {
}
object ToolDefinition {
private val converter = new ToolConverter()
def apply(objectId : Int) : ToolDefinition = {
new ToolDefinition(objectId)
}

View file

@ -26,7 +26,7 @@ class VehicleDefinition(objectId : Int) extends ObjectDefinition(objectId) {
private var canCloak : Boolean = false
private var canBeOwned : Boolean = true
Name = "vehicle"
Packet = new VehicleConverter
Packet = VehicleDefinition.converter
def MaxHealth : Int = maxHealth
@ -87,6 +87,8 @@ class VehicleDefinition(objectId : Int) extends ObjectDefinition(objectId) {
}
object VehicleDefinition {
private val converter = new VehicleConverter
def apply(objectId: Int) : VehicleDefinition = {
new VehicleDefinition(objectId)
}

View file

@ -25,6 +25,6 @@ class ToolConverter extends ObjectCreateConverter[Tool]() {
val box = obj.AmmoSlots(index).Box
slots += InternalSlot(box.Definition.ObjectId, box.GUID, index, box.Definition.Packet.DetailedConstructorData(box).get)
})
Success(DetailedWeaponData(4,8, slots.toList)(maxSlot))
Success(DetailedWeaponData(4,8, obj.FireModeIndex, slots.toList)(maxSlot))
}
}

View file

@ -9,7 +9,6 @@ class FireModeDefinition {
private var chamber : Int = 1 //how many rounds are queued to be fired at once, e.g., 3 for the Jackhammer's triple burst
private var magazine : Int = 1 //how many rounds are queued for each reload cycle
// private var target : Any = _ //target designation (self? other?)
private var resetAmmoIndexOnSwap : Boolean = false //when changing fire modes, do not attempt to match previous mode's ammo type
//damage modifiers will follow here ...
@ -46,13 +45,6 @@ class FireModeDefinition {
// target = setAsTarget
// Target
// }
def ResetAmmoIndexOnSwap : Boolean = resetAmmoIndexOnSwap
def ResetAmmoIndexOnSwap_=(reset : Boolean) : Boolean = {
resetAmmoIndexOnSwap = reset
ResetAmmoIndexOnSwap
}
}
object FireModeDefinition {

View file

@ -28,6 +28,7 @@ import shapeless.{::, HNil}
*/
final case class DetailedWeaponData(unk1 : Int,
unk2 : Int,
fire_mode : Int,
ammo : List[InternalSlot]
)(implicit val mag_capacity : Int = 1) extends ConstructorData {
override def bitsize : Long = {
@ -35,7 +36,7 @@ final case class DetailedWeaponData(unk1 : Int,
for(o <- ammo) {
bitsize += o.bitsize
}
61L + bitsize
61L + bitsize //51 + 10 (from InventoryData) + ammo
}
}
@ -51,7 +52,21 @@ object DetailedWeaponData extends Marshallable[DetailedWeaponData] {
* @return a `DetailedWeaponData` object
*/
def apply(unk1 : Int, unk2 : Int, cls : Int, guid : PlanetSideGUID, parentSlot : Int, ammo : DetailedAmmoBoxData) : DetailedWeaponData =
new DetailedWeaponData(unk1, unk2, InternalSlot(cls, guid, parentSlot, ammo) :: Nil)
new DetailedWeaponData(unk1, unk2, 0, InternalSlot(cls, guid, parentSlot, ammo) :: Nil)
/**
* Overloaded constructor for creating `DetailedWeaponData` while masking use of `InternalSlot` for its `DetailedAmmoBoxData`.
* @param unk1 na
* @param unk2 na
* @param cls the code for the type of object (ammunition) being constructed
* @param guid the globally unique id assigned to the ammunition
* @param parentSlot the slot where the ammunition is to be installed in the weapon
* @param ammo the constructor data for the ammunition
* @return a `DetailedWeaponData` object
*/
def apply(unk1 : Int, unk2 : Int, fire_mode : Int, cls : Int, guid : PlanetSideGUID, parentSlot : Int, ammo : DetailedAmmoBoxData) : DetailedWeaponData =
new DetailedWeaponData(unk1, unk2, fire_mode, InternalSlot(cls, guid, parentSlot, ammo) :: Nil)
/**
* A `Codec` for `DetailedWeaponData`
@ -60,17 +75,18 @@ object DetailedWeaponData extends Marshallable[DetailedWeaponData] {
* @return a `WeaponData` object or a `BitVector`
*/
def codec(mag_capacity : Int = 1) : Codec[DetailedWeaponData] = (
("unk1" | uintL(3)) ::
("unk1" | uint(3)) ::
bool :: //weapon refuses to shoot if set (not weapons lock?)
("unk2" | uint4L) :: //8 - common; 4 - jammers weapons; 2 - weapon breaks; 1, 0 - safe
uint24 ::
uint16 ::
uint2L ::
uint(12) ::
("fire_mode" | uint(3)) :: //TODO size?
uint(3) ::
("ammo" | InventoryData.codec_detailed) ::
bool
).exmap[DetailedWeaponData] (
{
case unk1 :: false :: unk2 :: 2 :: 0 :: 3 :: InventoryData(ammo) :: false :: HNil =>
case unk1 :: false :: unk2 :: 2 :: 0 :: fmode :: 3 :: InventoryData(ammo) :: false :: HNil =>
val magSize = ammo.size
if(mag_capacity == 0 || magSize == 0) {
Attempt.failure(Err("weapon must decode some ammunition"))
@ -79,21 +95,21 @@ object DetailedWeaponData extends Marshallable[DetailedWeaponData] {
Attempt.failure(Err(s"weapon decodes too much or too little ammunition - actual $magSize, expected $mag_capacity"))
}
else {
Attempt.successful(DetailedWeaponData(unk1, unk2, ammo)(magSize))
Attempt.successful(DetailedWeaponData(unk1, unk2, fmode, ammo)(magSize))
}
case _ =>
Attempt.failure(Err("invalid weapon data format"))
},
{
case obj @ DetailedWeaponData(unk1, unk2, ammo) =>
case obj @ DetailedWeaponData(unk1, unk2, fmode, ammo) =>
val magSize = ammo.size
val magCapacity = obj.mag_capacity
if(mag_capacity == 0 || magCapacity == 0 || magSize == 0) {
Attempt.failure(Err("weapon must encode some ammunition"))
}
else if(magCapacity < 0 || mag_capacity < 0) {
Attempt.successful(unk1 :: false :: unk2 :: 2 :: 0 :: 3 :: InventoryData(ammo) :: false :: HNil)
Attempt.successful(unk1 :: false :: unk2 :: 2 :: 0 :: fmode :: 3 :: InventoryData(ammo) :: false :: HNil)
}
else {
if(magCapacity != mag_capacity) {
@ -106,7 +122,7 @@ object DetailedWeaponData extends Marshallable[DetailedWeaponData] {
Attempt.failure(Err("weapon encodes too much ammunition (255+ types!)"))
}
else {
Attempt.successful(unk1 :: false :: unk2 :: 2 :: 0 :: 3 :: InventoryData(ammo) :: false :: HNil)
Attempt.successful(unk1 :: false :: unk2 :: 2 :: 0 :: fmode :: 3 :: InventoryData(ammo) :: false :: HNil)
}
}

View file

@ -102,7 +102,7 @@ object WeaponData extends Marshallable[WeaponData] {
bool :: //weapon refuses to shoot if set (not weapons lock?)
("unk2" | uint4L) :: //8 - common; 4 - jammers weapons; 2 - weapon breaks; 1, 0 - safe
uint(20) ::
("fire_mode" | int(3)) ::
("fire_mode" | int(3)) :: //TODO size?
bool ::
bool ::
("ammo" | InventoryData.codec) ::

View file

@ -652,59 +652,59 @@ class DetailedCharacterDataTest extends Specification {
InventoryData(
List(
InternalSlot(531, PlanetSideGUID(4202), 0,
DetailedWeaponData(2, 8, List(InternalSlot(389, PlanetSideGUID(3942), 0,DetailedAmmoBoxData(8, 100))))
DetailedWeaponData(2, 8, 0, List(InternalSlot(389, PlanetSideGUID(3942), 0,DetailedAmmoBoxData(8, 100))))
),
InternalSlot(132, PlanetSideGUID(6924), 1,
DetailedWeaponData(2, 8, List(InternalSlot(111, PlanetSideGUID(9157), 0, DetailedAmmoBoxData(8, 100))))
DetailedWeaponData(2, 8, 0, List(InternalSlot(111, PlanetSideGUID(9157), 0, DetailedAmmoBoxData(8, 100))))
),
InternalSlot(714, PlanetSideGUID(8498), 2,
DetailedWeaponData(2, 8, List(InternalSlot(755, PlanetSideGUID(5356), 0, DetailedAmmoBoxData(8, 16))))
DetailedWeaponData(2, 8, 0, List(InternalSlot(755, PlanetSideGUID(5356), 0, DetailedAmmoBoxData(8, 16))))
),
InternalSlot(468, PlanetSideGUID(7198), 4,
DetailedWeaponData(2, 8, List(InternalSlot(540, PlanetSideGUID(5009), 0, DetailedAmmoBoxData(8, 1))))
DetailedWeaponData(2, 8, 0, List(InternalSlot(540, PlanetSideGUID(5009), 0, DetailedAmmoBoxData(8, 1))))
),
InternalSlot(456, PlanetSideGUID(5374), 5,
DetailedLockerContainerData(8, Some(InventoryData(List(
InternalSlot(429, PlanetSideGUID(3021), 0,
DetailedWeaponData(6, 8, List(InternalSlot(272, PlanetSideGUID(8729), 0, DetailedAmmoBoxData(8, 0))))
DetailedWeaponData(6, 8, 0, List(InternalSlot(272, PlanetSideGUID(8729), 0, DetailedAmmoBoxData(8, 0))))
),
InternalSlot(838, PlanetSideGUID(8467), 9,
DetailedWeaponData(6, 8, List(InternalSlot(839, PlanetSideGUID(8603), 0, DetailedAmmoBoxData(8, 5))))
DetailedWeaponData(6, 8, 0, List(InternalSlot(839, PlanetSideGUID(8603), 0, DetailedAmmoBoxData(8, 5))))
),
InternalSlot(272, PlanetSideGUID(3266), 18, DetailedAmmoBoxData(8, 27)),
InternalSlot(577, PlanetSideGUID(2934), 22,
DetailedWeaponData(6, 8, List(InternalSlot(111, PlanetSideGUID(4682), 0, DetailedAmmoBoxData(8, 100))))
DetailedWeaponData(6, 8, 0, List(InternalSlot(111, PlanetSideGUID(4682), 0, DetailedAmmoBoxData(8, 100))))
),
InternalSlot(839, PlanetSideGUID(3271), 90, DetailedAmmoBoxData(8, 15)),
InternalSlot(839, PlanetSideGUID(7174), 94, DetailedAmmoBoxData(8, 6)),
InternalSlot(429, PlanetSideGUID(6084), 98,
DetailedWeaponData(6, 8, List(InternalSlot(272, PlanetSideGUID(5928), 0, DetailedAmmoBoxData(8, 35))))
DetailedWeaponData(6, 8, 0, List(InternalSlot(272, PlanetSideGUID(5928), 0, DetailedAmmoBoxData(8, 35))))
),
InternalSlot(462, PlanetSideGUID(5000), 108,
DetailedWeaponData(6, 8, List(InternalSlot(463, PlanetSideGUID(6277), 0, DetailedAmmoBoxData(8, 150))))
DetailedWeaponData(6, 8, 0, List(InternalSlot(463, PlanetSideGUID(6277), 0, DetailedAmmoBoxData(8, 150))))
),
InternalSlot(429, PlanetSideGUID(4341), 189,
DetailedWeaponData(6, 8, List(InternalSlot(272, PlanetSideGUID(7043), 0, DetailedAmmoBoxData(8, 35))))
DetailedWeaponData(6, 8, 0, List(InternalSlot(272, PlanetSideGUID(7043), 0, DetailedAmmoBoxData(8, 35))))
),
InternalSlot(556, PlanetSideGUID(4168), 198,
DetailedWeaponData(6, 8, List(InternalSlot(28, PlanetSideGUID(8937), 0, DetailedAmmoBoxData(8, 100))))
DetailedWeaponData(6, 8, 0, List(InternalSlot(28, PlanetSideGUID(8937), 0, DetailedAmmoBoxData(8, 100))))
),
InternalSlot(272, PlanetSideGUID(3173), 207, DetailedAmmoBoxData(8, 50)),
InternalSlot(462, PlanetSideGUID(3221), 210,
DetailedWeaponData(6, 8, List(InternalSlot(463, PlanetSideGUID(4031), 0, DetailedAmmoBoxData(8, 150))))
DetailedWeaponData(6, 8, 0, List(InternalSlot(463, PlanetSideGUID(4031), 0, DetailedAmmoBoxData(8, 150))))
),
InternalSlot(556, PlanetSideGUID(6853), 280,
DetailedWeaponData(6, 8, List(InternalSlot(29, PlanetSideGUID(8524), 0, DetailedAmmoBoxData(8, 67))))
DetailedWeaponData(6, 8, 0, List(InternalSlot(29, PlanetSideGUID(8524), 0, DetailedAmmoBoxData(8, 67))))
),
InternalSlot(556, PlanetSideGUID(4569), 290,
DetailedWeaponData(6, 8, List(InternalSlot(28, PlanetSideGUID(5584), 0, DetailedAmmoBoxData(8, 100))))
DetailedWeaponData(6, 8, 0, List(InternalSlot(28, PlanetSideGUID(5584), 0, DetailedAmmoBoxData(8, 100))))
),
InternalSlot(462, PlanetSideGUID(9294), 300,
DetailedWeaponData(6, 8, List(InternalSlot(463, PlanetSideGUID(3118), 0, DetailedAmmoBoxData(8, 150))))
DetailedWeaponData(6, 8, 0, List(InternalSlot(463, PlanetSideGUID(3118), 0, DetailedAmmoBoxData(8, 150))))
),
InternalSlot(272, PlanetSideGUID(4759), 387, DetailedAmmoBoxData(8, 50)),
InternalSlot(462, PlanetSideGUID(7377), 390,
DetailedWeaponData(6, 8, List(InternalSlot(463, PlanetSideGUID(8155), 0, DetailedAmmoBoxData(8, 150))))
DetailedWeaponData(6, 8, 0, List(InternalSlot(463, PlanetSideGUID(8155), 0, DetailedAmmoBoxData(8, 150))))
),
InternalSlot(843, PlanetSideGUID(6709), 480, DetailedAmmoBoxData(8, 1)),
InternalSlot(843, PlanetSideGUID(5276), 484, DetailedAmmoBoxData(8, 1)),
@ -714,109 +714,109 @@ class DetailedCharacterDataTest extends Specification {
InternalSlot(842, PlanetSideGUID(7279), 500, DetailedAmmoBoxData(8, 1)),
InternalSlot(842, PlanetSideGUID(5415), 504, DetailedAmmoBoxData(8, 1)),
InternalSlot(175, PlanetSideGUID(5741), 540,
DetailedWeaponData(6, 8, List(InternalSlot(540, PlanetSideGUID(5183), 0, DetailedAmmoBoxData(8, 1))))
DetailedWeaponData(6, 8, 0, List(InternalSlot(540, PlanetSideGUID(5183), 0, DetailedAmmoBoxData(8, 1))))
),
InternalSlot(324, PlanetSideGUID(6208), 541,
DetailedWeaponData(6, 8, List(InternalSlot(540, PlanetSideGUID(5029), 0, DetailedAmmoBoxData(8, 1))))
DetailedWeaponData(6, 8, 0, List(InternalSlot(540, PlanetSideGUID(5029), 0, DetailedAmmoBoxData(8, 1))))
),
InternalSlot(324, PlanetSideGUID(8589), 542,
DetailedWeaponData(6, 8, List(InternalSlot(540, PlanetSideGUID(9217), 0, DetailedAmmoBoxData(8, 1))))
DetailedWeaponData(6, 8, 0, List(InternalSlot(540, PlanetSideGUID(9217), 0, DetailedAmmoBoxData(8, 1))))
),
InternalSlot(175, PlanetSideGUID(8901), 543,
DetailedWeaponData(6, 8, List(InternalSlot(540, PlanetSideGUID(7633), 0, DetailedAmmoBoxData(8, 1))))
DetailedWeaponData(6, 8, 0, List(InternalSlot(540, PlanetSideGUID(7633), 0, DetailedAmmoBoxData(8, 1))))
),
InternalSlot(175, PlanetSideGUID(8419), 544,
DetailedWeaponData(6, 8, List(InternalSlot(540, PlanetSideGUID(6546), 0, DetailedAmmoBoxData(8, 1))))
DetailedWeaponData(6, 8, 0, List(InternalSlot(540, PlanetSideGUID(6546), 0, DetailedAmmoBoxData(8, 1))))
),
InternalSlot(175, PlanetSideGUID(4715), 545,
DetailedWeaponData(6, 8, List(InternalSlot(540, PlanetSideGUID(8453), 0, DetailedAmmoBoxData(8, 1))))
DetailedWeaponData(6, 8, 0, List(InternalSlot(540, PlanetSideGUID(8453), 0, DetailedAmmoBoxData(8, 1))))
),
InternalSlot(324, PlanetSideGUID(3577), 546,
DetailedWeaponData(6, 8, List(InternalSlot(540, PlanetSideGUID(9202), 0, DetailedAmmoBoxData(8, 1))))
DetailedWeaponData(6, 8, 0, List(InternalSlot(540, PlanetSideGUID(9202), 0, DetailedAmmoBoxData(8, 1))))
),
InternalSlot(324, PlanetSideGUID(6003), 547,
DetailedWeaponData(6, 8, List(InternalSlot(540, PlanetSideGUID(3260), 0, DetailedAmmoBoxData(8, 1))))
DetailedWeaponData(6, 8, 0, List(InternalSlot(540, PlanetSideGUID(3260), 0, DetailedAmmoBoxData(8, 1))))
),
InternalSlot(324, PlanetSideGUID(9140), 548,
DetailedWeaponData(6, 8, List(InternalSlot(540,PlanetSideGUID(3815),0,DetailedAmmoBoxData(8, 1))))
DetailedWeaponData(6, 8, 0, List(InternalSlot(540,PlanetSideGUID(3815),0,DetailedAmmoBoxData(8, 1))))
),
InternalSlot(324, PlanetSideGUID(4913), 549,
DetailedWeaponData(6, 8, List(InternalSlot(540,PlanetSideGUID(7222),0,DetailedAmmoBoxData(8, 1))))
DetailedWeaponData(6, 8, 0, List(InternalSlot(540,PlanetSideGUID(7222),0,DetailedAmmoBoxData(8, 1))))
),
InternalSlot(324, PlanetSideGUID(6954), 550,
DetailedWeaponData(6, 8, List(InternalSlot(540,PlanetSideGUID(2953),0,DetailedAmmoBoxData(8, 1))))
DetailedWeaponData(6, 8, 0, List(InternalSlot(540,PlanetSideGUID(2953),0,DetailedAmmoBoxData(8, 1))))
),
InternalSlot(324, PlanetSideGUID(6405), 551,
DetailedWeaponData(6, 8, List(InternalSlot(540,PlanetSideGUID(4676),0,DetailedAmmoBoxData(8, 1))))
DetailedWeaponData(6, 8, 0, List(InternalSlot(540,PlanetSideGUID(4676),0,DetailedAmmoBoxData(8, 1))))
),
InternalSlot(324, PlanetSideGUID(8915), 552,
DetailedWeaponData(6, 8, List(InternalSlot(540,PlanetSideGUID(4018),0,DetailedAmmoBoxData(8, 1))))
DetailedWeaponData(6, 8, 0, List(InternalSlot(540,PlanetSideGUID(4018),0,DetailedAmmoBoxData(8, 1))))
),
InternalSlot(324, PlanetSideGUID(4993), 553,
DetailedWeaponData(6, 8, List(InternalSlot(540,PlanetSideGUID(6775),0,DetailedAmmoBoxData(8, 1))))
DetailedWeaponData(6, 8, 0, List(InternalSlot(540,PlanetSideGUID(6775),0,DetailedAmmoBoxData(8, 1))))
),
InternalSlot(175, PlanetSideGUID(5053), 554,
DetailedWeaponData(6, 8, List(InternalSlot(540,PlanetSideGUID(6418),0,DetailedAmmoBoxData(8, 1))))
DetailedWeaponData(6, 8, 0, List(InternalSlot(540,PlanetSideGUID(6418),0,DetailedAmmoBoxData(8, 1))))
),
InternalSlot(324, PlanetSideGUID(9244), 555,
DetailedWeaponData(6, 8, List(InternalSlot(540,PlanetSideGUID(3327),0,DetailedAmmoBoxData(8, 1))))
DetailedWeaponData(6, 8, 0, List(InternalSlot(540,PlanetSideGUID(3327),0,DetailedAmmoBoxData(8, 1))))
),
InternalSlot(468, PlanetSideGUID(6292), 556,
DetailedWeaponData(6, 8, List(InternalSlot(540,PlanetSideGUID(6918),0,DetailedAmmoBoxData(8, 1))))
DetailedWeaponData(6, 8, 0, List(InternalSlot(540,PlanetSideGUID(6918),0,DetailedAmmoBoxData(8, 1))))
),
InternalSlot(842, PlanetSideGUID(5357), 558, DetailedAmmoBoxData(8, 1)),
InternalSlot(844, PlanetSideGUID(4435), 562, DetailedAmmoBoxData(8, 1)),
InternalSlot(843, PlanetSideGUID(7242), 566, DetailedAmmoBoxData(8, 1)),
InternalSlot(175, PlanetSideGUID(7330), 570,
DetailedWeaponData(6, 8, List(InternalSlot(540, PlanetSideGUID(4786), 0, DetailedAmmoBoxData(8, 1))))
DetailedWeaponData(6, 8, 0, List(InternalSlot(540, PlanetSideGUID(4786), 0, DetailedAmmoBoxData(8, 1))))
),
InternalSlot(468, PlanetSideGUID(7415), 571,
DetailedWeaponData(6, 8, List(InternalSlot(540, PlanetSideGUID(6536), 0, DetailedAmmoBoxData(8, 1))))
DetailedWeaponData(6, 8, 0, List(InternalSlot(540, PlanetSideGUID(6536), 0, DetailedAmmoBoxData(8, 1))))
),
InternalSlot(175, PlanetSideGUID(3949), 572,
DetailedWeaponData(6, 8, List(InternalSlot(540, PlanetSideGUID(7526), 0, DetailedAmmoBoxData(8, 1))))
DetailedWeaponData(6, 8, 0, List(InternalSlot(540, PlanetSideGUID(7526), 0, DetailedAmmoBoxData(8, 1))))
),
InternalSlot(175, PlanetSideGUID(3805), 573,
DetailedWeaponData(6, 8, List(InternalSlot(540, PlanetSideGUID(7358), 0, DetailedAmmoBoxData(8, 1))))
DetailedWeaponData(6, 8, 0, List(InternalSlot(540, PlanetSideGUID(7358), 0, DetailedAmmoBoxData(8, 1))))
),
InternalSlot(324, PlanetSideGUID(4493), 574,
DetailedWeaponData(6, 8, List(InternalSlot(540, PlanetSideGUID(6852), 0, DetailedAmmoBoxData(8, 1))))
DetailedWeaponData(6, 8, 0, List(InternalSlot(540, PlanetSideGUID(6852), 0, DetailedAmmoBoxData(8, 1))))
),
InternalSlot(324, PlanetSideGUID(5762), 575,
DetailedWeaponData(6, 8, List(InternalSlot(540, PlanetSideGUID(3463), 0, DetailedAmmoBoxData(8, 1))))
DetailedWeaponData(6, 8, 0, List(InternalSlot(540, PlanetSideGUID(3463), 0, DetailedAmmoBoxData(8, 1))))
),
InternalSlot(175, PlanetSideGUID(3315), 576,
DetailedWeaponData(6, 8, List(InternalSlot(540, PlanetSideGUID(7619), 0, DetailedAmmoBoxData(8, 1))))
DetailedWeaponData(6, 8, 0, List(InternalSlot(540, PlanetSideGUID(7619), 0, DetailedAmmoBoxData(8, 1))))
),
InternalSlot(324, PlanetSideGUID(6263), 577,
DetailedWeaponData(6, 8, List(InternalSlot(540, PlanetSideGUID(5912), 0, DetailedAmmoBoxData(8, 1))))
DetailedWeaponData(6, 8, 0, List(InternalSlot(540, PlanetSideGUID(5912), 0, DetailedAmmoBoxData(8, 1))))
),
InternalSlot(468, PlanetSideGUID(4028), 578,
DetailedWeaponData(6, 8, List(InternalSlot(540, PlanetSideGUID(8021), 0, DetailedAmmoBoxData(8, 1))))
DetailedWeaponData(6, 8, 0, List(InternalSlot(540, PlanetSideGUID(8021), 0, DetailedAmmoBoxData(8, 1))))
),
InternalSlot(175, PlanetSideGUID(2843), 579,
DetailedWeaponData(6, 8, List(InternalSlot(540, PlanetSideGUID(7250), 0, DetailedAmmoBoxData(8, 1))))
DetailedWeaponData(6, 8, 0, List(InternalSlot(540, PlanetSideGUID(7250), 0, DetailedAmmoBoxData(8, 1))))
),
InternalSlot(175, PlanetSideGUID(9143), 580,
DetailedWeaponData(6, 8, List(InternalSlot(540, PlanetSideGUID(5195), 0, DetailedAmmoBoxData(8, 1))))
DetailedWeaponData(6, 8, 0, List(InternalSlot(540, PlanetSideGUID(5195), 0, DetailedAmmoBoxData(8, 1))))
),
InternalSlot(468, PlanetSideGUID(5024), 581,
DetailedWeaponData(6, 8, List(InternalSlot(540, PlanetSideGUID(4287), 0, DetailedAmmoBoxData(8, 1))))
DetailedWeaponData(6, 8, 0, List(InternalSlot(540, PlanetSideGUID(4287), 0, DetailedAmmoBoxData(8, 1))))
),
InternalSlot(468, PlanetSideGUID(6582), 582,
DetailedWeaponData(6, 8, List(InternalSlot(540, PlanetSideGUID(4915), 0, DetailedAmmoBoxData(8, 1))))
DetailedWeaponData(6, 8, 0, List(InternalSlot(540, PlanetSideGUID(4915), 0, DetailedAmmoBoxData(8, 1))))
),
InternalSlot(468, PlanetSideGUID(6425), 583,
DetailedWeaponData(6, 8, List(InternalSlot(540, PlanetSideGUID(8872), 0, DetailedAmmoBoxData(8, 1))))
DetailedWeaponData(6, 8, 0, List(InternalSlot(540, PlanetSideGUID(8872), 0, DetailedAmmoBoxData(8, 1))))
),
InternalSlot(468, PlanetSideGUID(4431), 584,
DetailedWeaponData(6, 8, List(InternalSlot(540, PlanetSideGUID(4191), 0, DetailedAmmoBoxData(8, 1))))
DetailedWeaponData(6, 8, 0, List(InternalSlot(540, PlanetSideGUID(4191), 0, DetailedAmmoBoxData(8, 1))))
),
InternalSlot(175, PlanetSideGUID(8339), 585,
DetailedWeaponData(6, 8, List(InternalSlot(540, PlanetSideGUID(7317), 0, DetailedAmmoBoxData(8, 1))))
DetailedWeaponData(6, 8, 0, List(InternalSlot(540, PlanetSideGUID(7317), 0, DetailedAmmoBoxData(8, 1))))
),
InternalSlot(175, PlanetSideGUID(3277), 586,
DetailedWeaponData(6, 8, List(InternalSlot(540, PlanetSideGUID(6469), 0, DetailedAmmoBoxData(8, 1))))
DetailedWeaponData(6, 8, 0, List(InternalSlot(540, PlanetSideGUID(6469), 0, DetailedAmmoBoxData(8, 1))))
)
))))
),
@ -825,11 +825,11 @@ class DetailedCharacterDataTest extends Specification {
InternalSlot(728, PlanetSideGUID(7181), 12, DetailedREKData(4, 16)),
InternalSlot(536, PlanetSideGUID(4077), 33, DetailedAmmoBoxData(8, 1)),
InternalSlot(680, PlanetSideGUID(4377), 37,
DetailedWeaponData(2, 8, List(InternalSlot(681, PlanetSideGUID(8905), 0, DetailedAmmoBoxData(8, 3))))
DetailedWeaponData(2, 8, 0, List(InternalSlot(681, PlanetSideGUID(8905), 0, DetailedAmmoBoxData(8, 3))))
),
InternalSlot(32, PlanetSideGUID(5523), 39, DetailedACEData(4)),
InternalSlot(673, PlanetSideGUID(3661), 60,
DetailedWeaponData(2, 8, List(InternalSlot(674, PlanetSideGUID(8542), 0, DetailedAmmoBoxData(8, 3))))
DetailedWeaponData(2, 8, 0, List(InternalSlot(674, PlanetSideGUID(8542), 0, DetailedAmmoBoxData(8, 3))))
)
)
)

View file

@ -72,7 +72,7 @@ class DetailedWeaponDataTest extends Specification {
}
"encode (punisher)" in {
val obj = DetailedWeaponData(0, 8,
val obj = DetailedWeaponData(0, 8, 0,
DetailedAmmoBoxData(ObjectClass.bullet_9mm, PlanetSideGUID(1693), 0, DetailedAmmoBoxData(8, 30)) ::
DetailedAmmoBoxData(ObjectClass.jammer_cartridge, PlanetSideGUID(1564), 1, DetailedAmmoBoxData(8, 1)) ::
Nil

View file

@ -37,22 +37,13 @@ class ConverterTest extends Specification {
}
"Tool" should {
"convert to packet" in {
val tdef = ToolDefinition(1076)
tdef.Size = EquipmentSize.Rifle
tdef.AmmoTypes += GlobalDefinitions.shotgun_shell
tdef.AmmoTypes += GlobalDefinitions.shotgun_shell_AP
tdef.FireModes += new FireModeDefinition
tdef.FireModes.head.AmmoTypeIndices += 0
tdef.FireModes.head.AmmoTypeIndices += 1
tdef.FireModes.head.AmmoSlotIndex = 0
tdef.FireModes.head.Magazine = 30
val obj : Tool = Tool(tdef)
"convert to packet (1 fire mode slot)" in {
val obj : Tool = Tool(GlobalDefinitions.flechette)
obj.AmmoSlot.Box.GUID = PlanetSideGUID(90)
obj.Definition.Packet.DetailedConstructorData(obj) match {
case Success(pkt) =>
pkt mustEqual DetailedWeaponData(4,8, Ammo.shotgun_shell.id, PlanetSideGUID(90), 0, DetailedAmmoBoxData(8, 30))
pkt mustEqual DetailedWeaponData(4,8, Ammo.shotgun_shell.id, PlanetSideGUID(90), 0, DetailedAmmoBoxData(8, 12))
case _ =>
ko
}
@ -63,6 +54,35 @@ class ConverterTest extends Specification {
ko
}
}
"convert to packet (2 fire mode slots)" in {
val obj : Tool = Tool(GlobalDefinitions.punisher)
obj.AmmoSlots.head.Box.GUID = PlanetSideGUID(90)
obj.AmmoSlots(1).Box.GUID = PlanetSideGUID(91)
obj.Definition.Packet.DetailedConstructorData(obj) match {
case Success(pkt) =>
pkt mustEqual DetailedWeaponData(4,8, 0,
List(
InternalSlot(Ammo.bullet_9mm.id, PlanetSideGUID(90), 0, DetailedAmmoBoxData(8, 30)),
InternalSlot(Ammo.rocket.id, PlanetSideGUID(91), 1, DetailedAmmoBoxData(8, 1))
)
)
case _ =>
ko
}
obj.Definition.Packet.ConstructorData(obj) match {
case Success(pkt) =>
pkt mustEqual WeaponData(4,8, 0,
List(
InternalSlot(Ammo.bullet_9mm.id, PlanetSideGUID(90), 0, AmmoBoxData()),
InternalSlot(Ammo.rocket.id, PlanetSideGUID(91), 1, AmmoBoxData())
)
)
case _ =>
ko
}
}
}
"Kit" should {

View file

@ -114,7 +114,6 @@ class EquipmentTest extends Specification {
obj.FireModes.head.AmmoTypeIndices += 1
obj.FireModes.head.AmmoSlotIndex = 0
obj.FireModes.head.Magazine = 18
obj.FireModes.head.ResetAmmoIndexOnSwap = true
obj.FireModes += FireModeDefinition()
obj.FireModes(1).AmmoTypeIndices += 0
obj.FireModes(1).AmmoTypeIndices += 1
@ -132,13 +131,11 @@ class EquipmentTest extends Specification {
obj.FireModes.head.AmmoSlotIndex mustEqual 0
obj.FireModes.head.Chamber mustEqual 1
obj.FireModes.head.Magazine mustEqual 18
obj.FireModes.head.ResetAmmoIndexOnSwap mustEqual true
obj.FireModes(1).AmmoTypeIndices.head mustEqual 0
obj.FireModes(1).AmmoTypeIndices(1) mustEqual 1
obj.FireModes(1).AmmoSlotIndex mustEqual 1
obj.FireModes(1).Chamber mustEqual 3
obj.FireModes(1).Magazine mustEqual 18
obj.FireModes(1).ResetAmmoIndexOnSwap mustEqual false
obj.Tile.Width mustEqual InventoryTile.Tile93.Width
obj.Tile.Height mustEqual InventoryTile.Tile93.Height
}

View file

@ -114,15 +114,15 @@ class PlayerTest extends Specification {
obj.Slot(1).Size = EquipmentSize.Pistol
obj.Slot(1).Equipment = wep2
obj.DrawnSlot mustEqual Player.HandsDownSlot //default value
obj.LastDrawnSlot mustEqual 0 //default value
obj.LastDrawnSlot mustEqual Player.HandsDownSlot //default value
obj.DrawnSlot = 1
obj.DrawnSlot mustEqual 1
obj.LastDrawnSlot mustEqual 0 //default value; sorry
obj.LastDrawnSlot mustEqual 1
obj.DrawnSlot = 0
obj.DrawnSlot mustEqual 0
obj.LastDrawnSlot mustEqual 1
obj.LastDrawnSlot mustEqual 0
obj.DrawnSlot = Player.HandsDownSlot
obj.DrawnSlot mustEqual Player.HandsDownSlot
@ -130,15 +130,15 @@ class PlayerTest extends Specification {
obj.DrawnSlot = 1
obj.DrawnSlot mustEqual 1
obj.LastDrawnSlot mustEqual 0
obj.LastDrawnSlot mustEqual 1
obj.DrawnSlot = 0
obj.DrawnSlot mustEqual 0
obj.LastDrawnSlot mustEqual 1
obj.LastDrawnSlot mustEqual 0
obj.DrawnSlot = 1
obj.DrawnSlot mustEqual 1
obj.LastDrawnSlot mustEqual 0
obj.LastDrawnSlot mustEqual 1
obj.DrawnSlot = Player.HandsDownSlot
obj.DrawnSlot mustEqual Player.HandsDownSlot