mirror of
https://github.com/psforever/PSF-LoginServer.git
synced 2026-07-16 00:44:46 +00:00
when changing exo-suits, complain if equipment has to be deleted; dropped equipment is limited to special equipment; report a player pointlessly
This commit is contained in:
parent
8f98f67aef
commit
00e985516a
7 changed files with 43 additions and 9 deletions
|
|
@ -3,6 +3,7 @@ package net.psforever.actors.session.normal
|
||||||
|
|
||||||
import akka.actor.{ActorContext, typed}
|
import akka.actor.{ActorContext, typed}
|
||||||
import net.psforever.actors.session.support.AvatarHandlerFunctions
|
import net.psforever.actors.session.support.AvatarHandlerFunctions
|
||||||
|
import net.psforever.objects.serverobject.containable.ContainableBehavior
|
||||||
import net.psforever.packet.game.{AvatarImplantMessage, CreateShortcutMessage, ImplantAction}
|
import net.psforever.packet.game.{AvatarImplantMessage, CreateShortcutMessage, ImplantAction}
|
||||||
import net.psforever.types.ImplantType
|
import net.psforever.types.ImplantType
|
||||||
|
|
||||||
|
|
@ -295,6 +296,17 @@ class AvatarHandlerLogic(val ops: SessionAvatarHandlers, implicit val context: A
|
||||||
case (_, dguid) => sendResponse(ObjectDeleteMessage(dguid, unk1=0))
|
case (_, dguid) => sendResponse(ObjectDeleteMessage(dguid, unk1=0))
|
||||||
}
|
}
|
||||||
//functionally delete
|
//functionally delete
|
||||||
|
if (delete.size > 1 || delete.nonEmpty && !delete.exists {
|
||||||
|
case (e: Tool, _) => GlobalDefinitions.isMaxArms(e.Definition)
|
||||||
|
case _ => false
|
||||||
|
}) {
|
||||||
|
/*
|
||||||
|
if going x -> max, you will have enough space in max inventory for any displaced holster equipment
|
||||||
|
for max -> max, don't care about the max weapon arm being deleted (allow for 1)
|
||||||
|
for any other x -> x, any deleted equipment will raise this comment
|
||||||
|
*/
|
||||||
|
sendResponse(ChatMsg(ChatMessageType.UNK_227, "@ItemsDeconstructed"))
|
||||||
|
}
|
||||||
delete.foreach { case (obj, _) => TaskWorkflow.execute(GUIDTask.unregisterEquipment(continent.GUID, obj)) }
|
delete.foreach { case (obj, _) => TaskWorkflow.execute(GUIDTask.unregisterEquipment(continent.GUID, obj)) }
|
||||||
//redraw
|
//redraw
|
||||||
if (maxhand) {
|
if (maxhand) {
|
||||||
|
|
@ -330,13 +342,17 @@ class AvatarHandlerLogic(val ops: SessionAvatarHandlers, implicit val context: A
|
||||||
}
|
}
|
||||||
DropLeftovers(player)(drop)
|
DropLeftovers(player)(drop)
|
||||||
|
|
||||||
case AvatarResponse.ChangeExosuit(target, armor, exosuit, subtype, slot, _, oldHolsters, holsters, _, _, _, delete) =>
|
case AvatarResponse.ChangeExosuit(target, armor, exosuit, subtype, slot, _, oldHolsters, holsters, _, _, drop, delete) =>
|
||||||
sendResponse(ArmorChangedMessage(target, exosuit, subtype))
|
sendResponse(ArmorChangedMessage(target, exosuit, subtype))
|
||||||
sendResponse(PlanetsideAttributeMessage(target, attribute_type=4, armor))
|
sendResponse(PlanetsideAttributeMessage(target, attribute_type=4, armor))
|
||||||
//happening to some other player
|
//happening to some other player
|
||||||
sendResponse(ObjectHeldMessage(target, slot, unk1 = false))
|
sendResponse(ObjectHeldMessage(target, slot, unk1 = false))
|
||||||
//cleanup
|
//cleanup
|
||||||
(oldHolsters ++ delete).foreach { case (_, guid) => sendResponse(ObjectDeleteMessage(guid, unk1=0)) }
|
val dropPred = ContainableBehavior.DropPredicate(player)
|
||||||
|
val deleteFromDrop = drop.filterNot(dropPred)
|
||||||
|
(oldHolsters ++ delete ++ deleteFromDrop.map(f =>(f.obj, f.GUID)))
|
||||||
|
.distinctBy(_._2)
|
||||||
|
.foreach { case (_, guid) => sendResponse(ObjectDeleteMessage(guid, unk1=0)) }
|
||||||
//draw holsters
|
//draw holsters
|
||||||
holsters.foreach {
|
holsters.foreach {
|
||||||
case InventoryItem(obj, index) =>
|
case InventoryItem(obj, index) =>
|
||||||
|
|
|
||||||
|
|
@ -145,8 +145,11 @@ class ChatLogic(val ops: ChatOperations, implicit val context: ActorContext) ext
|
||||||
case (CMT_KICK, _, contents) if gmCommandAllowed =>
|
case (CMT_KICK, _, contents) if gmCommandAllowed =>
|
||||||
ops.commandKick(session, message, contents)
|
ops.commandKick(session, message, contents)
|
||||||
|
|
||||||
|
case (CMT_REPORTUSER, _, contents) =>
|
||||||
|
ops.commandReportUser(session, message, contents)
|
||||||
|
|
||||||
case _ =>
|
case _ =>
|
||||||
log.warn(s"Unhandled chat message $message")
|
sendResponse(ChatMsg(ChatMessageType.UNK_227, "@no_permission"))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -120,8 +120,9 @@ class GeneralLogic(val ops: GeneralOperations, implicit val context: ActorContex
|
||||||
ops.fallHeightTracker(pos.z)
|
ops.fallHeightTracker(pos.z)
|
||||||
if (isCrouching && !player.Crouching) {
|
if (isCrouching && !player.Crouching) {
|
||||||
//dev stuff goes here
|
//dev stuff goes here
|
||||||
sendResponse(ChatMsg(ChatMessageType.UNK_229, "@PadDeconstruct_secsA^23~"))
|
sendResponse(ChatMsg(ChatMessageType.UNK_227, "@NoMount_Permission"))
|
||||||
sendResponse(ChatMsg(ChatMessageType.UNK_227, "@InventoryPickupNoRoom"))
|
//sendResponse(ChatMsg(ChatMessageType.UNK_227, "@ArmorShieldOff"))
|
||||||
|
//sendResponse(ChatMsg(ChatMessageType.UNK_227, "@ArmorShieldOverride"))
|
||||||
}
|
}
|
||||||
player.Position = pos
|
player.Position = pos
|
||||||
player.Velocity = vel
|
player.Velocity = vel
|
||||||
|
|
|
||||||
|
|
@ -85,7 +85,11 @@ class ChatLogic(val ops: ChatOperations, implicit val context: ActorContext) ext
|
||||||
case (CMT_WARP, _, contents) =>
|
case (CMT_WARP, _, contents) =>
|
||||||
ops.commandWarp(session, message, contents)
|
ops.commandWarp(session, message, contents)
|
||||||
|
|
||||||
case _ => ()
|
case (CMT_REPORTUSER, _, contents) =>
|
||||||
|
ops.commandReportUser(session, message, contents)
|
||||||
|
|
||||||
|
case _ =>
|
||||||
|
sendResponse(ChatMsg(ChatMessageType.UNK_227, "@no_permission"))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -649,6 +649,11 @@ class ChatOperations(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
def commandReportUser(@unused session: Session, @unused message: ChatMsg, @unused contents: String): Unit = {
|
||||||
|
//todo get user from contents
|
||||||
|
sendResponse(ChatMsg(ChatMessageType.UNK_227, "@rpt_i"))
|
||||||
|
}
|
||||||
|
|
||||||
def commandIncomingSendAllIfOnline(session: Session, message: ChatMsg): Unit = {
|
def commandIncomingSendAllIfOnline(session: Session, message: ChatMsg): Unit = {
|
||||||
if (AvatarActor.onlineIfNotIgnored(session.avatar, message.recipient)) {
|
if (AvatarActor.onlineIfNotIgnored(session.avatar, message.recipient)) {
|
||||||
sendResponse(message)
|
sendResponse(message)
|
||||||
|
|
|
||||||
|
|
@ -637,6 +637,7 @@ class PlayerControl(player: Player, avatarActor: typed.ActorRef[AvatarActor.Comm
|
||||||
if (player.DrawnSlot != Player.HandsDownSlot) {
|
if (player.DrawnSlot != Player.HandsDownSlot) {
|
||||||
player.DrawnSlot = Player.HandsDownSlot
|
player.DrawnSlot = Player.HandsDownSlot
|
||||||
}
|
}
|
||||||
|
val dropPred = ContainableBehavior.DropPredicate(player)
|
||||||
val (toDelete, toDrop, afterHolsters, afterInventory) = if (originalSuit == ExoSuitType.MAX) {
|
val (toDelete, toDrop, afterHolsters, afterInventory) = if (originalSuit == ExoSuitType.MAX) {
|
||||||
//was max
|
//was max
|
||||||
val (delete, insert) = beforeHolsters.partition(elem => elem.obj.Size == EquipmentSize.Max)
|
val (delete, insert) = beforeHolsters.partition(elem => elem.obj.Size == EquipmentSize.Max)
|
||||||
|
|
@ -647,18 +648,21 @@ class PlayerControl(player: Player, avatarActor: typed.ActorRef[AvatarActor.Comm
|
||||||
//changing to a vanilla exo-suit
|
//changing to a vanilla exo-suit
|
||||||
val (newHolsters, unplacedHolsters) = Players.fillEmptyHolsters(player.Holsters().iterator, insert ++ beforeInventory)
|
val (newHolsters, unplacedHolsters) = Players.fillEmptyHolsters(player.Holsters().iterator, insert ++ beforeInventory)
|
||||||
val (inventory, unplacedInventory) = GridInventory.recoverInventory(unplacedHolsters, player.Inventory)
|
val (inventory, unplacedInventory) = GridInventory.recoverInventory(unplacedHolsters, player.Inventory)
|
||||||
(delete, unplacedInventory.map(InventoryItem(_, -1)), newHolsters, inventory)
|
val (dropFromUnplaced, deleteFromUnplaced) = unplacedInventory.map(InventoryItem(_, -1)).partition(dropPred)
|
||||||
|
(delete ++ deleteFromUnplaced, dropFromUnplaced, newHolsters, inventory)
|
||||||
}
|
}
|
||||||
} else if (willBecomeMax) {
|
} else if (willBecomeMax) {
|
||||||
//will be max, drop everything but melee slot
|
//will be max, drop everything but melee slot
|
||||||
val (melee, other) = beforeHolsters.partition(elem => elem.obj.Size == EquipmentSize.Melee)
|
val (melee, other) = beforeHolsters.partition(elem => elem.obj.Size == EquipmentSize.Melee)
|
||||||
val (inventory, unplacedInventory) = GridInventory.recoverInventory(beforeInventory ++ other, player.Inventory)
|
val (inventory, unplacedInventory) = GridInventory.recoverInventory(beforeInventory ++ other, player.Inventory)
|
||||||
(Nil, unplacedInventory.map(InventoryItem(_, -1)), melee, inventory)
|
val (dropFromUnplaced, deleteFromUnplaced) = unplacedInventory.map(InventoryItem(_, -1)).partition(dropPred)
|
||||||
|
(deleteFromUnplaced, dropFromUnplaced, melee, inventory)
|
||||||
} else {
|
} else {
|
||||||
//was not a max nor will become a max; vanilla exo-suit to a vanilla-exo-suit
|
//was not a max nor will become a max; vanilla exo-suit to a vanilla-exo-suit
|
||||||
val (insert, unplacedHolsters) = Players.fillEmptyHolsters(player.Holsters().iterator, beforeHolsters ++ beforeInventory)
|
val (insert, unplacedHolsters) = Players.fillEmptyHolsters(player.Holsters().iterator, beforeHolsters ++ beforeInventory)
|
||||||
val (inventory, unplacedInventory) = GridInventory.recoverInventory(unplacedHolsters, player.Inventory)
|
val (inventory, unplacedInventory) = GridInventory.recoverInventory(unplacedHolsters, player.Inventory)
|
||||||
(Nil, unplacedInventory.map(InventoryItem(_, -1)), insert, inventory)
|
val (dropFromUnplaced, deleteFromUnplaced) = unplacedInventory.map(InventoryItem(_, -1)).partition(dropPred)
|
||||||
|
(deleteFromUnplaced, dropFromUnplaced, insert, inventory)
|
||||||
}
|
}
|
||||||
//insert
|
//insert
|
||||||
afterHolsters.foreach(elem => player.Slot(elem.start).Equipment = elem.obj)
|
afterHolsters.foreach(elem => player.Slot(elem.start).Equipment = elem.obj)
|
||||||
|
|
|
||||||
|
|
@ -676,6 +676,7 @@ object ContainableBehavior {
|
||||||
entry => {
|
entry => {
|
||||||
val objDef = entry.obj.Definition
|
val objDef = entry.obj.Definition
|
||||||
val faction = GlobalDefinitions.isFactionEquipment(objDef)
|
val faction = GlobalDefinitions.isFactionEquipment(objDef)
|
||||||
|
GlobalDefinitions.isCavernEquipment(objDef) ||
|
||||||
objDef == GlobalDefinitions.router_telepad ||
|
objDef == GlobalDefinitions.router_telepad ||
|
||||||
entry.obj.isInstanceOf[BoomerTrigger] ||
|
entry.obj.isInstanceOf[BoomerTrigger] ||
|
||||||
(faction != tplayer.Faction && faction != PlanetSideEmpire.NEUTRAL)
|
(faction != tplayer.Faction && faction != PlanetSideEmpire.NEUTRAL)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue