mirror of
https://github.com/2revoemag/PSF-BotServer.git
synced 2026-03-01 19:23:38 +00:00
Let's Move Item, Together, Again (#445)
* mix-in code for akka messaging move item, currently testing on infantry only * adjusted structure of COntainable so callbacks are separate from message-producing functions, are separate from message-sending functionality; massaged LockerContainer until it could support control agency and created a wrapper for its Equipment interfacing; the control structure starts and stops when PlayerControl starts and stops, and it converts whenever necessary * added failsafe conditions to Containable, such as blocking certain messages while completing a MoveItem call, or blocking all messages to reset disruptive MoveItem calls; depiction message callbacks for Player, Locker, and Vehicle, to properly depict the manipulation of items; eliminated the old code from WSA * added useful comments to Containable; moved functionality for deployables, and for container'ing, and dropping logic out from WSA and distributed it appropriately * handling terminal operations - buying an exosuit and selecting an infantry loadout; starting work on support for more persistent equipment timers local to the avatar (that were removed in this update; see wsa changes) * linked terminal page/message with routing policy * tuning vehicle loadout management and display * separated use time from purchase time and applied a system that limits either if that same event would recur too soon; tuning exosuit and loadout changes * some ask timeout handling and comments * normalizing item on ground interactions * rearranging the project structure * merged with master; commas removed * fixing tests * added description strings to Tasks; adjusted the completion conditions for some Tasks * a failed purchase will not block future purchases; increased timeout on move-item tasks * corpses, even one's own, should have properly moveable inventories * for better persistence, until GlobalDefinitions is renovated, moved the object id->name map onto the avatar object, for the purpose of timers; replaced a use of values in GridInventory for a map conversion * max loadouts and max exosuit switch use same cooldown now; hopefully better clarifcation regarding held arm position * manual merge-rebase of master with hand reconstruction of WorldSessionActor and PlayerControl, and variations for other files necessary to maintain both inventory operations and login reliability * test fixes; MAX exo-suit cooldown is now five minutes again
This commit is contained in:
parent
d6397d54a1
commit
bd82d332fa
42 changed files with 3166 additions and 1819 deletions
|
|
@ -389,7 +389,10 @@ class AvatarTest extends Specification {
|
|||
|
||||
"the fifth slot is the locker wrapped in an EquipmentSlot" in {
|
||||
val (_, avatar) = CreatePlayer()
|
||||
avatar.FifthSlot.Equipment.contains(avatar.Locker)
|
||||
avatar.FifthSlot.Equipment match {
|
||||
case Some(slot : LockerEquipment) => slot.Inventory mustEqual avatar.Locker.Inventory
|
||||
case _ => ko
|
||||
}
|
||||
}
|
||||
|
||||
"toString" in {
|
||||
|
|
|
|||
|
|
@ -631,7 +631,7 @@ class ConverterTest extends Specification {
|
|||
|
||||
"LockerContainer" should {
|
||||
"convert to packet (empty)" in {
|
||||
val obj = LockerContainer()
|
||||
val obj = new LockerEquipment(LockerContainer())
|
||||
obj.Definition.Packet.DetailedConstructorData(obj) match {
|
||||
case Success(pkt) =>
|
||||
pkt mustEqual DetailedLockerContainerData(CommonFieldData(PlanetSideEmpire.NEUTRAL, false, false, true, None, false, None, None, PlanetSideGUID(0)), None)
|
||||
|
|
@ -648,7 +648,7 @@ class ConverterTest extends Specification {
|
|||
|
||||
"convert to packet (occupied)" in {
|
||||
import GlobalDefinitions._
|
||||
val obj = LockerContainer()
|
||||
val obj = new LockerEquipment(LockerContainer())
|
||||
val rek = SimpleItem(remote_electronics_kit)
|
||||
rek.GUID = PlanetSideGUID(1)
|
||||
obj.Inventory += 0 -> rek
|
||||
|
|
|
|||
|
|
@ -525,4 +525,136 @@ class InventoryTest extends Specification {
|
|||
ok
|
||||
}
|
||||
}
|
||||
|
||||
"InventoryEquiupmentSlot" should {
|
||||
"insert, collide, insert" in {
|
||||
val obj : GridInventory = GridInventory(7, 7)
|
||||
obj.Slot(16).Equipment = bullet9mmBox1
|
||||
//confirm all squares
|
||||
obj.Slot( 8).Equipment.nonEmpty mustEqual false
|
||||
obj.Slot( 9).Equipment.nonEmpty mustEqual false
|
||||
obj.Slot( 10).Equipment.nonEmpty mustEqual false
|
||||
obj.Slot( 11).Equipment.nonEmpty mustEqual false
|
||||
obj.Slot( 12).Equipment.nonEmpty mustEqual false
|
||||
//
|
||||
obj.Slot(15).Equipment.nonEmpty mustEqual false
|
||||
obj.Slot(16).Equipment.nonEmpty mustEqual true
|
||||
obj.Slot(17).Equipment.nonEmpty mustEqual true
|
||||
obj.Slot(18).Equipment.nonEmpty mustEqual true
|
||||
obj.Slot(19).Equipment.nonEmpty mustEqual false
|
||||
//
|
||||
obj.Slot(22).Equipment.nonEmpty mustEqual false
|
||||
obj.Slot(23).Equipment.nonEmpty mustEqual true
|
||||
obj.Slot(24).Equipment.nonEmpty mustEqual true
|
||||
obj.Slot(25).Equipment.nonEmpty mustEqual true
|
||||
obj.Slot(26).Equipment.nonEmpty mustEqual false
|
||||
//
|
||||
obj.Slot(29).Equipment.nonEmpty mustEqual false
|
||||
obj.Slot(30).Equipment.nonEmpty mustEqual true
|
||||
obj.Slot(31).Equipment.nonEmpty mustEqual true
|
||||
obj.Slot(32).Equipment.nonEmpty mustEqual true
|
||||
obj.Slot(33).Equipment.nonEmpty mustEqual false
|
||||
//
|
||||
obj.Slot(36).Equipment.nonEmpty mustEqual false
|
||||
obj.Slot(37).Equipment.nonEmpty mustEqual false
|
||||
obj.Slot(38).Equipment.nonEmpty mustEqual false
|
||||
obj.Slot(39).Equipment.nonEmpty mustEqual false
|
||||
obj.Slot(40).Equipment.nonEmpty mustEqual false
|
||||
//
|
||||
//remove
|
||||
obj.Slot(16).Equipment = None
|
||||
obj.Slot( 8).Equipment.nonEmpty mustEqual false
|
||||
obj.Slot( 9).Equipment.nonEmpty mustEqual false
|
||||
obj.Slot( 10).Equipment.nonEmpty mustEqual false
|
||||
obj.Slot( 11).Equipment.nonEmpty mustEqual false
|
||||
obj.Slot( 12).Equipment.nonEmpty mustEqual false
|
||||
//
|
||||
obj.Slot(15).Equipment.nonEmpty mustEqual false
|
||||
obj.Slot(16).Equipment.nonEmpty mustEqual false
|
||||
obj.Slot(17).Equipment.nonEmpty mustEqual false
|
||||
obj.Slot(18).Equipment.nonEmpty mustEqual false
|
||||
obj.Slot(19).Equipment.nonEmpty mustEqual false
|
||||
//
|
||||
obj.Slot(22).Equipment.nonEmpty mustEqual false
|
||||
obj.Slot(23).Equipment.nonEmpty mustEqual false
|
||||
obj.Slot(24).Equipment.nonEmpty mustEqual false
|
||||
obj.Slot(25).Equipment.nonEmpty mustEqual false
|
||||
obj.Slot(26).Equipment.nonEmpty mustEqual false
|
||||
//
|
||||
obj.Slot(29).Equipment.nonEmpty mustEqual false
|
||||
obj.Slot(30).Equipment.nonEmpty mustEqual false
|
||||
obj.Slot(31).Equipment.nonEmpty mustEqual false
|
||||
obj.Slot(32).Equipment.nonEmpty mustEqual false
|
||||
obj.Slot(33).Equipment.nonEmpty mustEqual false
|
||||
//
|
||||
obj.Slot(36).Equipment.nonEmpty mustEqual false
|
||||
obj.Slot(37).Equipment.nonEmpty mustEqual false
|
||||
obj.Slot(38).Equipment.nonEmpty mustEqual false
|
||||
obj.Slot(39).Equipment.nonEmpty mustEqual false
|
||||
obj.Slot(40).Equipment.nonEmpty mustEqual false
|
||||
//insert again
|
||||
obj.Slot(16).Equipment = bullet9mmBox2
|
||||
obj.Slot( 8).Equipment.nonEmpty mustEqual false
|
||||
obj.Slot( 9).Equipment.nonEmpty mustEqual false
|
||||
obj.Slot( 10).Equipment.nonEmpty mustEqual false
|
||||
obj.Slot( 11).Equipment.nonEmpty mustEqual false
|
||||
obj.Slot( 12).Equipment.nonEmpty mustEqual false
|
||||
//
|
||||
obj.Slot(15).Equipment.nonEmpty mustEqual false
|
||||
obj.Slot(16).Equipment.nonEmpty mustEqual true
|
||||
obj.Slot(17).Equipment.nonEmpty mustEqual true
|
||||
obj.Slot(18).Equipment.nonEmpty mustEqual true
|
||||
obj.Slot(19).Equipment.nonEmpty mustEqual false
|
||||
//
|
||||
obj.Slot(22).Equipment.nonEmpty mustEqual false
|
||||
obj.Slot(23).Equipment.nonEmpty mustEqual true
|
||||
obj.Slot(24).Equipment.nonEmpty mustEqual true
|
||||
obj.Slot(25).Equipment.nonEmpty mustEqual true
|
||||
obj.Slot(26).Equipment.nonEmpty mustEqual false
|
||||
//
|
||||
obj.Slot(29).Equipment.nonEmpty mustEqual false
|
||||
obj.Slot(30).Equipment.nonEmpty mustEqual true
|
||||
obj.Slot(31).Equipment.nonEmpty mustEqual true
|
||||
obj.Slot(32).Equipment.nonEmpty mustEqual true
|
||||
obj.Slot(33).Equipment.nonEmpty mustEqual false
|
||||
//
|
||||
obj.Slot(36).Equipment.nonEmpty mustEqual false
|
||||
obj.Slot(37).Equipment.nonEmpty mustEqual false
|
||||
obj.Slot(38).Equipment.nonEmpty mustEqual false
|
||||
obj.Slot(39).Equipment.nonEmpty mustEqual false
|
||||
obj.Slot(40).Equipment.nonEmpty mustEqual false
|
||||
//
|
||||
//remove
|
||||
obj.Slot(16).Equipment = None
|
||||
obj.Slot( 8).Equipment.nonEmpty mustEqual false
|
||||
obj.Slot( 9).Equipment.nonEmpty mustEqual false
|
||||
obj.Slot( 10).Equipment.nonEmpty mustEqual false
|
||||
obj.Slot( 11).Equipment.nonEmpty mustEqual false
|
||||
obj.Slot( 12).Equipment.nonEmpty mustEqual false
|
||||
//
|
||||
obj.Slot(15).Equipment.nonEmpty mustEqual false
|
||||
obj.Slot(16).Equipment.nonEmpty mustEqual false
|
||||
obj.Slot(17).Equipment.nonEmpty mustEqual false
|
||||
obj.Slot(18).Equipment.nonEmpty mustEqual false
|
||||
obj.Slot(19).Equipment.nonEmpty mustEqual false
|
||||
//
|
||||
obj.Slot(22).Equipment.nonEmpty mustEqual false
|
||||
obj.Slot(23).Equipment.nonEmpty mustEqual false
|
||||
obj.Slot(24).Equipment.nonEmpty mustEqual false
|
||||
obj.Slot(25).Equipment.nonEmpty mustEqual false
|
||||
obj.Slot(26).Equipment.nonEmpty mustEqual false
|
||||
//
|
||||
obj.Slot(29).Equipment.nonEmpty mustEqual false
|
||||
obj.Slot(30).Equipment.nonEmpty mustEqual false
|
||||
obj.Slot(31).Equipment.nonEmpty mustEqual false
|
||||
obj.Slot(32).Equipment.nonEmpty mustEqual false
|
||||
obj.Slot(33).Equipment.nonEmpty mustEqual false
|
||||
//
|
||||
obj.Slot(36).Equipment.nonEmpty mustEqual false
|
||||
obj.Slot(37).Equipment.nonEmpty mustEqual false
|
||||
obj.Slot(38).Equipment.nonEmpty mustEqual false
|
||||
obj.Slot(39).Equipment.nonEmpty mustEqual false
|
||||
obj.Slot(40).Equipment.nonEmpty mustEqual false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -32,10 +32,12 @@ class PlayerControlHealTest extends ActorTest {
|
|||
player1.Zone = zone
|
||||
player1.Spawn
|
||||
player1.Position = Vector3(2, 0, 0)
|
||||
guid.register(player1.Locker, 5)
|
||||
player1.Actor = system.actorOf(Props(classOf[PlayerControl], player1), "player1-control")
|
||||
val player2 = Player(Avatar("TestCharacter2", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute)) //guid=2
|
||||
player2.Zone = zone
|
||||
player2.Spawn
|
||||
guid.register(player2.Locker, 6)
|
||||
player2.Actor = system.actorOf(Props(classOf[PlayerControl], player2), "player2-control")
|
||||
|
||||
val tool = Tool(GlobalDefinitions.medicalapplicator) //guid=3 & 4
|
||||
|
|
@ -102,6 +104,7 @@ class PlayerControlHealSelfTest extends ActorTest {
|
|||
player1.Zone = zone
|
||||
player1.Spawn
|
||||
player1.Position = Vector3(2, 0, 0)
|
||||
guid.register(player1.Locker, 5)
|
||||
player1.Actor = system.actorOf(Props(classOf[PlayerControl], player1), "player1-control")
|
||||
|
||||
val tool = Tool(GlobalDefinitions.medicalapplicator) //guid=3 & 4
|
||||
|
|
@ -167,10 +170,12 @@ class PlayerControlRepairTest extends ActorTest {
|
|||
player1.Zone = zone
|
||||
player1.Spawn
|
||||
player1.Position = Vector3(2, 0, 0)
|
||||
guid.register(player1.Locker, 5)
|
||||
player1.Actor = system.actorOf(Props(classOf[PlayerControl], player1), "player1-control")
|
||||
val player2 = Player(Avatar("TestCharacter2", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Mute)) //guid=2
|
||||
player2.Zone = zone
|
||||
player2.Spawn
|
||||
guid.register(player2.Locker, 6)
|
||||
player2.Actor = system.actorOf(Props(classOf[PlayerControl], player2), "player2-control")
|
||||
|
||||
val tool = Tool(GlobalDefinitions.bank) //guid=3 & 4
|
||||
|
|
@ -243,6 +248,7 @@ class PlayerControlRepairSelfTest extends ActorTest {
|
|||
player1.Zone = zone
|
||||
player1.Spawn
|
||||
player1.Position = Vector3(2, 0, 0)
|
||||
guid.register(player1.Locker, 5)
|
||||
player1.Actor = system.actorOf(Props(classOf[PlayerControl], player1), "player1-control")
|
||||
|
||||
val tool = Tool(GlobalDefinitions.bank) //guid=3 & 4
|
||||
|
|
@ -309,10 +315,12 @@ class PlayerControlDamageTest extends ActorTest {
|
|||
player1.Zone = zone
|
||||
player1.Spawn
|
||||
player1.Position = Vector3(2, 0, 0)
|
||||
guid.register(player1.Locker, 5)
|
||||
player1.Actor = system.actorOf(Props(classOf[PlayerControl], player1), "player1-control")
|
||||
val player2 = Player(Avatar("TestCharacter2", PlanetSideEmpire.NC, CharacterGender.Male, 0, CharacterVoice.Mute)) //guid=2
|
||||
player2.Zone = zone
|
||||
player2.Spawn
|
||||
guid.register(player2.Locker, 6)
|
||||
player2.Actor = system.actorOf(Props(classOf[PlayerControl], player2), "player2-control")
|
||||
val tool = Tool(GlobalDefinitions.suppressor) //guid 3 & 4
|
||||
val projectile = tool.Projectile
|
||||
|
|
@ -385,10 +393,12 @@ class PlayerControlDeathStandingTest extends ActorTest {
|
|||
player1.Zone = zone
|
||||
player1.Spawn
|
||||
player1.Position = Vector3(2,0,0)
|
||||
guid.register(player1.Locker, 5)
|
||||
player1.Actor = system.actorOf(Props(classOf[PlayerControl], player1), "player1-control")
|
||||
val player2 = Player(Avatar("TestCharacter2", PlanetSideEmpire.NC, CharacterGender.Male, 0, CharacterVoice.Mute)) //guid=2
|
||||
player2.Zone = zone
|
||||
player2.Spawn
|
||||
guid.register(player2.Locker, 6)
|
||||
player2.Actor = system.actorOf(Props(classOf[PlayerControl], player2), "player2-control")
|
||||
|
||||
val tool = Tool(GlobalDefinitions.suppressor) //guid 3 & 4
|
||||
|
|
@ -430,7 +440,7 @@ class PlayerControlDeathStandingTest extends ActorTest {
|
|||
)
|
||||
assert(
|
||||
msg_avatar(1) match {
|
||||
case AvatarServiceMessage("TestCharacter2", AvatarAction.Killed(PlanetSideGUID(2))) => true
|
||||
case AvatarServiceMessage("TestCharacter2", AvatarAction.Killed(PlanetSideGUID(2), None)) => true
|
||||
case _ => false
|
||||
}
|
||||
)
|
||||
|
|
@ -493,10 +503,12 @@ class PlayerControlDeathSeatedTest extends ActorTest {
|
|||
player1.Zone = zone
|
||||
player1.Spawn
|
||||
player1.Position = Vector3(2,0,0)
|
||||
guid.register(player1.Locker, 6)
|
||||
player1.Actor = system.actorOf(Props(classOf[PlayerControl], player1), "player1-control")
|
||||
val player2 = Player(Avatar("TestCharacter2", PlanetSideEmpire.NC, CharacterGender.Male, 0, CharacterVoice.Mute)) //guid=2
|
||||
player2.Zone = zone
|
||||
player2.Spawn
|
||||
guid.register(player2.Locker, 7)
|
||||
player2.Actor = system.actorOf(Props(classOf[PlayerControl], player2), "player2-control")
|
||||
|
||||
val vehicle = Vehicle(GlobalDefinitions.quadstealth) //guid=5
|
||||
|
|
@ -534,7 +546,7 @@ class PlayerControlDeathSeatedTest extends ActorTest {
|
|||
activityProbe.expectNoMessage(200 milliseconds)
|
||||
assert(
|
||||
msg_avatar.head match {
|
||||
case AvatarServiceMessage("TestCharacter2", AvatarAction.Killed(PlanetSideGUID(2))) => true
|
||||
case AvatarServiceMessage("TestCharacter2", AvatarAction.Killed(PlanetSideGUID(2), Some(PlanetSideGUID(5)))) => true
|
||||
case _ => false
|
||||
}
|
||||
)
|
||||
|
|
@ -595,5 +607,4 @@ class PlayerControlDeathSeatedTest extends ActorTest {
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
object PlayerControlTest { }
|
||||
|
|
|
|||
|
|
@ -279,7 +279,7 @@ class PlayerTest extends Specification {
|
|||
|
||||
"can access the player's locker-space" in {
|
||||
val obj = TestPlayer("Chord", PlanetSideEmpire.TR, CharacterGender.Male, 0, CharacterVoice.Voice5)
|
||||
obj.Slot(5).Equipment.get.isInstanceOf[LockerContainer] mustEqual true
|
||||
obj.Slot(5).Equipment.get.isInstanceOf[LockerEquipment] mustEqual true
|
||||
}
|
||||
|
||||
"can find equipment" in {
|
||||
|
|
|
|||
|
|
@ -18,7 +18,7 @@ class GUIDTaskRegisterAvatarTest extends ActorTest {
|
|||
obj.Slot(6).Equipment = obj_inv_ammo
|
||||
val obj_locker = obj.Slot(5).Equipment.get
|
||||
val obj_locker_ammo = AmmoBox(GlobalDefinitions.energy_cell)
|
||||
obj_locker.asInstanceOf[LockerContainer].Inventory += 0 -> obj_locker_ammo
|
||||
obj_locker.asInstanceOf[LockerEquipment].Inventory += 0 -> obj_locker_ammo
|
||||
|
||||
assert(!obj.HasGUID)
|
||||
assert(!obj_wep.HasGUID)
|
||||
|
|
|
|||
|
|
@ -18,7 +18,7 @@ class GUIDTaskRegisterPlayerTest extends ActorTest {
|
|||
obj.Slot(6).Equipment = obj_inv_ammo
|
||||
val obj_locker = obj.Slot(5).Equipment.get
|
||||
val obj_locker_ammo = AmmoBox(GlobalDefinitions.energy_cell)
|
||||
obj_locker.asInstanceOf[LockerContainer].Inventory += 0 -> obj_locker_ammo
|
||||
obj_locker.asInstanceOf[LockerEquipment].Inventory += 0 -> obj_locker_ammo
|
||||
|
||||
assert(!obj.HasGUID)
|
||||
assert(!obj_wep.HasGUID)
|
||||
|
|
|
|||
|
|
@ -18,7 +18,7 @@ class GUIDTaskUnregisterAvatarTest extends ActorTest {
|
|||
obj.Slot(6).Equipment = obj_inv_ammo
|
||||
val obj_locker = obj.Slot(5).Equipment.get
|
||||
val obj_locker_ammo = AmmoBox(GlobalDefinitions.energy_cell)
|
||||
obj_locker.asInstanceOf[LockerContainer].Inventory += 0 -> obj_locker_ammo
|
||||
obj_locker.asInstanceOf[LockerEquipment].Inventory += 0 -> obj_locker_ammo
|
||||
guid.register(obj, "dynamic")
|
||||
guid.register(obj_wep, "dynamic")
|
||||
guid.register(obj_wep_ammo, "dynamic")
|
||||
|
|
|
|||
|
|
@ -18,7 +18,7 @@ class GUIDTaskUnregisterPlayerTest extends ActorTest {
|
|||
obj.Slot(6).Equipment = obj_inv_ammo
|
||||
val obj_locker = obj.Slot(5).Equipment.get
|
||||
val obj_locker_ammo = AmmoBox(GlobalDefinitions.energy_cell)
|
||||
obj_locker.asInstanceOf[LockerContainer].Inventory += 0 -> obj_locker_ammo
|
||||
obj_locker.asInstanceOf[LockerEquipment].Inventory += 0 -> obj_locker_ammo
|
||||
guid.register(obj, "dynamic")
|
||||
guid.register(obj_wep, "dynamic")
|
||||
guid.register(obj_wep_ammo, "dynamic")
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue