misc animations and turret range

This commit is contained in:
ScrawnyRonnie 2025-07-28 21:26:39 -04:00 committed by Fate-JH
parent eb5b869917
commit ab1cb9dc0a
9 changed files with 46 additions and 16 deletions

View file

@ -33,6 +33,7 @@ import net.psforever.packet.PlanetSideGamePacket
import net.psforever.packet.game.{ActionCancelMessage, AvatarFirstTimeEventMessage, AvatarImplantMessage, AvatarJumpMessage, BattleplanMessage, BindPlayerMessage, BugReportMessage, ChangeFireModeMessage, ChangeShortcutBankMessage, CharacterCreateRequestMessage, CharacterRequestMessage, ChatMsg, CollisionIs, ConnectToWorldRequestMessage, CreateShortcutMessage, DeadState, DeployObjectMessage, DisplayedAwardMessage, DropItemMessage, EmoteMsg, FacilityBenefitShieldChargeRequestMessage, FriendsRequest, GenericAction, GenericActionMessage, GenericCollisionMsg, GenericObjectActionAtPositionMessage, GenericObjectActionMessage, GenericObjectStateMsg, HitHint, InvalidTerrainMessage, LootItemMessage, MoveItemMessage, ObjectDetectedMessage, ObjectHeldMessage, PickupItemMessage, PlanetsideAttributeMessage, PlayerStateMessageUpstream, RequestDestroyMessage, TargetingImplantRequest, TerrainCondition, TradeMessage, UnuseItemMessage, UseItemMessage, VoiceHostInfo, VoiceHostRequest, ZipLineMessage} import net.psforever.packet.game.{ActionCancelMessage, AvatarFirstTimeEventMessage, AvatarImplantMessage, AvatarJumpMessage, BattleplanMessage, BindPlayerMessage, BugReportMessage, ChangeFireModeMessage, ChangeShortcutBankMessage, CharacterCreateRequestMessage, CharacterRequestMessage, ChatMsg, CollisionIs, ConnectToWorldRequestMessage, CreateShortcutMessage, DeadState, DeployObjectMessage, DisplayedAwardMessage, DropItemMessage, EmoteMsg, FacilityBenefitShieldChargeRequestMessage, FriendsRequest, GenericAction, GenericActionMessage, GenericCollisionMsg, GenericObjectActionAtPositionMessage, GenericObjectActionMessage, GenericObjectStateMsg, HitHint, InvalidTerrainMessage, LootItemMessage, MoveItemMessage, ObjectDetectedMessage, ObjectHeldMessage, PickupItemMessage, PlanetsideAttributeMessage, PlayerStateMessageUpstream, RequestDestroyMessage, TargetingImplantRequest, TerrainCondition, TradeMessage, UnuseItemMessage, UseItemMessage, VoiceHostInfo, VoiceHostRequest, ZipLineMessage}
import net.psforever.services.RemoverActor import net.psforever.services.RemoverActor
import net.psforever.services.avatar.{AvatarAction, AvatarServiceMessage} import net.psforever.services.avatar.{AvatarAction, AvatarServiceMessage}
import net.psforever.services.local.{LocalAction, LocalServiceMessage}
import net.psforever.types.{CapacitorStateType, ChatMessageType, Cosmetic, ExoSuitType, PlanetSideEmpire, PlanetSideGUID, Vector3} import net.psforever.types.{CapacitorStateType, ChatMessageType, Cosmetic, ExoSuitType, PlanetSideEmpire, PlanetSideGUID, Vector3}
import scala.util.Success import scala.util.Success
@ -181,7 +182,11 @@ class GeneralLogic(val ops: GeneralOperations, implicit val context: ActorContex
def handleEmote(pkt: EmoteMsg): Unit = { def handleEmote(pkt: EmoteMsg): Unit = {
val EmoteMsg(avatarGuid, emote) = pkt val EmoteMsg(avatarGuid, emote) = pkt
val pZone = player.Zone
sendResponse(EmoteMsg(avatarGuid, emote)) sendResponse(EmoteMsg(avatarGuid, emote))
pZone.blockMap.sector(player).livePlayerList.collect { case t if t.GUID != player.GUID =>
pZone.LocalEvents ! LocalServiceMessage(t.Name, LocalAction.SendResponse(EmoteMsg(avatarGuid, emote)))
}
} }
def handleDropItem(pkt: DropItemMessage): Unit = { def handleDropItem(pkt: DropItemMessage): Unit = {

View file

@ -40,6 +40,7 @@ import net.psforever.packet.PlanetSideGamePacket
import net.psforever.packet.game.{ActionCancelMessage, ActionResultMessage, AvatarFirstTimeEventMessage, AvatarImplantMessage, AvatarJumpMessage, BattleplanMessage, BindPlayerMessage, BugReportMessage, ChangeFireModeMessage, ChangeShortcutBankMessage, CharacterCreateRequestMessage, CharacterRequestAction, CharacterRequestMessage, ChatMsg, CollisionIs, ConnectToWorldRequestMessage, CreateShortcutMessage, DeadState, DeployObjectMessage, DisplayedAwardMessage, DropItemMessage, EmoteMsg, FacilityBenefitShieldChargeRequestMessage, FriendsRequest, GenericAction, GenericActionMessage, GenericCollisionMsg, GenericObjectActionAtPositionMessage, GenericObjectActionMessage, GenericObjectStateMsg, HitHint, InvalidTerrainMessage, LootItemMessage, MoveItemMessage, ObjectDetectedMessage, ObjectHeldMessage, PickupItemMessage, PlanetsideAttributeMessage, PlayerStateMessageUpstream, RequestDestroyMessage, TargetingImplantRequest, TerrainCondition, TradeMessage, UnuseItemMessage, UseItemMessage, VoiceHostInfo, VoiceHostRequest, ZipLineMessage} import net.psforever.packet.game.{ActionCancelMessage, ActionResultMessage, AvatarFirstTimeEventMessage, AvatarImplantMessage, AvatarJumpMessage, BattleplanMessage, BindPlayerMessage, BugReportMessage, ChangeFireModeMessage, ChangeShortcutBankMessage, CharacterCreateRequestMessage, CharacterRequestAction, CharacterRequestMessage, ChatMsg, CollisionIs, ConnectToWorldRequestMessage, CreateShortcutMessage, DeadState, DeployObjectMessage, DisplayedAwardMessage, DropItemMessage, EmoteMsg, FacilityBenefitShieldChargeRequestMessage, FriendsRequest, GenericAction, GenericActionMessage, GenericCollisionMsg, GenericObjectActionAtPositionMessage, GenericObjectActionMessage, GenericObjectStateMsg, HitHint, InvalidTerrainMessage, LootItemMessage, MoveItemMessage, ObjectDetectedMessage, ObjectHeldMessage, PickupItemMessage, PlanetsideAttributeMessage, PlayerStateMessageUpstream, RequestDestroyMessage, TargetingImplantRequest, TerrainCondition, TradeMessage, UnuseItemMessage, UseItemMessage, VoiceHostInfo, VoiceHostRequest, ZipLineMessage}
import net.psforever.services.account.{AccountPersistenceService, RetrieveAccountData} import net.psforever.services.account.{AccountPersistenceService, RetrieveAccountData}
import net.psforever.services.avatar.{AvatarAction, AvatarServiceMessage} import net.psforever.services.avatar.{AvatarAction, AvatarServiceMessage}
import net.psforever.services.local.{LocalAction, LocalServiceMessage}
import net.psforever.services.local.support.CaptureFlagManager import net.psforever.services.local.support.CaptureFlagManager
import net.psforever.types.{CapacitorStateType, ChatMessageType, Cosmetic, ExoSuitType, ImplantType, PlanetSideEmpire, PlanetSideGUID, Vector3} import net.psforever.types.{CapacitorStateType, ChatMessageType, Cosmetic, ExoSuitType, ImplantType, PlanetSideEmpire, PlanetSideGUID, Vector3}
import net.psforever.util.Config import net.psforever.util.Config
@ -200,7 +201,11 @@ class GeneralLogic(val ops: GeneralOperations, implicit val context: ActorContex
def handleEmote(pkt: EmoteMsg): Unit = { def handleEmote(pkt: EmoteMsg): Unit = {
val EmoteMsg(avatarGuid, emote) = pkt val EmoteMsg(avatarGuid, emote) = pkt
val pZone = player.Zone
sendResponse(EmoteMsg(avatarGuid, emote)) sendResponse(EmoteMsg(avatarGuid, emote))
pZone.blockMap.sector(player).livePlayerList.collect { case t if t.GUID != player.GUID =>
pZone.LocalEvents ! LocalServiceMessage(t.Name, LocalAction.SendResponse(EmoteMsg(avatarGuid, emote)))
}
} }
def handleDropItem(pkt: DropItemMessage): Unit = { def handleDropItem(pkt: DropItemMessage): Unit = {

View file

@ -231,7 +231,7 @@ class VehicleHandlerLogic(val ops: SessionVehicleHandlers, implicit val context:
sendResponse(ObjectCreateDetailedMessage(itemType, itemGuid, ObjectCreateMessageParent(vehicleGuid, slot), itemData)) sendResponse(ObjectCreateDetailedMessage(itemType, itemGuid, ObjectCreateMessageParent(vehicleGuid, slot), itemData))
case VehicleResponse.UnloadVehicle(_, vehicleGuid) => case VehicleResponse.UnloadVehicle(_, vehicleGuid) =>
sendResponse(ObjectDeleteMessage(vehicleGuid, unk1=0)) sendResponse(ObjectDeleteMessage(vehicleGuid, unk1=1))
if (sessionLogic.zoning.spawn.prevSpawnPoint.map(_.Owner).exists { if (sessionLogic.zoning.spawn.prevSpawnPoint.map(_.Owner).exists {
case ams: Vehicle => case ams: Vehicle =>
ams.GUID == vehicleGuid && ams.GUID == vehicleGuid &&

View file

@ -197,7 +197,7 @@ class VehicleHandlerLogic(val ops: SessionVehicleHandlers, implicit val context:
sendResponse(PlanetsideAttributeMessage(vehicleGuid, seatGroup, permission)) sendResponse(PlanetsideAttributeMessage(vehicleGuid, seatGroup, permission))
case VehicleResponse.UnloadVehicle(_, vehicleGuid) => case VehicleResponse.UnloadVehicle(_, vehicleGuid) =>
sendResponse(ObjectDeleteMessage(vehicleGuid, unk1=0)) sendResponse(ObjectDeleteMessage(vehicleGuid, unk1=1))
case VehicleResponse.UnstowEquipment(itemGuid) if isNotSameTarget => case VehicleResponse.UnstowEquipment(itemGuid) if isNotSameTarget =>
//TODO prefer ObjectDetachMessage, but how to force ammo pools to update properly? //TODO prefer ObjectDetachMessage, but how to force ammo pools to update properly?

View file

@ -20,7 +20,8 @@ import net.psforever.objects.serverobject.turret.auto.AutomatedTurret
import net.psforever.objects.sourcing.{PlayerSource, SourceEntry, VehicleSource} import net.psforever.objects.sourcing.{PlayerSource, SourceEntry, VehicleSource}
import net.psforever.objects.vital.{InGameHistory, IncarnationActivity, ReconstructionActivity, SpawningActivity} import net.psforever.objects.vital.{InGameHistory, IncarnationActivity, ReconstructionActivity, SpawningActivity}
import net.psforever.objects.zones.blockmap.BlockMapEntity import net.psforever.objects.zones.blockmap.BlockMapEntity
import net.psforever.packet.game.{CampaignStatistic, ChangeFireStateMessage_Start, HackState7, MailMessage, ObjectDetectedMessage, SessionStatistic, TriggeredSound, WeatherMessage, CloudInfo, StormInfo} import net.psforever.packet.game.GenericAction.FirstPersonViewWithEffect
import net.psforever.packet.game.{CampaignStatistic, ChangeFireStateMessage_Start, CloudInfo, GenericActionMessage, GenericObjectActionEnum, HackState7, MailMessage, ObjectDetectedMessage, SessionStatistic, StormInfo, TriggeredSound, WeatherMessage}
import net.psforever.services.chat.DefaultChannel import net.psforever.services.chat.DefaultChannel
import scala.concurrent.duration._ import scala.concurrent.duration._
@ -3000,10 +3001,10 @@ class ZoningOperations(
case _ if player.HasGUID => // player is deconstructing self or instant action case _ if player.HasGUID => // player is deconstructing self or instant action
val player_guid = player.GUID val player_guid = player.GUID
sendResponse(ObjectDeleteMessage(player_guid, 4)) sendResponse(ObjectDeleteMessage(player_guid, unk1=1))
continent.AvatarEvents ! AvatarServiceMessage( continent.AvatarEvents ! AvatarServiceMessage(
continent.id, continent.id,
AvatarAction.ObjectDelete(player_guid, player_guid, 4) AvatarAction.ObjectDelete(player_guid, player_guid, unk=1)
) )
InGameHistory.SpawnReconstructionActivity(player, toZoneNumber, betterSpawnPoint) InGameHistory.SpawnReconstructionActivity(player, toZoneNumber, betterSpawnPoint)
LoadZoneAsPlayerUsing(player, pos, ori, toSide, zoneId) LoadZoneAsPlayerUsing(player, pos, ori, toSide, zoneId)
@ -3803,6 +3804,11 @@ class ZoningOperations(
player.death_by = 1 player.death_by = 1
} }
GoToDeploymentMap() GoToDeploymentMap()
val pZone = player.Zone
sendResponse(GenericActionMessage(FirstPersonViewWithEffect))
pZone.blockMap.sector(player).livePlayerList.collect { case t if t.GUID != player.GUID =>
pZone.LocalEvents ! LocalServiceMessage(t.Name, LocalAction.SendGenericObjectActionMessage(t.GUID, player.GUID, GenericObjectActionEnum.PlayerDeconstructs))
}
} }
def stopDeconstructing(): Unit = { def stopDeconstructing(): Unit = {

View file

@ -2,6 +2,7 @@
package net.psforever.objects.serverobject.damage package net.psforever.objects.serverobject.damage
import net.psforever.objects.equipment.JammableUnit import net.psforever.objects.equipment.JammableUnit
import net.psforever.objects.serverobject.tube.SpawnTube
import net.psforever.objects.vital.interaction.DamageResult import net.psforever.objects.vital.interaction.DamageResult
import net.psforever.objects.vital.resolution.ResolutionCalculations import net.psforever.objects.vital.resolution.ResolutionCalculations
import net.psforever.objects.zones.Zone import net.psforever.objects.zones.Zone
@ -199,9 +200,12 @@ object DamageableEntity {
val tguid = target.GUID val tguid = target.GUID
val attribution = attributionTo(cause, target.Zone) val attribution = attributionTo(cause, target.Zone)
zone.AvatarEvents ! AvatarServiceMessage(zoneId, AvatarAction.PlanetsideAttributeToAll(tguid, 0, target.Health)) zone.AvatarEvents ! AvatarServiceMessage(zoneId, AvatarAction.PlanetsideAttributeToAll(tguid, 0, target.Health))
zone.AvatarEvents ! AvatarServiceMessage( if (target.isInstanceOf[SpawnTube]) {}//do nothing to prevent issue #1057
zoneId, else {
AvatarAction.Destroy(tguid, attribution, Service.defaultPlayerGUID, target.Position) zone.AvatarEvents ! AvatarServiceMessage(
) zoneId,
AvatarAction.Destroy(tguid, attribution, Service.defaultPlayerGUID, target.Position)
)
}
} }
} }

View file

@ -205,7 +205,8 @@ trait AutomatedTurretBehavior {
val now = System.currentTimeMillis() val now = System.currentTimeMillis()
if ( if (
currentTargetToken.isEmpty && currentTargetToken.isEmpty &&
target.Faction != AutomatedTurretObject.Faction target.Faction != AutomatedTurretObject.Faction &&
now >= currentTargetLastShotTime
) { ) {
currentTargetLastShotTime = now currentTargetLastShotTime = now
currentTargetLocation = Some(target.Position) currentTargetLocation = Some(target.Position)
@ -215,11 +216,19 @@ trait AutomatedTurretBehavior {
true true
} else if ( } else if (
currentTargetToken.contains(SourceUniqueness(target)) && currentTargetToken.contains(SourceUniqueness(target)) &&
now - currentTargetLastShotTime < autoStats.map(_.cooldowns.missedShot).getOrElse(0L)) { now - currentTargetLastShotTime < autoStats.map(_.cooldowns.missedShot).getOrElse(0L)
currentTargetLastShotTime = now ) {
currentTargetLocation = Some(target.Position) val escapeRange = autoStats.map(_.ranges.escape).getOrElse(400f)
cancelSelfReportedAutoFire() val distSq = Vector3.DistanceSquared(target.Position, AutomatedTurretObject.Position)
true val escapeSq = escapeRange * escapeRange
if (distSq <= escapeSq) {
currentTargetLastShotTime = now
currentTargetLocation = Some(target.Position)
cancelSelfReportedAutoFire()
true
} else {
false
}
} else { } else {
false false
} }

View file

@ -91,4 +91,5 @@ object GenericObjectActionEnum extends Enumeration {
* <b>Target</b>: CaptureTerminal * <b>Target</b>: CaptureTerminal
*/ */
val FlagSpawned = Value(14) val FlagSpawned = Value(14)
val PlayerDeconstructs = Value(6)
} }

View file

@ -25,7 +25,7 @@ class CorpseRemovalActor extends RemoverActor() {
entry.zone.Population ! Zone.Corpse.Remove(entry.obj.asInstanceOf[Player]) entry.zone.Population ! Zone.Corpse.Remove(entry.obj.asInstanceOf[Player])
context.parent ! AvatarServiceMessage( context.parent ! AvatarServiceMessage(
entry.zone.id, entry.zone.id,
AvatarAction.ObjectDelete(Service.defaultPlayerGUID, entry.obj.GUID) AvatarAction.ObjectDelete(Service.defaultPlayerGUID, entry.obj.GUID, unk=1)
) )
} }