diff --git a/src/Sanctuary.Game/Entities/Mount.cs b/src/Sanctuary.Game/Entities/Mount.cs index fd2a739..97f2a9b 100644 --- a/src/Sanctuary.Game/Entities/Mount.cs +++ b/src/Sanctuary.Game/Entities/Mount.cs @@ -52,13 +52,22 @@ public override PlayerUpdatePacketAddNpc GetAddNpcPacket() { var packet = base.GetAddNpcPacket(); - packet.RiderGuid = Rider.Guid; + packet.RiderGuid = 0; return packet; } - public override void Dispose() + public PacketMountResponse GetMountResponsePacket() { - base.Dispose(); + return new PacketMountResponse + { + RiderGuid = Rider.Guid, + MountGuid = Guid, + Seat = Seat, + QueuePosition = QueuePosition, + Unknown = 1, + CompositeEffectId = 46, // PFX_Teleport_Flash + NameVerticalOffset = Definition.NameVerticalOffset + }; } } \ No newline at end of file diff --git a/src/Sanctuary.Game/Entities/Player.cs b/src/Sanctuary.Game/Entities/Player.cs index 1395f02..2940192 100644 --- a/src/Sanctuary.Game/Entities/Player.cs +++ b/src/Sanctuary.Game/Entities/Player.cs @@ -133,6 +133,8 @@ public void UpdatePosition(Vector4 position, Quaternion rotation, bool updateZon Position = position; Rotation = rotation; + Mount?.UpdatePosition(position, rotation, updateZoneArea); + if (Visible) { UpdateZoneTile(); @@ -263,12 +265,10 @@ public void OnAddVisibleNpcs(params IEnumerable npcs) { foreach (var npc in npcs) { - var playerUpdatePacketAddNpc = npc.GetAddNpcPacket(); - - if (npc is Mount mount && mount.Rider.Guid == Guid) - playerUpdatePacketAddNpc.RiderGuid = 0; + if (npc is Mount) + continue; - SendTunneled(playerUpdatePacketAddNpc); + SendTunneled(npc.GetAddNpcPacket()); } var playerUpdatePacketNpcRelevance = new PlayerUpdatePacketNpcRelevance(); @@ -310,9 +310,20 @@ public void OnAddVisiblePlayers(params IEnumerable players) { foreach (var player in players) { - var playerUpdatePacketAddPc = player.GetAddPcPacket(); - - SendTunneled(playerUpdatePacketAddPc); + if (player.Mount is not null) + { + var addPc = player.GetAddPcPacket(); + addPc.MountGuid = 0; + addPc.MountSeat = -1; + addPc.MountQueuePosition = -1; + addPc.NameVerticalOffset = 0; + + SendTunneled(addPc); + SendTunneled(player.Mount.GetAddNpcPacket()); + SendTunneled(player.Mount.GetMountResponsePacket()); + } + else + SendTunneled(player.GetAddPcPacket()); } foreach (var player in players) @@ -323,28 +334,10 @@ public void OnRemoveVisibleNpcs(params IEnumerable npcs) { foreach (var npc in npcs) { - if (npc is Mount mount) - { - var playerUpdatePacketRemovePlayerGracefully = new PlayerUpdatePacketRemovePlayerGracefully(); - - playerUpdatePacketRemovePlayerGracefully.Guid = npc.Guid; - - playerUpdatePacketRemovePlayerGracefully.Animate = false; - playerUpdatePacketRemovePlayerGracefully.Delay = 0; - playerUpdatePacketRemovePlayerGracefully.EffectDelay = 0; - playerUpdatePacketRemovePlayerGracefully.CompositeEffectId = 46; - playerUpdatePacketRemovePlayerGracefully.Duration = 1000; - - SendTunneled(playerUpdatePacketRemovePlayerGracefully); - } - else - { - var playerUpdatePacketRemovePlayer = new PlayerUpdatePacketRemovePlayer(); - - playerUpdatePacketRemovePlayer.Guid = npc.Guid; + if (npc is Mount) + continue; - SendTunneled(playerUpdatePacketRemovePlayer); - } + SendTunneled(new PlayerUpdatePacketRemovePlayer { Guid = npc.Guid }); } foreach (var npc in npcs) @@ -355,11 +348,10 @@ public void OnRemoveVisiblePlayers(params IEnumerable players) { foreach (var player in players) { - var playerUpdatePacketRemovePlayer = new PlayerUpdatePacketRemovePlayer(); - - playerUpdatePacketRemovePlayer.Guid = player.Guid; + SendTunneled(new PlayerUpdatePacketRemovePlayer { Guid = player.Guid }); - SendTunneled(playerUpdatePacketRemovePlayer); + if (player.Mount is not null) + SendTunneled(new PlayerUpdatePacketRemovePlayer { Guid = player.Mount.Guid }); } foreach (var player in players) @@ -561,14 +553,13 @@ public override int GetHashCode() public void Dispose() { - Mount?.Dispose(); - Mount = null; - foreach (var visiblePlayer in VisiblePlayers) visiblePlayer.Value.OnRemoveVisiblePlayers([this]); - ZoneTile.Entities.Remove(Guid, out _); + Mount?.Dispose(); + Mount = null; + ZoneTile.Entities.Remove(Guid, out _); Zone.TryRemovePlayer(Guid); } } diff --git a/src/Sanctuary.Gateway/Handlers/MountBasePacket/PacketDismountRequestHandler.cs b/src/Sanctuary.Gateway/Handlers/MountBasePacket/PacketDismountRequestHandler.cs index f1f010a..41dc269 100644 --- a/src/Sanctuary.Gateway/Handlers/MountBasePacket/PacketDismountRequestHandler.cs +++ b/src/Sanctuary.Gateway/Handlers/MountBasePacket/PacketDismountRequestHandler.cs @@ -27,21 +27,31 @@ public static bool HandlePacket(GatewayConnection connection) if (connection.Player.Mount is null) return true; - var packetDismountResponse = new PacketDismountResponse(); - - packetDismountResponse.RiderGuid = connection.Player.Guid; - packetDismountResponse.CompositeEffectId = 0; // PFX_Teleport_Flash + var packetDismountResponse = new PacketDismountResponse + { + RiderGuid = connection.Player.Guid, + CompositeEffectId = 0, + }; connection.Player.SendTunneledToVisible(packetDismountResponse, true); - connection.Player.Mount.Dispose(); - connection.Player.Mount = null; - connection.Player.UpdateCharacterStats( CharacterStats.MaxMovementSpeed.Set(8f), CharacterStats.GlideEnabled.Set(0), CharacterStats.JumpHeight.Set(0f)); + connection.Player.SendTunneledToVisible(new PlayerUpdatePacketRemovePlayerGracefully + { + Guid = connection.Player.Mount.Guid, + Animate = false, + Delay = 0, + EffectDelay = 0, + CompositeEffectId = 0, + }, true); + + connection.Player.Mount.Dispose(); + connection.Player.Mount = null; + return true; } } \ No newline at end of file diff --git a/src/Sanctuary.Gateway/Handlers/MountBasePacket/PacketMountSpawnHandler.cs b/src/Sanctuary.Gateway/Handlers/MountBasePacket/PacketMountSpawnHandler.cs index 1ec886f..258f489 100644 --- a/src/Sanctuary.Gateway/Handlers/MountBasePacket/PacketMountSpawnHandler.cs +++ b/src/Sanctuary.Gateway/Handlers/MountBasePacket/PacketMountSpawnHandler.cs @@ -74,24 +74,13 @@ public static void SpawnMount(GatewayConnection connection, PacketMountInfo moun connection.Player.Mount = mount; - mount.UpdatePosition(connection.Player.Position, connection.Player.Rotation); + connection.Player.UpdatePosition(connection.Player.Position, connection.Player.Rotation); - var packetMountResponse = new PacketMountResponse(); + foreach (var visiblePlayer in connection.Player.VisiblePlayers) + visiblePlayer.Value.OnAddVisiblePlayers([connection.Player]); - packetMountResponse.RiderGuid = mount.Rider.Guid; - packetMountResponse.MountGuid = mount.Guid; - - packetMountResponse.Seat = mount.Seat; - - packetMountResponse.QueuePosition = mount.QueuePosition; - - packetMountResponse.Unknown = 1; - - packetMountResponse.CompositeEffectId = 46; // PFX_Teleport_Flash - - packetMountResponse.NameVerticalOffset = mountDefinition.NameVerticalOffset; - - connection.Player.SendTunneledToVisible(packetMountResponse, true); + connection.Player.SendTunneled(mount.GetAddNpcPacket()); + connection.Player.SendTunneled(mount.GetMountResponsePacket()); var mountStats = mountDefinition.Stats; diff --git a/src/Sanctuary.Gateway/Handlers/PacketClientFinishedLoadingHandler.cs b/src/Sanctuary.Gateway/Handlers/PacketClientFinishedLoadingHandler.cs index 61f0515..b187c2e 100644 --- a/src/Sanctuary.Gateway/Handlers/PacketClientFinishedLoadingHandler.cs +++ b/src/Sanctuary.Gateway/Handlers/PacketClientFinishedLoadingHandler.cs @@ -24,33 +24,13 @@ public static bool HandlePacket(GatewayConnection connection) _logger.LogTrace("Received {name} packet.", nameof(PacketClientFinishedLoading)); connection.Player.Visible = true; - connection.Player.UpdatePosition(connection.Player.Position, connection.Player.Rotation); - var mount = connection.Player.Mount; - - if (mount is not null) + if (connection.Player.Mount is not null) { - mount.Visible = true; - - mount.UpdatePosition(connection.Player.Position, connection.Player.Rotation); - - var packetMountResponse = new PacketMountResponse(); - - packetMountResponse.RiderGuid = mount.Rider.Guid; - packetMountResponse.MountGuid = mount.Guid; - - packetMountResponse.Seat = mount.Seat; - - packetMountResponse.QueuePosition = mount.QueuePosition; - - packetMountResponse.Unknown = 1; - - packetMountResponse.CompositeEffectId = 46; // PFX_Teleport_Flash - - // packetMountResponse.NameVerticalOffset = mountDefinition.NameVerticalOffset; + connection.Player.Mount.Visible = true; - connection.Player.SendTunneled(packetMountResponse); + connection.Player.SendTunneled(connection.Player.Mount.GetMountResponsePacket()); } connection.Player.Zone.OnClientFinishedLoading(connection.Player); diff --git a/src/Sanctuary.Gateway/Handlers/PacketWorldTeleportRequestHandler.cs b/src/Sanctuary.Gateway/Handlers/PacketWorldTeleportRequestHandler.cs index 16f0360..c5afb92 100644 --- a/src/Sanctuary.Gateway/Handlers/PacketWorldTeleportRequestHandler.cs +++ b/src/Sanctuary.Gateway/Handlers/PacketWorldTeleportRequestHandler.cs @@ -39,7 +39,6 @@ public static bool HandlePacket(GatewayConnection connection, Span data) var position = player.Position; var rotation = player.Rotation; - connection.Player.Mount?.UpdatePosition(position, rotation); connection.Player.UpdatePosition(position, rotation, updateZoneArea: false); var clientUpdatePacketUpdateLocation = new ClientUpdatePacketUpdateLocation diff --git a/src/Sanctuary.Gateway/Handlers/PacketZoneSafeTeleportRequestHandler.cs b/src/Sanctuary.Gateway/Handlers/PacketZoneSafeTeleportRequestHandler.cs index 48bc43e..c0b41c8 100644 --- a/src/Sanctuary.Gateway/Handlers/PacketZoneSafeTeleportRequestHandler.cs +++ b/src/Sanctuary.Gateway/Handlers/PacketZoneSafeTeleportRequestHandler.cs @@ -50,7 +50,6 @@ public static bool HandlePacket(GatewayConnection connection, Span data) var position = pointOfInterest.SpawnPosition; var rotation = new Quaternion(rotationZ, 0f, rotationX, 0f); - connection.Player.Mount?.UpdatePosition(position, rotation); connection.Player.UpdatePosition(position, rotation, updateZoneArea: false); var clientUpdatePacketUpdateLocation = new ClientUpdatePacketUpdateLocation diff --git a/src/Sanctuary.Gateway/Handlers/PacketZoneTeleportRequestHandler.cs b/src/Sanctuary.Gateway/Handlers/PacketZoneTeleportRequestHandler.cs index 44d43ce..b92c8da 100644 --- a/src/Sanctuary.Gateway/Handlers/PacketZoneTeleportRequestHandler.cs +++ b/src/Sanctuary.Gateway/Handlers/PacketZoneTeleportRequestHandler.cs @@ -46,7 +46,6 @@ public static bool HandlePacket(GatewayConnection connection, Span data) var position = pointOfInterest.SpawnPosition; var rotation = new Quaternion(rotationZ, 0f, rotationX, 0f); - connection.Player.Mount?.UpdatePosition(position, rotation); connection.Player.UpdatePosition(position, rotation, updateZoneArea: false); var clientUpdatePacketUpdateLocation = new ClientUpdatePacketUpdateLocation diff --git a/src/Sanctuary.Gateway/Handlers/PlayerUpdatePacketJumpHandler.cs b/src/Sanctuary.Gateway/Handlers/PlayerUpdatePacketJumpHandler.cs index aa21488..edb548e 100644 --- a/src/Sanctuary.Gateway/Handlers/PlayerUpdatePacketJumpHandler.cs +++ b/src/Sanctuary.Gateway/Handlers/PlayerUpdatePacketJumpHandler.cs @@ -29,7 +29,6 @@ public static bool HandlePacket(GatewayConnection connection, Span data) // _logger.LogTrace("Received {name} packet. ( {packet} )", nameof(PlayerUpdatePacketJump), packet); - connection.Player.Mount?.UpdatePosition(packet.Position, packet.Rotation); connection.Player.UpdatePosition(packet.Position, packet.Rotation); connection.Player.SendTunneledToVisible(packet); diff --git a/src/Sanctuary.Gateway/Handlers/PlayerUpdatePacketUpdatePositionHandler.cs b/src/Sanctuary.Gateway/Handlers/PlayerUpdatePacketUpdatePositionHandler.cs index 66a74e5..5bdb9cd 100644 --- a/src/Sanctuary.Gateway/Handlers/PlayerUpdatePacketUpdatePositionHandler.cs +++ b/src/Sanctuary.Gateway/Handlers/PlayerUpdatePacketUpdatePositionHandler.cs @@ -29,7 +29,6 @@ public static bool HandlePacket(GatewayConnection connection, Span data) // _logger.LogTrace("Received {name} packet. ( {packet} )", nameof(PlayerUpdatePacketUpdatePosition), packet); - connection.Player.Mount?.UpdatePosition(packet.Position, packet.Rotation); connection.Player.UpdatePosition(packet.Position, packet.Rotation); connection.Player.SendTunneledToVisible(packet);