From 69ebb45e59b2e91d85556075a38cd78cdc4acf06 Mon Sep 17 00:00:00 2001 From: Kamron Batman <3953314+kamronbatman@users.noreply.github.com> Date: Thu, 28 May 2020 19:15:34 -0700 Subject: [PATCH] Moves more outgoing packets (#152) --- ...mentPackets.cs => EquipmentPacketTests.cs} | 2 +- Projects/Server/Buffers/BufferReader.cs | 2 - Projects/Server/Network/Packets.cs | 1721 ----------------- .../Packets/Old Packets/AccountPackets.cs | 46 + .../Packets/Old Packets/EffectPackets.cs | 292 +++ .../Packets/Old Packets/GumpPackets.cs | 344 ++++ .../Packets/Old Packets/ItemPackets.cs | 465 +++++ .../Packets/Old Packets/MenuPackets.cs | 13 +- .../Packets/Old Packets/MessagePackets.cs | 166 ++ .../Packets/Old Packets/MobilePackets.cs | 49 +- ...sponse.cs => ObjectHelpResponsePackets.cs} | 0 .../Packets/Old Packets/PlayerPackets.cs | 312 ++- .../Packets/Old Packets/TargetPackets.cs | 87 + ...icodePrompt.cs => UnicodePromptPackets.cs} | 0 Projects/Server/Utilities/Utility.cs | 33 +- 15 files changed, 1778 insertions(+), 1754 deletions(-) rename Projects/Server.Tests/Network/Packets/Old/Outgoing/{TestEquipmentPackets.cs => EquipmentPacketTests.cs} (94%) create mode 100644 Projects/Server/Network/Packets/Old Packets/EffectPackets.cs create mode 100644 Projects/Server/Network/Packets/Old Packets/GumpPackets.cs create mode 100644 Projects/Server/Network/Packets/Old Packets/ItemPackets.cs create mode 100644 Projects/Server/Network/Packets/Old Packets/MessagePackets.cs rename Projects/Server/Network/Packets/Old Packets/{ObjectHelpResponse.cs => ObjectHelpResponsePackets.cs} (100%) create mode 100644 Projects/Server/Network/Packets/Old Packets/TargetPackets.cs rename Projects/Server/Network/Packets/Old Packets/{UnicodePrompt.cs => UnicodePromptPackets.cs} (100%) diff --git a/Projects/Server.Tests/Network/Packets/Old/Outgoing/TestEquipmentPackets.cs b/Projects/Server.Tests/Network/Packets/Old/Outgoing/EquipmentPacketTests.cs similarity index 94% rename from Projects/Server.Tests/Network/Packets/Old/Outgoing/TestEquipmentPackets.cs rename to Projects/Server.Tests/Network/Packets/Old/Outgoing/EquipmentPacketTests.cs index f28828e20..25ab2f020 100644 --- a/Projects/Server.Tests/Network/Packets/Old/Outgoing/TestEquipmentPackets.cs +++ b/Projects/Server.Tests/Network/Packets/Old/Outgoing/EquipmentPacketTests.cs @@ -4,7 +4,7 @@ using Xunit; namespace Server.Tests.Network.Packets { - public class TestEquipmentPackets : IClassFixture + public class EquipmentPacketTests : IClassFixture { [Fact] public void TestDisplayEquipmentInfo() diff --git a/Projects/Server/Buffers/BufferReader.cs b/Projects/Server/Buffers/BufferReader.cs index b534ef704..673af7d20 100644 --- a/Projects/Server/Buffers/BufferReader.cs +++ b/Projects/Server/Buffers/BufferReader.cs @@ -73,10 +73,8 @@ namespace System.Buffers get { if (length < 0) - { // Cast-away readonly to initialize lazy field Volatile.Write(ref Unsafe.AsRef(length), sequence.Length); - } return length; } diff --git a/Projects/Server/Network/Packets.cs b/Projects/Server/Network/Packets.cs index 10b518207..043a0da78 100644 --- a/Projects/Server/Network/Packets.cs +++ b/Projects/Server/Network/Packets.cs @@ -19,29 +19,12 @@ ***************************************************************************/ using System; -using System.Buffers; -using System.Collections.Generic; -using System.IO; using System.Net; -using System.Text; using System.Threading; using Server.Accounting; -using Server.Compression; -using Server.Gumps; -using Server.Items; -using Server.Targeting; namespace Server.Network { - public enum PMMessage : byte - { - CharNoExist = 1, - CharExists = 2, - CharInWorld = 5, - LoginSyncError = 6, - IdleWarning = 7 - } - public enum LRReason : byte { CannotLift = 0, @@ -52,1578 +35,6 @@ namespace Server.Network Inspecific = 5 } - [Flags] - public enum CMEFlags - { - None = 0x00, - Disabled = 0x01, - Arrow = 0x02, - Highlighted = 0x04, - Colored = 0x20 - } - - public sealed class DisplayProfile : Packet - { - public DisplayProfile(bool realSerial, Mobile m, string header, string body, string footer) : base(0xB8) - { - header ??= ""; - body ??= ""; - footer ??= ""; - - EnsureCapacity(12 + header.Length + footer.Length * 2 + body.Length * 2); - - Stream.Write(realSerial ? m.Serial : Serial.Zero); - Stream.WriteAsciiNull(header); - Stream.WriteBigUniNull(footer); - Stream.WriteBigUniNull(body); - } - } - - public sealed class CloseGump : Packet - { - public CloseGump(int typeID, int buttonID) : base(0xBF) - { - EnsureCapacity(13); - - Stream.Write((short)0x04); - Stream.Write(typeID); - Stream.Write(buttonID); - } - } - - public sealed class WorldItem : Packet - { - public WorldItem(Item item) : base(0x1A) - { - EnsureCapacity(20); - - // 14 base length - // +2 - Amount - // +2 - Hue - // +1 - Flags - - var serial = item.Serial.Value; - var itemID = item.ItemID & 0x3FFF; - var amount = item.Amount; - var loc = item.Location; - var x = loc.m_X; - var y = loc.m_Y; - var hue = item.Hue; - var flags = item.GetPacketFlags(); - var direction = (int)item.Direction; - - if (amount != 0) - serial |= 0x80000000; - else - serial &= 0x7FFFFFFF; - - Stream.Write(serial); - - if (item is BaseMulti) - Stream.Write((short)(itemID | 0x4000)); - else - Stream.Write((short)itemID); - - if (amount != 0) Stream.Write((short)amount); - - x &= 0x7FFF; - - if (direction != 0) x |= 0x8000; - - Stream.Write((short)x); - - y &= 0x3FFF; - - if (hue != 0) y |= 0x8000; - - if (flags != 0) y |= 0x4000; - - Stream.Write((short)y); - - if (direction != 0) - Stream.Write((byte)direction); - - Stream.Write((sbyte)loc.m_Z); - - if (hue != 0) - Stream.Write((ushort)hue); - - if (flags != 0) - Stream.Write((byte)flags); - } - } - - public sealed class WorldItemSA : Packet - { - public WorldItemSA(Item item) : base(0xF3, 24) - { - Stream.Write((short)0x1); - - var itemID = item.ItemID; - - if (item is BaseMulti) - { - Stream.Write((byte)0x02); - - Stream.Write(item.Serial); - - itemID &= 0x3FFF; - - Stream.Write((short)itemID); - - Stream.Write((byte)0); - /*} else if ( ) { - m_Stream.Write( (byte) 0x01 ); - - m_Stream.Write( (int) item.Serial ); - - m_Stream.Write( (short) itemID ); - - m_Stream.Write( (byte) item.Direction );*/ - } - else - { - Stream.Write((byte)0x00); - - Stream.Write(item.Serial); - - itemID &= 0x7FFF; - - Stream.Write((short)itemID); - - Stream.Write((byte)0); - } - - var amount = item.Amount; - Stream.Write((short)amount); - Stream.Write((short)amount); - - var loc = item.Location; - var x = loc.m_X & 0x7FFF; - var y = loc.m_Y & 0x3FFF; - Stream.Write((short)x); - Stream.Write((short)y); - Stream.Write((sbyte)loc.m_Z); - - Stream.Write((byte)item.Light); - Stream.Write((short)item.Hue); - Stream.Write((byte)item.GetPacketFlags()); - } - } - - public sealed class WorldItemHS : Packet - { - public WorldItemHS(Item item) : base(0xF3, 26) - { - Stream.Write((short)0x1); - - var itemID = item.ItemID; - - if (item is BaseMulti) - { - Stream.Write((byte)0x02); - - Stream.Write(item.Serial); - - itemID &= 0x3FFF; - - Stream.Write((ushort)itemID); - - Stream.Write((byte)0); - /*} else if ( ) { - m_Stream.Write( (byte) 0x01 ); - - m_Stream.Write( (int) item.Serial ); - - m_Stream.Write( (ushort) itemID ); - - m_Stream.Write( (byte) item.Direction );*/ - } - else - { - Stream.Write((byte)0x00); - - Stream.Write(item.Serial); - - itemID &= 0xFFFF; - - Stream.Write((ushort)itemID); - - Stream.Write((byte)0); - } - - var amount = item.Amount; - Stream.Write((short)amount); - Stream.Write((short)amount); - - var loc = item.Location; - var x = loc.m_X & 0x7FFF; - var y = loc.m_Y & 0x3FFF; - Stream.Write((short)x); - Stream.Write((short)y); - Stream.Write((sbyte)loc.m_Z); - - Stream.Write((byte)item.Light); - Stream.Write((short)item.Hue); - Stream.Write((byte)item.GetPacketFlags()); - - Stream.Write((short)0x00); // ?? - } - } - - public sealed class LiftRej : Packet - { - public LiftRej(LRReason reason) : base(0x27, 2) - { - Stream.Write((byte)reason); - } - } - - public sealed class LogoutAck : Packet - { - public LogoutAck() : base(0xD1, 2) - { - Stream.Write((byte)0x01); - } - } - - public sealed class Weather : Packet - { - public Weather(int v1, int v2, int v3) : base(0x65, 4) - { - Stream.Write((byte)v1); - Stream.Write((byte)v2); - Stream.Write((byte)v3); - } - } - - /// - /// Causes the client to walk in a given direction. It does not send a movement request. - /// - public sealed class PlayerMove : Packet - { - public PlayerMove(Direction d) : base(0x97, 2) - { - Stream.Write((byte)d); - - // @4C63B0 - } - } - - /// - /// Asks the client for it's version - /// - public sealed class ClientVersionReq : Packet - { - public ClientVersionReq() : base(0xBD) - { - EnsureCapacity(3); - } - } - - public enum EffectType - { - Moving = 0x00, - Lightning = 0x01, - FixedXYZ = 0x02, - FixedFrom = 0x03 - } - - public class ParticleEffect : Packet - { - public ParticleEffect(EffectType type, Serial from, Serial to, int itemID, Point3D fromPoint, Point3D toPoint, - int speed, int duration, bool fixedDirection, bool explode, int hue, int renderMode, int effect, - int explodeEffect, int explodeSound, Serial serial, int layer, int unknown) : base(0xC7, 49) - { - Stream.Write((byte)type); - Stream.Write(from); - Stream.Write(to); - Stream.Write((short)itemID); - Stream.Write((short)fromPoint.m_X); - Stream.Write((short)fromPoint.m_Y); - Stream.Write((sbyte)fromPoint.m_Z); - Stream.Write((short)toPoint.m_X); - Stream.Write((short)toPoint.m_Y); - Stream.Write((sbyte)toPoint.m_Z); - Stream.Write((byte)speed); - Stream.Write((byte)duration); - Stream.Write((byte)0); - Stream.Write((byte)0); - Stream.Write(fixedDirection); - Stream.Write(explode); - Stream.Write(hue); - Stream.Write(renderMode); - Stream.Write((short)effect); - Stream.Write((short)explodeEffect); - Stream.Write((short)explodeSound); - Stream.Write(serial); - Stream.Write((byte)layer); - Stream.Write((short)unknown); - } - - public ParticleEffect(EffectType type, Serial from, Serial to, int itemID, IPoint3D fromPoint, IPoint3D toPoint, - int speed, int duration, bool fixedDirection, bool explode, int hue, int renderMode, int effect, - int explodeEffect, int explodeSound, Serial serial, int layer, int unknown) : base(0xC7, 49) - { - Stream.Write((byte)type); - Stream.Write(from); - Stream.Write(to); - Stream.Write((short)itemID); - Stream.Write((short)fromPoint.X); - Stream.Write((short)fromPoint.Y); - Stream.Write((sbyte)fromPoint.Z); - Stream.Write((short)toPoint.X); - Stream.Write((short)toPoint.Y); - Stream.Write((sbyte)toPoint.Z); - Stream.Write((byte)speed); - Stream.Write((byte)duration); - Stream.Write((byte)0); - Stream.Write((byte)0); - Stream.Write(fixedDirection); - Stream.Write(explode); - Stream.Write(hue); - Stream.Write(renderMode); - Stream.Write((short)effect); - Stream.Write((short)explodeEffect); - Stream.Write((short)explodeSound); - Stream.Write(serial); - Stream.Write((byte)layer); - Stream.Write((short)unknown); - } - } - - public class HuedEffect : Packet - { - public HuedEffect(EffectType type, Serial from, Serial to, int itemID, Point3D fromPoint, Point3D toPoint, int speed, - int duration, bool fixedDirection, bool explode, int hue, int renderMode) : base(0xC0, 36) - { - Stream.Write((byte)type); - Stream.Write(from); - Stream.Write(to); - Stream.Write((short)itemID); - Stream.Write((short)fromPoint.m_X); - Stream.Write((short)fromPoint.m_Y); - Stream.Write((sbyte)fromPoint.m_Z); - Stream.Write((short)toPoint.m_X); - Stream.Write((short)toPoint.m_Y); - Stream.Write((sbyte)toPoint.m_Z); - Stream.Write((byte)speed); - Stream.Write((byte)duration); - Stream.Write((byte)0); - Stream.Write((byte)0); - Stream.Write(fixedDirection); - Stream.Write(explode); - Stream.Write(hue); - Stream.Write(renderMode); - } - - public HuedEffect(EffectType type, Serial from, Serial to, int itemID, IPoint3D fromPoint, IPoint3D toPoint, - int speed, int duration, bool fixedDirection, bool explode, int hue, int renderMode) : base(0xC0, 36) - { - Stream.Write((byte)type); - Stream.Write(from); - Stream.Write(to); - Stream.Write((short)itemID); - Stream.Write((short)fromPoint.X); - Stream.Write((short)fromPoint.Y); - Stream.Write((sbyte)fromPoint.Z); - Stream.Write((short)toPoint.X); - Stream.Write((short)toPoint.Y); - Stream.Write((sbyte)toPoint.Z); - Stream.Write((byte)speed); - Stream.Write((byte)duration); - Stream.Write((byte)0); - Stream.Write((byte)0); - Stream.Write(fixedDirection); - Stream.Write(explode); - Stream.Write(hue); - Stream.Write(renderMode); - } - } - - public sealed class TargetParticleEffect : ParticleEffect - { - public TargetParticleEffect(IEntity e, int itemID, int speed, int duration, int hue, int renderMode, int effect, - int layer, int unknown) : base(EffectType.FixedFrom, e.Serial, Serial.Zero, itemID, e.Location, e.Location, - speed, duration, true, false, hue, renderMode, effect, 1, 0, e.Serial, layer, unknown) - { - } - } - - public sealed class TargetEffect : HuedEffect - { - public TargetEffect(IEntity e, int itemID, int speed, int duration, int hue, int renderMode) : base( - EffectType.FixedFrom, e.Serial, Serial.Zero, itemID, e.Location, e.Location, speed, duration, true, false, hue, - renderMode) - { - } - } - - public sealed class LocationParticleEffect : ParticleEffect - { - public LocationParticleEffect(IEntity e, int itemID, int speed, int duration, int hue, int renderMode, int effect, - int unknown) : base(EffectType.FixedXYZ, e.Serial, Serial.Zero, itemID, e.Location, e.Location, speed, duration, - true, false, hue, renderMode, effect, 1, 0, e.Serial, 255, unknown) - { - } - } - - public sealed class LocationEffect : HuedEffect - { - public LocationEffect(IPoint3D p, int itemID, int speed, int duration, int hue, int renderMode) : base( - EffectType.FixedXYZ, Serial.Zero, Serial.Zero, itemID, p, p, speed, duration, true, false, hue, renderMode) - { - } - } - - public sealed class MovingParticleEffect : ParticleEffect - { - public MovingParticleEffect(IEntity from, IEntity to, int itemID, int speed, int duration, bool fixedDirection, - bool explodes, int hue, int renderMode, int effect, int explodeEffect, int explodeSound, EffectLayer layer, - int unknown) : base(EffectType.Moving, from.Serial, to.Serial, itemID, from.Location, to.Location, speed, - duration, fixedDirection, explodes, hue, renderMode, effect, explodeEffect, explodeSound, Serial.Zero, - (int)layer, unknown) - { - } - } - - public sealed class MovingEffect : HuedEffect - { - public MovingEffect(IEntity from, IEntity to, int itemID, int speed, int duration, bool fixedDirection, - bool explodes, int hue, int renderMode) : base(EffectType.Moving, from.Serial, to.Serial, itemID, from.Location, - to.Location, speed, duration, fixedDirection, explodes, hue, renderMode) - { - } - } - - public enum ScreenEffectType - { - FadeOut = 0x00, - FadeIn = 0x01, - LightFlash = 0x02, - FadeInOut = 0x03, - DarkFlash = 0x04 - } - - public class ScreenEffect : Packet - { - public ScreenEffect(ScreenEffectType type) - : base(0x70, 28) - { - Stream.Write((byte)0x04); - Stream.Fill(8); - Stream.Write((short)type); - Stream.Fill(16); - } - } - - public sealed class ScreenFadeOut : ScreenEffect - { - public static readonly Packet Instance = SetStatic(new ScreenFadeOut()); - - public ScreenFadeOut() - : base(ScreenEffectType.FadeOut) - { - } - } - - public sealed class ScreenFadeIn : ScreenEffect - { - public static readonly Packet Instance = SetStatic(new ScreenFadeIn()); - - public ScreenFadeIn() - : base(ScreenEffectType.FadeIn) - { - } - } - - public sealed class ScreenFadeInOut : ScreenEffect - { - public static readonly Packet Instance = SetStatic(new ScreenFadeInOut()); - - public ScreenFadeInOut() - : base(ScreenEffectType.FadeInOut) - { - } - } - - public sealed class ScreenLightFlash : ScreenEffect - { - public static readonly Packet Instance = SetStatic(new ScreenLightFlash()); - - public ScreenLightFlash() - : base(ScreenEffectType.LightFlash) - { - } - } - - public sealed class ScreenDarkFlash : ScreenEffect - { - public static readonly Packet Instance = SetStatic(new ScreenDarkFlash()); - - public ScreenDarkFlash() - : base(ScreenEffectType.DarkFlash) - { - } - } - - public enum DeleteResultType - { - PasswordInvalid, - CharNotExist, - CharBeingPlayed, - CharTooYoung, - CharQueued, - BadRequest - } - - public sealed class DeleteResult : Packet - { - public DeleteResult(DeleteResultType res) : base(0x85, 2) - { - Stream.Write((byte)res); - } - } - - /*public sealed class MovingEffect : Packet - { - public MovingEffect( IEntity from, IEntity to, int itemID, int speed, int duration, bool fixedDirection, bool turn, int hue, int renderMode ) : base( 0xC0, 36 ) - { - m_Stream.Write( (byte) 0x00 ); - m_Stream.Write( (int) from.Serial ); - m_Stream.Write( (int) to.Serial ); - m_Stream.Write( (short) itemID ); - m_Stream.Write( (short) from.Location.m_X ); - m_Stream.Write( (short) from.Location.m_Y ); - m_Stream.Write( (sbyte) from.Location.m_Z ); - m_Stream.Write( (short) to.Location.m_X ); - m_Stream.Write( (short) to.Location.m_Y ); - m_Stream.Write( (sbyte) to.Location.m_Z ); - m_Stream.Write( (byte) speed ); - m_Stream.Write( (byte) duration ); - m_Stream.Write( (byte) 0 ); - m_Stream.Write( (byte) 0 ); - m_Stream.Write( (bool) fixedDirection ); - m_Stream.Write( (bool) turn ); - m_Stream.Write( (int) hue ); - m_Stream.Write( (int) renderMode ); - } - }*/ - - /*public sealed class LocationEffect : Packet - { - public LocationEffect( IPoint3D p, int itemID, int duration, int hue, int renderMode ) : base( 0xC0, 36 ) - { - m_Stream.Write( (byte) 0x02 ); - m_Stream.Write( (int) Serial.Zero ); - m_Stream.Write( (int) Serial.Zero ); - m_Stream.Write( (short) itemID ); - m_Stream.Write( (short) p.X ); - m_Stream.Write( (short) p.Y ); - m_Stream.Write( (sbyte) p.Z ); - m_Stream.Write( (short) p.X ); - m_Stream.Write( (short) p.Y ); - m_Stream.Write( (sbyte) p.Z ); - m_Stream.Write( (byte) 10 ); - m_Stream.Write( (byte) duration ); - m_Stream.Write( (byte) 0 ); - m_Stream.Write( (byte) 0 ); - m_Stream.Write( (byte) 1 ); - m_Stream.Write( (byte) 0 ); - m_Stream.Write( (int) hue ); - m_Stream.Write( (int) renderMode ); - } - }*/ - - public sealed class BoltEffect : Packet - { - public BoltEffect(IEntity target, int hue) : base(0xC0, 36) - { - Stream.Write((byte)0x01); // type - Stream.Write(target.Serial); - Stream.Write(Serial.Zero); - Stream.Write((short)0); // itemID - Stream.Write((short)target.X); - Stream.Write((short)target.Y); - Stream.Write((sbyte)target.Z); - Stream.Write((short)target.X); - Stream.Write((short)target.Y); - Stream.Write((sbyte)target.Z); - Stream.Write((byte)0); // speed - Stream.Write((byte)0); // duration - Stream.Write((short)0); // unk - Stream.Write(false); // fixed direction - Stream.Write(false); // explode - Stream.Write(hue); - Stream.Write(0); // render mode - } - } - - public sealed class DisplaySpellbook : Packet - { - public DisplaySpellbook(Item book) : base(0x24, 7) - { - Stream.Write(book.Serial); - Stream.Write((short)-1); - } - } - - public sealed class DisplaySpellbookHS : Packet - { - public DisplaySpellbookHS(Item book) : base(0x24, 9) - { - Stream.Write(book.Serial); - Stream.Write((short)-1); - Stream.Write((short)0x7D); - } - } - - public sealed class NewSpellbookContent : Packet - { - public NewSpellbookContent(Item item, int graphic, int offset, ulong content) : base(0xBF) - { - EnsureCapacity(23); - - Stream.Write((short)0x1B); - Stream.Write((short)0x01); - - Stream.Write(item.Serial); - Stream.Write((short)graphic); - Stream.Write((short)offset); - - for (var i = 0; i < 8; ++i) - Stream.Write((byte)(content >> (i * 8))); - } - } - - public sealed class SpellbookContent : Packet - { - public SpellbookContent(int count, int offset, ulong content, Item item) : base(0x3C) - { - EnsureCapacity(5 + count * 19); - - var written = 0; - - Stream.Write((ushort)0); - - ulong mask = 1; - - for (var i = 0; i < 64; ++i, mask <<= 1) - if ((content & mask) != 0) - { - Stream.Write(0x7FFFFFFF - i); - Stream.Write((ushort)0); - Stream.Write((byte)0); - Stream.Write((ushort)(i + offset)); - Stream.Write((short)0); - Stream.Write((short)0); - Stream.Write(item.Serial); - Stream.Write((short)0); - - ++written; - } - - Stream.Seek(3, SeekOrigin.Begin); - Stream.Write((ushort)written); - } - } - - public sealed class SpellbookContent6017 : Packet - { - public SpellbookContent6017(int count, int offset, ulong content, Item item) : base(0x3C) - { - EnsureCapacity(5 + count * 20); - - var written = 0; - - Stream.Write((ushort)0); - - ulong mask = 1; - - for (var i = 0; i < 64; ++i, mask <<= 1) - if ((content & mask) != 0) - { - Stream.Write(0x7FFFFFFF - i); - Stream.Write((ushort)0); - Stream.Write((byte)0); - Stream.Write((ushort)(i + offset)); - Stream.Write((short)0); - Stream.Write((short)0); - Stream.Write((byte)0); // Grid Location? - Stream.Write(item.Serial); - Stream.Write((short)0); - - ++written; - } - - Stream.Seek(3, SeekOrigin.Begin); - Stream.Write((ushort)written); - } - } - - public sealed class ContainerDisplay : Packet - { - public ContainerDisplay(Container c) : base(0x24, 7) - { - Stream.Write(c.Serial); - Stream.Write((short)c.GumpID); - } - } - - public sealed class ContainerDisplayHS : Packet - { - public ContainerDisplayHS(Container c) : base(0x24, 9) - { - Stream.Write(c.Serial); - Stream.Write((short)c.GumpID); - Stream.Write((short)0x7D); - } - } - - public sealed class ContainerContentUpdate : Packet - { - public ContainerContentUpdate(Item item) : base(0x25, 20) - { - Serial parentSerial; - - if (item.Parent is Item parentItem) - { - parentSerial = parentItem.Serial; - } - else - { - Console.WriteLine("Warning: ContainerContentUpdate on item with !(parent is Item)"); - parentSerial = Serial.Zero; - } - - Stream.Write(item.Serial); - Stream.Write((ushort)item.ItemID); - Stream.Write((byte)0); // signed, itemID offset - Stream.Write((ushort)Math.Min(item.Amount, ushort.MaxValue)); - Stream.Write((short)item.X); - Stream.Write((short)item.Y); - Stream.Write(parentSerial); - Stream.Write((ushort)(item.QuestItem ? Item.QuestItemHue : item.Hue)); - } - } - - public sealed class ContainerContentUpdate6017 : Packet - { - public ContainerContentUpdate6017(Item item) : base(0x25, 21) - { - Serial parentSerial; - - if (item.Parent is Item parentItem) - { - parentSerial = parentItem.Serial; - } - else - { - Console.WriteLine("Warning: ContainerContentUpdate on item with !(parent is Item)"); - parentSerial = Serial.Zero; - } - - Stream.Write(item.Serial); - Stream.Write((ushort)item.ItemID); - Stream.Write((byte)0); // signed, itemID offset - Stream.Write((ushort)Math.Min(item.Amount, ushort.MaxValue)); - Stream.Write((short)item.X); - Stream.Write((short)item.Y); - Stream.Write((byte)0); // Grid Location? - Stream.Write(parentSerial); - Stream.Write((ushort)(item.QuestItem ? Item.QuestItemHue : item.Hue)); - } - } - - public sealed class ContainerContent : Packet - { - public ContainerContent(Mobile beholder, Item beheld) : base(0x3C) - { - var items = beheld.Items; - var count = items.Count; - - EnsureCapacity(5 + count * 19); - - var pos = Stream.Position; - - var written = 0; - - Stream.Write((ushort)0); - - for (var i = 0; i < count; ++i) - { - var child = items[i]; - - if (!child.Deleted && beholder.CanSee(child)) - { - var loc = child.Location; - - Stream.Write(child.Serial); - Stream.Write((ushort)child.ItemID); - Stream.Write((byte)0); // signed, itemID offset - Stream.Write((ushort)Math.Min(child.Amount, ushort.MaxValue)); - Stream.Write((short)loc.m_X); - Stream.Write((short)loc.m_Y); - Stream.Write(beheld.Serial); - Stream.Write((ushort)(child.QuestItem ? Item.QuestItemHue : child.Hue)); - - ++written; - } - } - - Stream.Seek(pos, SeekOrigin.Begin); - Stream.Write((ushort)written); - } - } - - public sealed class ContainerContent6017 : Packet - { - public ContainerContent6017(Mobile beholder, Item beheld) : base(0x3C) - { - var items = beheld.Items; - var count = items.Count; - - EnsureCapacity(5 + count * 20); - - var pos = Stream.Position; - - var written = 0; - - Stream.Write((ushort)0); - - for (var i = 0; i < count; ++i) - { - var child = items[i]; - - if (!child.Deleted && beholder.CanSee(child)) - { - var loc = child.Location; - - Stream.Write(child.Serial); - Stream.Write((ushort)child.ItemID); - Stream.Write((byte)0); // signed, itemID offset - Stream.Write((ushort)Math.Min(child.Amount, ushort.MaxValue)); - Stream.Write((short)loc.m_X); - Stream.Write((short)loc.m_Y); - Stream.Write((byte)0); // Grid Location? - Stream.Write(beheld.Serial); - Stream.Write((ushort)(child.QuestItem ? Item.QuestItemHue : child.Hue)); - - ++written; - } - } - - Stream.Seek(pos, SeekOrigin.Begin); - Stream.Write((ushort)written); - } - } - - public sealed class SetWarMode : Packet - { - public static readonly Packet InWarMode = SetStatic(new SetWarMode(true)); - public static readonly Packet InPeaceMode = SetStatic(new SetWarMode(false)); - - public SetWarMode(bool mode) : base(0x72, 5) - { - Stream.Write(mode); - Stream.Write((byte)0x00); - Stream.Write((byte)0x32); - Stream.Write((byte)0x00); - // m_Stream.Fill(); - } - - public static Packet Instantiate(bool mode) => mode ? InWarMode : InPeaceMode; - } - - public sealed class Swing : Packet - { - public Swing(int flag, Mobile attacker, Mobile defender) : base(0x2F, 10) - { - Stream.Write((byte)flag); - Stream.Write(attacker.Serial); - Stream.Write(defender.Serial); - } - } - - public sealed class NullFastwalkStack : Packet - { - public NullFastwalkStack() : base(0xBF) - { - EnsureCapacity(256); - Stream.Write((short)0x1); - Stream.Write(0x0); - Stream.Write(0x0); - Stream.Write(0x0); - Stream.Write(0x0); - Stream.Write(0x0); - Stream.Write(0x0); - } - } - - public sealed class RemoveEntity : Packet - { - public RemoveEntity(IEntity entity) : base(0x1D, 5) - { - Stream.Write(entity.Serial); - } - } - - public sealed class ServerChange : Packet - { - public ServerChange(Mobile m, Map map) : base(0x76, 16) - { - Stream.Write((short)m.X); - Stream.Write((short)m.Y); - Stream.Write((short)m.Z); - Stream.Write((byte)0); - Stream.Write((short)0); - Stream.Write((short)0); - Stream.Write((short)map.Width); - Stream.Write((short)map.Height); - } - } - - public sealed class SkillUpdate : Packet - { - public SkillUpdate(Skills skills) : base(0x3A) - { - EnsureCapacity(6 + skills.Length * 9); - - Stream.Write((byte)0x02); // type: absolute, capped - - for (var i = 0; i < skills.Length; ++i) - { - var s = skills[i]; - - var v = s.NonRacialValue; - var uv = (int)(v * 10); - - if (uv < 0) - uv = 0; - else if (uv >= 0x10000) - uv = 0xFFFF; - - Stream.Write((ushort)(s.Info.SkillID + 1)); - Stream.Write((ushort)uv); - Stream.Write((ushort)s.BaseFixedPoint); - Stream.Write((byte)s.Lock); - Stream.Write((ushort)s.CapFixedPoint); - } - - Stream.Write((short)0); // terminate - } - } - - public sealed class Sequence : Packet - { - public Sequence(int num) : base(0x7B, 2) - { - Stream.Write((byte)num); - } - } - - public sealed class SkillChange : Packet - { - public SkillChange(Skill skill) : base(0x3A) - { - EnsureCapacity(13); - - var v = skill.NonRacialValue; - var uv = (int)(v * 10); - - if (uv < 0) - uv = 0; - else if (uv >= 0x10000) - uv = 0xFFFF; - - Stream.Write((byte)0xDF); // type: delta, capped - Stream.Write((ushort)skill.Info.SkillID); - Stream.Write((ushort)uv); - Stream.Write((ushort)skill.BaseFixedPoint); - Stream.Write((byte)skill.Lock); - Stream.Write((ushort)skill.CapFixedPoint); - - /*m_Stream.Write( (short) skill.Info.SkillID ); - m_Stream.Write( (short) (skill.Value * 10.0) ); - m_Stream.Write( (short) (skill.Base * 10.0) ); - m_Stream.Write( (byte) skill.Lock ); - m_Stream.Write( (short) skill.CapFixedPoint );*/ - } - } - - public sealed class LaunchBrowser : Packet - { - public LaunchBrowser(Uri uri) : this(uri.AbsoluteUri) - { - } - - public LaunchBrowser(string url) : base(0xA5) - { - url ??= ""; - - EnsureCapacity(4 + url.Length); - - Stream.WriteAsciiNull(url); - } - } - - public sealed class MessageLocalized : Packet - { - private static readonly MessageLocalized[] m_Cache_IntLoc = new MessageLocalized[15000]; - private static readonly MessageLocalized[] m_Cache_CliLoc = new MessageLocalized[100000]; - private static readonly MessageLocalized[] m_Cache_CliLocCmp = new MessageLocalized[5000]; - - public MessageLocalized(Serial serial, int graphic, MessageType type, int hue, int font, int number, string name, - string args) : base(0xC1) - { - name ??= ""; - args ??= ""; - - if (hue == 0) - hue = 0x3B2; - - EnsureCapacity(50 + args.Length * 2); - - Stream.Write(serial); - Stream.Write((short)graphic); - Stream.Write((byte)type); - Stream.Write((short)hue); - Stream.Write((short)font); - Stream.Write(number); - Stream.WriteAsciiFixed(name, 30); - Stream.WriteLittleUniNull(args); - } - - public static MessageLocalized InstantiateGeneric(int number) - { - MessageLocalized[] cache = null; - var index = 0; - - if (number >= 3000000) - { - cache = m_Cache_IntLoc; - index = number - 3000000; - } - else if (number >= 1000000) - { - cache = m_Cache_CliLoc; - index = number - 1000000; - } - else if (number >= 500000) - { - cache = m_Cache_CliLocCmp; - index = number - 500000; - } - - MessageLocalized p; - - if (cache != null && index >= 0 && index < cache.Length) - { - p = cache[index]; - - if (p == null) - { - cache[index] = p = new MessageLocalized(Serial.MinusOne, -1, MessageType.Regular, 0x3B2, 3, number, - "System", ""); - p.SetStatic(); - } - } - else - { - p = new MessageLocalized(Serial.MinusOne, -1, MessageType.Regular, 0x3B2, 3, number, "System", ""); - } - - return p; - } - } - - public sealed class MobileMoving : Packet - { - public MobileMoving(Mobile m, int noto) : base(0x77, 17) - { - var loc = m.Location; - - var hue = m.Hue; - - if (m.SolidHueOverride >= 0) - hue = m.SolidHueOverride; - - Stream.Write(m.Serial); - Stream.Write((short)m.Body); - Stream.Write((short)loc.m_X); - Stream.Write((short)loc.m_Y); - Stream.Write((sbyte)loc.m_Z); - Stream.Write((byte)m.Direction); - Stream.Write((short)hue); - Stream.Write((byte)m.GetPacketFlags()); - Stream.Write((byte)noto); - } - } - - // Pre-7.0.0.0 Mobile Moving - public sealed class MobileMovingOld : Packet - { - public MobileMovingOld(Mobile m, int noto) : base(0x77, 17) - { - var loc = m.Location; - - var hue = m.Hue; - - if (m.SolidHueOverride >= 0) - hue = m.SolidHueOverride; - - Stream.Write(m.Serial); - Stream.Write((short)m.Body); - Stream.Write((short)loc.m_X); - Stream.Write((short)loc.m_Y); - Stream.Write((sbyte)loc.m_Z); - Stream.Write((byte)m.Direction); - Stream.Write((short)hue); - Stream.Write((byte)m.GetOldPacketFlags()); - Stream.Write((byte)noto); - } - } - - public sealed class MultiTargetReqHS : Packet - { - public MultiTargetReqHS(MultiTarget t) : base(0x99, 30) - { - Stream.Write(t.AllowGround); - Stream.Write(t.TargetID); - Stream.Write((byte)t.Flags); - - Stream.Fill(); - - Stream.Seek(18, SeekOrigin.Begin); - Stream.Write((short)t.MultiID); - Stream.Write((short)t.Offset.X); - Stream.Write((short)t.Offset.Y); - Stream.Write((short)t.Offset.Z); - - // DWORD Hue - } - } - - public sealed class MultiTargetReq : Packet - { - public MultiTargetReq(MultiTarget t) : base(0x99, 26) - { - Stream.Write(t.AllowGround); - Stream.Write(t.TargetID); - Stream.Write((byte)t.Flags); - - Stream.Fill(); - - Stream.Seek(18, SeekOrigin.Begin); - Stream.Write((short)t.MultiID); - Stream.Write((short)t.Offset.X); - Stream.Write((short)t.Offset.Y); - Stream.Write((short)t.Offset.Z); - } - } - - public sealed class CancelTarget : Packet - { - public static readonly Packet Instance = SetStatic(new CancelTarget()); - - public CancelTarget() : base(0x6C, 19) - { - Stream.Write((byte)0); - Stream.Write(0); - Stream.Write((byte)3); - Stream.Fill(); - } - } - - public sealed class TargetReq : Packet - { - public TargetReq(Target t) : base(0x6C, 19) - { - Stream.Write(t.AllowGround); - Stream.Write(t.TargetID); - Stream.Write((byte)t.Flags); - Stream.Fill(); - } - } - - public sealed class DragEffect : Packet - { - public DragEffect(IEntity src, IEntity trg, int itemID, int hue, int amount) : base(0x23, 26) - { - Stream.Write((short)itemID); - Stream.Write((byte)0); - Stream.Write((short)hue); - Stream.Write((short)amount); - Stream.Write(src.Serial); - Stream.Write((short)src.X); - Stream.Write((short)src.Y); - Stream.Write((sbyte)src.Z); - Stream.Write(trg.Serial); - Stream.Write((short)trg.X); - Stream.Write((short)trg.Y); - Stream.Write((sbyte)trg.Z); - } - } - - public interface IGumpWriter - { - int TextEntries { get; set; } - int Switches { get; set; } - - void AppendLayout(bool val); - void AppendLayout(int val); - void AppendLayout(uint val); - void AppendLayoutNS(int val); - void AppendLayout(string text); - void AppendLayout(byte[] buffer); - void WriteStrings(List strings); - void Flush(); - } - - public sealed class DisplayGumpPacked : Packet, IGumpWriter - { - private static readonly byte[] m_True = Gump.StringToBuffer(" 1"); - private static readonly byte[] m_False = Gump.StringToBuffer(" 0"); - - private static readonly byte[] m_BeginTextSeparator = Gump.StringToBuffer(" @"); - private static readonly byte[] m_EndTextSeparator = Gump.StringToBuffer("@"); - - private static readonly byte[] m_Buffer = new byte[48]; - - private readonly Gump m_Gump; - - private readonly PacketWriter m_Layout; - - private int m_StringCount; - private readonly PacketWriter m_Strings; - - static DisplayGumpPacked() => m_Buffer[0] = (byte)' '; - - public DisplayGumpPacked(Gump gump) - : base(0xDD) - { - m_Gump = gump; - - m_Layout = PacketWriter.CreateInstance(8192); - m_Strings = PacketWriter.CreateInstance(8192); - } - - public int TextEntries { get; set; } - - public int Switches { get; set; } - - public void AppendLayout(bool val) - { - AppendLayout(val ? m_True : m_False); - } - - public void AppendLayout(int val) - { - var toString = val.ToString(); - var bytes = Encoding.ASCII.GetBytes(toString, 0, toString.Length, m_Buffer, 1) + 1; - - m_Layout.Write(m_Buffer, 0, bytes); - } - - public void AppendLayout(uint val) - { - var toString = val.ToString(); - var bytes = Encoding.ASCII.GetBytes(toString, 0, toString.Length, m_Buffer, 1) + 1; - - m_Layout.Write(m_Buffer, 0, bytes); - } - - public void AppendLayoutNS(int val) - { - var toString = val.ToString(); - var bytes = Encoding.ASCII.GetBytes(toString, 0, toString.Length, m_Buffer, 1); - - m_Layout.Write(m_Buffer, 1, bytes); - } - - public void AppendLayout(string text) - { - AppendLayout(m_BeginTextSeparator); - - m_Layout.WriteAsciiFixed(text, text.Length); - - AppendLayout(m_EndTextSeparator); - } - - public void AppendLayout(byte[] buffer) - { - m_Layout.Write(buffer, 0, buffer.Length); - } - - public void WriteStrings(List strings) - { - m_StringCount = strings.Count; - - for (var i = 0; i < strings.Count; ++i) - { - var v = strings[i] ?? ""; - - m_Strings.Write((ushort)v.Length); - m_Strings.WriteBigUniFixed(v, v.Length); - } - } - - public void Flush() - { - EnsureCapacity(28 + (int)m_Layout.Length + (int)m_Strings.Length); - - Stream.Write(m_Gump.Serial); - Stream.Write(m_Gump.TypeID); - Stream.Write(m_Gump.X); - Stream.Write(m_Gump.Y); - - // Note: layout MUST be null terminated (don't listen to krrios) - m_Layout.Write((byte)0); - WritePacked(m_Layout); - - Stream.Write(m_StringCount); - - WritePacked(m_Strings); - - PacketWriter.ReleaseInstance(m_Layout); - PacketWriter.ReleaseInstance(m_Strings); - } - - private void WritePacked(PacketWriter src) - { - var buffer = src.UnderlyingStream.GetBuffer(); - var length = (int)src.Length; - - if (length == 0) - { - Stream.Write(0); - return; - } - - var wantLength = 1 + buffer.Length * 1024 / 1000; - - wantLength += 4095; - wantLength &= ~4095; - - var packBuffer = ArrayPool.Shared.Rent(wantLength); - - var packLength = wantLength; - - ZLib.Pack(packBuffer, ref packLength, buffer, length, ZLibQuality.Default); - - Stream.Write(4 + packLength); - Stream.Write(length); - Stream.Write(packBuffer, 0, packLength); - - ArrayPool.Shared.Return(packBuffer); - } - } - - public sealed class DisplayGumpFast : Packet, IGumpWriter - { - private static readonly byte[] m_True = Gump.StringToBuffer(" 1"); - private static readonly byte[] m_False = Gump.StringToBuffer(" 0"); - - private static readonly byte[] m_BeginTextSeparator = Gump.StringToBuffer(" @"); - private static readonly byte[] m_EndTextSeparator = Gump.StringToBuffer("@"); - - private readonly byte[] m_Buffer = new byte[48]; - private int m_LayoutLength; - - public DisplayGumpFast(Gump g) : base(0xB0) - { - m_Buffer[0] = (byte)' '; - - EnsureCapacity(4096); - - Stream.Write(g.Serial); - Stream.Write(g.TypeID); - Stream.Write(g.X); - Stream.Write(g.Y); - Stream.Write((ushort)0xFFFF); - } - - public int TextEntries { get; set; } - - public int Switches { get; set; } - - public void AppendLayout(bool val) - { - AppendLayout(val ? m_True : m_False); - } - - public void AppendLayout(int val) - { - var toString = val.ToString(); - var bytes = Encoding.ASCII.GetBytes(toString, 0, toString.Length, m_Buffer, 1) + 1; - - Stream.Write(m_Buffer, 0, bytes); - m_LayoutLength += bytes; - } - - public void AppendLayout(uint val) - { - var toString = val.ToString(); - var bytes = Encoding.ASCII.GetBytes(toString, 0, toString.Length, m_Buffer, 1) + 1; - - Stream.Write(m_Buffer, 0, bytes); - m_LayoutLength += bytes; - } - - public void AppendLayoutNS(int val) - { - var toString = val.ToString(); - var bytes = Encoding.ASCII.GetBytes(toString, 0, toString.Length, m_Buffer, 1); - - Stream.Write(m_Buffer, 1, bytes); - m_LayoutLength += bytes; - } - - public void AppendLayout(string text) - { - AppendLayout(m_BeginTextSeparator); - - var length = text.Length; - Stream.WriteAsciiFixed(text, length); - m_LayoutLength += length; - - AppendLayout(m_EndTextSeparator); - } - - public void AppendLayout(byte[] buffer) - { - var length = buffer.Length; - Stream.Write(buffer, 0, length); - m_LayoutLength += length; - } - - public void WriteStrings(List text) - { - Stream.Seek(19, SeekOrigin.Begin); - Stream.Write((ushort)m_LayoutLength); - Stream.Seek(0, SeekOrigin.End); - - Stream.Write((ushort)text.Count); - - for (var i = 0; i < text.Count; ++i) - { - var v = text[i] ?? ""; - - int length = (ushort)v.Length; - - Stream.Write((ushort)length); - Stream.WriteBigUniFixed(v, length); - } - } - - public void Flush() - { - } - } - - public sealed class DisplayGump : Packet - { - public DisplayGump(Gump g, string layout, string[] text) : base(0xB0) - { - layout ??= ""; - - EnsureCapacity(256); - - Stream.Write(g.Serial); - Stream.Write(g.TypeID); - Stream.Write(g.X); - Stream.Write(g.Y); - Stream.Write((ushort)(layout.Length + 1)); - Stream.WriteAsciiNull(layout); - - Stream.Write((ushort)text.Length); - - for (var i = 0; i < text.Length; ++i) - { - var v = text[i] ?? ""; - - var length = (ushort)v.Length; - - Stream.Write(length); - Stream.WriteBigUniFixed(v, length); - } - } - } - - public sealed class DisplayPaperdoll : Packet - { - public DisplayPaperdoll(Mobile m, string text, bool canLift) : base(0x88, 66) - { - byte flags = 0x00; - - if (m.Warmode) - flags |= 0x01; - - if (canLift) - flags |= 0x02; - - Stream.Write(m.Serial); - Stream.WriteAsciiFixed(text, 60); - Stream.Write(flags); - } - } - - public sealed class PopupMessage : Packet - { - public PopupMessage(PMMessage msg) : base(0x53, 2) - { - Stream.Write((byte)msg); - } - } - - public sealed class PlaySound : Packet - { - public PlaySound(int soundID, IPoint3D target) : base(0x54, 12) - { - Stream.Write((byte)1); // flags - Stream.Write((short)soundID); - Stream.Write((short)0); // volume - Stream.Write((short)target.X); - Stream.Write((short)target.Y); - Stream.Write((short)target.Z); - } - } - - public sealed class PlayMusic : Packet - { - public static readonly Packet InvalidInstance = SetStatic(new PlayMusic(MusicName.Invalid)); - - private static readonly Packet[] m_Instances = new Packet[60]; - - public PlayMusic(MusicName name) : base(0x6D, 3) - { - Stream.Write((short)name); - } - - public static Packet GetInstance(MusicName name) - { - if (name == MusicName.Invalid) - return InvalidInstance; - - var v = (int)name; - Packet p; - - if (v >= 0 && v < m_Instances.Length) - { - p = m_Instances[v]; - - if (p == null) - m_Instances[v] = p = SetStatic(new PlayMusic(name)); - } - else - { - p = new PlayMusic(name); - } - - return p; - } - } - public sealed class ScrollMessage : Packet { public ScrollMessage(int type, int tip, string text) : base(0xA6) @@ -1662,46 +73,6 @@ namespace Server.Network } } - public sealed class SeasonChange : Packet - { - private static readonly SeasonChange[][] m_Cache = new SeasonChange[][] - { - new SeasonChange[2], - new SeasonChange[2], - new SeasonChange[2], - new SeasonChange[2], - new SeasonChange[2] - }; - - public SeasonChange(int season, bool playSound = true) : base(0xBC, 3) - { - Stream.Write((byte)season); - Stream.Write(playSound); - } - - public static SeasonChange Instantiate(int season) => Instantiate(season, true); - - public static SeasonChange Instantiate(int season, bool playSound) - { - if (season >= 0 && season < m_Cache.Length) - { - var idx = playSound ? 1 : 0; - - var p = m_Cache[season][idx]; - - if (p == null) - { - m_Cache[season][idx] = p = new SeasonChange(season, playSound); - p.SetStatic(); - } - - return p; - } - - return new SeasonChange(season, playSound); - } - } - public sealed class SupportedFeatures : Packet { public SupportedFeatures(NetState ns) : base(0xB9, ns.ExtendedSupportedFeatures ? 5 : 3) @@ -2555,53 +926,6 @@ namespace Server.Network } } - public sealed class AsciiMessage : Packet - { - public AsciiMessage(Serial serial, int graphic, MessageType type, int hue, int font, string name, string text) : base(0x1C) - { - name ??= ""; - text ??= ""; - - if (hue == 0) - hue = 0x3B2; - - EnsureCapacity(45 + text.Length); - - Stream.Write(serial); - Stream.Write((short)graphic); - Stream.Write((byte)type); - Stream.Write((short)hue); - Stream.Write((short)font); - Stream.WriteAsciiFixed(name, 30); - Stream.WriteAsciiNull(text); - } - } - - public sealed class UnicodeMessage : Packet - { - public UnicodeMessage(Serial serial, int graphic, MessageType type, int hue, int font, string lang, string name, - string text) : base(0xAE) - { - if (string.IsNullOrEmpty(lang)) lang = "ENU"; - name ??= ""; - text ??= ""; - - if (hue == 0) - hue = 0x3B2; - - EnsureCapacity(50 + text.Length * 2); - - Stream.Write(serial); - Stream.Write((short)graphic); - Stream.Write((byte)type); - Stream.Write((short)hue); - Stream.Write((short)font); - Stream.WriteAsciiFixed(lang, 4); - Stream.WriteAsciiFixed(name, 30); - Stream.WriteBigUniNull(text); - } - } - public sealed class PingAck : Packet { private static readonly PingAck[] m_Cache = new PingAck[0x100]; @@ -2891,33 +1215,6 @@ namespace Server.Network System = 0x02 } - public sealed class MessageLocalizedAffix : Packet - { - public MessageLocalizedAffix(Serial serial, int graphic, MessageType messageType, int hue, int font, int number, - string name, AffixType affixType, string affix, string args) : base(0xCC) - { - name ??= ""; - affix ??= ""; - args ??= ""; - - if (hue == 0) - hue = 0x3B2; - - EnsureCapacity(52 + affix.Length + args.Length * 2); - - Stream.Write(serial); - Stream.Write((short)graphic); - Stream.Write((byte)messageType); - Stream.Write((short)hue); - Stream.Write((short)font); - Stream.Write(number); - Stream.Write((byte)affixType); - Stream.WriteAsciiFixed(name, 30); - Stream.WriteAsciiNull(affix); - Stream.WriteBigUniNull(args); - } - } - public sealed class ServerInfo { public ServerInfo(string name, int fullPercent, TimeZoneInfo tz, IPEndPoint address) @@ -2969,24 +1266,6 @@ namespace Server.Network } } - public sealed class DisplaySignGump : Packet - { - public DisplaySignGump(Serial serial, int gumpID, string unknown, string caption) : base(0x8B) - { - unknown ??= ""; - caption ??= ""; - - EnsureCapacity(16 + unknown.Length + caption.Length); - - Stream.Write(serial); - Stream.Write((short)gumpID); - Stream.Write((short)unknown.Length); - Stream.WriteAsciiFixed(unknown, unknown.Length); - Stream.Write((short)(caption.Length + 1)); - Stream.WriteAsciiFixed(caption, caption.Length + 1); - } - } - public sealed class PlayServerAck : Packet { internal static int m_AuthID = -1; diff --git a/Projects/Server/Network/Packets/Old Packets/AccountPackets.cs b/Projects/Server/Network/Packets/Old Packets/AccountPackets.cs index c06aa3963..5e9c68d73 100644 --- a/Projects/Server/Network/Packets/Old Packets/AccountPackets.cs +++ b/Projects/Server/Network/Packets/Old Packets/AccountPackets.cs @@ -22,6 +22,25 @@ using Server.Accounting; namespace Server.Network { + public enum PMMessage : byte + { + CharNoExist = 1, + CharExists = 2, + CharInWorld = 5, + LoginSyncError = 6, + IdleWarning = 7 + } + + public enum DeleteResultType + { + PasswordInvalid, + CharNotExist, + CharBeingPlayed, + CharTooYoung, + CharQueued, + BadRequest + } + public sealed class ChangeCharacter : Packet { public ChangeCharacter(IAccount a) : base(0x81) @@ -56,4 +75,31 @@ namespace Server.Network } } } + + /// + /// Asks the client for it's version + /// + public sealed class ClientVersionReq : Packet + { + public ClientVersionReq() : base(0xBD) + { + EnsureCapacity(3); + } + } + + public sealed class DeleteResult : Packet + { + public DeleteResult(DeleteResultType res) : base(0x85, 2) + { + Stream.Write((byte)res); + } + } + + public sealed class PopupMessage : Packet + { + public PopupMessage(PMMessage msg) : base(0x53, 2) + { + Stream.Write((byte)msg); + } + } } diff --git a/Projects/Server/Network/Packets/Old Packets/EffectPackets.cs b/Projects/Server/Network/Packets/Old Packets/EffectPackets.cs new file mode 100644 index 000000000..03d348df6 --- /dev/null +++ b/Projects/Server/Network/Packets/Old Packets/EffectPackets.cs @@ -0,0 +1,292 @@ +/************************************************************************* + * ModernUO * + * Copyright (C) 2019-2020 - ModernUO Development Team * + * Email: hi@modernuo.com * + * File: EffectPackets.cs - Created: 2020/05/26 - Updated: 2020/05/26 * + * * + * 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. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + *************************************************************************/ + +namespace Server.Network +{ + public enum EffectType + { + Moving, + Lightning, + FixedXYZ, + FixedFrom + } + + public class ParticleEffect : Packet + { + public ParticleEffect(EffectType type, Serial from, Serial to, int itemID, Point3D fromPoint, Point3D toPoint, + int speed, int duration, bool fixedDirection, bool explode, int hue, int renderMode, int effect, + int explodeEffect, int explodeSound, Serial serial, int layer, int unknown) : base(0xC7, 49) + { + Stream.Write((byte)type); + Stream.Write(from); + Stream.Write(to); + Stream.Write((short)itemID); + Stream.Write((short)fromPoint.m_X); + Stream.Write((short)fromPoint.m_Y); + Stream.Write((sbyte)fromPoint.m_Z); + Stream.Write((short)toPoint.m_X); + Stream.Write((short)toPoint.m_Y); + Stream.Write((sbyte)toPoint.m_Z); + Stream.Write((byte)speed); + Stream.Write((byte)duration); + Stream.Write((byte)0); + Stream.Write((byte)0); + Stream.Write(fixedDirection); + Stream.Write(explode); + Stream.Write(hue); + Stream.Write(renderMode); + Stream.Write((short)effect); + Stream.Write((short)explodeEffect); + Stream.Write((short)explodeSound); + Stream.Write(serial); + Stream.Write((byte)layer); + Stream.Write((short)unknown); + } + + public ParticleEffect(EffectType type, Serial from, Serial to, int itemID, IPoint3D fromPoint, IPoint3D toPoint, + int speed, int duration, bool fixedDirection, bool explode, int hue, int renderMode, int effect, + int explodeEffect, int explodeSound, Serial serial, int layer, int unknown) : base(0xC7, 49) + { + Stream.Write((byte)type); + Stream.Write(from); + Stream.Write(to); + Stream.Write((short)itemID); + Stream.Write((short)fromPoint.X); + Stream.Write((short)fromPoint.Y); + Stream.Write((sbyte)fromPoint.Z); + Stream.Write((short)toPoint.X); + Stream.Write((short)toPoint.Y); + Stream.Write((sbyte)toPoint.Z); + Stream.Write((byte)speed); + Stream.Write((byte)duration); + Stream.Write((byte)0); + Stream.Write((byte)0); + Stream.Write(fixedDirection); + Stream.Write(explode); + Stream.Write(hue); + Stream.Write(renderMode); + Stream.Write((short)effect); + Stream.Write((short)explodeEffect); + Stream.Write((short)explodeSound); + Stream.Write(serial); + Stream.Write((byte)layer); + Stream.Write((short)unknown); + } + } + + public class HuedEffect : Packet + { + public HuedEffect(EffectType type, Serial from, Serial to, int itemID, Point3D fromPoint, Point3D toPoint, int speed, + int duration, bool fixedDirection, bool explode, int hue, int renderMode) : base(0xC0, 36) + { + Stream.Write((byte)type); + Stream.Write(from); + Stream.Write(to); + Stream.Write((short)itemID); + Stream.Write((short)fromPoint.m_X); + Stream.Write((short)fromPoint.m_Y); + Stream.Write((sbyte)fromPoint.m_Z); + Stream.Write((short)toPoint.m_X); + Stream.Write((short)toPoint.m_Y); + Stream.Write((sbyte)toPoint.m_Z); + Stream.Write((byte)speed); + Stream.Write((byte)duration); + Stream.Write((byte)0); + Stream.Write((byte)0); + Stream.Write(fixedDirection); + Stream.Write(explode); + Stream.Write(hue); + Stream.Write(renderMode); + } + + public HuedEffect(EffectType type, Serial from, Serial to, int itemID, IPoint3D fromPoint, IPoint3D toPoint, + int speed, int duration, bool fixedDirection, bool explode, int hue, int renderMode) : base(0xC0, 36) + { + Stream.Write((byte)type); + Stream.Write(from); + Stream.Write(to); + Stream.Write((short)itemID); + Stream.Write((short)fromPoint.X); + Stream.Write((short)fromPoint.Y); + Stream.Write((sbyte)fromPoint.Z); + Stream.Write((short)toPoint.X); + Stream.Write((short)toPoint.Y); + Stream.Write((sbyte)toPoint.Z); + Stream.Write((byte)speed); + Stream.Write((byte)duration); + Stream.Write((byte)0); + Stream.Write((byte)0); + Stream.Write(fixedDirection); + Stream.Write(explode); + Stream.Write(hue); + Stream.Write(renderMode); + } + } + + public sealed class TargetParticleEffect : ParticleEffect + { + public TargetParticleEffect(IEntity e, int itemID, int speed, int duration, int hue, int renderMode, int effect, + int layer, int unknown) : base(EffectType.FixedFrom, e.Serial, Serial.Zero, itemID, e.Location, e.Location, + speed, duration, true, false, hue, renderMode, effect, 1, 0, e.Serial, layer, unknown) + { + } + } + + public sealed class TargetEffect : HuedEffect + { + public TargetEffect(IEntity e, int itemID, int speed, int duration, int hue, int renderMode) : base( + EffectType.FixedFrom, e.Serial, Serial.Zero, itemID, e.Location, e.Location, speed, duration, true, false, hue, + renderMode) + { + } + } + + public sealed class LocationParticleEffect : ParticleEffect + { + public LocationParticleEffect(IEntity e, int itemID, int speed, int duration, int hue, int renderMode, int effect, + int unknown) : base(EffectType.FixedXYZ, e.Serial, Serial.Zero, itemID, e.Location, e.Location, speed, duration, + true, false, hue, renderMode, effect, 1, 0, e.Serial, 255, unknown) + { + } + } + + public sealed class LocationEffect : HuedEffect + { + public LocationEffect(IPoint3D p, int itemID, int speed, int duration, int hue, int renderMode) : base( + EffectType.FixedXYZ, Serial.Zero, Serial.Zero, itemID, p, p, speed, duration, true, false, hue, renderMode) + { + } + } + + public sealed class MovingParticleEffect : ParticleEffect + { + public MovingParticleEffect(IEntity from, IEntity to, int itemID, int speed, int duration, bool fixedDirection, + bool explodes, int hue, int renderMode, int effect, int explodeEffect, int explodeSound, EffectLayer layer, + int unknown) : base(EffectType.Moving, from.Serial, to.Serial, itemID, from.Location, to.Location, speed, + duration, fixedDirection, explodes, hue, renderMode, effect, explodeEffect, explodeSound, Serial.Zero, + (int)layer, unknown) + { + } + } + + public sealed class MovingEffect : HuedEffect + { + public MovingEffect(IEntity from, IEntity to, int itemID, int speed, int duration, bool fixedDirection, + bool explodes, int hue, int renderMode) : base(EffectType.Moving, from.Serial, to.Serial, itemID, from.Location, + to.Location, speed, duration, fixedDirection, explodes, hue, renderMode) + { + } + } + + public enum ScreenEffectType + { + FadeOut = 0x00, + FadeIn = 0x01, + LightFlash = 0x02, + FadeInOut = 0x03, + DarkFlash = 0x04 + } + + public class ScreenEffect : Packet + { + public ScreenEffect(ScreenEffectType type) + : base(0x70, 28) + { + Stream.Write((byte)0x04); + Stream.Fill(8); + Stream.Write((short)type); + Stream.Fill(16); + } + } + + public sealed class ScreenFadeOut : ScreenEffect + { + public static readonly Packet Instance = SetStatic(new ScreenFadeOut()); + + public ScreenFadeOut() + : base(ScreenEffectType.FadeOut) + { + } + } + + public sealed class ScreenFadeIn : ScreenEffect + { + public static readonly Packet Instance = SetStatic(new ScreenFadeIn()); + + public ScreenFadeIn() + : base(ScreenEffectType.FadeIn) + { + } + } + + public sealed class ScreenFadeInOut : ScreenEffect + { + public static readonly Packet Instance = SetStatic(new ScreenFadeInOut()); + + public ScreenFadeInOut() + : base(ScreenEffectType.FadeInOut) + { + } + } + + public sealed class ScreenLightFlash : ScreenEffect + { + public static readonly Packet Instance = SetStatic(new ScreenLightFlash()); + + public ScreenLightFlash() + : base(ScreenEffectType.LightFlash) + { + } + } + + public sealed class ScreenDarkFlash : ScreenEffect + { + public static readonly Packet Instance = SetStatic(new ScreenDarkFlash()); + + public ScreenDarkFlash() + : base(ScreenEffectType.DarkFlash) + { + } + } + + public sealed class BoltEffect : Packet + { + public BoltEffect(IEntity target, int hue) : base(0xC0, 36) + { + Stream.Write((byte)0x01); // type + Stream.Write(target.Serial); + Stream.Write(Serial.Zero); + Stream.Write((short)0); // itemID + Stream.Write((short)target.X); + Stream.Write((short)target.Y); + Stream.Write((sbyte)target.Z); + Stream.Write((short)target.X); + Stream.Write((short)target.Y); + Stream.Write((sbyte)target.Z); + Stream.Write((byte)0); // speed + Stream.Write((byte)0); // duration + Stream.Write((short)0); // unk + Stream.Write(false); // fixed direction + Stream.Write(false); // explode + Stream.Write(hue); + Stream.Write(0); // render mode + } + } +} diff --git a/Projects/Server/Network/Packets/Old Packets/GumpPackets.cs b/Projects/Server/Network/Packets/Old Packets/GumpPackets.cs new file mode 100644 index 000000000..b2920c9ed --- /dev/null +++ b/Projects/Server/Network/Packets/Old Packets/GumpPackets.cs @@ -0,0 +1,344 @@ +/************************************************************************* + * ModernUO * + * Copyright (C) 2019-2020 - ModernUO Development Team * + * Email: hi@modernuo.com * + * File: GumpPackets.cs - Created: 2020/05/26 - Updated: 2020/05/26 * + * * + * 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. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + *************************************************************************/ + +using System.Buffers; +using System.Collections.Generic; +using System.IO; +using System.Text; +using Server.Compression; +using Server.Gumps; + +namespace Server.Network +{ + public sealed class CloseGump : Packet + { + public CloseGump(int typeID, int buttonID) : base(0xBF) + { + EnsureCapacity(13); + + Stream.Write((short)0x04); + Stream.Write(typeID); + Stream.Write(buttonID); + } + } + + public interface IGumpWriter + { + int TextEntries { get; set; } + int Switches { get; set; } + + void AppendLayout(bool val); + void AppendLayout(int val); + void AppendLayout(uint val); + void AppendLayoutNS(int val); + void AppendLayout(string text); + void AppendLayout(byte[] buffer); + void WriteStrings(List strings); + void Flush(); + } + + public sealed class DisplayGumpPacked : Packet, IGumpWriter + { + private static readonly byte[] m_True = Gump.StringToBuffer(" 1"); + private static readonly byte[] m_False = Gump.StringToBuffer(" 0"); + + private static readonly byte[] m_BeginTextSeparator = Gump.StringToBuffer(" @"); + private static readonly byte[] m_EndTextSeparator = Gump.StringToBuffer("@"); + + private static readonly byte[] m_Buffer = new byte[48]; + + private readonly Gump m_Gump; + + private readonly PacketWriter m_Layout; + + private int m_StringCount; + private readonly PacketWriter m_Strings; + + static DisplayGumpPacked() => m_Buffer[0] = (byte)' '; + + public DisplayGumpPacked(Gump gump) + : base(0xDD) + { + m_Gump = gump; + + m_Layout = PacketWriter.CreateInstance(8192); + m_Strings = PacketWriter.CreateInstance(8192); + } + + public int TextEntries { get; set; } + + public int Switches { get; set; } + + public void AppendLayout(bool val) + { + AppendLayout(val ? m_True : m_False); + } + + public void AppendLayout(int val) + { + var toString = val.ToString(); + var bytes = Encoding.ASCII.GetBytes(toString, 0, toString.Length, m_Buffer, 1) + 1; + + m_Layout.Write(m_Buffer, 0, bytes); + } + + public void AppendLayout(uint val) + { + var toString = val.ToString(); + var bytes = Encoding.ASCII.GetBytes(toString, 0, toString.Length, m_Buffer, 1) + 1; + + m_Layout.Write(m_Buffer, 0, bytes); + } + + public void AppendLayoutNS(int val) + { + var toString = val.ToString(); + var bytes = Encoding.ASCII.GetBytes(toString, 0, toString.Length, m_Buffer, 1); + + m_Layout.Write(m_Buffer, 1, bytes); + } + + public void AppendLayout(string text) + { + AppendLayout(m_BeginTextSeparator); + + m_Layout.WriteAsciiFixed(text, text.Length); + + AppendLayout(m_EndTextSeparator); + } + + public void AppendLayout(byte[] buffer) + { + m_Layout.Write(buffer, 0, buffer.Length); + } + + public void WriteStrings(List strings) + { + m_StringCount = strings.Count; + + for (var i = 0; i < strings.Count; ++i) + { + var v = strings[i] ?? ""; + + m_Strings.Write((ushort)v.Length); + m_Strings.WriteBigUniFixed(v, v.Length); + } + } + + public void Flush() + { + EnsureCapacity(28 + (int)m_Layout.Length + (int)m_Strings.Length); + + Stream.Write(m_Gump.Serial); + Stream.Write(m_Gump.TypeID); + Stream.Write(m_Gump.X); + Stream.Write(m_Gump.Y); + + // Note: layout MUST be null terminated (don't listen to krrios) + m_Layout.Write((byte)0); + WritePacked(m_Layout); + + Stream.Write(m_StringCount); + + WritePacked(m_Strings); + + PacketWriter.ReleaseInstance(m_Layout); + PacketWriter.ReleaseInstance(m_Strings); + } + + private void WritePacked(PacketWriter src) + { + var buffer = src.UnderlyingStream.GetBuffer(); + var length = (int)src.Length; + + if (length == 0) + { + Stream.Write(0); + return; + } + + var wantLength = 1 + buffer.Length * 1024 / 1000; + + wantLength += 4095; + wantLength &= ~4095; + + var packBuffer = ArrayPool.Shared.Rent(wantLength); + + var packLength = wantLength; + + ZLib.Pack(packBuffer, ref packLength, buffer, length, ZLibQuality.Default); + + Stream.Write(4 + packLength); + Stream.Write(length); + Stream.Write(packBuffer, 0, packLength); + + ArrayPool.Shared.Return(packBuffer); + } + } + + public sealed class DisplayGumpFast : Packet, IGumpWriter + { + private static readonly byte[] m_True = Gump.StringToBuffer(" 1"); + private static readonly byte[] m_False = Gump.StringToBuffer(" 0"); + + private static readonly byte[] m_BeginTextSeparator = Gump.StringToBuffer(" @"); + private static readonly byte[] m_EndTextSeparator = Gump.StringToBuffer("@"); + + private readonly byte[] m_Buffer = new byte[48]; + private int m_LayoutLength; + + public DisplayGumpFast(Gump g) : base(0xB0) + { + m_Buffer[0] = (byte)' '; + + EnsureCapacity(4096); + + Stream.Write(g.Serial); + Stream.Write(g.TypeID); + Stream.Write(g.X); + Stream.Write(g.Y); + Stream.Write((ushort)0xFFFF); + } + + public int TextEntries { get; set; } + + public int Switches { get; set; } + + public void AppendLayout(bool val) + { + AppendLayout(val ? m_True : m_False); + } + + public void AppendLayout(int val) + { + var toString = val.ToString(); + var bytes = Encoding.ASCII.GetBytes(toString, 0, toString.Length, m_Buffer, 1) + 1; + + Stream.Write(m_Buffer, 0, bytes); + m_LayoutLength += bytes; + } + + public void AppendLayout(uint val) + { + var toString = val.ToString(); + var bytes = Encoding.ASCII.GetBytes(toString, 0, toString.Length, m_Buffer, 1) + 1; + + Stream.Write(m_Buffer, 0, bytes); + m_LayoutLength += bytes; + } + + public void AppendLayoutNS(int val) + { + var toString = val.ToString(); + var bytes = Encoding.ASCII.GetBytes(toString, 0, toString.Length, m_Buffer, 1); + + Stream.Write(m_Buffer, 1, bytes); + m_LayoutLength += bytes; + } + + public void AppendLayout(string text) + { + AppendLayout(m_BeginTextSeparator); + + var length = text.Length; + Stream.WriteAsciiFixed(text, length); + m_LayoutLength += length; + + AppendLayout(m_EndTextSeparator); + } + + public void AppendLayout(byte[] buffer) + { + var length = buffer.Length; + Stream.Write(buffer, 0, length); + m_LayoutLength += length; + } + + public void WriteStrings(List text) + { + Stream.Seek(19, SeekOrigin.Begin); + Stream.Write((ushort)m_LayoutLength); + Stream.Seek(0, SeekOrigin.End); + + Stream.Write((ushort)text.Count); + + for (var i = 0; i < text.Count; ++i) + { + var v = text[i] ?? ""; + + int length = (ushort)v.Length; + + Stream.Write((ushort)length); + Stream.WriteBigUniFixed(v, length); + } + } + + public void Flush() + { + } + } + + public sealed class DisplayGump : Packet + { + public DisplayGump(Gump g, string layout, string[] text) : base(0xB0) + { + layout ??= ""; + + EnsureCapacity(256); + + Stream.Write(g.Serial); + Stream.Write(g.TypeID); + Stream.Write(g.X); + Stream.Write(g.Y); + Stream.Write((ushort)(layout.Length + 1)); + Stream.WriteAsciiNull(layout); + + Stream.Write((ushort)text.Length); + + for (var i = 0; i < text.Length; ++i) + { + var v = text[i] ?? ""; + + var length = (ushort)v.Length; + + Stream.Write(length); + Stream.WriteBigUniFixed(v, length); + } + } + } + + public sealed class DisplaySignGump : Packet + { + public DisplaySignGump(Serial serial, int gumpID, string unknown, string caption) : base(0x8B) + { + unknown ??= ""; + caption ??= ""; + + EnsureCapacity(16 + unknown.Length + caption.Length); + + Stream.Write(serial); + Stream.Write((short)gumpID); + Stream.Write((short)unknown.Length); + Stream.WriteAsciiFixed(unknown, unknown.Length); + Stream.Write((short)(caption.Length + 1)); + Stream.WriteAsciiFixed(caption, caption.Length + 1); + } + } +} diff --git a/Projects/Server/Network/Packets/Old Packets/ItemPackets.cs b/Projects/Server/Network/Packets/Old Packets/ItemPackets.cs new file mode 100644 index 000000000..087d9c754 --- /dev/null +++ b/Projects/Server/Network/Packets/Old Packets/ItemPackets.cs @@ -0,0 +1,465 @@ +/************************************************************************* + * ModernUO * + * Copyright (C) 2019-2020 - ModernUO Development Team * + * Email: hi@modernuo.com * + * File: ItemPackets.cs - Created: 2020/05/26 - Updated: 2020/05/26 * + * * + * 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. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + *************************************************************************/ + +using System; +using System.IO; +using Server.Items; + +namespace Server.Network +{ + public sealed class WorldItem : Packet + { + public WorldItem(Item item) : base(0x1A) + { + EnsureCapacity(20); + + // 14 base length + // +2 - Amount + // +2 - Hue + // +1 - Flags + + var serial = item.Serial.Value; + var itemID = item.ItemID & 0x3FFF; + var amount = item.Amount; + var loc = item.Location; + var x = loc.m_X; + var y = loc.m_Y; + var hue = item.Hue; + var flags = item.GetPacketFlags(); + var direction = (int)item.Direction; + + if (amount != 0) + serial |= 0x80000000; + else + serial &= 0x7FFFFFFF; + + Stream.Write(serial); + + if (item is BaseMulti) + Stream.Write((short)(itemID | 0x4000)); + else + Stream.Write((short)itemID); + + if (amount != 0) Stream.Write((short)amount); + + x &= 0x7FFF; + + if (direction != 0) x |= 0x8000; + + Stream.Write((short)x); + + y &= 0x3FFF; + + if (hue != 0) y |= 0x8000; + + if (flags != 0) y |= 0x4000; + + Stream.Write((short)y); + + if (direction != 0) + Stream.Write((byte)direction); + + Stream.Write((sbyte)loc.m_Z); + + if (hue != 0) + Stream.Write((ushort)hue); + + if (flags != 0) + Stream.Write((byte)flags); + } + } + + public sealed class WorldItemSA : Packet + { + public WorldItemSA(Item item) : base(0xF3, 24) + { + Stream.Write((short)0x1); + + var itemID = item.ItemID; + + if (item is BaseMulti) + { + Stream.Write((byte)0x02); + + Stream.Write(item.Serial); + + itemID &= 0x3FFF; + + Stream.Write((short)itemID); + + Stream.Write((byte)0); + /*} else if ( ) { + m_Stream.Write( (byte) 0x01 ); + + m_Stream.Write( (int) item.Serial ); + + m_Stream.Write( (short) itemID ); + + m_Stream.Write( (byte) item.Direction );*/ + } + else + { + Stream.Write((byte)0x00); + + Stream.Write(item.Serial); + + itemID &= 0x7FFF; + + Stream.Write((short)itemID); + + Stream.Write((byte)0); + } + + var amount = item.Amount; + Stream.Write((short)amount); + Stream.Write((short)amount); + + var loc = item.Location; + var x = loc.m_X & 0x7FFF; + var y = loc.m_Y & 0x3FFF; + Stream.Write((short)x); + Stream.Write((short)y); + Stream.Write((sbyte)loc.m_Z); + + Stream.Write((byte)item.Light); + Stream.Write((short)item.Hue); + Stream.Write((byte)item.GetPacketFlags()); + } + } + + public sealed class WorldItemHS : Packet + { + public WorldItemHS(Item item) : base(0xF3, 26) + { + Stream.Write((short)0x1); + + var itemID = item.ItemID; + + if (item is BaseMulti) + { + Stream.Write((byte)0x02); + + Stream.Write(item.Serial); + + itemID &= 0x3FFF; + + Stream.Write((ushort)itemID); + + Stream.Write((byte)0); + /*} else if ( ) { + m_Stream.Write( (byte) 0x01 ); + + m_Stream.Write( (int) item.Serial ); + + m_Stream.Write( (ushort) itemID ); + + m_Stream.Write( (byte) item.Direction );*/ + } + else + { + Stream.Write((byte)0x00); + + Stream.Write(item.Serial); + + itemID &= 0xFFFF; + + Stream.Write((ushort)itemID); + + Stream.Write((byte)0); + } + + var amount = item.Amount; + Stream.Write((short)amount); + Stream.Write((short)amount); + + var loc = item.Location; + var x = loc.m_X & 0x7FFF; + var y = loc.m_Y & 0x3FFF; + Stream.Write((short)x); + Stream.Write((short)y); + Stream.Write((sbyte)loc.m_Z); + + Stream.Write((byte)item.Light); + Stream.Write((short)item.Hue); + Stream.Write((byte)item.GetPacketFlags()); + + Stream.Write((short)0x00); // ?? + } + } + + public sealed class DisplaySpellbook : Packet + { + public DisplaySpellbook(Item book) : base(0x24, 7) + { + Stream.Write(book.Serial); + Stream.Write((short)-1); + } + } + + public sealed class DisplaySpellbookHS : Packet + { + public DisplaySpellbookHS(Item book) : base(0x24, 9) + { + Stream.Write(book.Serial); + Stream.Write((short)-1); + Stream.Write((short)0x7D); + } + } + + public sealed class NewSpellbookContent : Packet + { + public NewSpellbookContent(Item item, int graphic, int offset, ulong content) : base(0xBF) + { + EnsureCapacity(23); + + Stream.Write((short)0x1B); + Stream.Write((short)0x01); + + Stream.Write(item.Serial); + Stream.Write((short)graphic); + Stream.Write((short)offset); + + for (var i = 0; i < 8; ++i) + Stream.Write((byte)(content >> (i * 8))); + } + } + + public sealed class SpellbookContent : Packet + { + public SpellbookContent(int count, int offset, ulong content, Item item) : base(0x3C) + { + EnsureCapacity(5 + count * 19); + + var written = 0; + + Stream.Write((ushort)0); + + ulong mask = 1; + + for (var i = 0; i < 64; ++i, mask <<= 1) + if ((content & mask) != 0) + { + Stream.Write(0x7FFFFFFF - i); + Stream.Write((ushort)0); + Stream.Write((byte)0); + Stream.Write((ushort)(i + offset)); + Stream.Write((short)0); + Stream.Write((short)0); + Stream.Write(item.Serial); + Stream.Write((short)0); + + ++written; + } + + Stream.Seek(3, SeekOrigin.Begin); + Stream.Write((ushort)written); + } + } + + public sealed class SpellbookContent6017 : Packet + { + public SpellbookContent6017(int count, int offset, ulong content, Item item) : base(0x3C) + { + EnsureCapacity(5 + count * 20); + + var written = 0; + + Stream.Write((ushort)0); + + ulong mask = 1; + + for (var i = 0; i < 64; ++i, mask <<= 1) + if ((content & mask) != 0) + { + Stream.Write(0x7FFFFFFF - i); + Stream.Write((ushort)0); + Stream.Write((byte)0); + Stream.Write((ushort)(i + offset)); + Stream.Write((short)0); + Stream.Write((short)0); + Stream.Write((byte)0); // Grid Location? + Stream.Write(item.Serial); + Stream.Write((short)0); + + ++written; + } + + Stream.Seek(3, SeekOrigin.Begin); + Stream.Write((ushort)written); + } + } + + public sealed class ContainerDisplay : Packet + { + public ContainerDisplay(Container c) : base(0x24, 7) + { + Stream.Write(c.Serial); + Stream.Write((short)c.GumpID); + } + } + + public sealed class ContainerDisplayHS : Packet + { + public ContainerDisplayHS(Container c) : base(0x24, 9) + { + Stream.Write(c.Serial); + Stream.Write((short)c.GumpID); + Stream.Write((short)0x7D); + } + } + + public sealed class ContainerContentUpdate : Packet + { + public ContainerContentUpdate(Item item) : base(0x25, 20) + { + Serial parentSerial; + + if (item.Parent is Item parentItem) + { + parentSerial = parentItem.Serial; + } + else + { + Console.WriteLine("Warning: ContainerContentUpdate on item with !(parent is Item)"); + parentSerial = Serial.Zero; + } + + Stream.Write(item.Serial); + Stream.Write((ushort)item.ItemID); + Stream.Write((byte)0); // signed, itemID offset + Stream.Write((ushort)Math.Min(item.Amount, ushort.MaxValue)); + Stream.Write((short)item.X); + Stream.Write((short)item.Y); + Stream.Write(parentSerial); + Stream.Write((ushort)(item.QuestItem ? Item.QuestItemHue : item.Hue)); + } + } + + public sealed class ContainerContentUpdate6017 : Packet + { + public ContainerContentUpdate6017(Item item) : base(0x25, 21) + { + Serial parentSerial; + + if (item.Parent is Item parentItem) + { + parentSerial = parentItem.Serial; + } + else + { + Console.WriteLine("Warning: ContainerContentUpdate on item with !(parent is Item)"); + parentSerial = Serial.Zero; + } + + Stream.Write(item.Serial); + Stream.Write((ushort)item.ItemID); + Stream.Write((byte)0); // signed, itemID offset + Stream.Write((ushort)Math.Min(item.Amount, ushort.MaxValue)); + Stream.Write((short)item.X); + Stream.Write((short)item.Y); + Stream.Write((byte)0); // Grid Location? + Stream.Write(parentSerial); + Stream.Write((ushort)(item.QuestItem ? Item.QuestItemHue : item.Hue)); + } + } + + public sealed class ContainerContent : Packet + { + public ContainerContent(Mobile beholder, Item beheld) : base(0x3C) + { + var items = beheld.Items; + var count = items.Count; + + EnsureCapacity(5 + count * 19); + + var pos = Stream.Position; + + var written = 0; + + Stream.Write((ushort)0); + + for (var i = 0; i < count; ++i) + { + var child = items[i]; + + if (!child.Deleted && beholder.CanSee(child)) + { + var loc = child.Location; + + Stream.Write(child.Serial); + Stream.Write((ushort)child.ItemID); + Stream.Write((byte)0); // signed, itemID offset + Stream.Write((ushort)Math.Min(child.Amount, ushort.MaxValue)); + Stream.Write((short)loc.m_X); + Stream.Write((short)loc.m_Y); + Stream.Write(beheld.Serial); + Stream.Write((ushort)(child.QuestItem ? Item.QuestItemHue : child.Hue)); + + ++written; + } + } + + Stream.Seek(pos, SeekOrigin.Begin); + Stream.Write((ushort)written); + } + } + + public sealed class ContainerContent6017 : Packet + { + public ContainerContent6017(Mobile beholder, Item beheld) : base(0x3C) + { + var items = beheld.Items; + var count = items.Count; + + EnsureCapacity(5 + count * 20); + + var pos = Stream.Position; + + var written = 0; + + Stream.Write((ushort)0); + + for (var i = 0; i < count; ++i) + { + var child = items[i]; + + if (!child.Deleted && beholder.CanSee(child)) + { + var loc = child.Location; + + Stream.Write(child.Serial); + Stream.Write((ushort)child.ItemID); + Stream.Write((byte)0); // signed, itemID offset + Stream.Write((ushort)Math.Min(child.Amount, ushort.MaxValue)); + Stream.Write((short)loc.m_X); + Stream.Write((short)loc.m_Y); + Stream.Write((byte)0); // Grid Location? + Stream.Write(beheld.Serial); + Stream.Write((ushort)(child.QuestItem ? Item.QuestItemHue : child.Hue)); + + ++written; + } + } + + Stream.Seek(pos, SeekOrigin.Begin); + Stream.Write((ushort)written); + } + } +} diff --git a/Projects/Server/Network/Packets/Old Packets/MenuPackets.cs b/Projects/Server/Network/Packets/Old Packets/MenuPackets.cs index 02926a98a..03cd385d4 100644 --- a/Projects/Server/Network/Packets/Old Packets/MenuPackets.cs +++ b/Projects/Server/Network/Packets/Old Packets/MenuPackets.cs @@ -2,7 +2,7 @@ * ModernUO * * Copyright (C) 2019-2020 - ModernUO Development Team * * Email: hi@modernuo.com * - * File: MenuPackets.cs - Created: 2020/05/08 - Updated: 2020/05/08 * + * File: MenuPackets.cs - Created: 2020/05/08 - Updated: 2020/05/26 * * * * 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 * @@ -18,6 +18,7 @@ * along with this program. If not, see . * *************************************************************************/ +using System; using Server.ContextMenus; using Server.Menus; using Server.Menus.ItemLists; @@ -25,6 +26,16 @@ using Server.Menus.Questions; namespace Server.Network { + [Flags] + public enum CMEFlags + { + None = 0x00, + Disabled = 0x01, + Arrow = 0x02, + Highlighted = 0x04, + Colored = 0x20 + } + public sealed class DisplayItemListMenu : Packet { public DisplayItemListMenu(ItemListMenu menu) : base(0x7C) diff --git a/Projects/Server/Network/Packets/Old Packets/MessagePackets.cs b/Projects/Server/Network/Packets/Old Packets/MessagePackets.cs new file mode 100644 index 000000000..3d48a3015 --- /dev/null +++ b/Projects/Server/Network/Packets/Old Packets/MessagePackets.cs @@ -0,0 +1,166 @@ +/************************************************************************* + * ModernUO * + * Copyright (C) 2019-2020 - ModernUO Development Team * + * Email: hi@modernuo.com * + * File: MessagePackets.cs - Created: 2020/05/26 - Updated: 2020/05/26 * + * * + * 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. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * 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 MessageLocalized : Packet + { + private static readonly MessageLocalized[] m_Cache_IntLoc = new MessageLocalized[15000]; + private static readonly MessageLocalized[] m_Cache_CliLoc = new MessageLocalized[100000]; + private static readonly MessageLocalized[] m_Cache_CliLocCmp = new MessageLocalized[5000]; + + public MessageLocalized(Serial serial, int graphic, MessageType type, int hue, int font, int number, string name, + string args) : base(0xC1) + { + name ??= ""; + args ??= ""; + + if (hue == 0) + hue = 0x3B2; + + EnsureCapacity(50 + args.Length * 2); + + Stream.Write(serial); + Stream.Write((short)graphic); + Stream.Write((byte)type); + Stream.Write((short)hue); + Stream.Write((short)font); + Stream.Write(number); + Stream.WriteAsciiFixed(name, 30); + Stream.WriteLittleUniNull(args); + } + + public static MessageLocalized InstantiateGeneric(int number) + { + MessageLocalized[] cache = null; + var index = 0; + + if (number >= 3000000) + { + cache = m_Cache_IntLoc; + index = number - 3000000; + } + else if (number >= 1000000) + { + cache = m_Cache_CliLoc; + index = number - 1000000; + } + else if (number >= 500000) + { + cache = m_Cache_CliLocCmp; + index = number - 500000; + } + + MessageLocalized p; + + if (cache != null && index < cache.Length) + { + p = cache[index]; + + if (p == null) + { + cache[index] = p = new MessageLocalized(Serial.MinusOne, -1, MessageType.Regular, 0x3B2, 3, number, + "System", ""); + p.SetStatic(); + } + } + else + { + p = new MessageLocalized(Serial.MinusOne, -1, MessageType.Regular, 0x3B2, 3, number, "System", ""); + } + + return p; + } + } + + public sealed class MessageLocalizedAffix : Packet + { + public MessageLocalizedAffix(Serial serial, int graphic, MessageType messageType, int hue, int font, int number, + string name, AffixType affixType, string affix, string args) : base(0xCC) + { + name ??= ""; + affix ??= ""; + args ??= ""; + + if (hue == 0) + hue = 0x3B2; + + EnsureCapacity(52 + affix.Length + args.Length * 2); + + Stream.Write(serial); + Stream.Write((short)graphic); + Stream.Write((byte)messageType); + Stream.Write((short)hue); + Stream.Write((short)font); + Stream.Write(number); + Stream.Write((byte)affixType); + Stream.WriteAsciiFixed(name, 30); + Stream.WriteAsciiNull(affix); + Stream.WriteBigUniNull(args); + } + } + + public sealed class AsciiMessage : Packet + { + public AsciiMessage(Serial serial, int graphic, MessageType type, int hue, int font, string name, string text) : base(0x1C) + { + name ??= ""; + text ??= ""; + + if (hue == 0) + hue = 0x3B2; + + EnsureCapacity(45 + text.Length); + + Stream.Write(serial); + Stream.Write((short)graphic); + Stream.Write((byte)type); + Stream.Write((short)hue); + Stream.Write((short)font); + Stream.WriteAsciiFixed(name, 30); + Stream.WriteAsciiNull(text); + } + } + + public sealed class UnicodeMessage : Packet + { + public UnicodeMessage(Serial serial, int graphic, MessageType type, int hue, int font, string lang, string name, + string text) : base(0xAE) + { + if (string.IsNullOrEmpty(lang)) lang = "ENU"; + name ??= ""; + text ??= ""; + + if (hue == 0) + hue = 0x3B2; + + EnsureCapacity(50 + text.Length * 2); + + Stream.Write(serial); + Stream.Write((short)graphic); + Stream.Write((byte)type); + Stream.Write((short)hue); + Stream.Write((short)font); + Stream.WriteAsciiFixed(lang, 4); + Stream.WriteAsciiFixed(name, 30); + Stream.WriteBigUniNull(text); + } + } +} diff --git a/Projects/Server/Network/Packets/Old Packets/MobilePackets.cs b/Projects/Server/Network/Packets/Old Packets/MobilePackets.cs index 768194062..1f1fc629d 100644 --- a/Projects/Server/Network/Packets/Old Packets/MobilePackets.cs +++ b/Projects/Server/Network/Packets/Old Packets/MobilePackets.cs @@ -2,7 +2,7 @@ * ModernUO * * Copyright (C) 2019-2020 - ModernUO Development Team * * Email: hi@modernuo.com * - * File: MobilePackets.cs - Created: 2020/05/07 - Updated: 2020/05/07 * + * File: MobilePackets.cs - Created: 2020/05/07 - Updated: 2020/05/26 * * * * 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 * @@ -42,4 +42,51 @@ namespace Server.Network Stream.Write((byte)(bonded ? 1 : 0)); } } + + public sealed class MobileMoving : Packet + { + public MobileMoving(Mobile m, int noto) : base(0x77, 17) + { + var loc = m.Location; + + var hue = m.Hue; + + if (m.SolidHueOverride >= 0) + hue = m.SolidHueOverride; + + Stream.Write(m.Serial); + Stream.Write((short)m.Body); + Stream.Write((short)loc.m_X); + Stream.Write((short)loc.m_Y); + Stream.Write((sbyte)loc.m_Z); + Stream.Write((byte)m.Direction); + Stream.Write((short)hue); + Stream.Write((byte)m.GetPacketFlags()); + Stream.Write((byte)noto); + } + } + + // Pre-7.0.0.0 Mobile Moving + public sealed class MobileMovingOld : Packet + { + public MobileMovingOld(Mobile m, int noto) : base(0x77, 17) + { + var loc = m.Location; + + var hue = m.Hue; + + if (m.SolidHueOverride >= 0) + hue = m.SolidHueOverride; + + Stream.Write(m.Serial); + Stream.Write((short)m.Body); + Stream.Write((short)loc.m_X); + Stream.Write((short)loc.m_Y); + Stream.Write((sbyte)loc.m_Z); + Stream.Write((byte)m.Direction); + Stream.Write((short)hue); + Stream.Write((byte)m.GetOldPacketFlags()); + Stream.Write((byte)noto); + } + } } diff --git a/Projects/Server/Network/Packets/Old Packets/ObjectHelpResponse.cs b/Projects/Server/Network/Packets/Old Packets/ObjectHelpResponsePackets.cs similarity index 100% rename from Projects/Server/Network/Packets/Old Packets/ObjectHelpResponse.cs rename to Projects/Server/Network/Packets/Old Packets/ObjectHelpResponsePackets.cs diff --git a/Projects/Server/Network/Packets/Old Packets/PlayerPackets.cs b/Projects/Server/Network/Packets/Old Packets/PlayerPackets.cs index 5f981dff9..a89596d6e 100644 --- a/Projects/Server/Network/Packets/Old Packets/PlayerPackets.cs +++ b/Projects/Server/Network/Packets/Old Packets/PlayerPackets.cs @@ -2,7 +2,7 @@ * ModernUO * * Copyright (C) 2019-2020 - ModernUO Development Team * * Email: hi@modernuo.com * - * File: PlayerPackets.cs - Created: 2020/05/07 - Updated: 2020/05/07 * + * File: PlayerPackets.cs - Created: 2020/05/07 - Updated: 2020/05/26 * * * * 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 * @@ -151,4 +151,314 @@ namespace Server.Network Stream.Write((sbyte)0); } } + + public sealed class DisplayProfile : Packet + { + public DisplayProfile(bool realSerial, Mobile m, string header, string body, string footer) : base(0xB8) + { + header ??= ""; + body ??= ""; + footer ??= ""; + + EnsureCapacity(12 + header.Length + footer.Length * 2 + body.Length * 2); + + Stream.Write(realSerial ? m.Serial : Serial.Zero); + Stream.WriteAsciiNull(header); + Stream.WriteBigUniNull(footer); + Stream.WriteBigUniNull(body); + } + } + + public sealed class LiftRej : Packet + { + public LiftRej(LRReason reason) : base(0x27, 2) + { + Stream.Write((byte)reason); + } + } + + public sealed class LogoutAck : Packet + { + public LogoutAck() : base(0xD1, 2) + { + Stream.Write((byte)0x01); + } + } + + public sealed class Weather : Packet + { + public Weather(int type, int density, int temp) : base(0x65, 4) + { + Stream.Write((byte)type); + Stream.Write((byte)density); + Stream.Write((byte)temp); + } + } + + /// + /// Causes the client to walk in a given direction. It does not send a movement request. + /// + public sealed class MovePlayer : Packet + { + public MovePlayer(Direction d) : base(0x97, 2) + { + Stream.Write((byte)d); + + // @4C63B0 + } + } + + public sealed class SetWarMode : Packet + { + public static readonly Packet InWarMode = SetStatic(new SetWarMode(true)); + public static readonly Packet InPeaceMode = SetStatic(new SetWarMode(false)); + + public SetWarMode(bool mode) : base(0x72, 5) + { + Stream.Write(mode); + Stream.Write((byte)0x00); + Stream.Write((byte)0x32); + Stream.Write((byte)0x00); + // m_Stream.Fill(); + } + + public static Packet Instantiate(bool mode) => mode ? InWarMode : InPeaceMode; + } + + public sealed class Swing : Packet + { + public Swing(int flag, Mobile attacker, Mobile defender) : base(0x2F, 10) + { + Stream.Write((byte)flag); + Stream.Write(attacker.Serial); + Stream.Write(defender.Serial); + } + } + + public sealed class NullFastwalkStack : Packet + { + public NullFastwalkStack() : base(0xBF) + { + EnsureCapacity(256); + Stream.Write((short)0x1); + Stream.Write(0x0); + Stream.Write(0x0); + Stream.Write(0x0); + Stream.Write(0x0); + Stream.Write(0x0); + Stream.Write(0x0); + } + } + + public sealed class RemoveEntity : Packet + { + public RemoveEntity(IEntity entity) : base(0x1D, 5) + { + Stream.Write(entity.Serial); + } + } + + public sealed class ServerChange : Packet + { + public ServerChange(Mobile m, Map map) : base(0x76, 16) + { + Stream.Write((short)m.X); + Stream.Write((short)m.Y); + Stream.Write((short)m.Z); + Stream.Write((byte)0); + Stream.Write((short)0); + Stream.Write((short)0); + Stream.Write((short)map.Width); + Stream.Write((short)map.Height); + } + } + + public sealed class SkillUpdate : Packet + { + public SkillUpdate(Skills skills) : base(0x3A) + { + EnsureCapacity(6 + skills.Length * 9); + + Stream.Write((byte)0x02); // type: absolute, capped + + for (var i = 0; i < skills.Length; ++i) + { + var s = skills[i]; + + var v = s.NonRacialValue; + var uv = Utility.Coerce((int)(v * 10), 0, 0xFFFF); + + Stream.Write((ushort)(s.Info.SkillID + 1)); + Stream.Write((ushort)uv); + Stream.Write((ushort)s.BaseFixedPoint); + Stream.Write((byte)s.Lock); + Stream.Write((ushort)s.CapFixedPoint); + } + + Stream.Write((short)0); // terminate + } + } + + public sealed class Sequence : Packet + { + public Sequence(int num) : base(0x7B, 2) + { + Stream.Write((byte)num); + } + } + + public sealed class SkillChange : Packet + { + public SkillChange(Skill skill) : base(0x3A) + { + EnsureCapacity(13); + + var v = skill.NonRacialValue; + var uv = Utility.Coerce((int)(v * 10), 0, 0xFFFF); + + Stream.Write((byte)0xDF); // type: delta, capped + Stream.Write((ushort)skill.Info.SkillID); + Stream.Write((ushort)uv); + Stream.Write((ushort)skill.BaseFixedPoint); + Stream.Write((byte)skill.Lock); + Stream.Write((ushort)skill.CapFixedPoint); + } + } + + public sealed class LaunchBrowser : Packet + { + public LaunchBrowser(string url) : base(0xA5) + { + url ??= ""; + + EnsureCapacity(4 + url.Length); + + Stream.WriteAsciiNull(url); + } + } + + public sealed class DragEffect : Packet + { + public DragEffect(IEntity src, IEntity trg, int itemID, int hue, int amount) : base(0x23, 26) + { + Stream.Write((short)itemID); + Stream.Write((byte)0); + Stream.Write((short)hue); + Stream.Write((short)amount); + Stream.Write(src.Serial); + Stream.Write((short)src.X); + Stream.Write((short)src.Y); + Stream.Write((sbyte)src.Z); + Stream.Write(trg.Serial); + Stream.Write((short)trg.X); + Stream.Write((short)trg.Y); + Stream.Write((sbyte)trg.Z); + } + } + + public sealed class SeasonChange : Packet + { + private static readonly SeasonChange[][] m_Cache = new SeasonChange[][] + { + new SeasonChange[2], + new SeasonChange[2], + new SeasonChange[2], + new SeasonChange[2], + new SeasonChange[2] + }; + + public SeasonChange(int season, bool playSound = true) : base(0xBC, 3) + { + Stream.Write((byte)season); + Stream.Write(playSound); + } + + public static SeasonChange Instantiate(int season) => Instantiate(season, true); + + public static SeasonChange Instantiate(int season, bool playSound) + { + if (season >= 0 && season < m_Cache.Length) + { + var idx = playSound ? 1 : 0; + + var p = m_Cache[season][idx]; + + if (p == null) + { + m_Cache[season][idx] = p = new SeasonChange(season, playSound); + p.SetStatic(); + } + + return p; + } + + return new SeasonChange(season, playSound); + } + } + + public sealed class DisplayPaperdoll : Packet + { + public DisplayPaperdoll(Mobile m, string text, bool canLift) : base(0x88, 66) + { + byte flags = 0x00; + + if (m.Warmode) + flags |= 0x01; + + if (canLift) + flags |= 0x02; + + Stream.Write(m.Serial); + Stream.WriteAsciiFixed(text, 60); + Stream.Write(flags); + } + } + + public sealed class PlaySound : Packet + { + public PlaySound(int soundID, IPoint3D target) : base(0x54, 12) + { + Stream.Write((byte)1); // flags + Stream.Write((short)soundID); + Stream.Write((short)0); // volume + Stream.Write((short)target.X); + Stream.Write((short)target.Y); + Stream.Write((short)target.Z); + } + } + + public sealed class PlayMusic : Packet + { + public static readonly Packet InvalidInstance = SetStatic(new PlayMusic(MusicName.Invalid)); + + private static readonly Packet[] m_Instances = new Packet[60]; + + public PlayMusic(MusicName name) : base(0x6D, 3) + { + Stream.Write((short)name); + } + + public static Packet GetInstance(MusicName name) + { + if (name == MusicName.Invalid) + return InvalidInstance; + + var v = (int)name; + Packet p; + + if (v >= 0 && v < m_Instances.Length) + { + p = m_Instances[v]; + + if (p == null) + m_Instances[v] = p = SetStatic(new PlayMusic(name)); + } + else + { + p = new PlayMusic(name); + } + + return p; + } + } } diff --git a/Projects/Server/Network/Packets/Old Packets/TargetPackets.cs b/Projects/Server/Network/Packets/Old Packets/TargetPackets.cs new file mode 100644 index 000000000..e649c977f --- /dev/null +++ b/Projects/Server/Network/Packets/Old Packets/TargetPackets.cs @@ -0,0 +1,87 @@ +/************************************************************************* + * ModernUO * + * Copyright (C) 2019-2020 - ModernUO Development Team * + * Email: hi@modernuo.com * + * File: TargetPackets.cs - Created: 2020/05/26 - Updated: 2020/05/26 * + * * + * 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. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + *************************************************************************/ + +using System.IO; +using Server.Targeting; + +namespace Server.Network +{ + public sealed class MultiTargetReqHS : Packet + { + public MultiTargetReqHS(MultiTarget t) : base(0x99, 30) + { + Stream.Write(t.AllowGround); + Stream.Write(t.TargetID); + Stream.Write((byte)t.Flags); + + Stream.Fill(); + + Stream.Seek(18, SeekOrigin.Begin); + Stream.Write((short)t.MultiID); + Stream.Write((short)t.Offset.X); + Stream.Write((short)t.Offset.Y); + Stream.Write((short)t.Offset.Z); + + // DWORD Hue + } + } + + public sealed class MultiTargetReq : Packet + { + public MultiTargetReq(MultiTarget t) : base(0x99, 26) + { + Stream.Write(t.AllowGround); + Stream.Write(t.TargetID); + Stream.Write((byte)t.Flags); + + Stream.Fill(); + + Stream.Seek(18, SeekOrigin.Begin); + Stream.Write((short)t.MultiID); + Stream.Write((short)t.Offset.X); + Stream.Write((short)t.Offset.Y); + Stream.Write((short)t.Offset.Z); + } + } + + public sealed class CancelTarget : Packet + { + public static readonly Packet Instance = SetStatic(new CancelTarget()); + + public CancelTarget() : base(0x6C, 19) + { + Stream.Write((byte)0); + Stream.Write(0); + Stream.Write((byte)3); + Stream.Fill(); + } + } + + public sealed class TargetReq : Packet + { + public TargetReq(Target t) : base(0x6C, 19) + { + Stream.Write(t.AllowGround); + Stream.Write(t.TargetID); + Stream.Write((byte)t.Flags); + Stream.Fill(); + } + } +} diff --git a/Projects/Server/Network/Packets/Old Packets/UnicodePrompt.cs b/Projects/Server/Network/Packets/Old Packets/UnicodePromptPackets.cs similarity index 100% rename from Projects/Server/Network/Packets/Old Packets/UnicodePrompt.cs rename to Projects/Server/Network/Packets/Old Packets/UnicodePromptPackets.cs diff --git a/Projects/Server/Utilities/Utility.cs b/Projects/Server/Utilities/Utility.cs index 11a91659b..ee9eda78d 100644 --- a/Projects/Server/Utilities/Utility.cs +++ b/Projects/Server/Utilities/Utility.cs @@ -25,6 +25,7 @@ using System.IO; using System.Linq; using System.Net; using System.Net.Sockets; +using System.Runtime.CompilerServices; using System.Text; using System.Xml; @@ -763,18 +764,6 @@ namespace Server ? uint.TryParse(value.Substring(2), NumberStyles.HexNumber, null, out i) : uint.TryParse(value, out i); - public static double GetXMLDouble(string doubleString, double defaultValue) - { - try - { - return XmlConvert.ToDouble(doubleString); - } - catch - { - return double.TryParse(doubleString, out var val) ? val : defaultValue; - } - } - public static int GetXMLInt32(string intString, int defaultValue) { try @@ -811,18 +800,6 @@ namespace Server } } - public static DateTimeOffset GetXMLDateTimeOffset(string dateTimeOffsetString, DateTimeOffset defaultValue) - { - try - { - return XmlConvert.ToDateTimeOffset(dateTimeOffsetString); - } - catch - { - return DateTimeOffset.TryParse(dateTimeOffsetString, out var d) ? d : defaultValue; - } - } - public static TimeSpan GetXMLTimeSpan(string timeSpanString, TimeSpan defaultValue) { try @@ -868,13 +845,15 @@ namespace Server && p1.Y >= p2.Y - 18 && p1.Y <= p2.Y + 18; + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static int Coerce(int number, int min, int max) => number < min ? min : number > max ? max : number; + // 4d6+8 would be: Utility.Dice( 4, 6, 8 ) - public static int Dice(uint numDice, uint numSides, int bonus) + public static int Dice(uint amount, uint sides, int bonus) { var total = 0; - var sides = numSides; - for (var i = 0; i < numDice; ++i) + for (var i = 0; i < amount; ++i) total += (int)RandomProviders.Provider.Next(sides) + 1; return total + bonus;