diff --git a/Projects/Server.Tests/Tests/Network/Packets/Outgoing/MapPacketTests.cs b/Projects/Server.Tests/Tests/Network/Packets/Outgoing/MapPacketTests.cs index e59827538..6b23a8926 100644 --- a/Projects/Server.Tests/Tests/Network/Packets/Outgoing/MapPacketTests.cs +++ b/Projects/Server.Tests/Tests/Network/Packets/Outgoing/MapPacketTests.cs @@ -9,54 +9,40 @@ namespace Server.Tests.Network [Fact] public void TestMapPatches() { - var data = new MapPatches().Compile(); + var expected = new MapPatches().Compile(); - Span expectedData = stackalloc byte[] - { - 0xBF, // Packet ID - 0x00, 0x29, // Length - 0x00, 0x18, // Sub-packet - 0x00, 0x00, 0x00, 0x04, // 4 maps - 0x00, 0x00, 0x00, 0x00, // Felucca - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, // Trammel - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, // Ilshenar - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, // Malas - 0x00, 0x00, 0x00, 0x00 - }; + using var ns = PacketTestUtilities.CreateTestNetState(); + ns.SendMapPatches(); - AssertThat.Equal(data, expectedData); + var result = ns.SendPipe.Reader.TryRead(); + AssertThat.Equal(result.Buffer[0].AsSpan(0), expected); } [Fact] public void TestInvalidMapEnable() { - var data = new InvalidMapEnable().Compile(); + var expected = new InvalidMapEnable().Compile(); - Span expectedData = stackalloc byte[] - { - 0xC6 // Packet ID - }; + using var ns = PacketTestUtilities.CreateTestNetState(); + ns.SendInvalidMap(); - AssertThat.Equal(data, expectedData); + var result = ns.SendPipe.Reader.TryRead(); + AssertThat.Equal(result.Buffer[0].AsSpan(0), expected); } - [Fact] - public void TestMapChange() + [Theory] + [InlineData("Felucca")] + [InlineData("Malas")] + public void TestMapChange(string mapName) { - var data = new MapChange(Map.Felucca).Compile(); + var map = Map.Parse(mapName); + var expected = new MapChange(map).Compile(); - Span expectedData = stackalloc byte[] - { - 0xBF, // Packet ID - 0x00, 0x06, // Length - 0x00, 0x08, // Sub-packet - 0x00 // Felucca - }; + using var ns = PacketTestUtilities.CreateTestNetState(); + ns.SendMapChange(map); - AssertThat.Equal(data, expectedData); + var result = ns.SendPipe.Reader.TryRead(); + AssertThat.Equal(result.Buffer[0].AsSpan(0), expected); } } } diff --git a/Projects/Server/Network/Packets/MapPackets.cs b/Projects/Server.Tests/Tests/Network/Packets/Outgoing/MapPackets.cs similarity index 50% rename from Projects/Server/Network/Packets/MapPackets.cs rename to Projects/Server.Tests/Tests/Network/Packets/Outgoing/MapPackets.cs index 1880cbaea..b7bfa8e6e 100644 --- a/Projects/Server/Network/Packets/MapPackets.cs +++ b/Projects/Server.Tests/Tests/Network/Packets/Outgoing/MapPackets.cs @@ -1,23 +1,7 @@ -/************************************************************************* - * ModernUO * - * Copyright 2019-2020 - ModernUO Development Team * - * Email: hi@modernuo.com * - * File: MapPackets.cs * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - *************************************************************************/ - namespace Server.Network { public sealed class MapPatches : Packet { - // TODO: Base this on the client version and expansion public MapPatches() : base(0xBF) { EnsureCapacity(9 + 4 * 8); diff --git a/Projects/Server/Mobiles/Mobile.cs b/Projects/Server/Mobiles/Mobile.cs index 8c4edd256..3f9194dfe 100644 --- a/Projects/Server/Mobiles/Mobile.cs +++ b/Projects/Server/Mobiles/Mobile.cs @@ -2856,14 +2856,11 @@ namespace Server if (ns != null && m_Map != null) { ns.Sequence = 0; - if (Map != null) - { - ns.Send(new MapChange(Map)); - } + ns.SendMapChange(Map); if (!Core.SE && ns.ProtocolChanges < ProtocolChanges.Version6000) { - ns.Send(new MapPatches()); + ns.SendMapPatches(); } ns.Send(SeasonChange.Instantiate(GetSeason(), true)); @@ -2995,14 +2992,11 @@ namespace Server if (ns != null && m_Map != null) { ns.Sequence = 0; - if (Map != null) - { - ns.Send(new MapChange(Map)); - } + ns.SendMapChange(Map); if (!Core.SE && ns.ProtocolChanges < ProtocolChanges.Version6000) { - ns.Send(new MapPatches()); + ns.SendMapPatches(); } ns.Send(SeasonChange.Instantiate(GetSeason(), true)); diff --git a/Projects/Server/Network/Packets/IncomingAccountPackets.cs b/Projects/Server/Network/Packets/IncomingAccountPackets.cs index 5b4c22812..b251a23cd 100644 --- a/Projects/Server/Network/Packets/IncomingAccountPackets.cs +++ b/Projects/Server/Network/Packets/IncomingAccountPackets.cs @@ -303,14 +303,11 @@ namespace Server.Network { state.SendLoginConfirmation(m); - if (m.Map != null) - { - state.Send(new MapChange(m.Map)); - } + state.SendMapChange(m.Map); if (!Core.SE && state.ProtocolChanges < ProtocolChanges.Version6000) { - state.Send(new MapPatches()); + state.SendMapPatches(); } state.Send(SeasonChange.Instantiate(m.GetSeason(), true)); @@ -392,10 +389,7 @@ namespace Server.Network state.SendLoginComplete(); state.Send(new CurrentTime()); state.Send(SeasonChange.Instantiate(m.GetSeason(), true)); - if (m.Map != null) - { - state.Send(new MapChange(m.Map)); - } + state.SendMapChange(m.Map); EventSink.InvokeLogin(m); diff --git a/Projects/Server/Network/Packets/OutgoingLightPackets.cs b/Projects/Server/Network/Packets/OutgoingLightPackets.cs index 1eb7e37db..ae25836f1 100644 --- a/Projects/Server/Network/Packets/OutgoingLightPackets.cs +++ b/Projects/Server/Network/Packets/OutgoingLightPackets.cs @@ -31,7 +31,7 @@ namespace Server.Network writer.Write(serial); writer.Write((byte)level); - ns.Send(ref buffer, 6); + ns.Send(ref buffer, writer.Position); } public static void SendGlobalLightLevel(this NetState ns, int level = 0) diff --git a/Projects/Server/Network/Packets/OutgoingMapPackets.cs b/Projects/Server/Network/Packets/OutgoingMapPackets.cs new file mode 100644 index 000000000..be4fb66d2 --- /dev/null +++ b/Projects/Server/Network/Packets/OutgoingMapPackets.cs @@ -0,0 +1,78 @@ +/************************************************************************* + * ModernUO * + * Copyright 2019-2020 - ModernUO Development Team * + * Email: hi@modernuo.com * + * File: OutgoingMapPackets.cs * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + *************************************************************************/ + +using System.Buffers; + +namespace Server.Network +{ + public static class OutgoingMapPackets + { + public static void SendMapPatches(this NetState ns) + { + if (ns == null || !ns.GetSendBuffer(out var buffer)) + { + return; + } + + var writer = new CircularBufferWriter(buffer); + writer.Write((byte)0xBF); // Packet ID + writer.Write((ushort)41); // Length + writer.Write((ushort)0x18); // Subpacket + writer.Write(4); // Map count? + + writer.Write(Map.Felucca.Tiles.Patch.StaticBlocks); + writer.Write(Map.Felucca.Tiles.Patch.LandBlocks); + + writer.Write(Map.Trammel.Tiles.Patch.StaticBlocks); + writer.Write(Map.Trammel.Tiles.Patch.LandBlocks); + + writer.Write(Map.Ilshenar.Tiles.Patch.StaticBlocks); + writer.Write(Map.Ilshenar.Tiles.Patch.LandBlocks); + + writer.Write(Map.Malas.Tiles.Patch.StaticBlocks); + writer.Write(Map.Malas.Tiles.Patch.LandBlocks); + + ns.Send(ref buffer, writer.Position); + } + + public static void SendInvalidMap(this NetState ns) + { + if (ns == null || !ns.GetSendBuffer(out var buffer)) + { + return; + } + + buffer[0] = 0xC6; // Packet ID + + ns.Send(ref buffer, 1); + } + + public static void SendMapChange(this NetState ns, Map map) + { + if (ns == null || map == null || !ns.GetSendBuffer(out var buffer)) + { + return; + } + + var writer = new CircularBufferWriter(buffer); + writer.Write((byte)0xBF); // Packet ID + writer.Write((ushort)6); // Length + writer.Write((ushort)0x08); // Subpacket + writer.Write((byte)map.MapID); + + ns.Send(ref buffer, writer.Position); + } + } +}