public static void SetupEditableSlotWidget(LobbyLogic logic, Widget parent, Session.Slot s, Session.Client c, OrderManager orderManager) { var slot = parent.Get <DropDownButtonWidget>("SLOT_OPTIONS"); slot.IsVisible = () => true; slot.IsDisabled = () => orderManager.LocalClient.IsReady; slot.GetText = () => c != null ? c.Name : s.Closed ? "Closed" : "Open"; slot.OnMouseDown = _ => ShowSlotDropDown(logic, slot, s, c, orderManager); // Ensure Name selector (if present) is hidden var name = parent.GetOrNull("NAME"); if (name != null) { name.IsVisible = () => false; } }
public static void ShowSlotDropDown(LobbyLogic logic, DropDownButtonWidget dropdown, Session.Slot slot, Session.Client client, OrderManager orderManager) { var options = new Dictionary <string, IEnumerable <SlotDropDownOption> >() { { "Slot", new List <SlotDropDownOption>() { new SlotDropDownOption("Open", "slot_open " + slot.PlayerReference, () => (!slot.Closed && client == null)), new SlotDropDownOption("Closed", "slot_close " + slot.PlayerReference, () => slot.Closed) } } }; var bots = new List <SlotDropDownOption>(); if (slot.AllowBots) { foreach (var b in logic.Map.Rules.Actors["player"].TraitInfos <IBotInfo>().Select(t => t.Name)) { var bot = b; var botController = orderManager.LobbyInfo.Clients.FirstOrDefault(c => c.IsAdmin); bots.Add(new SlotDropDownOption(bot, "slot_bot {0} {1} {2}".F(slot.PlayerReference, botController.Index, bot), () => client != null && client.Bot == bot)); } } options.Add(bots.Any() ? "Bots" : "Bots Disabled", bots); Func <SlotDropDownOption, ScrollItemWidget, ScrollItemWidget> setupItem = (o, itemTemplate) => { var item = ScrollItemWidget.Setup(itemTemplate, o.Selected, () => orderManager.IssueOrder(Order.Command(o.Order))); item.Get <LabelWidget>("LABEL").GetText = () => o.Title; return(item); }; dropdown.ShowDropDown("LABEL_DROPDOWN_TEMPLATE", 167, options, setupItem); }
public static void ShowSlotDropDown(LobbyLogic logic, DropDownButtonWidget dropdown, Session.Slot slot, Session.Client client, OrderManager orderManager) { var options = new Dictionary<string, IEnumerable<SlotDropDownOption>>() { { "Slot", new List<SlotDropDownOption>() { new SlotDropDownOption("Open", "slot_open " + slot.PlayerReference, () => (!slot.Closed && client == null)), new SlotDropDownOption("Closed", "slot_close " + slot.PlayerReference, () => slot.Closed) } } }; var bots = new List<SlotDropDownOption>(); if (slot.AllowBots) { foreach (var b in logic.Map.Rules.Actors["player"].TraitInfos<IBotInfo>().Select(t => t.Name)) { var bot = b; var botController = orderManager.LobbyInfo.Clients.FirstOrDefault(c => c.IsAdmin); bots.Add(new SlotDropDownOption(bot, "slot_bot {0} {1} {2}".F(slot.PlayerReference, botController.Index, bot), () => client != null && client.Bot == bot)); } } options.Add(bots.Any() ? "Bots" : "Bots Disabled", bots); Func<SlotDropDownOption, ScrollItemWidget, ScrollItemWidget> setupItem = (o, itemTemplate) => { var item = ScrollItemWidget.Setup(itemTemplate, o.Selected, () => orderManager.IssueOrder(Order.Command(o.Order))); item.Get<LabelWidget>("LABEL").GetText = () => o.Title; return item; }; dropdown.ShowDropDown("LABEL_DROPDOWN_TEMPLATE", 167, options, setupItem); }
public static void SetupEditableSlotWidget(LobbyLogic logic, Widget parent, Session.Slot s, Session.Client c, OrderManager orderManager) { var slot = parent.Get<DropDownButtonWidget>("SLOT_OPTIONS"); slot.IsVisible = () => true; slot.IsDisabled = () => orderManager.LocalClient.IsReady; slot.GetText = () => c != null ? c.Name : s.Closed ? "Closed" : "Open"; slot.OnMouseDown = _ => ShowSlotDropDown(logic, slot, s, c, orderManager); // Ensure Name selector (if present) is hidden var name = parent.GetOrNull("NAME"); if (name != null) name.IsVisible = () => false; }
internal LobbyMapPreviewLogic(Widget widget, ModData modData, OrderManager orderManager, LobbyLogic lobby) { var available = widget.GetOrNull("MAP_AVAILABLE"); if (available != null) { available.IsVisible = () => lobby.Map.Status == MapStatus.Available && (!lobby.Map.RulesLoaded || !lobby.Map.InvalidCustomRules); var preview = available.Get <MapPreviewWidget>("MAP_PREVIEW"); preview.Preview = () => lobby.Map; preview.OnMouseDown = mi => LobbyUtils.SelectSpawnPoint(orderManager, preview, lobby.Map, mi); preview.SpawnOccupants = () => LobbyUtils.GetSpawnOccupants(orderManager.LobbyInfo, lobby.Map); var titleLabel = available.GetOrNull <LabelWidget>("MAP_TITLE"); if (titleLabel != null) { var font = Game.Renderer.Fonts[titleLabel.Font]; var title = new CachedTransform <MapPreview, string>(m => WidgetUtils.TruncateText(m.Title, titleLabel.Bounds.Width, font)); titleLabel.GetText = () => title.Update(lobby.Map); } var typeLabel = available.GetOrNull <LabelWidget>("MAP_TYPE"); if (typeLabel != null) { var type = new CachedTransform <MapPreview, string>(m => lobby.Map.Categories.FirstOrDefault() ?? ""); typeLabel.GetText = () => type.Update(lobby.Map); } var authorLabel = available.GetOrNull <LabelWidget>("MAP_AUTHOR"); if (authorLabel != null) { var font = Game.Renderer.Fonts[authorLabel.Font]; var author = new CachedTransform <MapPreview, string>( m => WidgetUtils.TruncateText("Created by {0}".F(lobby.Map.Author), authorLabel.Bounds.Width, font)); authorLabel.GetText = () => author.Update(lobby.Map); } } var invalid = widget.GetOrNull("MAP_INVALID"); if (invalid != null) { invalid.IsVisible = () => lobby.Map.Status == MapStatus.Available && lobby.Map.InvalidCustomRules; var preview = invalid.Get <MapPreviewWidget>("MAP_PREVIEW"); preview.Preview = () => lobby.Map; preview.OnMouseDown = mi => LobbyUtils.SelectSpawnPoint(orderManager, preview, lobby.Map, mi); preview.SpawnOccupants = () => LobbyUtils.GetSpawnOccupants(orderManager.LobbyInfo, lobby.Map); var titleLabel = invalid.GetOrNull <LabelWidget>("MAP_TITLE"); if (titleLabel != null) { titleLabel.GetText = () => lobby.Map.Title; } var typeLabel = invalid.GetOrNull <LabelWidget>("MAP_TYPE"); if (typeLabel != null) { var type = new CachedTransform <MapPreview, string>(m => lobby.Map.Categories.FirstOrDefault() ?? ""); typeLabel.GetText = () => type.Update(lobby.Map); } } var download = widget.GetOrNull("MAP_DOWNLOADABLE"); if (download != null) { download.IsVisible = () => lobby.Map.Status == MapStatus.DownloadAvailable; var preview = download.Get <MapPreviewWidget>("MAP_PREVIEW"); preview.Preview = () => lobby.Map; preview.OnMouseDown = mi => LobbyUtils.SelectSpawnPoint(orderManager, preview, lobby.Map, mi); preview.SpawnOccupants = () => LobbyUtils.GetSpawnOccupants(orderManager.LobbyInfo, lobby.Map); var titleLabel = download.GetOrNull <LabelWidget>("MAP_TITLE"); if (titleLabel != null) { titleLabel.GetText = () => lobby.Map.Title; } var typeLabel = download.GetOrNull <LabelWidget>("MAP_TYPE"); if (typeLabel != null) { var type = new CachedTransform <MapPreview, string>(m => lobby.Map.Categories.FirstOrDefault() ?? ""); typeLabel.GetText = () => type.Update(lobby.Map); } var authorLabel = download.GetOrNull <LabelWidget>("MAP_AUTHOR"); if (authorLabel != null) { authorLabel.GetText = () => "Created by {0}".F(lobby.Map.Author); } var install = download.GetOrNull <ButtonWidget>("MAP_INSTALL"); if (install != null) { install.OnClick = () => lobby.Map.Install(() => { lobby.Map.PreloadRules(); Game.RunAfterTick(() => orderManager.IssueOrder(Order.Command("state {0}".F(Session.ClientState.NotReady)))); }); install.IsHighlighted = () => installHighlighted; } } var progress = widget.GetOrNull("MAP_PROGRESS"); if (progress != null) { progress.IsVisible = () => lobby.Map.Status != MapStatus.Available && lobby.Map.Status != MapStatus.DownloadAvailable; var preview = progress.Get <MapPreviewWidget>("MAP_PREVIEW"); preview.Preview = () => lobby.Map; preview.OnMouseDown = mi => LobbyUtils.SelectSpawnPoint(orderManager, preview, lobby.Map, mi); preview.SpawnOccupants = () => LobbyUtils.GetSpawnOccupants(orderManager.LobbyInfo, lobby.Map); var titleLabel = progress.GetOrNull <LabelWidget>("MAP_TITLE"); if (titleLabel != null) { titleLabel.GetText = () => lobby.Map.Title; } var typeLabel = progress.GetOrNull <LabelWidget>("MAP_TYPE"); if (typeLabel != null) { if (typeLabel != null) { var type = new CachedTransform <MapPreview, string>(m => lobby.Map.Categories.FirstOrDefault() ?? ""); typeLabel.GetText = () => type.Update(lobby.Map); } } var statusSearching = progress.GetOrNull("MAP_STATUS_SEARCHING"); if (statusSearching != null) { statusSearching.IsVisible = () => lobby.Map.Status == MapStatus.Searching; } var statusUnavailable = progress.GetOrNull("MAP_STATUS_UNAVAILABLE"); if (statusUnavailable != null) { statusUnavailable.IsVisible = () => lobby.Map.Status == MapStatus.Unavailable; } var statusError = progress.GetOrNull("MAP_STATUS_ERROR"); if (statusError != null) { statusError.IsVisible = () => lobby.Map.Status == MapStatus.DownloadError; } var statusDownloading = progress.GetOrNull <LabelWidget>("MAP_STATUS_DOWNLOADING"); if (statusDownloading != null) { statusDownloading.IsVisible = () => lobby.Map.Status == MapStatus.Downloading; statusDownloading.GetText = () => { if (lobby.Map.DownloadBytes == 0) { return("Connecting..."); } // Server does not provide the total file length if (lobby.Map.DownloadPercentage == 0) { return("Downloading {0} kB".F(lobby.Map.DownloadBytes / 1024)); } return("Downloading {0} kB ({1}%)".F(lobby.Map.DownloadBytes / 1024, lobby.Map.DownloadPercentage)); }; } var retry = progress.GetOrNull <ButtonWidget>("MAP_RETRY"); if (retry != null) { retry.IsVisible = () => (lobby.Map.Status == MapStatus.DownloadError || lobby.Map.Status == MapStatus.Unavailable) && lobby.Map != MapCache.UnknownMap; retry.OnClick = () => { if (lobby.Map.Status == MapStatus.DownloadError) { lobby.Map.Install(() => orderManager.IssueOrder(Order.Command("state {0}".F(Session.ClientState.NotReady)))); } else if (lobby.Map.Status == MapStatus.Unavailable) { modData.MapCache.QueryRemoteMapDetails(new[] { lobby.Map.Uid }); } }; retry.GetText = () => lobby.Map.Status == MapStatus.DownloadError ? "Retry Install" : "Retry Search"; } var progressbar = progress.GetOrNull <ProgressBarWidget>("MAP_PROGRESSBAR"); if (progressbar != null) { progressbar.IsIndeterminate = () => lobby.Map.DownloadPercentage == 0; progressbar.GetPercentage = () => lobby.Map.DownloadPercentage; progressbar.IsVisible = () => !retry.IsVisible(); } } }
internal LobbyMapPreviewLogic(Widget widget, OrderManager orderManager, LobbyLogic lobby) { var available = widget.GetOrNull("MAP_AVAILABLE"); if (available != null) { available.IsVisible = () => lobby.Map.Status == MapStatus.Available && lobby.Map.RuleStatus == MapRuleStatus.Cached; var preview = available.Get<MapPreviewWidget>("MAP_PREVIEW"); preview.Preview = () => lobby.Map; preview.OnMouseDown = mi => LobbyUtils.SelectSpawnPoint(orderManager, preview, lobby.Map, mi); preview.SpawnOccupants = () => LobbyUtils.GetSpawnOccupants(orderManager.LobbyInfo, lobby.Map); var title = available.GetOrNull<LabelWidget>("MAP_TITLE"); if (title != null) title.GetText = () => lobby.Map.Title; var type = available.GetOrNull<LabelWidget>("MAP_TYPE"); if (type != null) type.GetText = () => lobby.Map.Type; var author = available.GetOrNull<LabelWidget>("MAP_AUTHOR"); if (author != null) author.GetText = () => "Created by {0}".F(lobby.Map.Author); } var invalid = widget.GetOrNull("MAP_INVALID"); if (invalid != null) { invalid.IsVisible = () => lobby.Map.Status == MapStatus.Available && lobby.Map.RuleStatus == MapRuleStatus.Invalid; var preview = invalid.Get<MapPreviewWidget>("MAP_PREVIEW"); preview.Preview = () => lobby.Map; preview.OnMouseDown = mi => LobbyUtils.SelectSpawnPoint(orderManager, preview, lobby.Map, mi); preview.SpawnOccupants = () => LobbyUtils.GetSpawnOccupants(orderManager.LobbyInfo, lobby.Map); var title = invalid.GetOrNull<LabelWidget>("MAP_TITLE"); if (title != null) title.GetText = () => lobby.Map.Title; var type = invalid.GetOrNull<LabelWidget>("MAP_TYPE"); if (type != null) type.GetText = () => lobby.Map.Type; } var download = widget.GetOrNull("MAP_DOWNLOADABLE"); if (download != null) { download.IsVisible = () => lobby.Map.Status == MapStatus.DownloadAvailable; var preview = download.Get<MapPreviewWidget>("MAP_PREVIEW"); preview.Preview = () => lobby.Map; preview.OnMouseDown = mi => LobbyUtils.SelectSpawnPoint(orderManager, preview, lobby.Map, mi); preview.SpawnOccupants = () => LobbyUtils.GetSpawnOccupants(orderManager.LobbyInfo, lobby.Map); var title = download.GetOrNull<LabelWidget>("MAP_TITLE"); if (title != null) title.GetText = () => lobby.Map.Title; var type = download.GetOrNull<LabelWidget>("MAP_TYPE"); if (type != null) type.GetText = () => lobby.Map.Type; var author = download.GetOrNull<LabelWidget>("MAP_AUTHOR"); if (author != null) author.GetText = () => "Created by {0}".F(lobby.Map.Author); var install = download.GetOrNull<ButtonWidget>("MAP_INSTALL"); if (install != null) install.OnClick = () => lobby.Map.Install(); } var progress = widget.GetOrNull("MAP_PROGRESS"); if (progress != null) { progress.IsVisible = () => (lobby.Map.Status != MapStatus.Available || lobby.Map.RuleStatus == MapRuleStatus.Unknown) && lobby.Map.Status != MapStatus.DownloadAvailable; var preview = progress.Get<MapPreviewWidget>("MAP_PREVIEW"); preview.Preview = () => lobby.Map; preview.OnMouseDown = mi => LobbyUtils.SelectSpawnPoint(orderManager, preview, lobby.Map, mi); preview.SpawnOccupants = () => LobbyUtils.GetSpawnOccupants(orderManager.LobbyInfo, lobby.Map); var title = progress.GetOrNull<LabelWidget>("MAP_TITLE"); if (title != null) title.GetText = () => lobby.Map.Title; var type = progress.GetOrNull<LabelWidget>("MAP_TYPE"); if (type != null) type.GetText = () => lobby.Map.Type; var statusSearching = progress.GetOrNull("MAP_STATUS_SEARCHING"); if (statusSearching != null) statusSearching.IsVisible = () => lobby.Map.Status == MapStatus.Searching; var statusUnavailable = progress.GetOrNull("MAP_STATUS_UNAVAILABLE"); if (statusUnavailable != null) statusUnavailable.IsVisible = () => lobby.Map.Status == MapStatus.Unavailable; var statusError = progress.GetOrNull("MAP_STATUS_ERROR"); if (statusError != null) statusError.IsVisible = () => lobby.Map.Status == MapStatus.DownloadError; var statusDownloading = progress.GetOrNull<LabelWidget>("MAP_STATUS_DOWNLOADING"); if (statusDownloading != null) { statusDownloading.IsVisible = () => lobby.Map.Status == MapStatus.Downloading; statusDownloading.GetText = () => { if (lobby.Map.DownloadBytes == 0) return "Connecting..."; // Server does not provide the total file length if (lobby.Map.DownloadPercentage == 0) return "Downloading {0} kB".F(lobby.Map.DownloadBytes / 1024); return "Downloading {0} kB ({1}%)".F(lobby.Map.DownloadBytes / 1024, lobby.Map.DownloadPercentage); }; } var retry = progress.GetOrNull<ButtonWidget>("MAP_RETRY"); if (retry != null) { retry.IsVisible = () => (lobby.Map.Status == MapStatus.DownloadError || lobby.Map.Status == MapStatus.Unavailable) && lobby.Map != MapCache.UnknownMap; retry.OnClick = () => { if (lobby.Map.Status == MapStatus.DownloadError) lobby.Map.Install(); else if (lobby.Map.Status == MapStatus.Unavailable) Game.ModData.MapCache.QueryRemoteMapDetails(new[] { lobby.Map.Uid }); }; retry.GetText = () => lobby.Map.Status == MapStatus.DownloadError ? "Retry Install" : "Retry Search"; } var progressbar = progress.GetOrNull<ProgressBarWidget>("MAP_PROGRESSBAR"); if (progressbar != null) { progressbar.IsIndeterminate = () => lobby.Map.DownloadPercentage == 0; progressbar.GetPercentage = () => lobby.Map.DownloadPercentage; progressbar.IsVisible = () => !retry.IsVisible(); } } }
internal LobbyMapPreviewLogic(Widget widget, OrderManager orderManager, LobbyLogic lobby) { var available = widget.GetOrNull("MAP_AVAILABLE"); if (available != null) { available.IsVisible = () => lobby.Map.Status == MapStatus.Available && lobby.Map.RuleStatus == MapRuleStatus.Cached; var preview = available.Get <MapPreviewWidget>("MAP_PREVIEW"); preview.Preview = () => lobby.Map; preview.OnMouseDown = mi => LobbyUtils.SelectSpawnPoint(orderManager, preview, lobby.Map, mi); preview.SpawnOccupants = () => LobbyUtils.GetSpawnOccupants(orderManager.LobbyInfo, lobby.Map); var title = available.GetOrNull <LabelWidget>("MAP_TITLE"); if (title != null) { title.GetText = () => lobby.Map.Title; } var type = available.GetOrNull <LabelWidget>("MAP_TYPE"); if (type != null) { type.GetText = () => lobby.Map.Type; } var author = available.GetOrNull <LabelWidget>("MAP_AUTHOR"); if (author != null) { author.GetText = () => "Created by {0}".F(lobby.Map.Author); } } var invalid = widget.GetOrNull("MAP_INVALID"); if (invalid != null) { invalid.IsVisible = () => lobby.Map.Status == MapStatus.Available && lobby.Map.RuleStatus == MapRuleStatus.Invalid; var preview = invalid.Get <MapPreviewWidget>("MAP_PREVIEW"); preview.Preview = () => lobby.Map; preview.OnMouseDown = mi => LobbyUtils.SelectSpawnPoint(orderManager, preview, lobby.Map, mi); preview.SpawnOccupants = () => LobbyUtils.GetSpawnOccupants(orderManager.LobbyInfo, lobby.Map); var title = invalid.GetOrNull <LabelWidget>("MAP_TITLE"); if (title != null) { title.GetText = () => lobby.Map.Title; } var type = invalid.GetOrNull <LabelWidget>("MAP_TYPE"); if (type != null) { type.GetText = () => lobby.Map.Type; } } var download = widget.GetOrNull("MAP_DOWNLOADABLE"); if (download != null) { download.IsVisible = () => lobby.Map.Status == MapStatus.DownloadAvailable; var preview = download.Get <MapPreviewWidget>("MAP_PREVIEW"); preview.Preview = () => lobby.Map; preview.OnMouseDown = mi => LobbyUtils.SelectSpawnPoint(orderManager, preview, lobby.Map, mi); preview.SpawnOccupants = () => LobbyUtils.GetSpawnOccupants(orderManager.LobbyInfo, lobby.Map); var title = download.GetOrNull <LabelWidget>("MAP_TITLE"); if (title != null) { title.GetText = () => lobby.Map.Title; } var type = download.GetOrNull <LabelWidget>("MAP_TYPE"); if (type != null) { type.GetText = () => lobby.Map.Type; } var author = download.GetOrNull <LabelWidget>("MAP_AUTHOR"); if (author != null) { author.GetText = () => "Created by {0}".F(lobby.Map.Author); } var install = download.GetOrNull <ButtonWidget>("MAP_INSTALL"); if (install != null) { install.OnClick = () => lobby.Map.Install(); } } var progress = widget.GetOrNull("MAP_PROGRESS"); if (progress != null) { progress.IsVisible = () => (lobby.Map.Status != MapStatus.Available || lobby.Map.RuleStatus == MapRuleStatus.Unknown) && lobby.Map.Status != MapStatus.DownloadAvailable; var preview = progress.Get <MapPreviewWidget>("MAP_PREVIEW"); preview.Preview = () => lobby.Map; preview.OnMouseDown = mi => LobbyUtils.SelectSpawnPoint(orderManager, preview, lobby.Map, mi); preview.SpawnOccupants = () => LobbyUtils.GetSpawnOccupants(orderManager.LobbyInfo, lobby.Map); var title = progress.GetOrNull <LabelWidget>("MAP_TITLE"); if (title != null) { title.GetText = () => lobby.Map.Title; } var type = progress.GetOrNull <LabelWidget>("MAP_TYPE"); if (type != null) { type.GetText = () => lobby.Map.Type; } var statusSearching = progress.GetOrNull("MAP_STATUS_SEARCHING"); if (statusSearching != null) { statusSearching.IsVisible = () => lobby.Map.Status == MapStatus.Searching; } var statusUnavailable = progress.GetOrNull("MAP_STATUS_UNAVAILABLE"); if (statusUnavailable != null) { statusUnavailable.IsVisible = () => lobby.Map.Status == MapStatus.Unavailable; } var statusError = progress.GetOrNull("MAP_STATUS_ERROR"); if (statusError != null) { statusError.IsVisible = () => lobby.Map.Status == MapStatus.DownloadError; } var statusDownloading = progress.GetOrNull <LabelWidget>("MAP_STATUS_DOWNLOADING"); if (statusDownloading != null) { statusDownloading.IsVisible = () => lobby.Map.Status == MapStatus.Downloading; statusDownloading.GetText = () => { if (lobby.Map.DownloadBytes == 0) { return("Connecting..."); } // Server does not provide the total file length if (lobby.Map.DownloadPercentage == 0) { return("Downloading {0} kB".F(lobby.Map.DownloadBytes / 1024)); } return("Downloading {0} kB ({1}%)".F(lobby.Map.DownloadBytes / 1024, lobby.Map.DownloadPercentage)); }; } var retry = progress.GetOrNull <ButtonWidget>("MAP_RETRY"); if (retry != null) { retry.IsVisible = () => (lobby.Map.Status == MapStatus.DownloadError || lobby.Map.Status == MapStatus.Unavailable) && lobby.Map != MapCache.UnknownMap; retry.OnClick = () => { if (lobby.Map.Status == MapStatus.DownloadError) { lobby.Map.Install(); } else if (lobby.Map.Status == MapStatus.Unavailable) { Game.ModData.MapCache.QueryRemoteMapDetails(new[] { lobby.Map.Uid }); } }; retry.GetText = () => lobby.Map.Status == MapStatus.DownloadError ? "Retry Install" : "Retry Search"; } var progressbar = progress.GetOrNull <ProgressBarWidget>("MAP_PROGRESSBAR"); if (progressbar != null) { progressbar.IsIndeterminate = () => lobby.Map.DownloadPercentage == 0; progressbar.GetPercentage = () => lobby.Map.DownloadPercentage; progressbar.IsVisible = () => !retry.IsVisible(); } } }
internal LobbyMapPreviewLogic(Widget widget, ModData modData, OrderManager orderManager, LobbyLogic lobby) { var available = widget.GetOrNull("MAP_AVAILABLE"); if (available != null) { available.IsVisible = () => lobby.Map.Status == MapStatus.Available && (!lobby.Map.RulesLoaded || !lobby.Map.InvalidCustomRules); var preview = available.Get<MapPreviewWidget>("MAP_PREVIEW"); preview.Preview = () => lobby.Map; preview.OnMouseDown = mi => LobbyUtils.SelectSpawnPoint(orderManager, preview, lobby.Map, mi); preview.SpawnOccupants = () => LobbyUtils.GetSpawnOccupants(orderManager.LobbyInfo, lobby.Map); var titleLabel = available.GetOrNull<LabelWidget>("MAP_TITLE"); if (titleLabel != null) { var font = Game.Renderer.Fonts[titleLabel.Font]; var title = new CachedTransform<MapPreview, string>(m => WidgetUtils.TruncateText(m.Title, titleLabel.Bounds.Width, font)); titleLabel.GetText = () => title.Update(lobby.Map); } var typeLabel = available.GetOrNull<LabelWidget>("MAP_TYPE"); if (typeLabel != null) { var type = new CachedTransform<MapPreview, string>(m => lobby.Map.Categories.FirstOrDefault() ?? ""); typeLabel.GetText = () => type.Update(lobby.Map); } var authorLabel = available.GetOrNull<LabelWidget>("MAP_AUTHOR"); if (authorLabel != null) { var font = Game.Renderer.Fonts[authorLabel.Font]; var author = new CachedTransform<MapPreview, string>( m => WidgetUtils.TruncateText("Created by {0}".F(lobby.Map.Author), authorLabel.Bounds.Width, font)); authorLabel.GetText = () => author.Update(lobby.Map); } } var invalid = widget.GetOrNull("MAP_INVALID"); if (invalid != null) { invalid.IsVisible = () => lobby.Map.Status == MapStatus.Available && lobby.Map.InvalidCustomRules; var preview = invalid.Get<MapPreviewWidget>("MAP_PREVIEW"); preview.Preview = () => lobby.Map; preview.OnMouseDown = mi => LobbyUtils.SelectSpawnPoint(orderManager, preview, lobby.Map, mi); preview.SpawnOccupants = () => LobbyUtils.GetSpawnOccupants(orderManager.LobbyInfo, lobby.Map); var titleLabel = invalid.GetOrNull<LabelWidget>("MAP_TITLE"); if (titleLabel != null) titleLabel.GetText = () => lobby.Map.Title; var typeLabel = invalid.GetOrNull<LabelWidget>("MAP_TYPE"); if (typeLabel != null) { var type = new CachedTransform<MapPreview, string>(m => lobby.Map.Categories.FirstOrDefault() ?? ""); typeLabel.GetText = () => type.Update(lobby.Map); } } var download = widget.GetOrNull("MAP_DOWNLOADABLE"); if (download != null) { download.IsVisible = () => lobby.Map.Status == MapStatus.DownloadAvailable; var preview = download.Get<MapPreviewWidget>("MAP_PREVIEW"); preview.Preview = () => lobby.Map; preview.OnMouseDown = mi => LobbyUtils.SelectSpawnPoint(orderManager, preview, lobby.Map, mi); preview.SpawnOccupants = () => LobbyUtils.GetSpawnOccupants(orderManager.LobbyInfo, lobby.Map); var titleLabel = download.GetOrNull<LabelWidget>("MAP_TITLE"); if (titleLabel != null) titleLabel.GetText = () => lobby.Map.Title; var typeLabel = download.GetOrNull<LabelWidget>("MAP_TYPE"); if (typeLabel != null) { var type = new CachedTransform<MapPreview, string>(m => lobby.Map.Categories.FirstOrDefault() ?? ""); typeLabel.GetText = () => type.Update(lobby.Map); } var authorLabel = download.GetOrNull<LabelWidget>("MAP_AUTHOR"); if (authorLabel != null) authorLabel.GetText = () => "Created by {0}".F(lobby.Map.Author); var install = download.GetOrNull<ButtonWidget>("MAP_INSTALL"); if (install != null) { install.OnClick = () => lobby.Map.Install(() => { lobby.Map.PreloadRules(); Game.RunAfterTick(() => orderManager.IssueOrder(Order.Command("state {0}".F(Session.ClientState.NotReady)))); }); install.IsHighlighted = () => installHighlighted; } } var progress = widget.GetOrNull("MAP_PROGRESS"); if (progress != null) { progress.IsVisible = () => lobby.Map.Status != MapStatus.Available && lobby.Map.Status != MapStatus.DownloadAvailable; var preview = progress.Get<MapPreviewWidget>("MAP_PREVIEW"); preview.Preview = () => lobby.Map; preview.OnMouseDown = mi => LobbyUtils.SelectSpawnPoint(orderManager, preview, lobby.Map, mi); preview.SpawnOccupants = () => LobbyUtils.GetSpawnOccupants(orderManager.LobbyInfo, lobby.Map); var titleLabel = progress.GetOrNull<LabelWidget>("MAP_TITLE"); if (titleLabel != null) titleLabel.GetText = () => lobby.Map.Title; var typeLabel = progress.GetOrNull<LabelWidget>("MAP_TYPE"); if (typeLabel != null) if (typeLabel != null) { var type = new CachedTransform<MapPreview, string>(m => lobby.Map.Categories.FirstOrDefault() ?? ""); typeLabel.GetText = () => type.Update(lobby.Map); } var statusSearching = progress.GetOrNull("MAP_STATUS_SEARCHING"); if (statusSearching != null) statusSearching.IsVisible = () => lobby.Map.Status == MapStatus.Searching; var statusUnavailable = progress.GetOrNull("MAP_STATUS_UNAVAILABLE"); if (statusUnavailable != null) statusUnavailable.IsVisible = () => lobby.Map.Status == MapStatus.Unavailable; var statusError = progress.GetOrNull("MAP_STATUS_ERROR"); if (statusError != null) statusError.IsVisible = () => lobby.Map.Status == MapStatus.DownloadError; var statusDownloading = progress.GetOrNull<LabelWidget>("MAP_STATUS_DOWNLOADING"); if (statusDownloading != null) { statusDownloading.IsVisible = () => lobby.Map.Status == MapStatus.Downloading; statusDownloading.GetText = () => { if (lobby.Map.DownloadBytes == 0) return "Connecting..."; // Server does not provide the total file length if (lobby.Map.DownloadPercentage == 0) return "Downloading {0} kB".F(lobby.Map.DownloadBytes / 1024); return "Downloading {0} kB ({1}%)".F(lobby.Map.DownloadBytes / 1024, lobby.Map.DownloadPercentage); }; } var retry = progress.GetOrNull<ButtonWidget>("MAP_RETRY"); if (retry != null) { retry.IsVisible = () => (lobby.Map.Status == MapStatus.DownloadError || lobby.Map.Status == MapStatus.Unavailable) && lobby.Map != MapCache.UnknownMap; retry.OnClick = () => { if (lobby.Map.Status == MapStatus.DownloadError) lobby.Map.Install(() => orderManager.IssueOrder(Order.Command("state {0}".F(Session.ClientState.NotReady)))); else if (lobby.Map.Status == MapStatus.Unavailable) modData.MapCache.QueryRemoteMapDetails(new[] { lobby.Map.Uid }); }; retry.GetText = () => lobby.Map.Status == MapStatus.DownloadError ? "Retry Install" : "Retry Search"; } var progressbar = progress.GetOrNull<ProgressBarWidget>("MAP_PROGRESSBAR"); if (progressbar != null) { progressbar.IsIndeterminate = () => lobby.Map.DownloadPercentage == 0; progressbar.GetPercentage = () => lobby.Map.DownloadPercentage; progressbar.IsVisible = () => !retry.IsVisible(); } } }