Пример #1
0
        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);
        }
Пример #2
0
        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);
        }
Пример #3
0
        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);
        }
Пример #4
0
        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);
        }
Пример #5
0
        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);
        }
Пример #7
0
        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);
        }
Пример #8
0
        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);
        }
Пример #9
0
        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);
        }
Пример #10
0
        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);
        }
Пример #12
0
        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);
        }
Пример #13
0
        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);
        }
Пример #14
0
        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);
        }
Пример #15
0
        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);
        }
Пример #16
0
        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);
        }
Пример #17
0
        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);
        }
Пример #18
0
        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);
        }