sort of cep to bep consditions for squad facility capture; bep deposit for ntu silo activity

This commit is contained in:
Fate-JH 2023-07-24 13:24:27 -04:00
parent a23d8d4cb8
commit ac0892ab34
8 changed files with 96 additions and 19 deletions

View file

@ -398,21 +398,80 @@ class SessionAvatarHandlers(
case AvatarResponse.UpdateKillsDeathsAssists(_, kda) => case AvatarResponse.UpdateKillsDeathsAssists(_, kda) =>
avatarActor ! AvatarActor.UpdateKillsDeathsAssists(kda) avatarActor ! AvatarActor.UpdateKillsDeathsAssists(kda)
case AvatarResponse.AwardSupportBep(_, bep) => case AvatarResponse.AwardBep(_, bep, expType) =>
avatarActor ! AvatarActor.AwardBep(bep, ExperienceType.Support) avatarActor ! AvatarActor.AwardBep(bep, expType)
case AvatarResponse.AwardCep(0, cep) => case AvatarResponse.AwardCep(0, cep) =>
//must lead a squad to be awarded CEP //must be in a squad to earn experience
val id = player.CharId
val squadUI = sessionData.squad.squadUI val squadUI = sessionData.squad.squadUI
val participation = continent
.Buildings
.values
.collect { case building if {
val soi = building.Definition.SOIRadius * building.Definition.SOIRadius
val pos = player.Position.xy
Vector3.DistanceSquared(building.Position.xy, pos) < soi
} =>
building.Participation.PlayerContribution()
}
squadUI squadUI
.find { _._1 == avatar.id } .find { _._1 == id }
.collect { .collect {
case (_, elem) if elem.index == 0 => case (_, elem) if elem.index == 0 =>
val thisZone = continent.Number //squad leader earns CEP, modified by squad effort
val squadSize = squadUI.count { case (_, e) => e.zone == thisZone } -1 val maxRate: Long = {
val maxCepList = Config.app.game.maximumCepPerSquadSize val maxCepList = Config.app.game.maximumCepPerSquadSize
val maxRate = maxCepList.lift(squadSize).getOrElse(squadSize * maxCepList.head).toLong val squadSize: Int = {
avatarActor ! AvatarActor.AwardCep(math.min(cep, maxRate)) val squadSizeList: Iterable[Int] = participation
.map { facilityMap =>
squadUI.count { case (id, _) => facilityMap.contains(id) }
}
if (squadSizeList.nonEmpty) {
squadSizeList.max
} else {
0
}
}
maxCepList.lift(squadSize - 1).getOrElse(squadSize * maxCepList.head).toLong
}
val groupContribution: Float = {
val eachSquadMemberParticipation: Iterable[Float] = participation.map { facilityMap =>
val foundSquadMemberParticipation: Iterable[Float] = squadUI
.keys
.flatMap { facilityMap.get }
if (foundSquadMemberParticipation.nonEmpty) {
foundSquadMemberParticipation.sum / 10f
} else {
0f
}
}
if (eachSquadMemberParticipation.nonEmpty) {
eachSquadMemberParticipation.max
} else {
0
}
}
val modifiedExp: Long = math.min((cep.toFloat * groupContribution).toLong, maxRate)
avatarActor ! AvatarActor.AwardCep(modifiedExp)
Some(modifiedExp)
case _ =>
//squad member earns BEP based on CEP, modified by personal effort
val individualContribution = {
val contributionList = for {
facilityMap <- participation
if facilityMap.contains(id)
} yield facilityMap(id)
if (contributionList.nonEmpty) {
contributionList.max
} else {
0f
}
}
val modifiedExp = (cep * individualContribution).toLong
avatarActor ! AvatarActor.AwardBep(modifiedExp, ExperienceType.Normal)
Some(modifiedExp)
} }
case AvatarResponse.AwardCep(charId, cep) => case AvatarResponse.AwardCep(charId, cep) =>

View file

@ -17,6 +17,15 @@ trait FacilityHackParticipation extends ParticipationLogic {
protected var playerContribution: mutable.LongMap[(Player, Int, Long)] = mutable.LongMap[(Player, Int, Long)]() protected var playerContribution: mutable.LongMap[(Player, Int, Long)] = mutable.LongMap[(Player, Int, Long)]()
protected var playerPopulationOverTime: Seq[Map[PlanetSideEmpire.Value, Int]] = Seq[ Map[PlanetSideEmpire.Value, Int]]() protected var playerPopulationOverTime: Seq[Map[PlanetSideEmpire.Value, Int]] = Seq[ Map[PlanetSideEmpire.Value, Int]]()
def PlayerContribution(timeDelay: Long): Map[Long, Float] = {
playerContribution
.collect {
case (id, (_, d, _)) if d < timeDelay => (id, d.toFloat / timeDelay.toFloat)
case (id, (_, _, _)) => (id, 1.0f)
}
.toMap[Long, Float]
}
protected def updatePlayers(list: List[Player]): Unit = { protected def updatePlayers(list: List[Player]): Unit = {
val hackTime = building.CaptureTerminal.get.Definition.FacilityHackTime.toMillis val hackTime = building.CaptureTerminal.get.Definition.FacilityHackTime.toMillis
val curr = System.currentTimeMillis() val curr = System.currentTimeMillis()

View file

@ -16,4 +16,5 @@ case object NoParticipation extends ParticipationLogic {
completionTime: Long, completionTime: Long,
isResecured: Boolean isResecured: Boolean
): Unit = { /* nothing here */ } ): Unit = { /* nothing here */ }
override def PlayerContribution(timeDelay: Long): Map[Long, Float] = Map.empty[Long, Float]
} }

View file

@ -30,4 +30,6 @@ trait ParticipationLogic {
completionTime: Long, completionTime: Long,
isResecured: Boolean isResecured: Boolean
): Unit ): Unit
def PlayerContribution(timeDelay: Long = 600): Map[Long, Float]
} }

View file

@ -1,7 +1,7 @@
// Copyright (c) 2020 PSForever // Copyright (c) 2020 PSForever
package net.psforever.objects.vehicles package net.psforever.objects.vehicles
import akka.actor.ActorRef import akka.actor.{ActorRef, Cancellable}
import net.psforever.actors.commands.NtuCommand import net.psforever.actors.commands.NtuCommand
import net.psforever.actors.zone.BuildingActor import net.psforever.actors.zone.BuildingActor
import net.psforever.objects.serverobject.deploy.Deployment import net.psforever.objects.serverobject.deploy.Deployment
@ -9,21 +9,23 @@ import net.psforever.objects.serverobject.resourcesilo.ResourceSilo
import net.psforever.objects.serverobject.structures.WarpGate import net.psforever.objects.serverobject.structures.WarpGate
import net.psforever.objects.serverobject.transfer.{TransferBehavior, TransferContainer} import net.psforever.objects.serverobject.transfer.{TransferBehavior, TransferContainer}
import net.psforever.objects.{NtuContainer, _} import net.psforever.objects.{NtuContainer, _}
import net.psforever.types.DriveState import net.psforever.types.{DriveState, ExperienceType}
import net.psforever.services.Service import net.psforever.services.Service
import net.psforever.services.vehicle.{VehicleAction, VehicleServiceMessage} import net.psforever.services.vehicle.{VehicleAction, VehicleServiceMessage}
import akka.actor.typed.scaladsl.adapter._ import akka.actor.typed.scaladsl.adapter._
import net.psforever.objects.serverobject.transfer.TransferContainer.TransferMaterial
import net.psforever.services.avatar.{AvatarAction, AvatarServiceMessage}
import scala.concurrent.ExecutionContext.Implicits.global import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.duration._ import scala.concurrent.duration._
trait AntTransferBehavior extends TransferBehavior with NtuStorageBehavior { trait AntTransferBehavior extends TransferBehavior with NtuStorageBehavior {
var panelAnimationFunc: () => Unit = NoCharge var panelAnimationFunc: () => Unit = NoCharge
var ntuChargingTick = Default.Cancellable var ntuChargingTick: Cancellable = Default.Cancellable
findChargeTargetFunc = Vehicles.FindANTChargingSource findChargeTargetFunc = Vehicles.FindANTChargingSource
findDischargeTargetFunc = Vehicles.FindANTDischargingTarget findDischargeTargetFunc = Vehicles.FindANTDischargingTarget
def TransferMaterial = Ntu.Nanites def TransferMaterial: TransferMaterial = Ntu.Nanites
def ChargeTransferObject: Vehicle with NtuContainer def ChargeTransferObject: Vehicle with NtuContainer
@ -138,6 +140,10 @@ trait AntTransferBehavior extends TransferBehavior with NtuStorageBehavior {
chargeable.NtuCapacitor -= chargeToDeposit chargeable.NtuCapacitor -= chargeToDeposit
UpdateNtuUI(chargeable) UpdateNtuUI(chargeable)
Ntu.Grant(chargeable, chargeToDeposit) Ntu.Grant(chargeable, chargeToDeposit)
vehicle.Zone.AvatarEvents ! AvatarServiceMessage(
vehicle.OwnerName.getOrElse(""),
AvatarAction.AwardBep(0, 100L, ExperienceType.Normal)
)
} }
/** Stopping */ /** Stopping */

View file

@ -438,12 +438,12 @@ class AvatarService(zone: Zone) extends Actor {
) )
) )
case AvatarAction.AwardSupportBep(charId, bep) => case AvatarAction.AwardBep(charId, bep, expType) =>
AvatarEvents.publish( AvatarEvents.publish(
AvatarServiceResponse( AvatarServiceResponse(
s"/$forChannel/Avatar", s"/$forChannel/Avatar",
Service.defaultPlayerGUID, Service.defaultPlayerGUID,
AvatarResponse.AwardSupportBep(charId, bep) AvatarResponse.AwardBep(charId, bep, expType)
) )
) )

