mirror of
https://github.com/2revoemag/PSF-BotServer.git
synced 2026-07-12 23:14:42 +00:00
added painbox damage history event
This commit is contained in:
parent
4261693ae1
commit
d2ef5a76a4
8 changed files with 28 additions and 24 deletions
|
|
@ -39,6 +39,7 @@ class PainboxControl(painbox: Painbox) extends Actor {
|
||||||
//todo: Account for overlapping pain fields
|
//todo: Account for overlapping pain fields
|
||||||
//todo: Pain module
|
//todo: Pain module
|
||||||
//todo: REK boosting
|
//todo: REK boosting
|
||||||
|
val guid = painbox.GUID
|
||||||
val owner = painbox.Owner.asInstanceOf[Building]
|
val owner = painbox.Owner.asInstanceOf[Building]
|
||||||
val faction = owner.Faction
|
val faction = owner.Faction
|
||||||
if(faction != PlanetSideEmpire.NEUTRAL && (!painbox.Definition.HasNearestDoorDependency || (painbox.Definition.HasNearestDoorDependency && nearestDoor.Open.nonEmpty))) {
|
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
|
.collect { case p if p.Faction != faction
|
||||||
&& p.Health > 0
|
&& p.Health > 0
|
||||||
&& Vector3.DistanceSquared(p.Position, position) < radius =>
|
&& 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))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,7 @@ package net.psforever.objects.vital
|
||||||
import net.psforever.objects.PlanetSideGameObject
|
import net.psforever.objects.PlanetSideGameObject
|
||||||
import net.psforever.objects.ballistics.{PlayerSource, ResolvedProjectile, SourceEntry, VehicleSource}
|
import net.psforever.objects.ballistics.{PlayerSource, ResolvedProjectile, SourceEntry, VehicleSource}
|
||||||
import net.psforever.objects.definition.KitDefinition
|
import net.psforever.objects.definition.KitDefinition
|
||||||
|
import net.psforever.objects.serverobject.painbox.Painbox
|
||||||
import net.psforever.objects.serverobject.terminals.TerminalDefinition
|
import net.psforever.objects.serverobject.terminals.TerminalDefinition
|
||||||
import net.psforever.objects.vital.resolution.ResolutionCalculations
|
import net.psforever.objects.vital.resolution.ResolutionCalculations
|
||||||
import net.psforever.types.{ExoSuitType, ImplantType}
|
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 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)
|
final case class PlayerSuicide(target : PlayerSource) extends DamagingActivity(target)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
|
|
@ -26,7 +26,7 @@ class SphereOfInfluenceActor(zone: Zone) extends Actor {
|
||||||
case SOI.Populate() =>
|
case SOI.Populate() =>
|
||||||
UpdateSOI()
|
UpdateSOI()
|
||||||
|
|
||||||
case SOI.StopPopulation() =>
|
case SOI.Stop() =>
|
||||||
context.become(Stopped)
|
context.become(Stopped)
|
||||||
populateTick.cancel
|
populateTick.cancel
|
||||||
sois.foreach { case (facility, _) => facility.PlayersInSOI = Nil }
|
sois.foreach { case (facility, _) => facility.PlayersInSOI = Nil }
|
||||||
|
|
@ -35,7 +35,7 @@ class SphereOfInfluenceActor(zone: Zone) extends Actor {
|
||||||
}
|
}
|
||||||
|
|
||||||
def Stopped : Receive = Build.orElse {
|
def Stopped : Receive = Build.orElse {
|
||||||
case SOI.Populate() =>
|
case SOI.Start() =>
|
||||||
context.become(Running)
|
context.become(Running)
|
||||||
UpdateSOI()
|
UpdateSOI()
|
||||||
|
|
||||||
|
|
@ -53,6 +53,7 @@ class SphereOfInfluenceActor(zone: Zone) extends Actor {
|
||||||
|
|
||||||
def UpdateSOI(): Unit = {
|
def UpdateSOI(): Unit = {
|
||||||
SOI.Populate(sois.iterator, zone.LivePlayers)
|
SOI.Populate(sois.iterator, zone.LivePlayers)
|
||||||
|
populateTick.cancel
|
||||||
populateTick = context.system.scheduler.scheduleOnce(5 seconds, self, SOI.Populate())
|
populateTick = context.system.scheduler.scheduleOnce(5 seconds, self, SOI.Populate())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -63,7 +64,9 @@ object SOI {
|
||||||
/** Populate the list of players within a SOI **/
|
/** Populate the list of players within a SOI **/
|
||||||
final case class Populate()
|
final case class Populate()
|
||||||
/** Stop sorting players into sois */
|
/** Stop sorting players into sois */
|
||||||
final case class StopPopulation()
|
final case class Start()
|
||||||
|
/** Stop sorting players into sois */
|
||||||
|
final case class Stop()
|
||||||
|
|
||||||
@tailrec
|
@tailrec
|
||||||
def Populate(buildings : Iterator[(Building, Int)], players : List[Player]) : Unit = {
|
def Populate(buildings : Iterator[(Building, Int)], players : List[Player]) : Unit = {
|
||||||
|
|
|
||||||
|
|
@ -472,20 +472,12 @@ class Zone(private val zoneId : String, zoneMap : ZoneMap, zoneNumber : Int) {
|
||||||
|
|
||||||
def StartPlayerManagementSystems() : Unit = {
|
def StartPlayerManagementSystems() : Unit = {
|
||||||
println(s"start player management for $Id")
|
println(s"start player management for $Id")
|
||||||
soi ! SOI.Populate()
|
soi ! SOI.Start()
|
||||||
// buildings.values.foreach { _.Amenities.collect {
|
|
||||||
// case box : Painbox =>
|
|
||||||
// box.Actor ! Painbox.Start()
|
|
||||||
// } }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
def StopPlayerManagementSystems() : Unit = {
|
def StopPlayerManagementSystems() : Unit = {
|
||||||
println(s"stop player management for $Id")
|
println(s"stop player management for $Id")
|
||||||
soi ! SOI.StopPopulation()
|
soi ! SOI.Stop()
|
||||||
// buildings.values.foreach { _.Amenities.collect {
|
|
||||||
// case box : Painbox =>
|
|
||||||
// box.Actor ! Painbox.Stop()
|
|
||||||
// } }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
def Activity : ActorRef = projector
|
def Activity : ActorRef = projector
|
||||||
|
|
|
||||||
|
|
@ -65,9 +65,9 @@ class AvatarService(zone : Zone) extends Actor {
|
||||||
AvatarEvents.publish(
|
AvatarEvents.publish(
|
||||||
AvatarServiceResponse(s"/$forChannel/Avatar", player_guid, AvatarResponse.ConcealPlayer())
|
AvatarServiceResponse(s"/$forChannel/Avatar", player_guid, AvatarResponse.ConcealPlayer())
|
||||||
)
|
)
|
||||||
case AvatarAction.EnvironmentalDamage(player_guid, amount) =>
|
case AvatarAction.EnvironmentalDamage(player_guid, source_guid, amount) =>
|
||||||
AvatarEvents.publish(
|
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) =>
|
case AvatarAction.Damage(player_guid, target, resolution_function) =>
|
||||||
AvatarEvents.publish(
|
AvatarEvents.publish(
|
||||||
|
|
|
||||||
|
|
@ -31,7 +31,7 @@ object AvatarAction {
|
||||||
final case class ChangeFireState_Start(player_guid : PlanetSideGUID, weapon_guid : PlanetSideGUID) extends Action
|
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 ChangeFireState_Stop(player_guid : PlanetSideGUID, weapon_guid : PlanetSideGUID) extends Action
|
||||||
final case class ConcealPlayer(player_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 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 DeployItem(player_guid : PlanetSideGUID, item : PlanetSideGameObject with Deployable) extends Action
|
||||||
final case class Destroy(victim : PlanetSideGUID, killer : PlanetSideGUID, weapon : PlanetSideGUID, pos : Vector3) extends Action
|
final case class Destroy(victim : PlanetSideGUID, killer : PlanetSideGUID, weapon : PlanetSideGUID, pos : Vector3) extends Action
|
||||||
|
|
|
||||||
|
|
@ -25,7 +25,7 @@ object AvatarResponse {
|
||||||
final case class ChangeFireState_Start(weapon_guid : PlanetSideGUID) extends Response
|
final case class ChangeFireState_Start(weapon_guid : PlanetSideGUID) extends Response
|
||||||
final case class ChangeFireState_Stop(weapon_guid : PlanetSideGUID) extends Response
|
final case class ChangeFireState_Stop(weapon_guid : PlanetSideGUID) extends Response
|
||||||
final case class ConcealPlayer() 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 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 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
|
final case class DestroyDisplay(killer : SourceEntry, victim : SourceEntry, method : Int, unk : Int) extends Response
|
||||||
|
|
|
||||||
|
|
@ -33,6 +33,7 @@ import net.psforever.objects.serverobject.implantmech.ImplantTerminalMech
|
||||||
import net.psforever.objects.serverobject.locks.IFFLock
|
import net.psforever.objects.serverobject.locks.IFFLock
|
||||||
import net.psforever.objects.serverobject.mblocker.Locker
|
import net.psforever.objects.serverobject.mblocker.Locker
|
||||||
import net.psforever.objects.serverobject.pad.{VehicleSpawnControl, VehicleSpawnPad}
|
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.resourcesilo.ResourceSilo
|
||||||
import net.psforever.objects.serverobject.structures.{Amenity, Building, StructureType, WarpGate}
|
import net.psforever.objects.serverobject.structures.{Amenity, Building, StructureType, WarpGate}
|
||||||
import net.psforever.objects.serverobject.terminals._
|
import net.psforever.objects.serverobject.terminals._
|
||||||
|
|
@ -1212,11 +1213,18 @@ class WorldSessionActor extends Actor
|
||||||
case AvatarResponse.ConcealPlayer() =>
|
case AvatarResponse.ConcealPlayer() =>
|
||||||
sendResponse(GenericObjectActionMessage(guid, 9))
|
sendResponse(GenericObjectActionMessage(guid, 9))
|
||||||
|
|
||||||
case AvatarResponse.EnvironmentalDamage(target, amount) =>
|
case AvatarResponse.EnvironmentalDamage(target, source, amount) =>
|
||||||
if(player.isAlive && amount != 0) {
|
if(player.isAlive && amount > 0) {
|
||||||
|
val playerGUID = player.GUID
|
||||||
val armor = player.Armor
|
val armor = player.Armor
|
||||||
val capacitor = player.Capacitor
|
val capacitor = player.Capacitor
|
||||||
val originalHealth = player.Health
|
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
|
player.Health = originalHealth - amount
|
||||||
sendResponse(PlanetsideAttributeMessage(target, 0, player.Health))
|
sendResponse(PlanetsideAttributeMessage(target, 0, player.Health))
|
||||||
continent.AvatarEvents ! AvatarServiceMessage(continent.Id, AvatarAction.PlanetsideAttribute(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) {
|
if(player.Health == 0 && player.isAlive) {
|
||||||
KillPlayer(player)
|
KillPlayer(player)
|
||||||
}
|
}
|
||||||
else {
|
|
||||||
//todo: History?
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
case AvatarResponse.DamageResolution(target, resolution_function) =>
|
case AvatarResponse.DamageResolution(target, resolution_function) =>
|
||||||
|
|
@ -3274,7 +3279,7 @@ class WorldSessionActor extends Actor
|
||||||
import net.psforever.objects.GlobalDefinitions._
|
import net.psforever.objects.GlobalDefinitions._
|
||||||
import net.psforever.types.CertificationType._
|
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)
|
val avatar = new Avatar(41605313L+sessionId, s"TestCharacter$sessionId", faction, CharacterGender.Female, 41, CharacterVoice.Voice1)
|
||||||
avatar.Certifications += StandardAssault
|
avatar.Certifications += StandardAssault
|
||||||
avatar.Certifications += MediumAssault
|
avatar.Certifications += MediumAssault
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue