public HairEquipUpdate(Mobile parent) : base(0x2E, 15) { var hue = parent.SolidHueOverride >= 0 ? parent.SolidHueOverride : parent.HairHue; Stream.Write(HairInfo.FakeSerial(parent.Serial)); Stream.Write((short)parent.HairItemID); Stream.Write((byte)0); Stream.Write((byte)Layer.Hair); Stream.Write(parent.Serial); Stream.Write((short)hue); }
public CorpseEquip(Mobile beholder, Corpse beheld) : base(0x89) { List <Item> list = new List <Item>(); for (int a = 0; a < beheld.EquipItems.Count; a++) { list.Add(beheld.EquipItems[a]); } int count = list.Count; if (beheld.Hair != null && beheld.Hair.ItemID > 0) { count++; } if (beheld.FacialHair != null && beheld.FacialHair.ItemID > 0) { count++; } EnsureCapacity(8 + (count * 5)); m_Stream.Write((int)beheld.Serial); for (int i = 0; i < list.Count; ++i) { Item item = list[i]; if (!item.Deleted && beholder.CanSee(item) && item.Parent == beheld) { m_Stream.Write((byte)(item.Layer + 1)); m_Stream.Write((int)item.Serial); } } if (beheld.Hair != null && beheld.Hair.ItemID > 0) { m_Stream.Write((byte)(Layer.Hair + 1)); m_Stream.Write((int)HairInfo.FakeSerial(beheld.Owner) - 2); } if (beheld.FacialHair != null && beheld.FacialHair.ItemID > 0) { m_Stream.Write((byte)(Layer.FacialHair + 1)); m_Stream.Write((int)FacialHairInfo.FakeSerial(beheld.Owner) - 2); } m_Stream.Write((byte)Layer.Invalid); }
public void TestSendRemoveVirtualHair() { var m = new Mobile(0x1024u); m.DefaultMobileInit(); var expected = new RemoveHair(m).Compile(); using var ns = PacketTestUtilities.CreateTestNetState(); ns.SendRemoveHairPacket(HairInfo.FakeSerial(m.Serial)); var result = ns.SendPipe.Reader.TryRead(); AssertThat.Equal(result.Buffer[0].AsSpan(0), expected); }
public void TestSendVirtualHairUpdate() { var m = new Mobile(0x1024u); m.DefaultMobileInit(); var expected = new HairEquipUpdate(m).Compile(); var ns = PacketTestUtilities.CreateTestNetState(); ns.SendHairEquipUpdatePacket(m, HairInfo.FakeSerial(m.Serial), Layer.Hair); var result = ns.SendPipe.Reader.TryRead(); AssertThat.Equal(result.Buffer[0].AsSpan(0), expected); }
public CorpseEquip(Mobile beholder, Corpse beheld) : base(0x89) { var list = beheld.EquipItems; var count = list.Count; if (beheld.Hair?.ItemID > 0) { count++; } if (beheld.FacialHair?.ItemID > 0) { count++; } EnsureCapacity(8 + count * 5); Stream.Write(beheld.Serial); for (var i = 0; i < list.Count; ++i) { var item = list[i]; if (!item.Deleted && beholder.CanSee(item) && item.Parent == beheld) { Stream.Write((byte)(item.Layer + 1)); Stream.Write(item.Serial); } } if (beheld.Hair?.ItemID > 0) { Stream.Write((byte)(Layer.Hair + 1)); Stream.Write(HairInfo.FakeSerial(beheld.Owner.Serial) - 2); } if (beheld.FacialHair?.ItemID > 0) { Stream.Write((byte)(Layer.FacialHair + 1)); Stream.Write(FacialHairInfo.FakeSerial(beheld.Owner.Serial) - 2); } Stream.Write((byte)Layer.Invalid); }
public CorpseEquip(Mobile beholder, Corpse beheld) : base(0x89) { System.Collections.Generic.List <Item> list = beheld.EquipItems; int count = list.Count; if (beheld.Hair != null && beheld.Hair.ItemID > 0) { count++; } if (beheld.FacialHair != null && beheld.FacialHair.ItemID > 0) { count++; } EnsureCapacity(8 + (count * 5)); m_Stream.Write(beheld.Serial); for (int i = 0; i < list.Count; ++i) { Item item = list[i]; if (!item.Deleted && beholder.CanSee(item) && item.Parent == beheld) { m_Stream.Write((byte)(item.Layer + 1)); m_Stream.Write(item.Serial); } } if (beheld.Hair != null && beheld.Hair.ItemID > 0) { m_Stream.Write((byte)(Layer.Hair + 1)); m_Stream.Write(HairInfo.FakeSerial(beheld.Owner) - 2); } if (beheld.FacialHair != null && beheld.FacialHair.ItemID > 0) { m_Stream.Write((byte)(Layer.FacialHair + 1)); m_Stream.Write(FacialHairInfo.FakeSerial(beheld.Owner) - 2); } m_Stream.Write((byte)Layer.Invalid); }
public static void SendCorpseEquip(this NetState ns, Mobile beholder, Corpse beheld) { if (ns.CannotSendPackets()) { return; } var list = beheld.EquipItems; var maxLength = 8 + (list.Count + 2) * 5; var writer = new SpanWriter(stackalloc byte[maxLength]); writer.Write((byte)0x89); writer.Seek(2, SeekOrigin.Current); writer.Write(beheld.Serial); for (var i = 0; i < list.Count; ++i) { var item = list[i]; if (!item.Deleted && beholder.CanSee(item) && item.Parent == beheld) { writer.Write((byte)(item.Layer + 1)); writer.Write(item.Serial); } } if (beheld.Hair?.ItemID > 0) { writer.Write((byte)(Layer.Hair + 1)); writer.Write(HairInfo.FakeSerial(beheld.Owner.Serial) - 2); } if (beheld.FacialHair?.ItemID > 0) { writer.Write((byte)(Layer.FacialHair + 1)); writer.Write(FacialHairInfo.FakeSerial(beheld.Owner.Serial) - 2); } writer.Write((byte)Layer.Invalid); writer.WritePacketLength(); ns.Send(writer.Span); }
public CorpseContent(Mobile beholder, Corpse beheld) : base(0x3C) { var items = beheld.EquipItems; var count = items.Count; if (beheld.Hair?.ItemID > 0) { count++; } if (beheld.FacialHair?.ItemID > 0) { count++; } EnsureCapacity(5 + count * 19); var pos = Stream.Position; var written = 0; Stream.Write((ushort)0); for (var i = 0; i < items.Count; ++i) { var child = items[i]; if (!child.Deleted && child.Parent == beheld && beholder.CanSee(child)) { Stream.Write(child.Serial); Stream.Write((ushort)child.ItemID); Stream.Write((byte)0); // signed, itemID offset Stream.Write((ushort)child.Amount); Stream.Write((short)child.X); Stream.Write((short)child.Y); Stream.Write(beheld.Serial); Stream.Write((ushort)child.Hue); ++written; } } if (beheld.Hair?.ItemID > 0) { Stream.Write(HairInfo.FakeSerial(beheld.Owner.Serial) - 2); Stream.Write((ushort)beheld.Hair.ItemID); Stream.Write((byte)0); // signed, itemID offset Stream.Write((ushort)1); Stream.Write((short)0); Stream.Write((short)0); Stream.Write(beheld.Serial); Stream.Write((ushort)beheld.Hair.Hue); ++written; } if (beheld.FacialHair?.ItemID > 0) { Stream.Write(FacialHairInfo.FakeSerial(beheld.Owner.Serial) - 2); Stream.Write((ushort)beheld.FacialHair.ItemID); Stream.Write((byte)0); // signed, itemID offset Stream.Write((ushort)1); Stream.Write((short)0); Stream.Write((short)0); Stream.Write(beheld.Serial); Stream.Write((ushort)beheld.FacialHair.Hue); ++written; } Stream.Seek(pos, SeekOrigin.Begin); Stream.Write((ushort)written); }
public CorpseContent(Mobile beholder, Corpse beheld) : base(0x3C) { List <Item> items = beheld.EquipItems; int count = items.Count; if (beheld.Hair != null && beheld.Hair.ItemID > 0) { count++; } if (beheld.FacialHair != null && beheld.FacialHair.ItemID > 0) { count++; } EnsureCapacity(5 + (count * 19)); long pos = m_Stream.Position; int written = 0; m_Stream.Write((ushort)0); for (int i = 0; i < items.Count; ++i) { Item child = items[i]; if (!child.Deleted && child.Parent == beheld && beholder.CanSee(child)) { m_Stream.Write((int)child.Serial); m_Stream.Write((ushort)child.ItemID); m_Stream.Write((byte)0); // signed, itemID offset m_Stream.Write((ushort)child.Amount); m_Stream.Write((short)child.X); m_Stream.Write((short)child.Y); m_Stream.Write((int)beheld.Serial); m_Stream.Write((ushort)child.Hue); ++written; } } if (beheld.Hair != null && beheld.Hair.ItemID > 0) { m_Stream.Write((int)HairInfo.FakeSerial(beheld.Owner) - 2); m_Stream.Write((ushort)beheld.Hair.ItemID); m_Stream.Write((byte)0); // signed, itemID offset m_Stream.Write((ushort)1); m_Stream.Write((short)0); m_Stream.Write((short)0); m_Stream.Write((int)beheld.Serial); m_Stream.Write((ushort)beheld.Hair.Hue); ++written; } if (beheld.FacialHair != null && beheld.FacialHair.ItemID > 0) { m_Stream.Write((int)FacialHairInfo.FakeSerial(beheld.Owner) - 2); m_Stream.Write((ushort)beheld.FacialHair.ItemID); m_Stream.Write((byte)0); // signed, itemID offset m_Stream.Write((ushort)1); m_Stream.Write((short)0); m_Stream.Write((short)0); m_Stream.Write((int)beheld.Serial); m_Stream.Write((ushort)beheld.FacialHair.Hue); ++written; } m_Stream.Seek(pos, SeekOrigin.Begin); m_Stream.Write((ushort)written); }
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 MobileIncomingOld(Mobile beholder, Mobile beheld) : base(0x78) { var m_Version = ++m_VersionTL.Value; var m_DupedLayers = m_DupedLayersTL.Value; var eq = beheld.Items; var count = eq.Count; if (beheld.HairItemID > 0) { count++; } if (beheld.FacialHairItemID > 0) { count++; } EnsureCapacity(23 + count * 9); var hue = beheld.Hue; if (beheld.SolidHueOverride >= 0) { hue = beheld.SolidHueOverride; } Stream.Write(beheld.Serial); Stream.Write((short)beheld.Body); Stream.Write((short)beheld.X); Stream.Write((short)beheld.Y); Stream.Write((sbyte)beheld.Z); Stream.Write((byte)beheld.Direction); Stream.Write((short)hue); Stream.Write((byte)beheld.GetOldPacketFlags()); Stream.Write((byte)Notoriety.Compute(beholder, beheld)); for (var i = 0; i < eq.Count; ++i) { var item = eq[i]; var layer = (byte)item.Layer; if (!item.Deleted && beholder.CanSee(item) && m_DupedLayers[layer] != m_Version) { m_DupedLayers[layer] = m_Version; hue = item.Hue; if (beheld.SolidHueOverride >= 0) { hue = beheld.SolidHueOverride; } var itemID = item.ItemID & 0x7FFF; var writeHue = hue != 0; if (writeHue) { itemID |= 0x8000; } Stream.Write(item.Serial); Stream.Write((ushort)itemID); Stream.Write(layer); if (writeHue) { Stream.Write((short)hue); } } } if (beheld.HairItemID > 0) { if (m_DupedLayers[(int)Layer.Hair] != m_Version) { m_DupedLayers[(int)Layer.Hair] = m_Version; hue = beheld.HairHue; if (beheld.SolidHueOverride >= 0) { hue = beheld.SolidHueOverride; } var itemID = beheld.HairItemID & 0x7FFF; var writeHue = hue != 0; if (writeHue) { itemID |= 0x8000; } Stream.Write(HairInfo.FakeSerial(beheld)); Stream.Write((ushort)itemID); Stream.Write((byte)Layer.Hair); if (writeHue) { Stream.Write((short)hue); } } } if (beheld.FacialHairItemID > 0) { if (m_DupedLayers[(int)Layer.FacialHair] != m_Version) { m_DupedLayers[(int)Layer.FacialHair] = m_Version; hue = beheld.FacialHairHue; if (beheld.SolidHueOverride >= 0) { hue = beheld.SolidHueOverride; } var itemID = beheld.FacialHairItemID & 0x7FFF; var writeHue = hue != 0; if (writeHue) { itemID |= 0x8000; } Stream.Write(FacialHairInfo.FakeSerial(beheld)); Stream.Write((ushort)itemID); Stream.Write((byte)Layer.FacialHair); if (writeHue) { Stream.Write((short)hue); } } } Stream.Write(0); // terminate }
public static void SendCorpseContent(this NetState ns, Mobile beholder, Corpse beheld) { if (ns.CannotSendPackets()) { return; } var list = beheld.EquipItems; var hairItemID = beheld.Hair?.ItemID ?? 0; var facialHairItemID = beheld.FacialHair?.ItemID ?? 0; var count = list.Count; if (hairItemID > 0) { count++; } if (facialHairItemID > 0) { count++; } var maxLength = 5 + count * (ns.ContainerGridLines ? 20 : 19); var writer = new SpanWriter(stackalloc byte[maxLength]); writer.Write((byte)0x3C); writer.Seek(4, SeekOrigin.Current); // Length and Count var written = 0; for (var i = 0; i < list.Count; ++i) { var child = list[i]; if (!child.Deleted && child.Parent == beheld && beholder.CanSee(child)) { writer.Write(child.Serial); writer.Write((ushort)child.ItemID); writer.Write((byte)0); // signed, itemID offset writer.Write((ushort)child.Amount); writer.Write((short)child.X); writer.Write((short)child.Y); if (ns.ContainerGridLines) { writer.Write((byte)0); // Grid Location? } writer.Write(beheld.Serial); writer.Write((ushort)child.Hue); ++written; } } if (hairItemID > 0) { writer.Write(HairInfo.FakeSerial(beheld.Owner.Serial) - 2); writer.Write((ushort)hairItemID); writer.Write((byte)0); // signed, itemID offset writer.Write((ushort)1); writer.Write(0); // X/Y if (ns.ContainerGridLines) { writer.Write((byte)0); // Grid Location? } writer.Write(beheld.Serial); writer.Write((ushort)beheld.Hair !.Hue); ++written; } if (facialHairItemID > 0) { writer.Write(FacialHairInfo.FakeSerial(beheld.Owner.Serial) - 2); writer.Write((ushort)facialHairItemID); writer.Write((byte)0); // signed, itemID offset writer.Write((ushort)1); writer.Write(0); // X/Y if (ns.ContainerGridLines) { writer.Write((byte)0); // Grid Location? } writer.Write(beheld.Serial); writer.Write((ushort)beheld.FacialHair !.Hue); ++written; } writer.Seek(1, SeekOrigin.Begin); writer.Write((ushort)writer.BytesWritten); writer.Write((ushort)written); writer.Seek(0, SeekOrigin.End); ns.Send(writer.Span); }
public RemoveHair(Mobile parent) : base(0x1D, 5) { Stream.Write(HairInfo.FakeSerial(parent.Serial)); }