mirror of
https://github.com/2revoemag/PSF-BotServer.git
synced 2026-04-26 22:35:23 +00:00
commit
d19cae7fdf
11 changed files with 200 additions and 37 deletions
|
|
@ -2,7 +2,7 @@
|
||||||
package net.psforever.objects
|
package net.psforever.objects
|
||||||
|
|
||||||
import net.psforever.objects.definition._
|
import net.psforever.objects.definition._
|
||||||
import net.psforever.objects.definition.converter.{CommandDetonaterConverter, REKConverter}
|
import net.psforever.objects.definition.converter.{CommandDetonaterConverter, LockerContainerConverter, REKConverter}
|
||||||
import net.psforever.objects.equipment.CItem.DeployedItem
|
import net.psforever.objects.equipment.CItem.DeployedItem
|
||||||
import net.psforever.objects.equipment._
|
import net.psforever.objects.equipment._
|
||||||
import net.psforever.objects.inventory.InventoryTile
|
import net.psforever.objects.inventory.InventoryTile
|
||||||
|
|
@ -241,6 +241,13 @@ object GlobalDefinitions {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
val
|
||||||
|
locker_container = new EquipmentDefinition(456) {
|
||||||
|
Name = "locker container"
|
||||||
|
Size = EquipmentSize.Inventory
|
||||||
|
Packet = new LockerContainerConverter()
|
||||||
|
}
|
||||||
|
|
||||||
val
|
val
|
||||||
medkit = KitDefinition(Kits.medkit)
|
medkit = KitDefinition(Kits.medkit)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -7,17 +7,13 @@ import net.psforever.objects.equipment.{Equipment, EquipmentSize}
|
||||||
import net.psforever.objects.inventory.GridInventory
|
import net.psforever.objects.inventory.GridInventory
|
||||||
|
|
||||||
class LockerContainer extends Equipment {
|
class LockerContainer extends Equipment {
|
||||||
private val inventory = GridInventory() //?
|
private val inventory = GridInventory(30, 20)
|
||||||
|
|
||||||
def Inventory : GridInventory = inventory
|
def Inventory : GridInventory = inventory
|
||||||
|
|
||||||
def Fit(obj : Equipment) : Option[Int] = inventory.Fit(obj.Definition.Tile)
|
def Fit(obj : Equipment) : Option[Int] = inventory.Fit(obj.Definition.Tile)
|
||||||
|
|
||||||
def Definition : EquipmentDefinition = new EquipmentDefinition(456) {
|
def Definition : EquipmentDefinition = GlobalDefinitions.locker_container
|
||||||
Name = "locker container"
|
|
||||||
Size = EquipmentSize.Inventory
|
|
||||||
Packet = new LockerContainerConverter()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
object LockerContainer {
|
object LockerContainer {
|
||||||
|
|
|
||||||
|
|
@ -70,6 +70,7 @@ class Player(private val name : String,
|
||||||
var PlanetsideAttribute : Array[Long] = Array.ofDim(120)
|
var PlanetsideAttribute : Array[Long] = Array.ofDim(120)
|
||||||
|
|
||||||
Player.SuitSetup(this, ExoSuit)
|
Player.SuitSetup(this, ExoSuit)
|
||||||
|
fifthSlot.Equipment = new LockerContainer() //the fifth slot is the player's "locker"
|
||||||
|
|
||||||
def Name : String = name
|
def Name : String = name
|
||||||
|
|
||||||
|
|
@ -158,7 +159,9 @@ class Player(private val name : String,
|
||||||
holsters(slot)
|
holsters(slot)
|
||||||
}
|
}
|
||||||
else if(slot == 5) {
|
else if(slot == 5) {
|
||||||
fifthSlot
|
new OffhandEquipmentSlot(EquipmentSize.Inventory) {
|
||||||
|
Equipment = fifthSlot.Equipment
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if(slot == Player.FreeHandSlot) {
|
else if(slot == Player.FreeHandSlot) {
|
||||||
freeHand
|
freeHand
|
||||||
|
|
|
||||||
|
|
@ -4,8 +4,7 @@ package net.psforever.objects.definition.converter
|
||||||
import net.psforever.objects.LockerContainer
|
import net.psforever.objects.LockerContainer
|
||||||
import net.psforever.objects.equipment.Equipment
|
import net.psforever.objects.equipment.Equipment
|
||||||
import net.psforever.objects.inventory.GridInventory
|
import net.psforever.objects.inventory.GridInventory
|
||||||
import net.psforever.packet.game.PlanetSideGUID
|
import net.psforever.packet.game.objectcreate._
|
||||||
import net.psforever.packet.game.objectcreate.{DetailedAmmoBoxData, InternalSlot, InventoryData, LockerContainerData}
|
|
||||||
|
|
||||||
import scala.util.{Success, Try}
|
import scala.util.{Success, Try}
|
||||||
|
|
||||||
|
|
@ -14,8 +13,13 @@ class LockerContainerConverter extends ObjectCreateConverter[LockerContainer]()
|
||||||
Success(LockerContainerData(InventoryData(MakeInventory(obj.Inventory))))
|
Success(LockerContainerData(InventoryData(MakeInventory(obj.Inventory))))
|
||||||
}
|
}
|
||||||
|
|
||||||
override def DetailedConstructorData(obj : LockerContainer) : Try[DetailedAmmoBoxData] = {
|
override def DetailedConstructorData(obj : LockerContainer) : Try[DetailedLockerContainerData] = {
|
||||||
Success(DetailedAmmoBoxData(8, 1)) //same format as AmmoBox data
|
if(obj.Inventory.Size > 0) {
|
||||||
|
Success(DetailedLockerContainerData(8, Some(InventoryData(MakeDetailedInventory(obj.Inventory)))))
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Success(DetailedLockerContainerData(8, None))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -27,9 +31,24 @@ class LockerContainerConverter extends ObjectCreateConverter[LockerContainer]()
|
||||||
private def MakeInventory(inv : GridInventory) : List[InternalSlot] = {
|
private def MakeInventory(inv : GridInventory) : List[InternalSlot] = {
|
||||||
inv.Items
|
inv.Items
|
||||||
.map({
|
.map({
|
||||||
case(guid, item) =>
|
case(_, item) =>
|
||||||
val equip : Equipment = item.obj
|
val equip : Equipment = item.obj
|
||||||
InternalSlot(equip.Definition.ObjectId, PlanetSideGUID(guid), item.start, equip.Definition.Packet.ConstructorData(equip).get)
|
InternalSlot(equip.Definition.ObjectId, equip.GUID, item.start, equip.Definition.Packet.ConstructorData(equip).get)
|
||||||
}).toList
|
}).toList
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Transform a list of contained items into a list of contained `InternalSlot` objects.
|
||||||
|
* All objects will take the form of data as if found in an `0x18` packet.
|
||||||
|
* @param inv the inventory container
|
||||||
|
* @return a list of all items that were in the inventory in decoded packet form
|
||||||
|
*/
|
||||||
|
private def MakeDetailedInventory(inv : GridInventory) : List[InternalSlot] = {
|
||||||
|
inv.Items
|
||||||
|
.map({
|
||||||
|
case(_, item) =>
|
||||||
|
val equip : Equipment = item.obj
|
||||||
|
InternalSlot(equip.Definition.ObjectId, equip.GUID, item.start, equip.Definition.Packet.DetailedConstructorData(equip).get)
|
||||||
|
}).toList
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,83 @@
|
||||||
|
// Copyright (c) 2017 PSForever
|
||||||
|
package net.psforever.packet.game.objectcreate
|
||||||
|
|
||||||
|
import net.psforever.packet.Marshallable
|
||||||
|
import net.psforever.packet.game.PlanetSideGUID
|
||||||
|
import scodec.codecs._
|
||||||
|
import scodec.{Attempt, Codec, Err}
|
||||||
|
import shapeless.{::, HNil}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A representation of the inventory portion of `ObjectCreateDetailedMessage` packet data that contains the items in the avatar's locker space.<br>
|
||||||
|
* <br>
|
||||||
|
* Although these items are technically always loaded and registered with globally unique identifiers for the current zone,
|
||||||
|
* the actual container for them, in grid format, can only be accessed by interacting with locker objects in the game world.
|
||||||
|
* Items are generally added and removed in the same way as with any other opened inventory.
|
||||||
|
* Unlike other inventories, however, locker space is personal to an avatar and can not be accessed by other players.
|
||||||
|
* @param unk na
|
||||||
|
* @param inventory the items in this inventory
|
||||||
|
*/
|
||||||
|
final case class DetailedLockerContainerData(unk : Int,
|
||||||
|
inventory : Option[InventoryData]
|
||||||
|
) extends ConstructorData {
|
||||||
|
override def bitsize : Long = {
|
||||||
|
val base : Long = 40L
|
||||||
|
val invSize : Long = if(inventory.isDefined) { inventory.get.bitsize } else { 0L }
|
||||||
|
base + invSize
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
object DetailedLockerContainerData extends Marshallable[DetailedLockerContainerData] {
|
||||||
|
/**
|
||||||
|
* Overloaded constructor for creating `DetailedLockerContainerData` without a list of contents.
|
||||||
|
* @param unk na
|
||||||
|
* @return a `DetailedLockerContainerData` object
|
||||||
|
*/
|
||||||
|
def apply(unk : Int) : DetailedLockerContainerData =
|
||||||
|
new DetailedLockerContainerData(unk, None)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Overloaded constructor for creating `DetailedLockerContainerData` containing known items.
|
||||||
|
* @param unk na
|
||||||
|
* @param inventory the items in the inventory
|
||||||
|
* @return a `DetailedLockerContainerData` object
|
||||||
|
*/
|
||||||
|
def apply(unk : Int, inventory : List[InternalSlot]) : DetailedLockerContainerData =
|
||||||
|
new DetailedLockerContainerData(unk, Some(InventoryData(inventory)))
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Overloaded constructor for creating `DetailedLockerContainerData` while masking use of `InternalSlot`.
|
||||||
|
* @param cls the code for the type of object being constructed
|
||||||
|
* @param guid the GUID this object will be assigned
|
||||||
|
* @param parentSlot a parent-defined slot identifier that explains where the child is to be attached to the parent
|
||||||
|
* @param locker the `DetailedLockerContainerData`
|
||||||
|
* @return an `InternalSlot` object that encapsulates `DetailedLockerContainerData`
|
||||||
|
*/
|
||||||
|
def apply(cls : Int, guid : PlanetSideGUID, parentSlot : Int, locker : DetailedLockerContainerData) : InternalSlot =
|
||||||
|
new InternalSlot(cls, guid, parentSlot, locker)
|
||||||
|
|
||||||
|
implicit val codec : Codec[DetailedLockerContainerData] = (
|
||||||
|
uint4L ::
|
||||||
|
("unk" | uint4L) :: // 8 - common - 4 - safe, 2 - stream misalignment, 1 - safe, 0 - common
|
||||||
|
uint(15) ::
|
||||||
|
uint16L :: //always 1
|
||||||
|
optional(bool, InventoryData.codec_detailed)
|
||||||
|
).exmap[DetailedLockerContainerData] (
|
||||||
|
{
|
||||||
|
case 0xC :: unk :: 0 :: 1 :: None :: HNil =>
|
||||||
|
Attempt.successful(DetailedLockerContainerData(unk, None))
|
||||||
|
|
||||||
|
case 0xC :: unk :: 0 :: 1 :: Some(inv) :: HNil =>
|
||||||
|
Attempt.successful(DetailedLockerContainerData(unk, Some(inv)))
|
||||||
|
case _ =>
|
||||||
|
Attempt.failure(Err(s"invalid locker container data format"))
|
||||||
|
},
|
||||||
|
{
|
||||||
|
case DetailedLockerContainerData(unk, None) =>
|
||||||
|
Attempt.successful(0xC :: unk :: 0 :: 1 :: None :: HNil)
|
||||||
|
|
||||||
|
case DetailedLockerContainerData(unk, Some(inv)) =>
|
||||||
|
Attempt.successful(0xC :: unk :: 0 :: 1 :: Some(inv) :: HNil)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
@ -23,7 +23,7 @@ import shapeless.{::, HNil}
|
||||||
*/
|
*/
|
||||||
final case class InventoryData(contents : List[InventoryItem] = List.empty) extends StreamBitSize {
|
final case class InventoryData(contents : List[InventoryItem] = List.empty) extends StreamBitSize {
|
||||||
override def bitsize : Long = {
|
override def bitsize : Long = {
|
||||||
val base : Long = 10L //8u + 1u + 1u
|
val base : Long = InventoryData.BaseSize
|
||||||
var invSize : Long = 0L //length of all items in inventory
|
var invSize : Long = 0L //length of all items in inventory
|
||||||
for(item <- contents) {
|
for(item <- contents) {
|
||||||
invSize += item.bitsize
|
invSize += item.bitsize
|
||||||
|
|
@ -33,6 +33,8 @@ final case class InventoryData(contents : List[InventoryItem] = List.empty) exte
|
||||||
}
|
}
|
||||||
|
|
||||||
object InventoryData {
|
object InventoryData {
|
||||||
|
final val BaseSize : Long = 10L //8u + 1u + 1u
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The primary `Codec` that parses the common format for an inventory `List`.
|
* The primary `Codec` that parses the common format for an inventory `List`.
|
||||||
* @param itemCodec a `Codec` that describes each of the contents of the list
|
* @param itemCodec a `Codec` that describes each of the contents of the list
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,7 @@ import shapeless.{::, HNil}
|
||||||
* A representation for a game object that can contain items.<br>
|
* A representation for a game object that can contain items.<br>
|
||||||
* <br>
|
* <br>
|
||||||
* For whatever reason, these "lockers" are typically placed at the origin coordinates.
|
* For whatever reason, these "lockers" are typically placed at the origin coordinates.
|
||||||
* @param inventory the items inside his locker
|
* @param inventory the items inside this locker
|
||||||
*/
|
*/
|
||||||
final case class LockerContainerData(inventory : InventoryData) extends ConstructorData {
|
final case class LockerContainerData(inventory : InventoryData) extends ConstructorData {
|
||||||
override def bitsize : Long = 105L + inventory.bitsize //81u + 2u + 21u + 1u
|
override def bitsize : Long = 105L + inventory.bitsize //81u + 2u + 21u + 1u
|
||||||
|
|
|
||||||
|
|
@ -638,7 +638,7 @@ object ObjectClass {
|
||||||
case ObjectClass.boomer_trigger => ConstructorData.genericCodec(DetailedBoomerTriggerData.codec, "boomer trigger")
|
case ObjectClass.boomer_trigger => ConstructorData.genericCodec(DetailedBoomerTriggerData.codec, "boomer trigger")
|
||||||
//other
|
//other
|
||||||
case ObjectClass.avatar => ConstructorData.genericCodec(DetailedCharacterData.codec, "avatar")
|
case ObjectClass.avatar => ConstructorData.genericCodec(DetailedCharacterData.codec, "avatar")
|
||||||
case ObjectClass.locker_container => ConstructorData.genericCodec(DetailedAmmoBoxData.codec, "locker container")
|
case ObjectClass.locker_container => ConstructorData.genericCodec(DetailedLockerContainerData.codec, "locker container")
|
||||||
|
|
||||||
//failure case
|
//failure case
|
||||||
case _ => defaultFailureCodec(objClass)
|
case _ => defaultFailureCodec(objClass)
|
||||||
|
|
|
||||||
|
|
@ -260,7 +260,8 @@ class ObjectCreateDetailedMessageTest extends Specification {
|
||||||
inventory(3).objectClass mustEqual ObjectClass.locker_container
|
inventory(3).objectClass mustEqual ObjectClass.locker_container
|
||||||
inventory(3).guid mustEqual PlanetSideGUID(82)
|
inventory(3).guid mustEqual PlanetSideGUID(82)
|
||||||
inventory(3).parentSlot mustEqual 5
|
inventory(3).parentSlot mustEqual 5
|
||||||
inventory(3).obj.asInstanceOf[DetailedAmmoBoxData].magazine mustEqual 1
|
inventory(3).obj.isInstanceOf[DetailedLockerContainerData] mustEqual true
|
||||||
|
inventory(3).obj.asInstanceOf[DetailedLockerContainerData].inventory.isDefined mustEqual false
|
||||||
//4
|
//4
|
||||||
inventory(4).objectClass mustEqual ObjectClass.bullet_9mm
|
inventory(4).objectClass mustEqual ObjectClass.bullet_9mm
|
||||||
inventory(4).guid mustEqual PlanetSideGUID(83)
|
inventory(4).guid mustEqual PlanetSideGUID(83)
|
||||||
|
|
@ -342,7 +343,7 @@ class ObjectCreateDetailedMessageTest extends Specification {
|
||||||
Nil
|
Nil
|
||||||
)(2)
|
)(2)
|
||||||
val msg = ObjectCreateDetailedMessage(ObjectClass.punisher, PlanetSideGUID(1703), ObjectCreateMessageParent(PlanetSideGUID(75), 2), obj)
|
val msg = ObjectCreateDetailedMessage(ObjectClass.punisher, PlanetSideGUID(1703), ObjectCreateMessageParent(PlanetSideGUID(75), 2), obj)
|
||||||
var pkt = PacketCoding.EncodePacket(msg).require.toByteVector
|
val pkt = PacketCoding.EncodePacket(msg).require.toByteVector
|
||||||
|
|
||||||
pkt mustEqual string_punisher
|
pkt mustEqual string_punisher
|
||||||
}
|
}
|
||||||
|
|
@ -394,7 +395,7 @@ class ObjectCreateDetailedMessageTest extends Specification {
|
||||||
val inv = InventoryItemData(ObjectClass.beamer, PlanetSideGUID(76), 0, DetailedWeaponData(4, 8, ObjectClass.energy_cell, PlanetSideGUID(77), 0, DetailedAmmoBoxData(8, 16))) ::
|
val inv = InventoryItemData(ObjectClass.beamer, PlanetSideGUID(76), 0, DetailedWeaponData(4, 8, ObjectClass.energy_cell, PlanetSideGUID(77), 0, DetailedAmmoBoxData(8, 16))) ::
|
||||||
InventoryItemData(ObjectClass.suppressor, PlanetSideGUID(78), 2, DetailedWeaponData(4, 8, ObjectClass.bullet_9mm, PlanetSideGUID(79), 0, DetailedAmmoBoxData(8, 25))) ::
|
InventoryItemData(ObjectClass.suppressor, PlanetSideGUID(78), 2, DetailedWeaponData(4, 8, ObjectClass.bullet_9mm, PlanetSideGUID(79), 0, DetailedAmmoBoxData(8, 25))) ::
|
||||||
InventoryItemData(ObjectClass.forceblade, PlanetSideGUID(80), 4, DetailedWeaponData(4, 8, ObjectClass.melee_ammo, PlanetSideGUID(81), 0, DetailedAmmoBoxData(8, 1))) ::
|
InventoryItemData(ObjectClass.forceblade, PlanetSideGUID(80), 4, DetailedWeaponData(4, 8, ObjectClass.melee_ammo, PlanetSideGUID(81), 0, DetailedAmmoBoxData(8, 1))) ::
|
||||||
InventoryItemData(ObjectClass.locker_container, PlanetSideGUID(82), 5, DetailedAmmoBoxData(8, 1)) ::
|
InventoryItemData(ObjectClass.locker_container, PlanetSideGUID(82), 5, DetailedLockerContainerData(8)) ::
|
||||||
InventoryItemData(ObjectClass.bullet_9mm, PlanetSideGUID(83), 6, DetailedAmmoBoxData(8, 50)) ::
|
InventoryItemData(ObjectClass.bullet_9mm, PlanetSideGUID(83), 6, DetailedAmmoBoxData(8, 50)) ::
|
||||||
InventoryItemData(ObjectClass.bullet_9mm, PlanetSideGUID(84), 9, DetailedAmmoBoxData(8, 50)) ::
|
InventoryItemData(ObjectClass.bullet_9mm, PlanetSideGUID(84), 9, DetailedAmmoBoxData(8, 50)) ::
|
||||||
InventoryItemData(ObjectClass.bullet_9mm, PlanetSideGUID(85), 12, DetailedAmmoBoxData(8, 50)) ::
|
InventoryItemData(ObjectClass.bullet_9mm, PlanetSideGUID(85), 12, DetailedAmmoBoxData(8, 50)) ::
|
||||||
|
|
|
||||||
|
|
@ -155,6 +155,7 @@ class ConverterTest extends Specification {
|
||||||
tool.AmmoSlots.head.Box = box1
|
tool.AmmoSlots.head.Box = box1
|
||||||
val obj = Player(PlanetSideGUID(93), "Chord", PlanetSideEmpire.TR, CharacterGender.Male, 0, 5)
|
val obj = Player(PlanetSideGUID(93), "Chord", PlanetSideEmpire.TR, CharacterGender.Male, 0, 5)
|
||||||
obj.Slot(2).Equipment = tool
|
obj.Slot(2).Equipment = tool
|
||||||
|
obj.Slot(5).Equipment.get.GUID = PlanetSideGUID(94)
|
||||||
obj.Inventory += 8 -> box2
|
obj.Inventory += 8 -> box2
|
||||||
|
|
||||||
obj.Definition.Packet.DetailedConstructorData(obj).isSuccess mustEqual true
|
obj.Definition.Packet.DetailedConstructorData(obj).isSuccess mustEqual true
|
||||||
|
|
@ -162,6 +163,45 @@ class ConverterTest extends Specification {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
"LockerContainer" should {
|
||||||
|
"convert to packet (empty)" in {
|
||||||
|
val obj = LockerContainer()
|
||||||
|
obj.Definition.Packet.DetailedConstructorData(obj) match {
|
||||||
|
case Success(pkt) =>
|
||||||
|
pkt mustEqual DetailedLockerContainerData(8, None)
|
||||||
|
case _ =>
|
||||||
|
ko
|
||||||
|
}
|
||||||
|
obj.Definition.Packet.ConstructorData(obj) match {
|
||||||
|
case Success(pkt) =>
|
||||||
|
pkt mustEqual LockerContainerData(InventoryData(List.empty))
|
||||||
|
case _ =>
|
||||||
|
ko
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
"convert to packet (occupied)" in {
|
||||||
|
import GlobalDefinitions._
|
||||||
|
val obj = LockerContainer()
|
||||||
|
val rek = SimpleItem(remote_electronics_kit)
|
||||||
|
rek.GUID = PlanetSideGUID(1)
|
||||||
|
obj.Inventory += 0 -> rek
|
||||||
|
|
||||||
|
obj.Definition.Packet.DetailedConstructorData(obj) match {
|
||||||
|
case Success(pkt) =>
|
||||||
|
pkt mustEqual DetailedLockerContainerData(8, InternalSlot(remote_electronics_kit.ObjectId, PlanetSideGUID(1), 0, DetailedREKData(8)) :: Nil)
|
||||||
|
case _ =>
|
||||||
|
ko
|
||||||
|
}
|
||||||
|
obj.Definition.Packet.ConstructorData(obj) match {
|
||||||
|
case Success(pkt) =>
|
||||||
|
pkt mustEqual LockerContainerData(InventoryData(InternalSlot(remote_electronics_kit.ObjectId, PlanetSideGUID(1), 0, REKData(8,0)) :: Nil))
|
||||||
|
case _ =>
|
||||||
|
ko
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
"Vehicle" should {
|
"Vehicle" should {
|
||||||
"convert to packet" in {
|
"convert to packet" in {
|
||||||
val hellfire_ammo = AmmoBoxDefinition(Ammo.hellfire_ammo.id)
|
val hellfire_ammo = AmmoBoxDefinition(Ammo.hellfire_ammo.id)
|
||||||
|
|
|
||||||
|
|
@ -578,7 +578,7 @@ class WorldSessionActor extends Actor with MDCContextAware {
|
||||||
forceblade1 = Tool(forceblade)
|
forceblade1 = Tool(forceblade)
|
||||||
forceblade1.AmmoSlots.head.Box = melee_ammo_box
|
forceblade1.AmmoSlots.head.Box = melee_ammo_box
|
||||||
val rek = SimpleItem(remote_electronics_kit)
|
val rek = SimpleItem(remote_electronics_kit)
|
||||||
val lockerContainer = LockerContainer()
|
val extra_rek = SimpleItem(remote_electronics_kit)
|
||||||
val
|
val
|
||||||
player = Player("IlllIIIlllIlIllIlllIllI", PlanetSideEmpire.VS, CharacterGender.Female, 41, 1)
|
player = Player("IlllIIIlllIlIllIlllIllI", PlanetSideEmpire.VS, CharacterGender.Female, 41, 1)
|
||||||
player.Position = Vector3(3674.8438f, 2726.789f, 91.15625f)
|
player.Position = Vector3(3674.8438f, 2726.789f, 91.15625f)
|
||||||
|
|
@ -587,13 +587,13 @@ class WorldSessionActor extends Actor with MDCContextAware {
|
||||||
player.Slot(0).Equipment = beamer1
|
player.Slot(0).Equipment = beamer1
|
||||||
player.Slot(2).Equipment = suppressor1
|
player.Slot(2).Equipment = suppressor1
|
||||||
player.Slot(4).Equipment = forceblade1
|
player.Slot(4).Equipment = forceblade1
|
||||||
player.Slot(5).Equipment = lockerContainer
|
|
||||||
player.Slot(6).Equipment = bullet_9mm_box1
|
player.Slot(6).Equipment = bullet_9mm_box1
|
||||||
player.Slot(9).Equipment = bullet_9mm_box2
|
player.Slot(9).Equipment = bullet_9mm_box2
|
||||||
player.Slot(12).Equipment = bullet_9mm_box3
|
player.Slot(12).Equipment = bullet_9mm_box3
|
||||||
player.Slot(33).Equipment = bullet_9mm_AP_box
|
player.Slot(33).Equipment = bullet_9mm_AP_box
|
||||||
player.Slot(36).Equipment = energy_cell_box1
|
player.Slot(36).Equipment = energy_cell_box1
|
||||||
player.Slot(39).Equipment = rek
|
player.Slot(39).Equipment = rek
|
||||||
|
player.Slot(5).Equipment.get.asInstanceOf[LockerContainer].Inventory += 0 -> extra_rek
|
||||||
|
|
||||||
//for player2
|
//for player2
|
||||||
val energy_cell_box3 = AmmoBox(PlanetSideGUID(187), energy_cell)
|
val energy_cell_box3 = AmmoBox(PlanetSideGUID(187), energy_cell)
|
||||||
|
|
@ -617,8 +617,6 @@ class WorldSessionActor extends Actor with MDCContextAware {
|
||||||
val
|
val
|
||||||
rek2 = SimpleItem(PlanetSideGUID(188), remote_electronics_kit)
|
rek2 = SimpleItem(PlanetSideGUID(188), remote_electronics_kit)
|
||||||
val
|
val
|
||||||
lockerContainer2 = LockerContainer(PlanetSideGUID(182))
|
|
||||||
val
|
|
||||||
player2 = Player(PlanetSideGUID(275), "Doppelganger", PlanetSideEmpire.NC, CharacterGender.Female, 41, 1)
|
player2 = Player(PlanetSideGUID(275), "Doppelganger", PlanetSideEmpire.NC, CharacterGender.Female, 41, 1)
|
||||||
player2.Position = Vector3(3680f, 2726.789f, 91.15625f)
|
player2.Position = Vector3(3680f, 2726.789f, 91.15625f)
|
||||||
player2.Orientation = Vector3(0f, 0f, 0f)
|
player2.Orientation = Vector3(0f, 0f, 0f)
|
||||||
|
|
@ -626,7 +624,7 @@ class WorldSessionActor extends Actor with MDCContextAware {
|
||||||
player2.Slot(0).Equipment = beamer2
|
player2.Slot(0).Equipment = beamer2
|
||||||
player2.Slot(2).Equipment = suppressor2
|
player2.Slot(2).Equipment = suppressor2
|
||||||
player2.Slot(4).Equipment = forceblade2
|
player2.Slot(4).Equipment = forceblade2
|
||||||
player2.Slot(5).Equipment = lockerContainer2
|
player2.Slot(5).Equipment.get.GUID = PlanetSideGUID(182)
|
||||||
player2.Slot(6).Equipment = bullet_9mm_box5
|
player2.Slot(6).Equipment = bullet_9mm_box5
|
||||||
player2.Slot(9).Equipment = bullet_9mm_box6
|
player2.Slot(9).Equipment = bullet_9mm_box6
|
||||||
player2.Slot(12).Equipment = bullet_9mm_box7
|
player2.Slot(12).Equipment = bullet_9mm_box7
|
||||||
|
|
@ -1285,8 +1283,8 @@ class WorldSessionActor extends Actor with MDCContextAware {
|
||||||
private def RegisterAvatar(tplayer : Player) : TaskResolver.GiveTask = {
|
private def RegisterAvatar(tplayer : Player) : TaskResolver.GiveTask = {
|
||||||
val holsterTasks = recursiveHolsterTaskBuilding(tplayer.Holsters().iterator, RegisterEquipment)
|
val holsterTasks = recursiveHolsterTaskBuilding(tplayer.Holsters().iterator, RegisterEquipment)
|
||||||
val fifthHolsterTask = tplayer.Slot(5).Equipment match {
|
val fifthHolsterTask = tplayer.Slot(5).Equipment match {
|
||||||
case Some(item) =>
|
case Some(locker) =>
|
||||||
RegisterEquipment(item) :: Nil
|
RegisterObjectTask(locker) :: locker.asInstanceOf[LockerContainer].Inventory.Items.map({ case((_ : Int, entry : InventoryItem)) => RegisterEquipment(entry.obj)}).toList
|
||||||
case None =>
|
case None =>
|
||||||
List.empty[TaskResolver.GiveTask];
|
List.empty[TaskResolver.GiveTask];
|
||||||
}
|
}
|
||||||
|
|
@ -1413,8 +1411,8 @@ class WorldSessionActor extends Actor with MDCContextAware {
|
||||||
val holsterTasks = recursiveHolsterTaskBuilding(tplayer.Holsters().iterator, UnregisterEquipment)
|
val holsterTasks = recursiveHolsterTaskBuilding(tplayer.Holsters().iterator, UnregisterEquipment)
|
||||||
val inventoryTasks = tplayer.Inventory.Items.map({ case((_ : Int, entry : InventoryItem)) => UnregisterEquipment(entry.obj)})
|
val inventoryTasks = tplayer.Inventory.Items.map({ case((_ : Int, entry : InventoryItem)) => UnregisterEquipment(entry.obj)})
|
||||||
val fifthHolsterTask = tplayer.Slot(5).Equipment match {
|
val fifthHolsterTask = tplayer.Slot(5).Equipment match {
|
||||||
case Some(item) =>
|
case Some(locker) =>
|
||||||
UnregisterEquipment(item) :: Nil
|
UnregisterObjectTask(locker) :: locker.asInstanceOf[LockerContainer].Inventory.Items.map({ case((_ : Int, entry : InventoryItem)) => UnregisterEquipment(entry.obj)}).toList
|
||||||
case None =>
|
case None =>
|
||||||
List.empty[TaskResolver.GiveTask];
|
List.empty[TaskResolver.GiveTask];
|
||||||
}
|
}
|
||||||
|
|
@ -1433,10 +1431,17 @@ class WorldSessionActor extends Actor with MDCContextAware {
|
||||||
tplayer.Holsters().foreach(holster => {
|
tplayer.Holsters().foreach(holster => {
|
||||||
SetCharacterSelectScreenGUID_SelectEquipment(holster.Equipment, gen)
|
SetCharacterSelectScreenGUID_SelectEquipment(holster.Equipment, gen)
|
||||||
})
|
})
|
||||||
tplayer.Inventory.Items.foreach({ case((_, entry : InventoryItem)) =>
|
// tplayer.Inventory.Items.foreach({ case((_, entry : InventoryItem)) =>
|
||||||
SetCharacterSelectScreenGUID_SelectEquipment(Some(entry.obj), gen)
|
// SetCharacterSelectScreenGUID_SelectEquipment(Some(entry.obj), gen)
|
||||||
})
|
// })
|
||||||
tplayer.Slot(5).Equipment.get.GUID = PlanetSideGUID(gen.getAndIncrement)
|
// tplayer.Slot(5).Equipment match {
|
||||||
|
// case Some(locker) =>
|
||||||
|
// locker.GUID = PlanetSideGUID(gen.getAndIncrement)
|
||||||
|
// locker.asInstanceOf[LockerContainer].Inventory.Items.foreach({ case((_, entry : InventoryItem)) =>
|
||||||
|
// SetCharacterSelectScreenGUID_SelectEquipment(Some(entry.obj), gen)
|
||||||
|
// })
|
||||||
|
// case None => ;
|
||||||
|
// }
|
||||||
tplayer.GUID = PlanetSideGUID(gen.getAndIncrement)
|
tplayer.GUID = PlanetSideGUID(gen.getAndIncrement)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1468,10 +1473,17 @@ class WorldSessionActor extends Actor with MDCContextAware {
|
||||||
tplayer.Holsters().foreach(holster => {
|
tplayer.Holsters().foreach(holster => {
|
||||||
RemoveCharacterSelectScreenGUID_SelectEquipment(holster.Equipment)
|
RemoveCharacterSelectScreenGUID_SelectEquipment(holster.Equipment)
|
||||||
})
|
})
|
||||||
tplayer.Inventory.Items.foreach({ case((_, entry : InventoryItem)) =>
|
// tplayer.Inventory.Items.foreach({ case((_, entry : InventoryItem)) =>
|
||||||
RemoveCharacterSelectScreenGUID_SelectEquipment(Some(entry.obj))
|
// RemoveCharacterSelectScreenGUID_SelectEquipment(Some(entry.obj))
|
||||||
})
|
// })
|
||||||
tplayer.Slot(5).Equipment.get.Invalidate()
|
// tplayer.Slot(5).Equipment match {
|
||||||
|
// case Some(locker) =>
|
||||||
|
// locker.Invalidate()
|
||||||
|
// locker.asInstanceOf[LockerContainer].Inventory.Items.foreach({ case((_, entry : InventoryItem)) =>
|
||||||
|
// RemoveCharacterSelectScreenGUID_SelectEquipment(Some(entry.obj))
|
||||||
|
// })
|
||||||
|
// case None => ;
|
||||||
|
// }
|
||||||
tplayer.Invalidate()
|
tplayer.Invalidate()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue