mirror of
https://github.com/psforever/PSF-LoginServer.git
synced 2026-07-16 08:55:18 +00:00
command detonater is no longer allowed; spectators now hold a laze pointer
This commit is contained in:
parent
e748f45c2f
commit
fedcb1caf9
8 changed files with 72 additions and 31 deletions
|
|
@ -23,7 +23,7 @@ add_property boomer_trigger equiptime 500
|
||||||
add_property chainblade equiptime 250
|
add_property chainblade equiptime 250
|
||||||
add_property chainblade holstertime 250
|
add_property chainblade holstertime 250
|
||||||
add_property colossus_flight requirement_award0 false
|
add_property colossus_flight requirement_award0 false
|
||||||
add_property command_detonater allowed true
|
add_property command_detonater allowed false
|
||||||
add_property command_detonater equiptime 500
|
add_property command_detonater equiptime 500
|
||||||
add_property command_detonater holstertime 500
|
add_property command_detonater holstertime 500
|
||||||
add_property cycler equiptime 600
|
add_property cycler equiptime 600
|
||||||
|
|
|
||||||
|
|
@ -10,10 +10,8 @@ import net.psforever.actors.zone.ZoneActor
|
||||||
import net.psforever.objects.Session
|
import net.psforever.objects.Session
|
||||||
import net.psforever.objects.avatar.ModePermissions
|
import net.psforever.objects.avatar.ModePermissions
|
||||||
import net.psforever.objects.avatar.scoring.{Assist, Death, EquipmentStat, KDAStat, Kill, Life, ScoreCard, SupportActivity}
|
import net.psforever.objects.avatar.scoring.{Assist, Death, EquipmentStat, KDAStat, Kill, Life, ScoreCard, SupportActivity}
|
||||||
import net.psforever.objects.serverobject.affinity.FactionAffinity
|
|
||||||
import net.psforever.objects.sourcing.{TurretSource, VehicleSource}
|
import net.psforever.objects.sourcing.{TurretSource, VehicleSource}
|
||||||
import net.psforever.objects.vital.{InGameHistory, ReconstructionActivity}
|
import net.psforever.objects.vital.ReconstructionActivity
|
||||||
import net.psforever.objects.vehicles.MountedWeapons
|
|
||||||
import net.psforever.types.{ChatMessageType, StatisticalCategory, StatisticalElement}
|
import net.psforever.types.{ChatMessageType, StatisticalCategory, StatisticalElement}
|
||||||
import org.joda.time.{LocalDateTime, Seconds}
|
import org.joda.time.{LocalDateTime, Seconds}
|
||||||
|
|
||||||
|
|
@ -44,7 +42,6 @@ import net.psforever.objects.inventory.{Container, InventoryItem}
|
||||||
import net.psforever.objects.loadouts.{InfantryLoadout, Loadout, VehicleLoadout}
|
import net.psforever.objects.loadouts.{InfantryLoadout, Loadout, VehicleLoadout}
|
||||||
import net.psforever.objects.locker.LockerContainer
|
import net.psforever.objects.locker.LockerContainer
|
||||||
import net.psforever.objects.sourcing.{PlayerSource,SourceWithHealthEntry}
|
import net.psforever.objects.sourcing.{PlayerSource,SourceWithHealthEntry}
|
||||||
import net.psforever.objects.vital.projectile.ProjectileReason
|
|
||||||
import net.psforever.objects.vital.{DamagingActivity, HealFromImplant, HealingActivity, SpawningActivity}
|
import net.psforever.objects.vital.{DamagingActivity, HealFromImplant, HealingActivity, SpawningActivity}
|
||||||
import net.psforever.packet.game.objectcreate.{BasicCharacterData, ObjectClass, RibbonBars}
|
import net.psforever.packet.game.objectcreate.{BasicCharacterData, ObjectClass, RibbonBars}
|
||||||
import net.psforever.packet.game.{Friend => GameFriend, _}
|
import net.psforever.packet.game.{Friend => GameFriend, _}
|
||||||
|
|
@ -3205,16 +3202,7 @@ class AvatarActor(
|
||||||
val zone = _session.zone
|
val zone = _session.zone
|
||||||
val player = _session.player
|
val player = _session.player
|
||||||
val playerSource = PlayerSource(player)
|
val playerSource = PlayerSource(player)
|
||||||
val historyTranscript = {
|
val historyTranscript = Players.produceContributionTranscriptFromKill(zone, player, killStat)
|
||||||
(killStat.info.interaction.cause match {
|
|
||||||
case pr: ProjectileReason => pr.projectile.mounted_in.flatMap { a => zone.GUID(a._1) } //what fired the projectile
|
|
||||||
case _ => None
|
|
||||||
}).collect {
|
|
||||||
case mount: PlanetSideGameObject with FactionAffinity with InGameHistory with MountedWeapons =>
|
|
||||||
player.ContributionFrom(mount)
|
|
||||||
}
|
|
||||||
player.HistoryAndContributions()
|
|
||||||
}
|
|
||||||
val target = killStat.info.targetAfter.asInstanceOf[PlayerSource]
|
val target = killStat.info.targetAfter.asInstanceOf[PlayerSource]
|
||||||
val targetMounted = target.seatedIn
|
val targetMounted = target.seatedIn
|
||||||
.collect {
|
.collect {
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,10 @@ package net.psforever.actors.session.spectator
|
||||||
|
|
||||||
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.actors.zone.ZoneActor
|
||||||
|
import net.psforever.objects.Players
|
||||||
|
import net.psforever.objects.avatar.scoring.Kill
|
||||||
|
import net.psforever.objects.sourcing.PlayerSource
|
||||||
import net.psforever.packet.game.{AvatarImplantMessage, ImplantAction}
|
import net.psforever.packet.game.{AvatarImplantMessage, ImplantAction}
|
||||||
|
|
||||||
import scala.concurrent.duration._
|
import scala.concurrent.duration._
|
||||||
|
|
@ -387,8 +391,13 @@ class AvatarHandlerLogic(val ops: SessionAvatarHandlers, implicit val context: A
|
||||||
sessionLogic.general.kitToBeUsed = None
|
sessionLogic.general.kitToBeUsed = None
|
||||||
sendResponse(ChatMsg(ChatMessageType.UNK_225, msg))
|
sendResponse(ChatMsg(ChatMessageType.UNK_225, msg))
|
||||||
|
|
||||||
case AvatarResponse.UpdateKillsDeathsAssists(_, kda) =>
|
case AvatarResponse.UpdateKillsDeathsAssists(_, kda: Kill) if kda.experienceEarned > 0 =>
|
||||||
avatarActor ! AvatarActor.UpdateKillsDeathsAssists(kda)
|
continent.actor ! ZoneActor.RewardOurSupporters(
|
||||||
|
PlayerSource(player),
|
||||||
|
Players.produceContributionTranscriptFromKill(continent, player, kda),
|
||||||
|
kda,
|
||||||
|
kda.experienceEarned
|
||||||
|
)
|
||||||
|
|
||||||
case AvatarResponse.AwardBep(charId, bep, expType) =>
|
case AvatarResponse.AwardBep(charId, bep, expType) =>
|
||||||
//if the target player, always award (some) BEP
|
//if the target player, always award (some) BEP
|
||||||
|
|
|
||||||
|
|
@ -112,9 +112,6 @@ class SpectatorModeLogic(data: SessionData) extends ModeLogic {
|
||||||
continent,
|
continent,
|
||||||
SquadAction.Membership(SquadRequestType.Leave, player.CharId, Some(player.CharId), player.Name, None)
|
SquadAction.Membership(SquadRequestType.Leave, player.CharId, Some(player.CharId), player.Name, None)
|
||||||
)
|
)
|
||||||
val originalEvent = player.History.headOption
|
|
||||||
player.ClearHistory()
|
|
||||||
player.LogActivity(originalEvent)
|
|
||||||
player.avatar
|
player.avatar
|
||||||
.shortcuts
|
.shortcuts
|
||||||
.zipWithIndex
|
.zipWithIndex
|
||||||
|
|
@ -132,8 +129,10 @@ class SpectatorModeLogic(data: SessionData) extends ModeLogic {
|
||||||
player.spectator = true
|
player.spectator = true
|
||||||
data.chat.JoinChannel(SpectatorChannel)
|
data.chat.JoinChannel(SpectatorChannel)
|
||||||
val newPlayer = SpectatorModeLogic.spectatorCharacter(player)
|
val newPlayer = SpectatorModeLogic.spectatorCharacter(player)
|
||||||
val cud = new SimpleItem(GlobalDefinitions.command_detonater)
|
newPlayer.LogActivity(player.History.headOption)
|
||||||
cud.GUID = player.avatar.locker.GUID
|
val simpleHandHeldThing = GlobalDefinitions.flail_targeting_laser
|
||||||
|
val handheld = new SimpleItem(simpleHandHeldThing)
|
||||||
|
handheld.GUID = player.avatar.locker.GUID
|
||||||
sendResponse(ObjectCreateDetailedMessage(
|
sendResponse(ObjectCreateDetailedMessage(
|
||||||
0L,
|
0L,
|
||||||
ObjectClass.avatar,
|
ObjectClass.avatar,
|
||||||
|
|
@ -143,10 +142,10 @@ class SpectatorModeLogic(data: SessionData) extends ModeLogic {
|
||||||
))
|
))
|
||||||
sendResponse(ObjectCreateDetailedMessage(
|
sendResponse(ObjectCreateDetailedMessage(
|
||||||
0L,
|
0L,
|
||||||
ObjectClass.command_detonater,
|
simpleHandHeldThing.ObjectId,
|
||||||
cud.GUID,
|
handheld.GUID,
|
||||||
Some(ObjectCreateMessageParent(pguid, 4)),
|
Some(ObjectCreateMessageParent(pguid, 4)),
|
||||||
cud.Definition.Packet.DetailedConstructorData(cud).get
|
handheld.Definition.Packet.DetailedConstructorData(handheld).get
|
||||||
))
|
))
|
||||||
data.zoning.spawn.HandleSetCurrentAvatar(newPlayer)
|
data.zoning.spawn.HandleSetCurrentAvatar(newPlayer)
|
||||||
data.session = session.copy(player = player)
|
data.session = session.copy(player = player)
|
||||||
|
|
@ -167,7 +166,7 @@ class SpectatorModeLogic(data: SessionData) extends ModeLogic {
|
||||||
.foreach(sendResponse)
|
.foreach(sendResponse)
|
||||||
data.chat.LeaveChannel(SpectatorChannel)
|
data.chat.LeaveChannel(SpectatorChannel)
|
||||||
player.spectator = false
|
player.spectator = false
|
||||||
sendResponse(ObjectDeleteMessage(player.avatar.locker.GUID, 0)) //free up the slot (from cud)
|
sendResponse(ObjectDeleteMessage(player.avatar.locker.GUID, 0)) //free up the slot
|
||||||
sendResponse(ChatMsg(ChatMessageType.CMT_TOGGLESPECTATORMODE, "off"))
|
sendResponse(ChatMsg(ChatMessageType.CMT_TOGGLESPECTATORMODE, "off"))
|
||||||
sendResponse(ChatMsg(ChatMessageType.UNK_227, "@SpectatorDisabled"))
|
sendResponse(ChatMsg(ChatMessageType.UNK_227, "@SpectatorDisabled"))
|
||||||
zoning.zoneReload = true
|
zoning.zoneReload = true
|
||||||
|
|
|
||||||
|
|
@ -147,6 +147,7 @@ class WeaponAndProjectileLogic(val ops: WeaponAndProjectileOperations, implicit
|
||||||
def handleUplinkRequest(packet: UplinkRequest): Unit = {
|
def handleUplinkRequest(packet: UplinkRequest): Unit = {
|
||||||
val UplinkRequest(code, _, _) = packet
|
val UplinkRequest(code, _, _) = packet
|
||||||
val playerFaction = player.Faction
|
val playerFaction = player.Faction
|
||||||
|
//todo this is not correct
|
||||||
code match {
|
code match {
|
||||||
case UplinkRequestType.RevealFriendlies =>
|
case UplinkRequestType.RevealFriendlies =>
|
||||||
sendResponse(UplinkResponse(code.value, continent.LivePlayers.count(_.Faction == playerFaction)))
|
sendResponse(UplinkResponse(code.value, continent.LivePlayers.count(_.Faction == playerFaction)))
|
||||||
|
|
|
||||||
|
|
@ -4,14 +4,18 @@ package net.psforever.objects
|
||||||
import net.psforever.objects.avatar.Certification
|
import net.psforever.objects.avatar.Certification
|
||||||
import net.psforever.login.WorldSession.FindEquipmentStock
|
import net.psforever.login.WorldSession.FindEquipmentStock
|
||||||
import net.psforever.objects.avatar.PlayerControl
|
import net.psforever.objects.avatar.PlayerControl
|
||||||
|
import net.psforever.objects.avatar.scoring.Kill
|
||||||
import net.psforever.objects.ce.Deployable
|
import net.psforever.objects.ce.Deployable
|
||||||
import net.psforever.objects.definition.ExoSuitDefinition
|
import net.psforever.objects.definition.ExoSuitDefinition
|
||||||
import net.psforever.objects.equipment.EquipmentSlot
|
import net.psforever.objects.equipment.EquipmentSlot
|
||||||
import net.psforever.objects.guid.{GUIDTask, TaskWorkflow}
|
import net.psforever.objects.guid.{GUIDTask, TaskWorkflow}
|
||||||
import net.psforever.objects.inventory.InventoryItem
|
import net.psforever.objects.inventory.InventoryItem
|
||||||
import net.psforever.objects.loadouts.InfantryLoadout
|
import net.psforever.objects.loadouts.InfantryLoadout
|
||||||
|
import net.psforever.objects.serverobject.affinity.FactionAffinity
|
||||||
import net.psforever.objects.sourcing.PlayerSource
|
import net.psforever.objects.sourcing.PlayerSource
|
||||||
import net.psforever.objects.vital.RevivingActivity
|
import net.psforever.objects.vehicles.MountedWeapons
|
||||||
|
import net.psforever.objects.vital.projectile.ProjectileReason
|
||||||
|
import net.psforever.objects.vital.{InGameActivity, InGameHistory, RevivingActivity}
|
||||||
import net.psforever.objects.zones.Zone
|
import net.psforever.objects.zones.Zone
|
||||||
import net.psforever.packet.game._
|
import net.psforever.packet.game._
|
||||||
import net.psforever.types.{ChatMessageType, ExoSuitType, Vector3}
|
import net.psforever.types.{ChatMessageType, ExoSuitType, Vector3}
|
||||||
|
|
@ -256,7 +260,7 @@ object Players {
|
||||||
PlayerControl.sendResponse(
|
PlayerControl.sendResponse(
|
||||||
zone,
|
zone,
|
||||||
channel,
|
channel,
|
||||||
ChatMsg(ChatMessageType.UNK_229, false, "", s"@${definition.Descriptor}OldestDestroyed", None)
|
ChatMsg(ChatMessageType.UNK_229, s"@${definition.Descriptor}OldestDestroyed")
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
true
|
true
|
||||||
|
|
@ -278,7 +282,7 @@ object Players {
|
||||||
PlayerControl.sendResponse(
|
PlayerControl.sendResponse(
|
||||||
zone,
|
zone,
|
||||||
channel,
|
channel,
|
||||||
ChatMsg(ChatMessageType.UNK_229, false, "", s"@${definition.Descriptor}LimitReached", None)
|
ChatMsg(ChatMessageType.UNK_229, s"@${definition.Descriptor}LimitReached")
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
true
|
true
|
||||||
|
|
@ -400,7 +404,7 @@ object Players {
|
||||||
val zone = player.Zone
|
val zone = player.Zone
|
||||||
zone.AvatarEvents ! AvatarServiceMessage(
|
zone.AvatarEvents ! AvatarServiceMessage(
|
||||||
zone.id,
|
zone.id,
|
||||||
AvatarAction.ObjectDelete(Service.defaultPlayerGUID, tool.GUID, 0)
|
AvatarAction.ObjectDelete(Service.defaultPlayerGUID, tool.GUID)
|
||||||
)
|
)
|
||||||
true
|
true
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -466,4 +470,22 @@ object Players {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* na
|
||||||
|
* @param zone where the event occurred
|
||||||
|
* @param player person attributed to the event
|
||||||
|
* @param killStat information about the event
|
||||||
|
* @return player-specific historical information and then related information that is inherited from other entities
|
||||||
|
*/
|
||||||
|
def produceContributionTranscriptFromKill(zone: Zone, player: Player, killStat: Kill): List[InGameActivity] = {
|
||||||
|
(killStat.info.interaction.cause match {
|
||||||
|
case pr: ProjectileReason => pr.projectile.mounted_in.flatMap { a => zone.GUID(a._1) } //what fired the projectile
|
||||||
|
case _ => None
|
||||||
|
}).collect {
|
||||||
|
case mount: PlanetSideGameObject with FactionAffinity with InGameHistory with MountedWeapons =>
|
||||||
|
player.ContributionFrom(mount)
|
||||||
|
}
|
||||||
|
player.HistoryAndContributions()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -204,7 +204,7 @@ object EquipmentTerminalDefinition {
|
||||||
"advanced_ace" -> MakeConstructionItem(advanced_ace),
|
"advanced_ace" -> MakeConstructionItem(advanced_ace),
|
||||||
"remote_electronics_kit" -> MakeSimpleItem(remote_electronics_kit),
|
"remote_electronics_kit" -> MakeSimpleItem(remote_electronics_kit),
|
||||||
"trek" -> MakeTool(trek),
|
"trek" -> MakeTool(trek),
|
||||||
//"command_detonater" -> MakeSimpleItem(command_detonater),
|
"command_detonater" -> MakeSimpleItem(command_detonater),
|
||||||
"flail_targeting_laser" -> MakeSimpleItem(flail_targeting_laser)
|
"flail_targeting_laser" -> MakeSimpleItem(flail_targeting_laser)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -26,6 +26,28 @@ object UplinkRequestType extends IntEnum[UplinkRequestType] {
|
||||||
|
|
||||||
case object OrbitalStrike extends UplinkRequestType(value = 4)
|
case object OrbitalStrike extends UplinkRequestType(value = 4)
|
||||||
|
|
||||||
|
case object Unknown5 extends UplinkRequestType(value = 5)
|
||||||
|
|
||||||
|
case object Function6 extends UplinkRequestType(value = 6)
|
||||||
|
|
||||||
|
case object Function7 extends UplinkRequestType(value = 7)
|
||||||
|
|
||||||
|
case object Function8 extends UplinkRequestType(value = 8)
|
||||||
|
|
||||||
|
case object Unknown9 extends UplinkRequestType(value = 9)
|
||||||
|
|
||||||
|
case object UnknownA extends UplinkRequestType(value = 10)
|
||||||
|
|
||||||
|
case object FunctionB extends UplinkRequestType(value = 11)
|
||||||
|
|
||||||
|
case object FunctionC extends UplinkRequestType(value = 12)
|
||||||
|
|
||||||
|
case object UnknownD extends UplinkRequestType(value = 13)
|
||||||
|
|
||||||
|
case object UnknownE extends UplinkRequestType(value = 14)
|
||||||
|
|
||||||
|
case object FunctionF extends UplinkRequestType(value = 15)
|
||||||
|
|
||||||
implicit val codec: Codec[UplinkRequestType] = PacketHelpers.createIntEnumCodec(this, uint4)
|
implicit val codec: Codec[UplinkRequestType] = PacketHelpers.createIntEnumCodec(this, uint4)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue