private static void SetParents(GoCategory parent) { // Deserialization may leave these null parent.Categories ??= Array.Empty <GoCategory>(); parent.Locations ??= Array.Empty <GoLocation>(); for (var i = 0; i < parent.Categories.Length; i++) { var category = parent.Categories[i]; category.Parent = parent; SetParents(category); } for (var j = 0; j < parent.Locations.Length; j++) { parent.Locations[j].Parent = parent; } }
private GoGump(int page, Mobile from, LocationTree tree, GoCategory node) : base(50, 50) { from.CloseGump <GoGump>(); if (node == tree.Root) { tree.LastBranch.Remove(from); } else { tree.LastBranch[from] = node; } m_Page = page; m_Tree = tree; m_Node = node; var x = BorderSize + OffsetSize; var y = BorderSize + OffsetSize; var count = Math.Clamp(node.Categories.Length + node.Locations.Length - page * EntryCount, 0, EntryCount); var totalHeight = OffsetSize + (EntryHeight + OffsetSize) * (count + 1); AddPage(0); AddBackground(0, 0, BackWidth, BorderSize + totalHeight + BorderSize, BackGumpID); AddImageTiled( BorderSize, BorderSize, TotalWidth - (OldStyle ? SetWidth + OffsetSize : 0), totalHeight, OffsetGumpID ); if (OldStyle) { AddImageTiled(x, y, TotalWidth - OffsetSize * 3 - SetWidth, EntryHeight, HeaderGumpID); } else { AddImageTiled(x, y, PrevWidth, EntryHeight, HeaderGumpID); } if (node.Parent != null) { AddButton(x + PrevOffsetX, y + PrevOffsetY, PrevButtonID1, PrevButtonID2, 1); if (PrevLabel) { AddLabel(x + PrevLabelOffsetX, y + PrevLabelOffsetY, TextHue, "Previous"); } } x += PrevWidth + OffsetSize; var emptyWidth = TotalWidth - PrevWidth * 2 - NextWidth - OffsetSize * 5 - (OldStyle ? SetWidth + OffsetSize : 0); if (!OldStyle) { AddImageTiled( x - (OldStyle ? OffsetSize : 0), y, emptyWidth + (OldStyle ? OffsetSize * 2 : 0), EntryHeight, EntryGumpID ); } AddHtml(x + TextOffsetX, y, emptyWidth - TextOffsetX, EntryHeight, $"<center>{node.Name}</center>"); x += emptyWidth + OffsetSize; if (OldStyle) { AddImageTiled(x, y, TotalWidth - OffsetSize * 3 - SetWidth, EntryHeight, HeaderGumpID); } else { AddImageTiled(x, y, PrevWidth, EntryHeight, HeaderGumpID); } if (page > 0) { AddButton(x + PrevOffsetX, y + PrevOffsetY, PrevButtonID1, PrevButtonID2, 2); if (PrevLabel) { AddLabel(x + PrevLabelOffsetX, y + PrevLabelOffsetY, TextHue, "Previous"); } } x += PrevWidth + OffsetSize; if (!OldStyle) { AddImageTiled(x, y, NextWidth, EntryHeight, HeaderGumpID); } if ((page + 1) * EntryCount < node.Categories.Length + node.Locations.Length) { AddButton(x + NextOffsetX, y + NextOffsetY, NextButtonID1, NextButtonID2, 3, GumpButtonType.Reply, 1); if (NextLabel) { AddLabel(x + NextLabelOffsetX, y + NextLabelOffsetY, TextHue, "Next"); } } var totalEntryCount = node.Categories.Length + node.Locations.Length; for (int i = 0, index = page * EntryCount; i < EntryCount && index < totalEntryCount; ++i, ++index) { x = BorderSize + OffsetSize; y += EntryHeight + OffsetSize; var name = index >= node.Categories.Length ? node.Locations[index].Name : node.Categories[index].Name; AddImageTiled(x, y, EntryWidth, EntryHeight, EntryGumpID); AddLabelCropped(x + TextOffsetX, y, EntryWidth - TextOffsetX, EntryHeight, TextHue, name); x += EntryWidth + OffsetSize; if (SetGumpID != 0) { AddImageTiled(x, y, SetWidth, EntryHeight, SetGumpID); } AddButton(x + SetOffsetX, y + SetOffsetY, SetButtonID1, SetButtonID2, index + 4); } }