From d46110874e2b6df879c5b700e9e28d4ca2ef2e76 Mon Sep 17 00:00:00 2001 From: Fate-JH Date: Sun, 23 Aug 2020 22:36:20 -0400 Subject: [PATCH] Implied Swap Item (#530) * by deleting a swap item for the entirety of a zone, avert the end of the world * drop the item you are holding when you die --- .../net/psforever/actors/session/SessionActor.scala | 6 ++++++ .../scala/net/psforever/objects/LockerContainer.scala | 2 +- .../net/psforever/objects/avatar/CorpseControl.scala | 2 +- .../net/psforever/objects/avatar/PlayerControl.scala | 7 ++++--- .../serverobject/containable/ContainableBehavior.scala | 9 +++++---- .../net/psforever/objects/vehicles/VehicleControl.scala | 7 ++++--- 6 files changed, 21 insertions(+), 12 deletions(-) diff --git a/common/src/main/scala/net/psforever/actors/session/SessionActor.scala b/common/src/main/scala/net/psforever/actors/session/SessionActor.scala index e6560be7..0b9b7548 100644 --- a/common/src/main/scala/net/psforever/actors/session/SessionActor.scala +++ b/common/src/main/scala/net/psforever/actors/session/SessionActor.scala @@ -1892,6 +1892,12 @@ class SessionActor extends Actor with MDCContextAware { case AvatarResponse.Killed(mount) => val respawnTimer = 300.seconds + //drop free hand item + player.FreeHand.Equipment match { + case Some(item) => + DropEquipmentFromInventory(player)(item) + case None => ; + } ToggleMaxSpecialState(enable = false) keepAliveFunc = NormalKeepAlive zoningStatus = Zoning.Status.None diff --git a/common/src/main/scala/net/psforever/objects/LockerContainer.scala b/common/src/main/scala/net/psforever/objects/LockerContainer.scala index 1323f675..529cf97e 100644 --- a/common/src/main/scala/net/psforever/objects/LockerContainer.scala +++ b/common/src/main/scala/net/psforever/objects/LockerContainer.scala @@ -112,7 +112,7 @@ class LockerContainerControl(locker: LockerContainer, toChannel: String) extends ) } - def SwapItemCallback(item: Equipment): Unit = { + def SwapItemCallback(item: Equipment, fromSlot: Int): Unit = { val zone = locker.Zone zone.AvatarEvents ! AvatarServiceMessage( toChannel, diff --git a/common/src/main/scala/net/psforever/objects/avatar/CorpseControl.scala b/common/src/main/scala/net/psforever/objects/avatar/CorpseControl.scala index 48d76103..ec6d897e 100644 --- a/common/src/main/scala/net/psforever/objects/avatar/CorpseControl.scala +++ b/common/src/main/scala/net/psforever/objects/avatar/CorpseControl.scala @@ -62,7 +62,7 @@ class CorpseControl(player: Player) extends Actor with ContainableBehavior { ) } - def SwapItemCallback(item: Equipment): Unit = { + def SwapItemCallback(item: Equipment, fromSlot: Int): Unit = { val obj = ContainerObject val zone = obj.Zone zone.AvatarEvents ! AvatarServiceMessage( diff --git a/common/src/main/scala/net/psforever/objects/avatar/PlayerControl.scala b/common/src/main/scala/net/psforever/objects/avatar/PlayerControl.scala index d3ee44fd..b8d8da27 100644 --- a/common/src/main/scala/net/psforever/objects/avatar/PlayerControl.scala +++ b/common/src/main/scala/net/psforever/objects/avatar/PlayerControl.scala @@ -861,12 +861,13 @@ class PlayerControl(player: Player, avatarActor: typed.ActorRef[AvatarActor.Comm } } - def SwapItemCallback(item: Equipment): Unit = { + def SwapItemCallback(item: Equipment, fromSlot: Int): Unit = { val obj = ContainerObject val zone = obj.Zone + val toChannel = if (obj.VisibleSlots.contains(fromSlot)) zone.id else player.Name zone.AvatarEvents ! AvatarServiceMessage( - player.Name, - AvatarAction.SendResponse(Service.defaultPlayerGUID, ObjectDetachMessage(obj.GUID, item.GUID, Vector3.Zero, 0f)) + toChannel, + AvatarAction.ObjectDelete(Service.defaultPlayerGUID, item.GUID) ) } } diff --git a/common/src/main/scala/net/psforever/objects/serverobject/containable/ContainableBehavior.scala b/common/src/main/scala/net/psforever/objects/serverobject/containable/ContainableBehavior.scala index abe4bf95..bda1128c 100644 --- a/common/src/main/scala/net/psforever/objects/serverobject/containable/ContainableBehavior.scala +++ b/common/src/main/scala/net/psforever/objects/serverobject/containable/ContainableBehavior.scala @@ -213,7 +213,7 @@ trait ContainableBehavior { ContainableBehavior.TryPutItemInSlot(destination, item, dest) match { case (true, swapItem) => swapItem match { - case Some(thing) => SwapItemCallback(thing) + case Some(thing) => SwapItemCallback(thing, dest) case None => ; } PutItemInSlotCallback(item, dest) @@ -249,7 +249,7 @@ trait ContainableBehavior { ContainableBehavior.TryPutItemInSlotOrAway(destination, item, dest) match { case (Some(slot), swapItem) => swapItem match { - case Some(thing) => SwapItemCallback(thing) + case Some(thing) => SwapItemCallback(thing, slot) case None => ; } PutItemInSlotCallback(item, slot) @@ -330,8 +330,9 @@ trait ContainableBehavior { * Reaction to the existence of a swap item being produced from a container into the environment. * To be implemented. * @param item the item that was removed + * @param fromSlot the slot from where the item was removed (where it previous was) */ - def SwapItemCallback(item: Equipment): Unit + def SwapItemCallback(item: Equipment, fromSlot: Int): Unit } object ContainableBehavior { @@ -626,7 +627,7 @@ object Containable { /** * A response for the `RemoveItemFromSlot` message. * It serves the dual purpose of reporting a missing item (by not reporting any slot information) - * and reporting no item ata given position (by not reporting any item information). + * and reporting no item at a given position (by not reporting any item information). * @param obj the container * @param item the equipment that was removed * @param slot the index position from which any item was removed diff --git a/common/src/main/scala/net/psforever/objects/vehicles/VehicleControl.scala b/common/src/main/scala/net/psforever/objects/vehicles/VehicleControl.scala index d31a79bd..56b181e8 100644 --- a/common/src/main/scala/net/psforever/objects/vehicles/VehicleControl.scala +++ b/common/src/main/scala/net/psforever/objects/vehicles/VehicleControl.scala @@ -450,12 +450,13 @@ class VehicleControl(vehicle: Vehicle) } } - def SwapItemCallback(item: Equipment): Unit = { + def SwapItemCallback(item: Equipment, fromSlot: Int): Unit = { val obj = ContainerObject val zone = obj.Zone + val toChannel = if (obj.VisibleSlots.contains(fromSlot)) zone.id else self.toString zone.VehicleEvents ! VehicleServiceMessage( - self.toString, - VehicleAction.SendResponse(Service.defaultPlayerGUID, ObjectDetachMessage(obj.GUID, item.GUID, Vector3.Zero, 0f)) + toChannel, + VehicleAction.ObjectDelete(Service.defaultPlayerGUID, item.GUID) ) }