diff --git a/common/src/main/scala/net/psforever/objects/serverobject/painbox/PainboxControl.scala b/common/src/main/scala/net/psforever/objects/serverobject/painbox/PainboxControl.scala index aad8f4e9..bf2a8966 100644 --- a/common/src/main/scala/net/psforever/objects/serverobject/painbox/PainboxControl.scala +++ b/common/src/main/scala/net/psforever/objects/serverobject/painbox/PainboxControl.scala @@ -39,6 +39,7 @@ class PainboxControl(painbox: Painbox) extends Actor { //todo: Account for overlapping pain fields //todo: Pain module //todo: REK boosting + val guid = painbox.GUID val owner = painbox.Owner.asInstanceOf[Building] val faction = owner.Faction if(faction != PlanetSideEmpire.NEUTRAL && (!painbox.Definition.HasNearestDoorDependency || (painbox.Definition.HasNearestDoorDependency && nearestDoor.Open.nonEmpty))) { @@ -50,7 +51,7 @@ class PainboxControl(painbox: Painbox) extends Actor { .collect { case p if p.Faction != faction && p.Health > 0 && Vector3.DistanceSquared(p.Position, position) < radius => - events ! AvatarServiceMessage(p.Name, AvatarAction.EnvironmentalDamage(p.GUID, damage)) + events ! AvatarServiceMessage(p.Name, AvatarAction.EnvironmentalDamage(p.GUID, guid, damage)) } } diff --git a/common/src/main/scala/net/psforever/objects/vital/Vitality.scala b/common/src/main/scala/net/psforever/objects/vital/Vitality.scala index 17a862bc..5cf22e3a 100644 --- a/common/src/main/scala/net/psforever/objects/vital/Vitality.scala +++ b/common/src/main/scala/net/psforever/objects/vital/Vitality.scala @@ -4,6 +4,7 @@ package net.psforever.objects.vital import net.psforever.objects.PlanetSideGameObject import net.psforever.objects.ballistics.{PlayerSource, ResolvedProjectile, SourceEntry, VehicleSource} import net.psforever.objects.definition.KitDefinition +import net.psforever.objects.serverobject.painbox.Painbox import net.psforever.objects.serverobject.terminals.TerminalDefinition import net.psforever.objects.vital.resolution.ResolutionCalculations import net.psforever.types.{ExoSuitType, ImplantType} @@ -35,6 +36,8 @@ final case class VehicleShieldCharge(target : VehicleSource, amount : Int) exten final case class DamageFromProjectile(data : ResolvedProjectile) extends DamagingActivity(data.target) +final case class DamageFromPainbox(target : PlayerSource, painbox : Painbox, damage : Int) extends DamagingActivity(target) + final case class PlayerSuicide(target : PlayerSource) extends DamagingActivity(target) /** diff --git a/common/src/main/scala/net/psforever/objects/zones/SphereOfInfluenceActor.scala b/common/src/main/scala/net/psforever/objects/zones/SphereOfInfluenceActor.scala index 844c643b..164ae7c9 100644 --- a/common/src/main/scala/net/psforever/objects/zones/SphereOfInfluenceActor.scala +++ b/common/src/main/scala/net/psforever/objects/zones/SphereOfInfluenceActor.scala @@ -26,7 +26,7 @@ class SphereOfInfluenceActor(zone: Zone) extends Actor { case SOI.Populate() => UpdateSOI() - case SOI.StopPopulation() => + case SOI.Stop() => context.become(Stopped) populateTick.cancel sois.foreach { case (facility, _) => facility.PlayersInSOI = Nil } @@ -35,7 +35,7 @@ class SphereOfInfluenceActor(zone: Zone) extends Actor { } def Stopped : Receive = Build.orElse { - case SOI.Populate() => + case SOI.Start() => context.become(Running) UpdateSOI() @@ -53,6 +53,7 @@ class SphereOfInfluenceActor(zone: Zone) extends Actor { def UpdateSOI(): Unit = { SOI.Populate(sois.iterator, zone.LivePlayers) + populateTick.cancel populateTick = context.system.scheduler.scheduleOnce(5 seconds, self, SOI.Populate()) } } @@ -63,7 +64,9 @@ object SOI { /** Populate the list of players within a SOI **/ final case class Populate() /** Stop sorting players into sois */ - final case class StopPopulation() + final case class Start() + /** Stop sorting players into sois */ + final case class Stop() @tailrec def Populate(buildings : Iterator[(Building, Int)], players : List[Player]) : Unit = { diff --git a/common/src/main/scala/net/psforever/objects/zones/Zone.scala b/common/src/main/scala/net/psforever/objects/zones/Zone.scala index d4d09130..44884dcc 100644 --- a/common/src/main/scala/net/psforever/objects/zones/Zone.scala +++ b/common/src/main/scala/net/psforever/objects/zones/Zone.scala @@ -472,20 +472,12 @@ class Zone(private val zoneId : String, zoneMap : ZoneMap, zoneNumber : Int) { def StartPlayerManagementSystems() : Unit = { println(s"start player management for $Id") - soi ! SOI.Populate() -// buildings.values.foreach { _.Amenities.collect { -// case box : Painbox => -// box.Actor ! Painbox.Start() -// } } + soi ! SOI.Start() } def StopPlayerManagementSystems() : Unit = { println(s"stop player management for $Id") - soi ! SOI.StopPopulation() -// buildings.values.foreach { _.Amenities.collect { -// case box : Painbox => -// box.Actor ! Painbox.Stop() -// } } + soi ! SOI.Stop() } def Activity : ActorRef = projector diff --git a/common/src/main/scala/services/avatar/AvatarService.scala b/common/src/main/scala/services/avatar/AvatarService.scala index e7b724a7..2a5643cf 100644 --- a/common/src/main/scala/services/avatar/AvatarService.scala +++ b/common/src/main/scala/services/avatar/AvatarService.scala @@ -65,9 +65,9 @@ class AvatarService(zone : Zone) extends Actor { AvatarEvents.publish( AvatarServiceResponse(s"/$forChannel/Avatar", player_guid, AvatarResponse.ConcealPlayer()) ) - case AvatarAction.EnvironmentalDamage(player_guid, amount) => + case AvatarAction.EnvironmentalDamage(player_guid, source_guid, amount) => AvatarEvents.publish( - AvatarServiceResponse(s"/$forChannel/Avatar", player_guid, AvatarResponse.EnvironmentalDamage(player_guid, amount)) + AvatarServiceResponse(s"/$forChannel/Avatar", player_guid, AvatarResponse.EnvironmentalDamage(player_guid, source_guid, amount)) ) case AvatarAction.Damage(player_guid, target, resolution_function) => AvatarEvents.publish( diff --git a/common/src/main/scala/services/avatar/AvatarServiceMessage.scala b/common/src/main/scala/services/avatar/AvatarServiceMessage.scala index a3e219aa..904423dc 100644 --- a/common/src/main/scala/services/avatar/AvatarServiceMessage.scala +++ b/common/src/main/scala/services/avatar/AvatarServiceMessage.scala @@ -31,7 +31,7 @@ object AvatarAction { final case class ChangeFireState_Start(player_guid : PlanetSideGUID, weapon_guid : PlanetSideGUID) extends Action final case class ChangeFireState_Stop(player_guid : PlanetSideGUID, weapon_guid : PlanetSideGUID) extends Action final case class ConcealPlayer(player_guid : PlanetSideGUID) extends Action - final case class EnvironmentalDamage(player_guid : PlanetSideGUID, amount: Int) extends Action + final case class EnvironmentalDamage(player_guid : PlanetSideGUID, source_guid : PlanetSideGUID, amount: Int) extends Action final case class Damage(player_guid : PlanetSideGUID, target : Player, resolution_function : ResolutionCalculations.Output) extends Action final case class DeployItem(player_guid : PlanetSideGUID, item : PlanetSideGameObject with Deployable) extends Action final case class Destroy(victim : PlanetSideGUID, killer : PlanetSideGUID, weapon : PlanetSideGUID, pos : Vector3) extends Action diff --git a/common/src/main/scala/services/avatar/AvatarServiceResponse.scala b/common/src/main/scala/services/avatar/AvatarServiceResponse.scala index 2140dbf7..0c589822 100644 --- a/common/src/main/scala/services/avatar/AvatarServiceResponse.scala +++ b/common/src/main/scala/services/avatar/AvatarServiceResponse.scala @@ -25,7 +25,7 @@ object AvatarResponse { final case class ChangeFireState_Start(weapon_guid : PlanetSideGUID) extends Response final case class ChangeFireState_Stop(weapon_guid : PlanetSideGUID) extends Response final case class ConcealPlayer() extends Response - final case class EnvironmentalDamage(target : PlanetSideGUID, amount : Int) extends Response + final case class EnvironmentalDamage(target : PlanetSideGUID, source_guid : PlanetSideGUID, amount : Int) extends Response final case class DamageResolution(target : Player, resolution_function : ResolutionCalculations.Output) extends Response final case class Destroy(victim : PlanetSideGUID, killer : PlanetSideGUID, weapon : PlanetSideGUID, pos : Vector3) extends Response final case class DestroyDisplay(killer : SourceEntry, victim : SourceEntry, method : Int, unk : Int) extends Response diff --git a/pslogin/src/main/scala/WorldSessionActor.scala b/pslogin/src/main/scala/WorldSessionActor.scala index f7e5c9d3..2a3b5845 100644 --- a/pslogin/src/main/scala/WorldSessionActor.scala +++ b/pslogin/src/main/scala/WorldSessionActor.scala @@ -33,6 +33,7 @@ import net.psforever.objects.serverobject.implantmech.ImplantTerminalMech import net.psforever.objects.serverobject.locks.IFFLock import net.psforever.objects.serverobject.mblocker.Locker import net.psforever.objects.serverobject.pad.{VehicleSpawnControl, VehicleSpawnPad} +import net.psforever.objects.serverobject.painbox.Painbox import net.psforever.objects.serverobject.resourcesilo.ResourceSilo import net.psforever.objects.serverobject.structures.{Amenity, Building, StructureType, WarpGate} import net.psforever.objects.serverobject.terminals._ @@ -1212,11 +1213,18 @@ class WorldSessionActor extends Actor case AvatarResponse.ConcealPlayer() => sendResponse(GenericObjectActionMessage(guid, 9)) - case AvatarResponse.EnvironmentalDamage(target, amount) => - if(player.isAlive && amount != 0) { + case AvatarResponse.EnvironmentalDamage(target, source, amount) => + if(player.isAlive && amount > 0) { + val playerGUID = player.GUID val armor = player.Armor val capacitor = player.Capacitor val originalHealth = player.Health + //history + continent.GUID(source) match { + case Some(obj : Painbox) => + player.History(DamageFromPainbox(PlayerSource(player), obj, amount)) + case _ => ; + } player.Health = originalHealth - amount sendResponse(PlanetsideAttributeMessage(target, 0, player.Health)) continent.AvatarEvents ! AvatarServiceMessage(continent.Id, AvatarAction.PlanetsideAttribute(target, 0, player.Health)) @@ -1224,9 +1232,6 @@ class WorldSessionActor extends Actor if(player.Health == 0 && player.isAlive) { KillPlayer(player) } - else { - //todo: History? - } } case AvatarResponse.DamageResolution(target, resolution_function) => @@ -3274,7 +3279,7 @@ class WorldSessionActor extends Actor import net.psforever.objects.GlobalDefinitions._ import net.psforever.types.CertificationType._ - val faction = PlanetSideEmpire.VS + val faction = PlanetSideEmpire.TR val avatar = new Avatar(41605313L+sessionId, s"TestCharacter$sessionId", faction, CharacterGender.Female, 41, CharacterVoice.Voice1) avatar.Certifications += StandardAssault avatar.Certifications += MediumAssault