public override void OnInitialize() { uIElement = new UIElement { Width = { Percent = 0.8f }, MaxWidth = UICommon.MaxPanelWidth, Top = { Pixels = 220 }, Height = { Pixels = -220, Percent = 1f }, HAlign = 0.5f }; uIPanel = new UIPanel { Width = { Percent = 1f }, Height = { Pixels = -110, Percent = 1f }, BackgroundColor = UICommon.mainPanelBackground, PaddingTop = 0f }; uIElement.Append(uIPanel); uiLoader = new UILoaderAnimatedImage(0.5f, 0.5f, 1f); modList = new UIList { Width = { Pixels = -25, Percent = 1f }, Height = { Pixels = ModLoader.showMemoryEstimates ? -72 : -50, Percent = 1f }, Top = { Pixels = ModLoader.showMemoryEstimates ? 72 : 50 }, ListPadding = 5f }; uIPanel.Append(modList); if (ModLoader.showMemoryEstimates) { var ramUsage = new UIMemoryBar() { Top = { Pixels = 45 }, }; ramUsage.Width.Pixels = -25; uIPanel.Append(ramUsage); } var uIScrollbar = new UIScrollbar { Height = { Pixels = -50, Percent = 1f }, Top = { Pixels = 50 }, HAlign = 1f }.WithView(100f, 1000f); uIPanel.Append(uIScrollbar); modList.SetScrollbar(uIScrollbar); var uIHeaderTexTPanel = new UITextPanel <string>(Language.GetTextValue("tModLoader.ModsModsList"), 0.8f, true) { HAlign = 0.5f, Top = { Pixels = -35 }, BackgroundColor = UICommon.defaultUIBlue }.WithPadding(15f); uIElement.Append(uIHeaderTexTPanel); buttonEA = new UIAutoScaleTextTextPanel <string>(Language.GetTextValue("tModLoader.ModsEnableAll")) { TextColor = Color.Green, Width = new StyleDimension(-10f, 1f / 3f), Height = { Pixels = 40 }, VAlign = 1f, Top = { Pixels = -65 } }.WithFadedMouseOver(); buttonEA.OnClick += EnableAll; uIElement.Append(buttonEA); // TODO CopyStyle doesn't capture all the duplication here, consider an inner method buttonDA = new UIAutoScaleTextTextPanel <string>(Language.GetTextValue("tModLoader.ModsDisableAll")); buttonDA.CopyStyle(buttonEA); buttonDA.TextColor = Color.Red; buttonDA.HAlign = 0.5f; buttonDA.WithFadedMouseOver(); buttonDA.OnClick += DisableAll; uIElement.Append(buttonDA); buttonRM = new UIAutoScaleTextTextPanel <string>(Language.GetTextValue("tModLoader.ModsReloadMods")); buttonRM.CopyStyle(buttonEA); buttonRM.HAlign = 1f; buttonDA.WithFadedMouseOver(); buttonRM.OnClick += ReloadMods; uIElement.Append(buttonRM); buttonB = new UIAutoScaleTextTextPanel <string>(Language.GetTextValue("UI.Back")); buttonB.CopyStyle(buttonEA); buttonB.Top.Pixels = -20; buttonB.WithFadedMouseOver(); buttonB.OnClick += BackClick; uIElement.Append(buttonB); buttonOMF = new UIAutoScaleTextTextPanel <string>(Language.GetTextValue("tModLoader.ModsOpenModsFolder")); buttonOMF.CopyStyle(buttonB); buttonOMF.HAlign = 0.5f; buttonOMF.WithFadedMouseOver(); buttonOMF.OnClick += OpenModsFolder; uIElement.Append(buttonOMF); var texture = Texture2D.FromStream(Main.instance.GraphicsDevice, Assembly.GetExecutingAssembly().GetManifestResourceStream("Terraria.ModLoader.UI.UIModBrowserIcons.png")); var upperMenuContainer = new UIElement { Width = { Percent = 1f }, Height = { Pixels = 32 }, Top = { Pixels = 10 } }; UICycleImage toggleImage; for (int j = 0; j < 3; j++) { if (j == 0) //TODO: ouch, at least there's a loop but these click events look quite similar { toggleImage = new UICycleImage(texture, 3, 32, 32, 34 * 3, 0); toggleImage.setCurrentState((int)sortMode); toggleImage.OnClick += (a, b) => { sortMode = sortMode.NextEnum(); updateNeeded = true; }; toggleImage.OnRightClick += (a, b) => { sortMode = sortMode.PreviousEnum(); updateNeeded = true; }; } else if (j == 1) { toggleImage = new UICycleImage(texture, 3, 32, 32, 34 * 4, 0); toggleImage.setCurrentState((int)enabledFilterMode); toggleImage.OnClick += (a, b) => { enabledFilterMode = enabledFilterMode.NextEnum(); updateNeeded = true; }; toggleImage.OnRightClick += (a, b) => { enabledFilterMode = enabledFilterMode.PreviousEnum(); updateNeeded = true; }; } else { toggleImage = new UICycleImage(texture, 5, 32, 32, 34 * 5, 0); toggleImage.setCurrentState((int)modSideFilterMode); toggleImage.OnClick += (a, b) => { modSideFilterMode = modSideFilterMode.NextEnum(); updateNeeded = true; }; toggleImage.OnRightClick += (a, b) => { modSideFilterMode = modSideFilterMode.PreviousEnum(); updateNeeded = true; }; } toggleImage.Left.Pixels = j * 36 + 8; _categoryButtons.Add(toggleImage); upperMenuContainer.Append(toggleImage); } var filterTextBoxBackground = new UIPanel { Top = { Percent = 0f }, Left = { Pixels = -170, Percent = 1f }, Width = { Pixels = 135 }, Height = { Pixels = 40 } }; filterTextBoxBackground.OnRightClick += (a, b) => filterTextBox.Text = ""; upperMenuContainer.Append(filterTextBoxBackground); filterTextBox = new UIInputTextField(Language.GetTextValue("tModLoader.ModsTypeToSearch")) { Top = { Pixels = 5 }, Left = { Pixels = -160, Percent = 1f }, Width = { Pixels = 120 }, Height = { Pixels = 20 } }; filterTextBox.OnTextChange += (a, b) => updateNeeded = true; upperMenuContainer.Append(filterTextBox); SearchFilterToggle = new UICycleImage(texture, 2, 32, 32, 34 * 2, 0) { Left = { Pixels = 545 } }; SearchFilterToggle.setCurrentState((int)searchFilterMode); SearchFilterToggle.OnClick += (a, b) => { searchFilterMode = searchFilterMode.NextEnum(); updateNeeded = true; }; SearchFilterToggle.OnRightClick += (a, b) => { searchFilterMode = searchFilterMode.PreviousEnum(); updateNeeded = true; }; _categoryButtons.Add(SearchFilterToggle); upperMenuContainer.Append(SearchFilterToggle); buttonMP = new UIAutoScaleTextTextPanel <string>(Language.GetTextValue("tModLoader.ModsModPacks")); buttonMP.CopyStyle(buttonOMF); buttonMP.HAlign = 1f; buttonMP.WithFadedMouseOver(); buttonMP.OnClick += GotoModPacksMenu; uIElement.Append(buttonMP); uIPanel.Append(upperMenuContainer); Append(uIElement); }
private void PublishMod(UIMouseEvent evt, UIElement listeningElement) { if (ModLoader.modBrowserPassphrase == "") { Main.menuMode = Interface.enterPassphraseMenuID; Interface.enterPassphraseMenu.SetGotoMenu(Interface.modSourcesID); return; } SoundEngine.PlaySound(10); try { if (ModLoader.GetMod(_builtMod.Name) == null) { if (!_builtMod.Enabled) { _builtMod.Enabled = true; } Main.menuMode = Interface.reloadModsID; ModLoader.OnSuccessfulLoad += () => { PublishMod(null, null); }; return; } var modFile = _builtMod.modFile; var bp = _builtMod.properties; var files = new List <UploadFile>(); files.Add(new UploadFile { Name = "file", Filename = Path.GetFileName(modFile.path), // ContentType = "text/plain", Content = File.ReadAllBytes(modFile.path) }); if (modFile.HasFile("icon.png")) { using (modFile.Open()) files.Add(new UploadFile { Name = "iconfile", Filename = "icon.png", Content = modFile.GetBytes("icon.png") }); } if (bp.beta) { throw new WebException(Language.GetTextValue("tModLoader.BetaModCantPublishError")); } if (bp.buildVersion != modFile.tModLoaderVersion) { throw new WebException(Language.GetTextValue("OutdatedModCantPublishError.BetaModCantPublishError")); } var values = new NameValueCollection { { "displayname", bp.displayName }, { "displaynameclean", string.Join("", ChatManager.ParseMessage(bp.displayName, Color.White).Where(x => x.GetType() == typeof(TextSnippet)).Select(x => x.Text)) }, { "name", modFile.name }, { "version", "v" + bp.version }, { "author", bp.author }, { "homepage", bp.homepage }, { "description", bp.description }, { "steamid64", ModLoader.SteamID64 }, { "modloaderversion", "tModLoader v" + modFile.tModLoaderVersion }, { "passphrase", ModLoader.modBrowserPassphrase }, { "modreferences", String.Join(", ", bp.modReferences.Select(x => x.mod)) }, { "modside", bp.side.ToFriendlyString() }, }; if (values["steamid64"].Length != 17) { throw new WebException($"The steamid64 '{values["steamid64"]}' is invalid, verify that you are logged into Steam and don't have a pirated copy of Terraria."); } if (string.IsNullOrEmpty(values["author"])) { throw new WebException($"You need to specify an author in build.txt"); } ServicePointManager.Expect100Continue = false; string url = "http://javid.ddns.net/tModLoader/publishmod.php"; uploadTimer = new Stopwatch(); uploadTimer.Start(); using (PatientWebClient client = new PatientWebClient()) { ServicePointManager.ServerCertificateValidationCallback = (sender, certificate, chain, policyErrors) => true; Interface.progress.Show(displayText: $"Uploading: {modFile.name}", gotoMenu: Interface.modSourcesID, cancel: client.CancelAsync); client.UploadProgressChanged += (s, e) => { double elapsedSeconds = uploadTimer.Elapsed.TotalSeconds; double speed = elapsedSeconds > 0.0 ? e.BytesSent / elapsedSeconds : 0.0; Interface.progress.SubProgressText = $"{UIMemoryBar.SizeSuffix(e.BytesSent, 2)} / {UIMemoryBar.SizeSuffix(e.TotalBytesToSend, 2)} " + $"({UIMemoryBar.SizeSuffix((long)speed, 2)}/s)"; Interface.progress.Progress = (float)e.BytesSent / e.TotalBytesToSend; }; client.UploadDataCompleted += (s, e) => PublishUploadDataComplete(s, e, modFile); var boundary = "---------------------------" + DateTime.Now.Ticks.ToString("x", System.Globalization.NumberFormatInfo.InvariantInfo); client.Headers["Content-Type"] = "multipart/form-data; boundary=" + boundary; //boundary = "--" + boundary; byte[] data = UploadFile.GetUploadFilesRequestData(files, values, boundary); client.UploadDataAsync(new Uri(url), data); } } catch (WebException e) { UIModBrowser.LogModBrowserException(e); } }