public void TestMobileStatusExtendedSelf(ProtocolChanges changes) { var m = new Mobile(0x1) { Name = "Random Mobile 1" }; m.DefaultMobileInit(); m.Str = 50; m.Hits = 100; m.Int = 75; m.Mana = 100; m.Dex = 25; m.Stam = 100; using var ns = PacketTestUtilities.CreateTestNetState(); ns.ProtocolChanges = changes; var expected = new MobileStatusExtended(m, ns).Compile(); ns.SendMobileStatus(m, m); var result = ns.SendPipe.Reader.TryRead(); AssertThat.Equal(result.Buffer[0].AsSpan(0), expected); }
public void TestSupportedFeatures(ProtocolChanges protocolChanges) { var firstMobile = new Mobile(0x1); firstMobile.DefaultMobileInit(); firstMobile.Name = "Test Mobile"; var account = new TestAccount(new[] { firstMobile, null, null, null, null }); var ns = new NetState( new TestConnectionContext { RemoteEndPoint = IPEndPoint.Parse("127.0.0.1") } ) { Account = account, ProtocolChanges = protocolChanges }; var data = new SupportedFeatures(ns).Compile(); Span <byte> expectedData = stackalloc byte[ns.ExtendedSupportedFeatures ? 5 : 3]; var pos = 0; expectedData[pos++] = 0xB9; // Packet ID var flags = ExpansionInfo.GetFeatures(Expansion.EJ); if (ns.Account.Limit >= 6) { flags |= FeatureFlags.LiveAccount; flags &= ~FeatureFlags.UOTD; if (ns.Account.Limit > 6) { flags |= FeatureFlags.SeventhCharacterSlot; } else { flags |= FeatureFlags.SixthCharacterSlot; } } if (ns.ExtendedSupportedFeatures) { expectedData.Write(ref pos, (uint)flags); } else { expectedData.Write(ref pos, (ushort)flags); } AssertThat.Equal(data, expectedData); }
public void TestMobileIncoming( ProtocolChanges changes, int hairItemId, int hairHue, int facialHairItemId, int facialHairHue ) { var beholder = new Mobile(0x1) { Name = "Random Mobile 1" }; beholder.DefaultMobileInit(); var beheld = new Mobile(0x2) { Name = "Random Mobile 2" }; beheld.DefaultMobileInit(); beheld.AddItem( new Item((Serial)0x1000) { Layer = Layer.OneHanded } ); // Test Dupe beheld.AddItem( new Item((Serial)0x1001) { Layer = Layer.OneHanded } ); beheld.HairItemID = hairItemId; beheld.HairHue = hairHue; beheld.FacialHairItemID = facialHairItemId; beheld.FacialHairHue = facialHairHue; var ns = PacketTestUtilities.CreateTestNetState(); ns.ProtocolChanges = changes; var expected = new MobileIncoming(ns, beholder, beheld).Compile(); ns.SendMobileIncoming(beholder, beheld); var result = ns.SendPipe.Reader.TryRead(); AssertThat.Equal(result.Buffer[0].AsSpan(0), expected); }
public void TestGumpPacketNameChange(ProtocolChanges changes) { var gump = new NameChangeDeedGump(); using var ns = PacketTestUtilities.CreateTestNetState(); ns.ProtocolChanges = changes; var expected = gump.Compile(ns).Compile(); ns.SendDisplayGump(gump, out _, out _); var result = ns.SendPipe.Reader.TryRead(); AssertThat.Equal(result.Buffer[0].AsSpan(0), expected); }
public void TestMapPatches(ProtocolChanges protocolChanges, ClientFlags flags) { var ns = PacketTestUtilities.CreateTestNetState(); ns.ProtocolChanges = protocolChanges; ns.Flags = flags; var expected = ns.ProtocolChanges >= ProtocolChanges.Version6000 ? Span <byte> .Empty : new MapPatches().Compile(); ns.SendMapPatches(); var result = ns.SendPipe.Reader.TryRead(); AssertThat.Equal(result.Buffer[0].AsSpan(0), expected); }
public void TestSendMapDetails(ProtocolChanges changes) { var mapItem = new MapItem(Map.Trammel); var ns = PacketTestUtilities.CreateTestNetState(); ns.ProtocolChanges = changes; var expected = (ns.NewCharacterList ? (Packet) new MapDetailsNew(mapItem) : new MapDetails(mapItem)).Compile(); ns.SendMapDetails(mapItem); var result = ns.SendPipe.Reader.TryRead(); AssertThat.Equal(result.Buffer[0].AsSpan(0), expected); }
public void TestDisplayBuyList(ProtocolChanges protocolChanges) { var vendor = new Mobile(0x1); vendor.DefaultMobileInit(); using var ns = PacketTestUtilities.CreateTestNetState(); ns.ProtocolChanges = protocolChanges; var expected = new DisplayBuyList(vendor.Serial, ns.HighSeas).Compile(); ns.SendDisplayBuyList(vendor.Serial); var result = ns.SendPipe.Reader.TryRead(); AssertThat.Equal(result.Buffer[0].AsSpan(0), expected); }
public void TestMobileMoving(ProtocolChanges protocolChanges) { var m = new Mobile(0x1); m.DefaultMobileInit(); var noto = 10; using var ns = PacketTestUtilities.CreateTestNetState(); ns.ProtocolChanges = protocolChanges; var expected = new MobileMoving(m, noto, ns.StygianAbyss).Compile(); ns.SendMobileMoving(m, noto); var result = ns.SendPipe.Reader.TryRead(); AssertThat.Equal(result.Buffer[0].AsSpan(0), expected); }
public void TestMobileUpdate(ProtocolChanges changes, int solidHueOverride) { var m = new Mobile(0x1); m.DefaultMobileInit(); m.SolidHueOverride = solidHueOverride; using var ns = PacketTestUtilities.CreateTestNetState(); ns.ProtocolChanges = changes; var expected = new MobileUpdate(m, ns.StygianAbyss).Compile(); ns.SendMobileUpdate(m); var result = ns.SendPipe.Reader.TryRead(); AssertThat.Equal(result.Buffer[0].AsSpan(0), expected); }
public void TestMobileStatusExtendedSelf( ProtocolChanges changes, string version, ClientFlags clientFlags, Expansion expansion, int mobileStatusVersion ) { var expansionInfo = ExpansionInfo.GetInfo(Core.Expansion); var oldExpansion = Core.Expansion; var oldVersion = expansionInfo.MobileStatusVersion; Core.Expansion = expansion; ExpansionInfo.GetInfo(Core.Expansion).MobileStatusVersion = mobileStatusVersion; var m = new Mobile((Serial)0x1) { Name = "Random Mobile 1" }; m.DefaultMobileInit(); m.Str = 50; m.Hits = 100; m.Int = 75; m.Mana = 100; m.Dex = 25; m.Stam = 100; var ns = PacketTestUtilities.CreateTestNetState(); ns.ProtocolChanges = changes; ns.Version = new ClientVersion(version); ns.Flags = clientFlags; var expected = new MobileStatusExtended(m, ns).Compile(); ns.SendMobileStatus(m, m); var result = ns.SendPipe.Reader.TryRead(); AssertThat.Equal(result.Buffer[0].AsSpan(0), expected); Core.Expansion = oldExpansion; expansionInfo.MobileStatusVersion = oldVersion; }
// Regression test used to identify an issue with AddItem compilation of the packet public void TestTrackingGump(ProtocolChanges changes) { var pm = new PlayerMobile(); pm.Skills.Tracking.BaseFixedPoint = 1000; var g = new TrackWhatGump(pm); var ns = PacketTestUtilities.CreateTestNetState(); ns.ProtocolChanges = changes; var expected = g.Compile(ns).Compile(); ns.SendDisplayGump(g, out var switches, out var entries); var result = ns.SendPipe.Reader.TryRead(); AssertThat.Equal(result.Buffer[0].AsSpan(0), expected); }
public void TestGumpPacketAdmin(ProtocolChanges changes) { var m = new Mobile(0x1); m.DefaultMobileInit(); m.RawName = "Test Mobile"; m.AccessLevel = AccessLevel.Administrator; var gump = new AdminGump(m, AdminGumpPage.Clients); using var ns = PacketTestUtilities.CreateTestNetState(); ns.ProtocolChanges = changes; var expected = gump.Compile(ns).Compile(); ns.SendDisplayGump(gump, out _, out _); var result = ns.SendPipe.Reader.TryRead(); AssertThat.Equal(result.Buffer[0].AsSpan(0), expected); }
public void TestSupportedFeatures(ProtocolChanges protocolChanges) { var firstMobile = new Mobile(0x1); firstMobile.DefaultMobileInit(); firstMobile.Name = "Test Mobile"; var account = new MockAccount(new[] { firstMobile, null, null, null, null }); using var ns = PacketTestUtilities.CreateTestNetState(); ns.Account = account; ns.ProtocolChanges = protocolChanges; var expected = new SupportedFeatures(ns).Compile(); ns.SendSupportedFeature(); var result = ns.SendPipe.Reader.TryRead(); AssertThat.Equal(result.Buffer[0].AsSpan(0), expected); }
public void TestMobileStatus(ProtocolChanges changes) { var beholder = new Mobile(0x1) { Name = "Random Mobile 1" }; beholder.DefaultMobileInit(); beholder.Str = 50; beholder.Hits = 100; beholder.Int = 75; beholder.Mana = 100; beholder.Dex = 25; beholder.Stam = 100; var beheld = new Mobile(0x2) { Name = "Random Mobile 2" }; beheld.DefaultMobileInit(); beheld.Str = 50; beheld.Hits = 100; beheld.Int = 75; beheld.Mana = 100; beheld.Dex = 25; beheld.Stam = 100; var ns = PacketTestUtilities.CreateTestNetState(); ns.ProtocolChanges = changes; var expected = new MobileStatus(beholder, beheld, ns).Compile(); ns.SendMobileStatus(beholder, beheld); var result = ns.SendPipe.Reader.TryRead(); AssertThat.Equal(result.Buffer[0].AsSpan(0), expected); }
public void TestVendorBuyContent(ProtocolChanges protocolChanges) { var cont = new Container(World.NewItem); var buyStates = new List <BuyItemState> { new("First Item", cont.Serial, World.NewItem, 10, 1, 0x01, 0), new("Second Item", cont.Serial, World.NewItem, 20, 2, 0x0A, 0), new("Third Item", cont.Serial, World.NewItem, 30, 10, 0x0F, 0) }; using var ns = PacketTestUtilities.CreateTestNetState(); ns.ProtocolChanges = protocolChanges; var expected = new VendorBuyContent(buyStates, ns.ContainerGridLines).Compile(); ns.SendVendorBuyContent(buyStates); var result = ns.SendPipe.Reader.TryRead(); AssertThat.Equal(result.Buffer[0].AsSpan(0), expected); }
public void TestCorpseContainerPacket(ProtocolChanges changes) { var m = new Mobile(0x1); m.DefaultMobileInit(); var weapon = new VikingSword(); m.EquipItem(weapon); var c = new Corpse(m, m.Items); using var ns = PacketTestUtilities.CreateTestNetState(); ns.ProtocolChanges = changes; var expected = (ns.ContainerGridLines ? (Packet) new CorpseContent6017(m, c) : new CorpseContent(m, c)).Compile(); ns.SendCorpseContent(m, c); var result = ns.SendPipe.Reader.TryRead(); AssertThat.Equal(result.Buffer[0].AsSpan(0), expected); }
public void TestMobileIncoming( ProtocolChanges protocolChanges, int hairItemId, int hairHue, int facialHairItemId, int facialHairHue ) { var beholder = new Mobile(0x1) { Name = "Random Mobile 1" }; beholder.DefaultMobileInit(); var beheld = new Mobile(0x2) { Name = "Random Mobile 2" }; beheld.DefaultMobileInit(); beheld.AddItem( new Item((Serial)0x1000) { Layer = Layer.OneHanded } ); // Test Dupe beheld.AddItem( new Item((Serial)0x1001) { Layer = Layer.OneHanded } ); beheld.HairItemID = hairItemId; beheld.HairHue = hairHue; beheld.FacialHairItemID = facialHairItemId; beheld.FacialHairHue = facialHairHue; var ns = new NetState(null) { ProtocolChanges = protocolChanges }; var data = new MobileIncoming(ns, beholder, beheld).Compile(); var sa = ns.StygianAbyss; var newPacket = ns.NewMobileIncoming; var itemIdMask = newPacket ? 0xFFFF : 0x7FFF; Span <bool> layers = stackalloc bool[256]; #if NO_LOCAL_INIT layers.Clear(); #endif var items = beheld.Items; var count = items.Count; if (beheld.HairItemID > 0) { count++; } if (beheld.FacialHairItemID > 0) { count++; } var length = 23 + count * 9; // Max Size Span <byte> expectedData = stackalloc byte[length]; var pos = 0; expectedData.Write(ref pos, (byte)0x78); pos += 2; // Length var isSolidHue = beheld.SolidHueOverride >= 0; expectedData.Write(ref pos, beheld.Serial); expectedData.Write(ref pos, (ushort)beheld.Body); expectedData.Write(ref pos, (ushort)beheld.X); expectedData.Write(ref pos, (ushort)beheld.Y); expectedData.Write(ref pos, (byte)beheld.Z); expectedData.Write(ref pos, (byte)beheld.Direction); expectedData.Write(ref pos, (ushort)(isSolidHue ? beheld.SolidHueOverride : beheld.Hue)); expectedData.Write(ref pos, (byte)beheld.GetPacketFlags(sa)); expectedData.Write(ref pos, (byte)Notoriety.Compute(beholder, beheld)); byte layer; for (var i = 0; i < items.Count; i++) { var item = items[i]; layer = (byte)item.Layer; if (!item.Deleted && !layers[layer] && beholder.CanSee(item)) { layers[layer] = true; expectedData.Write(ref pos, item.Serial); var hue = isSolidHue ? beheld.SolidHueOverride : item.Hue; var itemID = item.ItemID & itemIdMask; var writeHue = newPacket || hue != 0; if (!newPacket) { itemID |= 0x8000; } expectedData.Write(ref pos, (ushort)itemID); expectedData.Write(ref pos, layer); if (writeHue) { expectedData.Write(ref pos, (ushort)hue); } } } layer = (byte)Layer.Hair; var itemId = beheld.HairItemID; if (itemId > 0 && !layers[layer]) { expectedData.Write(ref pos, HairInfo.FakeSerial(beheld)); var hue = isSolidHue ? beheld.SolidHueOverride : beheld.HairHue; itemId &= itemIdMask; var writeHue = newPacket || hue != 0; if (!newPacket) { itemId |= 0x8000; } expectedData.Write(ref pos, (ushort)itemId); expectedData.Write(ref pos, layer); if (writeHue) { expectedData.Write(ref pos, (ushort)hue); } } layer = (byte)Layer.FacialHair; itemId = beheld.FacialHairItemID; if (itemId > 0 && !layers[layer]) { expectedData.Write(ref pos, FacialHairInfo.FakeSerial(beheld)); var hue = isSolidHue ? beheld.SolidHueOverride : beheld.FacialHairHue; itemId &= itemIdMask; var writeHue = newPacket || hue != 0; if (!newPacket) { itemId |= 0x8000; } expectedData.Write(ref pos, (ushort)itemId); expectedData.Write(ref pos, layer); if (writeHue) { expectedData.Write(ref pos, (ushort)hue); } } #if NO_LOCAL_INIT expectedData.Write(ref pos, 0); // Zero serial, terminate list #else pos += 4; #endif expectedData.Slice(1, 2).Write((ushort)pos); // Length expectedData = expectedData.Slice(0, pos); AssertThat.Equal(data, expectedData); }
public void TestMobileStatusExtended(ProtocolChanges changes) { var beholder = new Mobile(0x1) { Name = "Random Mobile 1" }; beholder.DefaultMobileInit(); var beheld = new Mobile(0x2) { Name = "Random Mobile 2" }; beheld.DefaultMobileInit(); var ns = new NetState(null) { ProtocolChanges = changes }; var data = new MobileStatus(beholder, beheld, ns).Compile(); Span <byte> expectedData = stackalloc byte[121]; // Max Size var pos = 0; expectedData.Write(ref pos, (byte)0x11); pos += 2; // Length int type; var notSelf = beholder != beheld; if (notSelf) { type = 0; } else if (Core.HS && ns.ExtendedStatus) { type = 6; } else if (Core.ML && ns.SupportsExpansion(Expansion.ML)) { type = 5; } else { type = Core.AOS ? 4 : 3; } expectedData.Write(ref pos, beheld.Serial); expectedData.WriteAsciiFixed(ref pos, beheld.Name, 30); expectedData.WriteReverseAttribute(ref pos, beheld.Hits, beheld.HitsMax, notSelf); expectedData.Write(ref pos, beheld.CanBeRenamedBy(beheld)); expectedData.Write(ref pos, (byte)type); if (type > 0) { expectedData.Write(ref pos, beheld.Female); expectedData.Write(ref pos, (ushort)beheld.Str); expectedData.Write(ref pos, (ushort)beheld.Dex); expectedData.Write(ref pos, (ushort)beheld.Int); expectedData.WriteReverseAttribute(ref pos, beheld.Stam, beheld.StamMax, notSelf); expectedData.WriteReverseAttribute(ref pos, beheld.Mana, beheld.ManaMax, notSelf); expectedData.Write(ref pos, beheld.TotalGold); expectedData.Write( ref pos, (ushort)(Core.AOS ? beheld.PhysicalResistance : (int)(beheld.ArmorRating + 0.5)) ); expectedData.Write(ref pos, (ushort)(Mobile.BodyWeight + beheld.TotalWeight)); if (type >= 5) { expectedData.Write(ref pos, (ushort)beheld.MaxWeight); expectedData.Write(ref pos, (byte)(beheld.Race.RaceID + 1)); // 0x00 for a non-ML enabled account } expectedData.Write(ref pos, (ushort)beheld.StatCap); expectedData.Write(ref pos, (byte)beheld.Followers); expectedData.Write(ref pos, (byte)beheld.FollowersMax); if (type >= 4) { expectedData.Write(ref pos, (ushort)beheld.FireResistance); expectedData.Write(ref pos, (ushort)beheld.ColdResistance); expectedData.Write(ref pos, (ushort)beheld.PoisonResistance); expectedData.Write(ref pos, (ushort)beheld.EnergyResistance); expectedData.Write(ref pos, (ushort)beheld.Luck); } var min = 0; var max = 0; beheld.Weapon?.GetStatusDamage(beheld, out min, out max); expectedData.Write(ref pos, (ushort)min); expectedData.Write(ref pos, (ushort)max); expectedData.Write(ref pos, beheld.TithingPoints); if (type >= 6) { for (var i = 0; i < 15; ++i) { expectedData.Write(ref pos, (ushort)beheld.GetAOSStatus(i)); } } } expectedData.Slice(1, 2).Write((ushort)pos); // Length expectedData = expectedData.Slice(0, pos); AssertThat.Equal(data, expectedData); }