public static int SendUnicodeMessage( ArraySegment <byte>[] buffer, Serial serial, int graphic, MessageType type, int hue, int font, string lang, string name, string text ) { name = name?.Trim() ?? ""; text = text?.Trim() ?? ""; lang = lang?.Trim() ?? "ENU"; if (hue == 0) { hue = 0x3B2; } var writer = new CircularBufferWriter(buffer); writer.Write((byte)0xAE); writer.Write((ushort)(50 + text.Length * 2)); writer.Write(serial); writer.Write((short)graphic); writer.Write((byte)type); writer.Write((short)hue); writer.Write((short)font); writer.WriteAscii(lang, 4); writer.WriteAscii(name, 30); writer.WriteBigUniNull(text); return(writer.Position); }
public static void SendDisplayItemListMenu(this NetState ns, ItemListMenu menu) { if (ns == null || menu == null || !ns.GetSendBuffer(out var buffer)) { return; } var writer = new CircularBufferWriter(buffer); writer.Write((byte)0x7C); // Packet ID writer.Seek(2, SeekOrigin.Current); // Length writer.Write(menu.Serial); writer.Write((ushort)0); var question = menu.Question?.Trim(); if (question == null) { writer.Write((byte)0); } else { var questionLength = question.Length; writer.Write((byte)questionLength); writer.WriteAscii(question); } var entries = menu.Entries; int entriesLength = (byte)entries.Length; writer.Write((byte)entriesLength); for (var i = 0; i < entriesLength; ++i) { var e = entries[i]; writer.Write((ushort)e.ItemID); writer.Write((short)e.Hue); var name = e.Name?.Trim(); if (name == null) { writer.Write((byte)0); } else { var nameLength = name.Length; writer.Write((byte)nameLength); writer.WriteAscii(name); } } writer.WritePacketLength(); ns.Send(ref buffer, writer.Position); }
public static void SendDisplayQuestionMenu(this NetState ns, QuestionMenu menu) { if (ns == null || menu == null || !ns.GetSendBuffer(out var buffer)) { return; } var writer = new CircularBufferWriter(buffer); writer.Write((byte)0x7C); // Packet ID writer.Seek(2, SeekOrigin.Current); // Length writer.Write(menu.Serial); writer.Write((ushort)0); var question = menu.Question?.Trim(); if (question == null) { writer.Write((byte)0); } else { var questionLength = question.Length; writer.Write((byte)questionLength); writer.WriteAscii(question); } var answers = menu.Answers; int answersLength = (byte)answers.Length; writer.Write((byte)answersLength); for (var i = 0; i < answersLength; ++i) { writer.Write(0); var answer = answers[i]?.Trim(); if (answer == null) { writer.Write((byte)0); } else { var nameLength = answer.Length; writer.Write((byte)nameLength); writer.WriteAscii(answer); } } writer.WritePacketLength(); ns.Send(ref buffer, writer.Position); }
/** * Packet: 0xA8 * Length: up to 240 bytes * * Sends login acknowledge with server listing */ public static void SendAccountLoginAck(this NetState ns) { if (ns == null || !ns.GetSendBuffer(out var buffer)) { return; } var writer = new CircularBufferWriter(buffer); writer.Write((byte)0xA8); // Packet ID writer.Seek(2, SeekOrigin.Current); // Length writer.Write((byte)0x5D); var info = ns.ServerInfo; writer.Write((ushort)info.Length); for (var i = 0; i < info.Length; ++i) { var si = info[i]; writer.Write((ushort)i); writer.WriteAscii(si.Name, 32); writer.Write((byte)si.FullPercent); writer.Write((sbyte)si.TimeZone); writer.Write(Utility.GetAddressValue(si.Address.Address)); } writer.WritePacketLength(); ns.Send(ref buffer, writer.Position); }
public static void SendVendorBuyList(this NetState ns, Mobile vendor, List <BuyItemState> list) { if (ns == null || !ns.GetSendBuffer(out var buffer)) { return; } var writer = new CircularBufferWriter(buffer); writer.Write((byte)0x74); // Packet ID writer.Seek(2, SeekOrigin.Current); writer.Write((vendor.FindItemOnLayer(Layer.ShopBuy) as Container)?.Serial ?? Serial.MinusOne); writer.Write((byte)list.Count); for (var i = 0; i < list.Count; ++i) { var bis = list[i]; writer.Write(bis.Price); var desc = bis.Description ?? ""; writer.Write((byte)desc.Length); writer.WriteAscii(desc); // Doesn't look like it is used anymore } writer.WritePacketLength(); ns.Send(ref buffer, writer.Position); }
public static void SendDisplayEquipmentInfo( this NetState ns, Serial serial, int number, string crafterName, bool unidentified, List <EquipInfoAttribute> attrs ) { if (ns == null || !ns.GetSendBuffer(out var buffer)) { return; } crafterName = crafterName.DefaultIfNullOrEmpty(""); var length = 17 + (crafterName.Length > 0 ? 6 + crafterName.Length : 0) + (unidentified ? 4 : 0) + attrs.Count * 6; var writer = new CircularBufferWriter(buffer); writer.Write((byte)0xBF); // Packet ID writer.Write((ushort)length); writer.Write((ushort)0x10); // Subpacket writer.Write(serial); writer.Write(number); if (crafterName.Length > 0) { writer.Write(-3); // crafted by writer.Write((ushort)crafterName.Length); writer.WriteAscii(crafterName); } if (unidentified) { writer.Write(-4); } for (var i = 0; i < attrs.Count; ++i) { var attr = attrs[i]; writer.Write(attr.Number); writer.Write((short)attr.Charges); } writer.Write(-1); ns.Send(ref buffer, writer.Position); }
/** * Packet: 0x86 * Length: Up to 424 bytes * * Sends updated character list */ public static void SendCharacterListUpdate(this NetState ns, IAccount a) { if (ns == null || a == null || !ns.GetSendBuffer(out var buffer)) { return; } var writer = new CircularBufferWriter(buffer); writer.Write((byte)0x86); // Packet ID writer.Seek(2, SeekOrigin.Current); // Length var highSlot = -1; for (var i = a.Length - 1; i >= 0; i--) { if (a[i] != null) { highSlot = i; break; } } var count = Math.Max(Math.Max(highSlot + 1, a.Limit), 5); writer.Write((byte)count); for (int i = 0; i < count; i++) { var m = a[i]; if (m == null) { writer.Clear(60); } else { var name = (m.RawName?.Trim()).DefaultIfNullOrEmpty("-no name-"); writer.WriteAscii(name, 30); writer.Clear(30); // password } } writer.WritePacketLength(); ns.Send(ref buffer, writer.Position); }
/** * Packet: 0x81 * Length: Up to 425 bytes * * Displays the list of characters during the login process. * Note: Currently Unused */ public static void SendChangeCharacter(this NetState ns, IAccount a) { if (ns == null || a == null || !ns.GetSendBuffer(out var buffer)) { return; } var length = 5 + a.Length * 60; var writer = new CircularBufferWriter(buffer); writer.Write((byte)0x81); // Packet ID writer.Write((ushort)length); writer.Write((ushort)0); // Count & Placeholder int count = 0; for (var i = 0; i < a.Length; ++i) { var m = a[i]; if (m == null) { writer.Clear(60); } else { var name = (m.RawName?.Trim()).DefaultIfNullOrEmpty("-no name-"); count++; writer.WriteAscii(name, 30); writer.Clear(30); // Password (empty) } } var position = writer.Position; writer.Seek(3, SeekOrigin.Begin); writer.Write((byte)count); writer.Seek(position, SeekOrigin.Begin); ns.Send(ref buffer, writer.Position); }
public static void SendDisplaySecureTrade( this NetState ns, Mobile them, Container first, Container second, string name ) { if (ns == null || !ns.GetSendBuffer(out var buffer)) { return; } var writer = new CircularBufferWriter(buffer); writer.Write((byte)0x6F); // Packet ID writer.Write((ushort)47); // Length writer.Write((byte)TradeFlag.Display); writer.Write(them.Serial); writer.Write(first.Serial); writer.Write(second.Serial); writer.Write(true); writer.WriteAscii(name ?? "", 30); ns.Send(ref buffer, writer.Position); }
/** * Packet: 0xA9 * Length: 1410 or more bytes * * Sends list of characters and starting cities. */ public static void SendCharacterList(this NetState ns) { var acct = ns?.Account; if (acct == null || !ns.GetSendBuffer(out var buffer)) { return; } var client70130 = ns.NewCharacterList; var textLength = client70130 ? 32 : 31; var cityInfo = ns.CityInfo; var writer = new CircularBufferWriter(buffer); writer.Write((byte)0xA9); // Packet ID writer.Seek(2, SeekOrigin.Current); // Length var highSlot = -1; for (var i = acct.Length - 1; i >= 0; i--) { if (acct[i] != null) { highSlot = i; break; } } var count = Math.Max(Math.Max(highSlot + 1, acct.Limit), 5); writer.Write((byte)count); for (int i = 0; i < count; i++) { var m = acct[i]; if (m == null) { writer.Clear(60); } else { var name = (m.RawName?.Trim()).DefaultIfNullOrEmpty("-no name-"); writer.WriteAscii(name, 30); writer.Clear(30); // password } } writer.Write((byte)cityInfo.Length); for (int i = 0; i < cityInfo.Length; ++i) { var ci = cityInfo[i]; writer.Write((byte)i); writer.WriteAscii(ci.City, textLength); writer.WriteAscii(ci.Building, textLength); if (client70130) { writer.Write(ci.X); writer.Write(ci.Y); writer.Write(ci.Z); writer.Write(ci.Map?.MapID ?? 0); writer.Write(ci.Description); writer.Write(0); } } var flags = ExpansionInfo.CoreExpansion.CharacterListFlags; if (count > 6) { flags |= CharacterListFlags.SeventhCharacterSlot | CharacterListFlags.SixthCharacterSlot; // 7th Character Slot - TODO: Is SixthCharacterSlot Required? } else if (count == 6) { flags |= CharacterListFlags.SixthCharacterSlot; // 6th Character Slot } else if (acct.Limit == 1) { flags |= CharacterListFlags.SlotLimit & CharacterListFlags.OneCharacterSlot; // Limit Characters & One Character } writer.Write((int)flags); if (client70130) { writer.Write((short)-1); } writer.WritePacketLength(); ns.Send(ref buffer, writer.Position); }