public static void SendDisplayItemListMenu(this NetState ns, ItemListMenu menu) { if (ns == null || menu == null) { return; } var question = menu.Question?.Trim(); var questionLength = question?.Length ?? 0; var entries = menu.Entries; int entriesLength = (byte)entries.Length; var maxLength = 11 + questionLength; for (int i = 0; i < entriesLength; i++) { maxLength += 5 + entries[i].Name?.Length ?? 0; // could be trimmed } var writer = new SpanWriter(stackalloc byte[maxLength]); writer.Write((byte)0x7C); // Packet ID writer.Seek(2, SeekOrigin.Current); writer.Write(menu.Serial); writer.Write((ushort)0); writer.Write((byte)questionLength); if (question != null) { writer.WriteAscii(question); } 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(writer.Span); }
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 void TestDisplayItemListMenu() { var menu = new ItemListMenu( "Which item would you choose?", new[] { new ItemListEntry("Item 1", 0x01), new ItemListEntry("Item 2", 0x100), new ItemListEntry("Item 3", 0x1000, 250) } ); var data = new DisplayItemListMenu(menu).Compile(); var question = menu.Question; var questionLength = Math.Min(255, question.Length); var entriesCount = 0; var length = 11 + questionLength; foreach (var entry in menu.Entries) { length += 5 + entry.Name.Length; if (entriesCount == 255) { break; } entriesCount++; } Span <byte> expectedData = stackalloc byte[length]; var pos = 0; expectedData.Write(ref pos, (byte)0x7C); // Packet ID expectedData.Write(ref pos, (ushort)length); expectedData.Write(ref pos, menu.Serial); expectedData.Write(ref pos, (ushort)0x00); expectedData.Write(ref pos, (byte)questionLength); expectedData.WriteAscii(ref pos, question, 255); expectedData.Write(ref pos, (byte)entriesCount); for (var i = 0; i < entriesCount; i++) { var entry = menu.Entries[i]; expectedData.Write(ref pos, (ushort)entry.ItemID); expectedData.Write(ref pos, (ushort)entry.Hue); var name = entry.Name?.Trim() ?? ""; expectedData.Write(ref pos, (byte)Math.Min(255, name.Length)); expectedData.WriteAscii(ref pos, name, 255); } AssertThat.Equal(data, expectedData); }
internal static void ItemListMenuPatch(ItemListMenu __instance, string ___title, int ___currentTab, int ___totalValueOfItems, List <Item> ___itemsToList) { try { int x = Game1.getMouseX(true), y = Game1.getMouseY(true); // Mouse x and y position string toSpeak = " ", currentList = " "; for (int i = ___currentTab * __instance.itemsPerCategoryPage; i < ___currentTab * __instance.itemsPerCategoryPage + __instance.itemsPerCategoryPage; i++) { if (i == 0) { currentList = ___title; } if (___itemsToList.Count > i) { if (___itemsToList[i] == null) { currentList = $"{currentList}, \n" + Game1.content.LoadString("Strings\\UI:ItemList_ItemsLostValue", ___totalValueOfItems); continue; } currentList = $"{currentList}, \n {___itemsToList[i].Stack} {___itemsToList[i].DisplayName}"; } } if (__instance.okButton != null && __instance.okButton.containsPoint(x, y)) { toSpeak = $"Page {___currentTab + 1} of {((int)___itemsToList.Count / __instance.itemsPerCategoryPage) + 1} \n {currentList} \n ok button"; } else if (__instance.forwardButton != null && __instance.forwardButton.containsPoint(x, y)) { toSpeak = "Next page button"; } else if (__instance.backButton != null && __instance.backButton.containsPoint(x, y)) { toSpeak = "Previous page button"; } if (itemListMenuQuery != toSpeak) { itemListMenuQuery = toSpeak; MainClass.ScreenReader.Say(toSpeak, true); } } catch (System.Exception e) { MainClass.ErrorLog($"Unable to narrate Text:\n{e.Message}\n{e.StackTrace}"); } }
public DisplayItemListMenu(ItemListMenu menu) : base(0x7C) { EnsureCapacity(256); Stream.Write(((IMenu)menu).Serial); Stream.Write((short)0); var question = menu.Question; if (question == null) { Stream.Write((byte)0); } else { var questionLength = question.Length; Stream.Write((byte)questionLength); Stream.WriteAsciiFixed(question, questionLength); } var entries = menu.Entries; int entriesLength = (byte)entries.Length; Stream.Write((byte)entriesLength); for (var i = 0; i < entriesLength; ++i) { var e = entries[i]; Stream.Write((ushort)e.ItemID); Stream.Write((short)e.Hue); var name = e.Name; if (name == null) { Stream.Write((byte)0); } else { var nameLength = name.Length; Stream.Write((byte)nameLength); Stream.WriteAsciiFixed(name, nameLength); } } }
public void TestDisplayItemListMenu() { var menu = new ItemListMenu( "Which item would you choose?", new[] { new ItemListEntry("Item 1", 0x01), new ItemListEntry("Item 2", 0x100), new ItemListEntry("Item 3", 0x1000, 250) } ); string question = menu.Question?.Trim() ?? ""; int questionLength = Math.Min(255, question.Length); int length = 11 + questionLength + menu.Entries.Sum(entry => 5 + entry.Name?.Trim().Length ?? 0); Span <byte> data = new DisplayItemListMenu(menu).Compile(); Span <byte> expectedData = stackalloc byte[length]; int pos = 0; expectedData[pos++] = 0x7C; // Packet ID ((ushort)length).CopyTo(ref pos, expectedData); menu.Serial.CopyTo(ref pos, expectedData); pos += 2; // ((ushort)0x00).CopyTo(ref pos, expectedData); expectedData[pos++] = (byte)questionLength; question.CopyASCIITo(ref pos, expectedData); expectedData[pos++] = (byte)menu.Entries.Length; for (int i = 0; i < menu.Entries.Length; i++) { var entry = menu.Entries[i]; ((ushort)entry.ItemID).CopyTo(ref pos, expectedData); ((ushort)entry.Hue).CopyTo(ref pos, expectedData); string name = entry.Name?.Trim() ?? ""; expectedData[pos++] = (byte)name.Length; name.CopyASCIITo(ref pos, expectedData); } AssertThat.Equal(data, expectedData); }
// Methods public DisplayItemListMenu(ItemListMenu menu) : base(124) { int num3; ItemListEntry entry1; string text2; int num4; base.EnsureCapacity(256); this.m_Stream.Write(menu.Serial); this.m_Stream.Write(((short)0)); string text1 = menu.Question; if (text1 == null) { text1 = ""; } int num1 = ((byte)text1.Length); this.m_Stream.Write(((byte)num1)); this.m_Stream.WriteAsciiFixed(text1, num1); ItemListEntry[] entryArray1 = menu.Entries; int num2 = ((byte)entryArray1.Length); this.m_Stream.Write(((byte)num2)); for (num3 = 0; (num3 < num2); ++num3) { entry1 = entryArray1[num3]; this.m_Stream.Write(((short)(entry1.ItemID & 16383))); this.m_Stream.Write(((short)entry1.Hue)); text2 = entry1.Name; if (text2 == null) { text2 = ""; } num4 = ((byte)text2.Length); this.m_Stream.Write(((byte)num4)); this.m_Stream.WriteAsciiFixed(text2, num4); } }