command detonater is no longer allowed; spectators now hold a laze pointer

This commit is contained in:
Fate-JH 2024-05-07 19:12:14 -04:00
parent e748f45c2f
commit fedcb1caf9
8 changed files with 72 additions and 31 deletions

View file

@ -23,7 +23,7 @@ add_property boomer_trigger equiptime 500
add_property chainblade equiptime 250
add_property chainblade holstertime 250
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 holstertime 500
add_property cycler equiptime 600

View file

@ -10,10 +10,8 @@ import net.psforever.actors.zone.ZoneActor
import net.psforever.objects.Session
import net.psforever.objects.avatar.ModePermissions
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.vital.{InGameHistory, ReconstructionActivity}
import net.psforever.objects.vehicles.MountedWeapons
import net.psforever.objects.vital.ReconstructionActivity
import net.psforever.types.{ChatMessageType, StatisticalCategory, StatisticalElement}
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.locker.LockerContainer
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.packet.game.objectcreate.{BasicCharacterData, ObjectClass, RibbonBars}
import net.psforever.packet.game.{Friend => GameFriend, _}
@ -3205,16 +3202,7 @@ class AvatarActor(
val zone = _session.zone
val player = _session.player
val playerSource = PlayerSource(player)
val historyTranscript = {
(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 historyTranscript = Players.produceContributionTranscriptFromKill(zone, player, killStat)
val target = killStat.info.targetAfter.asInstanceOf[PlayerSource]
val targetMounted = target.seatedIn
.collect {

View file

@ -3,6 +3,10 @@ package net.psforever.actors.session.spectator
import akka.actor.{ActorContext, typed}
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 scala.concurrent.duration._
@ -387,8 +391,13 @@ class AvatarHandlerLogic(val ops: SessionAvatarHandlers, implicit val context: A
sessionLogic.general.kitToBeUsed = None
sendResponse(ChatMsg(ChatMessageType.UNK_225, msg))
case AvatarResponse.UpdateKillsDeathsAssists(_, kda) =>
avatarActor ! AvatarActor.UpdateKillsDeathsAssists(kda)
case AvatarResponse.UpdateKillsDeathsAssists(_, kda: Kill) if kda.experienceEarned > 0 =>
continent.actor ! ZoneActor.RewardOurSupporters(
PlayerSource(player),
Players.produceContributionTranscriptFromKill(continent, player, kda),
kda,
kda.experienceEarned
)
case AvatarResponse.AwardBep(charId, bep, expType) =>
//if the target player, always award (some) BEP

View file

@ -112,9 +112,6 @@ class SpectatorModeLogic(data: SessionData) extends ModeLogic {
continent,
SquadAction.Membership(SquadRequestType.Leave, player.CharId, Some(player.CharId), player.Name, None)
)
val originalEvent = player.History.headOption
player.ClearHistory()
player.LogActivity(originalEvent)
player.avatar
.shortcuts
.zipWithIndex
@ -132,8 +129,10 @@ class SpectatorModeLogic(data: SessionData) extends ModeLogic {
player.spectator = true
data.chat.JoinChannel(SpectatorChannel)
val newPlayer = SpectatorModeLogic.spectatorCharacter(player)
val cud = new SimpleItem(GlobalDefinitions.command_detonater)
cud.GUID = player.avatar.locker.GUID
newPlayer.LogActivity(player.History.headOption)
val simpleHandHeldThing = GlobalDefinitions.flail_targeting_laser
val handheld = new SimpleItem(simpleHandHeldThing)
handheld.GUID = player.avatar.locker.GUID
sendResponse(ObjectCreateDetailedMessage(
0L,
ObjectClass.avatar,
@ -143,10 +142,10 @@ class SpectatorModeLogic(data: SessionData) extends ModeLogic {
))
sendResponse(ObjectCreateDetailedMessage(
0L,
ObjectClass.command_detonater,
cud.GUID,
simpleHandHeldThing.ObjectId,
handheld.GUID,
Some(ObjectCreateMessageParent(pguid, 4)),
cud.Definition.Packet.DetailedConstructorData(cud).get
handheld.Definition.Packet.DetailedConstructorData(handheld).get
))
data.zoning.spawn.HandleSetCurrentAvatar(newPlayer)
data.session = session.copy(player = player)
@ -167,7 +166,7 @@ class SpectatorModeLogic(data: SessionData) extends ModeLogic {
.foreach(sendResponse)
data.chat.LeaveChannel(SpectatorChannel)
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.UNK_227, "@SpectatorDisabled"))
zoning.zoneReload = true

View file

@ -147,6 +147,7 @@ class WeaponAndProjectileLogic(val ops: WeaponAndProjectileOperations, implicit
def handleUplinkRequest(packet: UplinkRequest): Unit = {
val UplinkRequest(code, _, _) = packet
val playerFaction = player.Faction
//todo this is not correct
code match {
case UplinkRequestType.RevealFriendlies =>
sendResponse(UplinkResponse(code.value, continent.LivePlayers.count(_.Faction == playerFaction)))

View file

@ -4,14 +4,18 @@ package net.psforever.objects
import net.psforever.objects.avatar.Certification
import net.psforever.login.WorldSession.FindEquipmentStock
import net.psforever.objects.avatar.PlayerControl
import net.psforever.objects.avatar.scoring.Kill
import net.psforever.objects.ce.Deployable
import net.psforever.objects.definition.ExoSuitDefinition
import net.psforever.objects.equipment.EquipmentSlot
import net.psforever.objects.guid.{GUIDTask, TaskWorkflow}
import net.psforever.objects.inventory.InventoryItem
import net.psforever.objects.loadouts.InfantryLoadout
import net.psforever.objects.serverobject.affinity.FactionAffinity
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.packet.game._
import net.psforever.types.{ChatMessageType, ExoSuitType, Vector3}
@ -256,7 +260,7 @@ object Players {
PlayerControl.sendResponse(
zone,
channel,
ChatMsg(ChatMessageType.UNK_229, false, "", s"@${definition.Descriptor}OldestDestroyed", None)
ChatMsg(ChatMessageType.UNK_229, s"@${definition.Descriptor}OldestDestroyed")
)
}
true
@ -278,7 +282,7 @@ object Players {
PlayerControl.sendResponse(
zone,
channel,
ChatMsg(ChatMessageType.UNK_229, false, "", s"@${definition.Descriptor}LimitReached", None)
ChatMsg(ChatMessageType.UNK_229, s"@${definition.Descriptor}LimitReached")
)
}
true
@ -400,7 +404,7 @@ object Players {
val zone = player.Zone
zone.AvatarEvents ! AvatarServiceMessage(
zone.id,
AvatarAction.ObjectDelete(Service.defaultPlayerGUID, tool.GUID, 0)
AvatarAction.ObjectDelete(Service.defaultPlayerGUID, tool.GUID)
)
true
} 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()
}
}

View file

@ -204,7 +204,7 @@ object EquipmentTerminalDefinition {
"advanced_ace" -> MakeConstructionItem(advanced_ace),
"remote_electronics_kit" -> MakeSimpleItem(remote_electronics_kit),
"trek" -> MakeTool(trek),
//"command_detonater" -> MakeSimpleItem(command_detonater),
"command_detonater" -> MakeSimpleItem(command_detonater),
"flail_targeting_laser" -> MakeSimpleItem(flail_targeting_laser)
)

View file

@ -26,6 +26,28 @@ object UplinkRequestType extends IntEnum[UplinkRequestType] {
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)
}