private void ReallyUnpublishThenDeleteMod() { var promise = Game.Network.Workshop.UpdateItem( m_mod.SteamWorkshopID.Value, "Deleted", title: m_mod.Title + " (Deleted in Editor)", visibility: false ); var dialog = PromiseDialogBox.Create(Game.Language.Translate("menus.unpublishing.title"), promise); dialog.OnClosed += delegate(object sender, DialogBoxClosedEventArgs e) { if (promise.Status == Status.Complete) { // Continue to delete the mod ReallyDeleteMod(); } else if (promise.Status == Status.Error) { // Show the user the error var errorDialog = DialogBox.CreateQueryBox( Game.Screen, Game.Language.Translate("menus.unpublishing_error.title"), promise.Error, new string[] { Game.Language.Translate("menus.ok") }, true ); ShowDialog(errorDialog); } }; ShowDialog(dialog); }
private void ReallyPublishMod() { // Update game_version m_mod.MinimumGameVersion = App.Info.Version; m_mod.SaveInfo(); // Check every level has a thumbnail and has been completed foreach (var campaign in Assets.Find <Campaign>("campaigns", m_mod.Assets)) { for (int i = 0; i < campaign.Levels.Count; ++i) { var levelPath = campaign.Levels[i]; var levelData = LevelData.Get(levelPath); if (!levelData.EverCompleted) { ShowDialog(DialogBox.CreateQueryBox( Game.Screen, Game.Language.Translate("menus.publishing_error.title"), Game.Language.Translate("menus.publishing_error.level_not_completed", TranslateTitle(levelData.Title)), new string[] { Game.Language.Translate("menus.ok") }, true) ); return; } var levelThumbnailPath = AssetPath.ChangeExtension(levelPath, "png"); var levelThumbnailFullPath = Path.Combine(m_mod.Path, "assets/" + levelThumbnailPath); if (!File.Exists(levelThumbnailFullPath)) { ShowDialog(DialogBox.CreateQueryBox( Game.Screen, Game.Language.Translate("menus.publishing_error.title"), Game.Language.Translate("menus.publishing_error.level_no_thumbnail", TranslateTitle(levelData.Title)), new string[] { Game.Language.Translate("menus.ok") }, true) ); return; } } } // Find source images for the thumbnail var thumbnailSources = new List <string>(); var manualThumbnailPath = Path.Combine(m_mod.Path, "thumbnail.png"); if (File.Exists(manualThumbnailPath)) { // Use thumbnail.png thumbnailSources.Add(manualThumbnailPath); } else { // Use the thumbnails from the levels var campaigns = Assets.List <Campaign>("campaigns", m_mod.Assets).ToArray(); for (int i = 0; i < campaigns.Length; ++i) { var campaign = campaigns[i]; for (int j = 0; j < campaign.Levels.Count; ++j) { var levelPath = campaign.Levels[j]; var levelThumbnailPath = AssetPath.ChangeExtension(levelPath, "png"); var levelThumbnailFullPath = Path.Combine(m_mod.Path, "assets/" + levelThumbnailPath); if (File.Exists(levelThumbnailFullPath)) { thumbnailSources.Add(levelThumbnailFullPath); } } } } if (thumbnailSources.Count == 0) { ShowDialog(DialogBox.CreateQueryBox( Game.Screen, Game.Language.Translate("menus.publishing_error.title"), Game.Language.Translate("menus.publishing_error.no_thumbnail"), new string[] { Game.Language.Translate("menus.ok") }, true) ); return; } // Generate the thumbnail var thumbnailPath = GenerateThumbnail(thumbnailSources); // Determine the tags var tags = new HashSet <string>(); if (Assets.Find <LuaScript>("animation", m_mod.Assets).Count() > 0) { tags.Add("Custom Animation"); } if (Assets.List <Campaign>("campaigns", m_mod.Assets).Count() > 0 && Assets.Find <LevelData>("levels", m_mod.Assets).Count() > 0) { tags.Add("New Levels"); } if (Assets.List <Language>("languages", m_mod.Assets).Where(lang => !lang.IsEnglish).Count() > 0) { tags.Add("Localisation"); } if (Assets.Find <Model>("models", m_mod.Assets).Count() > 0 || Assets.Find <Sky>("skies", m_mod.Assets).Count() > 0) { tags.Add("Custom Art"); } if (Assets.Find <Sound>("sound", m_mod.Assets).Count() > 0 || Assets.Find <Sound>("music", m_mod.Assets).Count() > 0) { tags.Add("Custom Audio"); } if (Assets.List <ArcadeDisk>("arcade", m_mod.Assets).Count() > 0) { tags.Add("Arcade Games"); } // Publish if (m_mod.SteamWorkshopID.HasValue) { // Update existing mod ulong id = m_mod.SteamWorkshopID.Value; var promise = Game.Network.Workshop.UpdateItem( id, "Modified with the Redirection Mod Editor", filePath: m_mod.Path, previewImagePath: thumbnailPath, title: m_mod.Title, tags: tags.ToArray() ); var progressDialog = PromiseDialogBox.Create( Game.Language.Translate("menus.publishing.title"), promise ); progressDialog.OnClosed += delegate(object sender2, DialogBoxClosedEventArgs e2) { if (promise.Status == Status.Complete) { // Show the user the mod ShowInWorkshop(); // Show a dialog var completeDialog = DialogBox.CreateQueryBox( Game.Screen, Game.Language.Translate("menus.mod_published.title"), promise.Result.AgreementNeeded ? Game.Language.Translate("menus.mod_published.info_agreement_needed", m_mod.Title) : Game.Language.Translate("menus.mod_published.info", m_mod.Title), new string[] { Game.Language.Translate("menus.ok") }, true ); ShowDialog(completeDialog); } else if (promise.Status == Status.Error) { // Show the user the error var errorDialog = DialogBox.CreateQueryBox( Game.Screen, Game.Language.Translate("menus.publishing_error.title"), promise.Error, new string[] { Game.Language.Translate("menus.ok") }, true ); ShowDialog(errorDialog); } }; ShowDialog(progressDialog); } else { // Create new mod var description = "Created with the Redirection Mod Editor"; var promise = Game.Network.Workshop.CreateItem( m_mod.Path, thumbnailPath, m_mod.Title, description, tags.ToArray(), true ); var progressDialog = PromiseDialogBox.Create( Game.Language.Translate("menus.publishing.title"), promise ); progressDialog.OnClosed += delegate(object sender2, DialogBoxClosedEventArgs e2) { if (promise.Status == Status.Complete) { // Save the mod ulong id = promise.Result.ID; m_mod.SteamWorkshopID = id; m_mod.SaveInfo(); // Show the user the mod ShowInWorkshop(); // Show a dialog var completeDialog = DialogBox.CreateQueryBox( Game.Screen, Game.Language.Translate("menus.mod_published.title"), promise.Result.AgreementNeeded ? Game.Language.Translate("menus.mod_published.info_agreement_needed", m_mod.Title) : Game.Language.Translate("menus.mod_published.info", m_mod.Title), new string[] { Game.Language.Translate("menus.ok") }, true ); completeDialog.OnClosed += delegate { // Re-enter state so the new "show in workshop" entry appears CutToState(new ModEditorState(Game, m_mod)); }; ShowDialog(completeDialog); } else if (promise.Status == Status.Error) { // Show the user the error var errorDialog = DialogBox.CreateQueryBox( Game.Screen, Game.Language.Translate("menus.publishing_error.title"), promise.Error, new string[] { Game.Language.Translate("menus.ok") }, true ); ShowDialog(errorDialog); } }; ShowDialog(progressDialog); } }