View file

@ -12,7 +12,7 @@ import net.psforever.objects.sourcing.SourceEntry
import net.psforever.objects.zones.Zone import net.psforever.objects.zones.Zone
import net.psforever.packet.PlanetSideGamePacket import net.psforever.packet.PlanetSideGamePacket
import net.psforever.packet.game.objectcreate.{ConstructorData, ObjectCreateMessageParent} import net.psforever.packet.game.objectcreate.{ConstructorData, ObjectCreateMessageParent}
import net.psforever.types.{ExoSuitType, PlanetSideEmpire, PlanetSideGUID, TransactionType, Vector3} import net.psforever.types.{ExoSuitType, ExperienceType, PlanetSideEmpire, PlanetSideGUID, TransactionType, Vector3}
import scala.concurrent.duration.FiniteDuration import scala.concurrent.duration.FiniteDuration
@ -156,7 +156,7 @@ object AvatarAction {
final case class KitNotUsed(kit_guid: PlanetSideGUID, msg: String) extends Action final case class KitNotUsed(kit_guid: PlanetSideGUID, msg: String) extends Action
final case class UpdateKillsDeathsAssists(charId: Long, kda: KDAStat) extends Action final case class UpdateKillsDeathsAssists(charId: Long, kda: KDAStat) extends Action
final case class AwardSupportBep(charId: Long, bep: Long) extends Action final case class AwardBep(charId: Long, bep: Long, expType: ExperienceType) extends Action
final case class AwardCep(charId: Long, bep: Long) extends Action final case class AwardCep(charId: Long, bep: Long) extends Action
final case class TeardownConnection() extends Action final case class TeardownConnection() extends Action

View file

@ -11,7 +11,7 @@ import net.psforever.objects.sourcing.SourceEntry
import net.psforever.packet.PlanetSideGamePacket import net.psforever.packet.PlanetSideGamePacket
import net.psforever.packet.game.objectcreate.ConstructorData import net.psforever.packet.game.objectcreate.ConstructorData
import net.psforever.packet.game.ObjectCreateMessage import net.psforever.packet.game.ObjectCreateMessage
import net.psforever.types.{ExoSuitType, PlanetSideEmpire, PlanetSideGUID, TransactionType, Vector3} import net.psforever.types.{ExoSuitType, ExperienceType, PlanetSideEmpire, PlanetSideGUID, TransactionType, Vector3}
import net.psforever.services.GenericEventBusMsg import net.psforever.services.GenericEventBusMsg
final case class AvatarServiceResponse( final case class AvatarServiceResponse(
@ -127,6 +127,6 @@ object AvatarResponse {
final case class KitNotUsed(kit_guid: PlanetSideGUID, msg: String) extends Response final case class KitNotUsed(kit_guid: PlanetSideGUID, msg: String) extends Response
final case class UpdateKillsDeathsAssists(charId: Long, kda: KDAStat) extends Response final case class UpdateKillsDeathsAssists(charId: Long, kda: KDAStat) extends Response
final case class AwardSupportBep(charId: Long, bep: Long) extends Response final case class AwardBep(charId: Long, bep: Long, expType: ExperienceType) extends Response
final case class AwardCep(charId: Long, bep: Long) extends Response final case class AwardCep(charId: Long, bep: Long) extends Response
} }