Core(DLCManager) - Add CloseDLCPackage function

This commit is contained in:
miku-666
2025-12-10 07:30:09 +01:00
parent 91a82c99d9
commit 2b36e9d1d8
4 changed files with 225 additions and 193 deletions

View File

@@ -31,24 +31,29 @@ using PckStudio.Properties;
namespace PckStudio
{
public partial class MainForm : ImmersiveForm
{
private PckManager PckManager = null;
public partial class MainForm : ImmersiveForm
{
private PckManager PckManager = null;
private Dictionary<string, TabPage> openTabPages = new Dictionary<string, TabPage>();
private DLCManager _dlcManager;
public MainForm()
{
InitializeComponent();
{
InitializeComponent();
Text = Application.ProductName;
labelVersion.Text = $"{Application.ProductName}: {ApplicationScope.CurrentVersion}";
ChangelogRichTextBox.Text = Resources.CHANGELOG;
pckOpen.AllowDrop = true;
}
labelVersion.Text = $"{Application.ProductName}: {ApplicationScope.CurrentVersion}";
ChangelogRichTextBox.Text = Resources.CHANGELOG;
pckOpen.AllowDrop = true;
_dlcManager = new DLCManager(Settings.Default.Platform, Settings.Default.UserLanguage);
Internal.SettingsManager.Default.RegisterPropertyChangedCallback<AppLanguage>(nameof(Settings.Default.UserLanguage), _dlcManager.SetPreferredLanguage);
Internal.SettingsManager.Default.RegisterPropertyChangedCallback<ConsolePlatform>(nameof(Settings.Default.Platform), _dlcManager.SetPlatform);
}
public void LoadPckFromFile(IEnumerable<string> filepaths)
{
@@ -60,17 +65,19 @@ namespace PckStudio
public void LoadPckFromFile(string filepath)
{
IDLCPackage dlcPackage = DLCManager.Default.OpenDLCPackage(filepath);
IDLCPackage dlcPackage = _dlcManager.OpenDLCPackage(filepath);
Debug.WriteLine(dlcPackage?.GetDLCPackageType());
if (dlcPackage is null)
{
MessageBox.Show($"Failed to open '{Path.GetFileName(filepath)}'");
return;
}
SaveToRecentFiles(filepath);
if (dlcPackage.GetDLCPackageType() == DLCPackageType.RawAssets)
AddEditorPage(dlcPackage);
AddEditorPage(dlcPackage);
}
internal void OpenNewPckTab(string caption, string identifier, RawAssetDLCPackage packInfo, ISaveContext<RawAssetDLCPackage> saveContext)
{
internal void OpenNewPckTab(string caption, string identifier, RawAssetDLCPackage packInfo, ISaveContext<RawAssetDLCPackage> saveContext)
{
if (openTabPages.ContainsKey(identifier))
{
tabControl.SelectTab(openTabPages[identifier]);
@@ -89,14 +96,34 @@ namespace PckStudio
private void AddEditorPage(IDLCPackage dlcPackage)
{
ISaveContext<RawAssetDLCPackage> saveContext = GetDefaultSaveContext("", "PCK (Minecraft Console Package)");
var editor = new RawAssetsEditor(dlcPackage as RawAssetDLCPackage, saveContext);
TabPage page = AddPage(dlcPackage.Name, dlcPackage.Name, editor);
switch (dlcPackage.GetDLCPackageType())
{
case DLCPackageType.RawAssets:
ISaveContext<RawAssetDLCPackage> saveContext = GetDefaultSaveContext("", "PCK (Minecraft Console Package)");
var editor = new RawAssetsEditor(dlcPackage as RawAssetDLCPackage, saveContext);
TabPage page = AddPage(dlcPackage.Name, dlcPackage.Name, editor);
break;
case DLCPackageType.SkinPack:
break;
case DLCPackageType.TexturePack:
break;
case DLCPackageType.MashUpPack:
break;
case DLCPackageType.MG01:
case DLCPackageType.MG02:
case DLCPackageType.MG03:
MessageBox.Show("Not Implemented...");
break;
default:
Trace.TraceError("Invalid Package Type");
break;
}
}
private static ISaveContext<RawAssetDLCPackage> GetDefaultSaveContext(string filepath, string description)
{
return new DelegatedFileSaveContext<RawAssetDLCPackage>(filepath, false, new FileDialogFilter(description, "*"+Path.GetExtension(filepath)),(packInfo, stream) => new PckFileWriter(packInfo.PckFile, packInfo.ByteOrder).WriteToStream(stream));
return new DelegatedFileSaveContext<RawAssetDLCPackage>(filepath, false, new FileDialogFilter(description, "*" + Path.GetExtension(filepath)), (packInfo, stream) => new PckFileWriter(packInfo.PckFile, packInfo.ByteOrder).WriteToStream(stream));
}
private TabPage AddPage(string caption, string identifier, Control control)
@@ -127,9 +154,9 @@ namespace PckStudio
private bool TryGetCurrentEditor(out IEditor<RawAssetDLCPackage> editor) => TryGetEditor(tabControl.SelectedTab, out editor);
private void MainForm_Load(object sender, EventArgs e)
{
LoadRecentFileList();
}
{
LoadRecentFileList();
}
private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
{
@@ -173,55 +200,55 @@ namespace PckStudio
{
Settings.Default.RecentFiles ??= new System.Collections.Specialized.StringCollection();
recentlyOpenToolStripMenuItem.DropDownItems.Clear();
for (int i = 0; i < Settings.Default.RecentFiles.Count && i < 5; i++)
{
string filepath = Settings.Default.RecentFiles[i];
if (!string.IsNullOrWhiteSpace(filepath) && File.Exists(filepath))
{
string displayFilepath = Regex.Replace(filepath, @"([A-Z]{1}\:\\[Uu]sers\\)([^\\]*\\)(.*)", "~\\$3");
for (int i = 0; i < Settings.Default.RecentFiles.Count && i < 5; i++)
{
string filepath = Settings.Default.RecentFiles[i];
if (!string.IsNullOrWhiteSpace(filepath) && File.Exists(filepath))
{
string displayFilepath = Regex.Replace(filepath, @"([A-Z]{1}\:\\[Uu]sers\\)([^\\]*\\)(.*)", "~\\$3");
ToolStripItem item = recentlyOpenToolStripMenuItem.DropDownItems.Add(displayFilepath, null, HandleOpenFile);
item.Tag = filepath;
}
}
if (recentlyOpenToolStripMenuItem.DropDownItems.Count > 0)
{
void clearRecentFileList(object sender, EventArgs e)
{
Settings.Default.RecentFiles.Clear();
LoadRecentFileList();
item.Tag = filepath;
}
recentlyOpenToolStripMenuItem.DropDownItems.Add(new ToolStripSeparator());
recentlyOpenToolStripMenuItem.DropDownItems.Add("Clear", null, clearRecentFileList);
}
}
if (recentlyOpenToolStripMenuItem.DropDownItems.Count > 0)
{
void clearRecentFileList(object sender, EventArgs e)
{
Settings.Default.RecentFiles.Clear();
LoadRecentFileList();
}
recentlyOpenToolStripMenuItem.DropDownItems.Add(new ToolStripSeparator());
recentlyOpenToolStripMenuItem.DropDownItems.Add("Clear", null, clearRecentFileList);
}
}
private void HandleOpenFile(object sender, EventArgs e)
{
if (sender is ToolStripItem menuItem && menuItem.Tag is string filepath)
{
if (!File.Exists(filepath))
{
menuItem.Available = false;
return;
}
LoadPckFromFile(filepath);
}
private void HandleOpenFile(object sender, EventArgs e)
{
if (sender is ToolStripItem menuItem && menuItem.Tag is string filepath)
{
if (!File.Exists(filepath))
{
menuItem.Available = false;
return;
}
LoadPckFromFile(filepath);
}
}
private void SaveToRecentFiles(string filepath)
{
if (filepath is null || string.IsNullOrWhiteSpace(filepath))
return;
private void SaveToRecentFiles(string filepath)
{
if (filepath is null || string.IsNullOrWhiteSpace(filepath))
return;
if (Settings.Default.RecentFiles.Contains(filepath))
Settings.Default.RecentFiles.Remove(filepath);
Settings.Default.RecentFiles.Insert(0, filepath);
Settings.Default.RecentFiles.Insert(0, filepath);
for (int i = Settings.Default.RecentFiles.Count - 1; i >= 5; i--)
{
for (int i = Settings.Default.RecentFiles.Count - 1; i >= 5; i--)
{
Settings.Default.RecentFiles.RemoveAt(i);
}
Settings.Default.Save();
LoadRecentFileList();
Settings.Default.Save();
LoadRecentFileList();
}
private void openPckManagerToolStripMenuItem_Click(object sender, EventArgs e)
@@ -238,7 +265,7 @@ namespace PckStudio
}
private void openToolStripMenuItem_Click(object sender, EventArgs e)
{
{
using var ofd = new OpenFileDialog();
ofd.CheckFileExists = true;
ofd.Filter = "PCK (Minecraft Console Package)|*.pck";
@@ -253,6 +280,7 @@ namespace PckStudio
if (TryGetEditor(e.Page, out IEditor<RawAssetDLCPackage> editor))
{
editor.Close();
_dlcManager.CloseDLCPackage(editor.EditorValue.Identifier);
RemoveOpenFile();
}
}
@@ -271,66 +299,66 @@ namespace PckStudio
}
private static PckFile InitializePack(int packId, int packVersion, string packName)
{
var pack = new PckFile(3);
{
var pack = new PckFile(3);
PckAsset zeroAsset = pack.CreateNewAsset("0", PckAssetType.InfoFile);
zeroAsset.AddProperty("PACKID", packId);
zeroAsset.AddProperty("PACKVERSION", packVersion);
zeroAsset.AddProperty("PACKID", packId);
zeroAsset.AddProperty("PACKVERSION", packVersion);
var locFile = new LOCFile();
locFile.InitializeDefault(packName);
pack.CreateNewAsset("localisation.loc", PckAssetType.LocalisationFile, new LOCFileWriter(locFile, 2));
return pack;
}
var locFile = new LOCFile();
locFile.InitializeDefault(packName);
pack.CreateNewAsset("localisation.loc", PckAssetType.LocalisationFile, new LOCFileWriter(locFile, 2));
return pack;
}
private static PckFile InitializeTexturePack(int packId, int packVersion, string packName, string res)
{
{
PckFile pack = InitializePack(packId, packVersion, packName);
PckFile infoPCK = new PckFile(3);
PckFile infoPCK = new PckFile(3);
pack.GetAsset("localisation.loc", PckAssetType.LocalisationFile).Filename = "languages.loc";
PckAsset iconAsset = infoPCK.CreateNewAsset("icon.png", PckAssetType.TextureFile);
iconAsset.SetTexture(Core.Properties.Resources.TexturePackIcon);
iconAsset.SetTexture(Core.Properties.Resources.TexturePackIcon);
PckAsset comparisonAsset = infoPCK.CreateNewAsset("comparison.png", PckAssetType.TextureFile);
comparisonAsset.SetTexture(Core.Properties.Resources.Comparison);
comparisonAsset.SetTexture(Core.Properties.Resources.Comparison);
PckAsset texturepackInfoAsset = pack.CreateNewAsset($"{res}/{res}Info.pck", PckAssetType.TexturePackInfoFile);
texturepackInfoAsset.AddProperty("PACKID", "0");
texturepackInfoAsset.AddProperty("DATAPATH", $"{res}Data.pck");
texturepackInfoAsset.AddProperty("PACKID", "0");
texturepackInfoAsset.AddProperty("DATAPATH", $"{res}Data.pck");
texturepackInfoAsset.SetData(new PckFileWriter(infoPCK, OMI.ByteOrder.BigEndian));
texturepackInfoAsset.SetData(new PckFileWriter(infoPCK, OMI.ByteOrder.BigEndian));
return pack;
}
return pack;
}
private static PckFile InitializeMashUpPack(int packId, int packVersion, string packName, string res)
{
private static PckFile InitializeMashUpPack(int packId, int packVersion, string packName, string res)
{
PckFile pack = InitializeTexturePack(packId, packVersion, packName, res);
PckAsset gameRuleAsset = pack.CreateNewAsset("GameRules.grf", PckAssetType.GameRulesFile);
GameRuleFile grfFile = new GameRuleFile();
grfFile.AddRule("MapOptions",
new KeyValuePair<string, string>("seed", "0"),
new KeyValuePair<string, string>("baseSaveName", string.Empty),
new KeyValuePair<string, string>("flatworld", "false"),
new KeyValuePair<string, string>("texturePackId", packId.ToString())
);
grfFile.AddRule("LevelRules")
.AddRule("UpdatePlayer",
new KeyValuePair<string, string>("yRot", "0"),
new KeyValuePair<string, string>("xRot", "0"),
new KeyValuePair<string, string>("spawnX", "0"),
new KeyValuePair<string, string>("spawnY", "0"),
new KeyValuePair<string, string>("spawnZ", "0")
);
grfFile.AddRule("MapOptions",
new KeyValuePair<string, string>("seed", "0"),
new KeyValuePair<string, string>("baseSaveName", string.Empty),
new KeyValuePair<string, string>("flatworld", "false"),
new KeyValuePair<string, string>("texturePackId", packId.ToString())
);
grfFile.AddRule("LevelRules")
.AddRule("UpdatePlayer",
new KeyValuePair<string, string>("yRot", "0"),
new KeyValuePair<string, string>("xRot", "0"),
new KeyValuePair<string, string>("spawnX", "0"),
new KeyValuePair<string, string>("spawnY", "0"),
new KeyValuePair<string, string>("spawnZ", "0")
);
gameRuleAsset.SetData(new GameRuleFileWriter(grfFile));
gameRuleAsset.SetData(new GameRuleFileWriter(grfFile));
return pack;
}
return pack;
}
private void skinPackToolStripMenuItem_Click(object sender, EventArgs e)
{
@@ -366,8 +394,8 @@ namespace PckStudio
}
}
private void quickChangeToolStripMenuItem_Click(object sender, EventArgs e)
{
private void quickChangeToolStripMenuItem_Click(object sender, EventArgs e)
{
if (TryGetCurrentEditor(out IEditor<RawAssetDLCPackage> editor))
{
using AdvancedOptions advanced = new AdvancedOptions(editor.EditorValue.PckFile);
@@ -379,16 +407,16 @@ namespace PckStudio
}
}
private void closeToolStripMenuItem_Click(object sender, EventArgs e)
{
private void closeToolStripMenuItem_Click(object sender, EventArgs e)
{
CloseTab(tabControl.TabPages, tabControl.SelectedTab);
}
private void aboutToolStripMenuItem_Click(object sender, EventArgs e)
{
using ContributorsForm info = new ContributorsForm();
info.ShowDialog(this);
}
private void aboutToolStripMenuItem_Click(object sender, EventArgs e)
{
using ContributorsForm info = new ContributorsForm();
info.ShowDialog(this);
}
private void howToMakeABasicSkinPackToolStripMenuItem_Click(object sender, EventArgs e) => Process.Start("https://www.youtube.com/watch?v=A43aHRHkKxk");
@@ -415,113 +443,113 @@ namespace PckStudio
private void trelloBoardToolStripMenuItem_Click(object sender, EventArgs e) => Process.Start("https://trello.com/b/0XLNOEbe/pck-studio");
private void OpenPck_MouseEnter(object sender, EventArgs e)
{
pckOpen.Image = Resources.pckOpen;
}
{
pckOpen.Image = Resources.pckOpen;
}
private void OpenPck_MouseLeave(object sender, EventArgs e)
{
pckOpen.Image = Resources.pckClosed;
}
private void OpenPck_MouseLeave(object sender, EventArgs e)
{
pckOpen.Image = Resources.pckClosed;
}
private void OpenPck_DragEnter(object sender, DragEventArgs e)
{
pckOpen.Image = Resources.pckDrop;
private void OpenPck_DragEnter(object sender, DragEventArgs e)
{
pckOpen.Image = Resources.pckDrop;
string[] files = (string[])e.Data.GetData(DataFormats.FileDrop) ?? Array.Empty<string>();
e.Effect = files.Any(file => Path.GetExtension(file).Equals(".pck", StringComparison.CurrentCultureIgnoreCase))
? DragDropEffects.Copy
: DragDropEffects.None;
}
e.Effect = files.Any(file => Path.GetExtension(file).Equals(".pck", StringComparison.CurrentCultureIgnoreCase))
? DragDropEffects.Copy
: DragDropEffects.None;
}
private void OpenPck_DragDrop(object sender, DragEventArgs e)
{
if (e.Data.GetData(DataFormats.FileDrop, false) is string[] filepaths)
LoadPckFromFile(filepaths);
}
private void OpenPck_DragDrop(object sender, DragEventArgs e)
{
if (e.Data.GetData(DataFormats.FileDrop, false) is string[] filepaths)
LoadPckFromFile(filepaths);
}
private void OpenPck_DragLeave(object sender, EventArgs e)
{
pckOpen.Image = Resources.pckClosed;
}
private void OpenPck_DragLeave(object sender, EventArgs e)
{
pckOpen.Image = Resources.pckClosed;
}
private void OpenPck_Click(object sender, EventArgs e)
{
openToolStripMenuItem_Click(sender, e);
}
private void OpenPck_Click(object sender, EventArgs e)
{
openToolStripMenuItem_Click(sender, e);
}
private void saveToolStripMenuItem_Click(object sender, EventArgs e)
{
private void saveToolStripMenuItem_Click(object sender, EventArgs e)
{
if (TryGetCurrentEditor(out IEditor<RawAssetDLCPackage> editor))
{
editor.Save();
}
}
private void saveAsToolStripMenuItem_Click(object sender, EventArgs e)
{
private void saveAsToolStripMenuItem_Click(object sender, EventArgs e)
{
if (TryGetCurrentEditor(out IEditor<RawAssetDLCPackage> editor))
{
editor.SaveAs();
}
}
private void wavBinkaToolStripMenuItem_Click(object sender, EventArgs e)
{
using OpenFileDialog fileDialog = new OpenFileDialog
{
Multiselect = true,
Filter = "WAV files (*.wav)|*.wav",
Title = "Please choose WAV files to convert to BINKA"
};
if (fileDialog.ShowDialog(this) == DialogResult.OK)
{
using ItemSelectionPopUp dialog = new ItemSelectionPopUp(
"Level 1 (Best Quality)", "Level 2", "Level 3", "Level 4", "Level 5",
"Level 6", "Level 7", "Level 8", "Level 9 (Worst Quality)")
{
LabelText = "Compression",
ButtonText = "OK"
};
if (dialog.ShowDialog(this) == DialogResult.OK)
private void wavBinkaToolStripMenuItem_Click(object sender, EventArgs e)
{
using OpenFileDialog fileDialog = new OpenFileDialog
{
Multiselect = true,
Filter = "WAV files (*.wav)|*.wav",
Title = "Please choose WAV files to convert to BINKA"
};
if (fileDialog.ShowDialog(this) == DialogResult.OK)
{
using ItemSelectionPopUp dialog = new ItemSelectionPopUp(
"Level 1 (Best Quality)", "Level 2", "Level 3", "Level 4", "Level 5",
"Level 6", "Level 7", "Level 8", "Level 9 (Worst Quality)")
{
BinkaConverter.ToBinka(
fileDialog.FileNames,
new DirectoryInfo(Path.GetDirectoryName(fileDialog.FileName)),
dialog.SelectedIndex + 1 // compression level
);
}
}
}
LabelText = "Compression",
ButtonText = "OK"
};
private void binkaWavToolStripMenuItem_Click(object sender, EventArgs e)
{
using OpenFileDialog fileDialog = new OpenFileDialog
{
Multiselect = true,
Filter = "BINKA files (*.binka)|*.binka",
Title = "Please choose BINKA files to convert to WAV"
};
if (fileDialog.ShowDialog(this) == DialogResult.OK)
{
BinkaConverter.ToWav(fileDialog.FileNames, new DirectoryInfo(Path.GetDirectoryName(fileDialog.FileName)));
}
}
if (dialog.ShowDialog(this) == DialogResult.OK)
{
BinkaConverter.ToBinka(
fileDialog.FileNames,
new DirectoryInfo(Path.GetDirectoryName(fileDialog.FileName)),
dialog.SelectedIndex + 1 // compression level
);
}
}
}
private void settingsToolStripMenuItem_Click(object sender, EventArgs e)
{
var appSettings = new AppSettingsForm();
appSettings.ShowDialog(this);
}
private void binkaWavToolStripMenuItem_Click(object sender, EventArgs e)
{
using OpenFileDialog fileDialog = new OpenFileDialog
{
Multiselect = true,
Filter = "BINKA files (*.binka)|*.binka",
Title = "Please choose BINKA files to convert to WAV"
};
if (fileDialog.ShowDialog(this) == DialogResult.OK)
{
BinkaConverter.ToWav(fileDialog.FileNames, new DirectoryInfo(Path.GetDirectoryName(fileDialog.FileName)));
}
}
private void checkForUpdatesToolStripMenuItem_Click(object sender, EventArgs e)
{
Updater.UpdateToLatest();
}
private void settingsToolStripMenuItem_Click(object sender, EventArgs e)
{
var appSettings = new AppSettingsForm();
appSettings.ShowDialog(this);
}
private void checkForUpdatesToolStripMenuItem_Click(object sender, EventArgs e)
{
Updater.UpdateToLatest();
}
private void exitToolStripMenuItem_Click(object sender, EventArgs e)
{
PckManager?.Close();
PckManager?.Close();
Application.Exit();
}
}

View File

@@ -38,18 +38,15 @@ namespace PckStudio
if (Settings.Default.Platform == Core.ConsolePlatform.Unknown)
{
MessageBox.Show("Please choose on which console you're playing on.", "Select Platform", MessageBoxButtons.OK, MessageBoxIcon.Question);
var platformChooser = new ItemSelectionPopUp(Enum.GetNames(typeof(Core.ConsolePlatform)));
var platformChooser = new ItemSelectionPopUp(Enum.GetNames(typeof(Core.ConsolePlatform)).Skip(1).ToArray());
if (platformChooser.ShowDialog() == DialogResult.OK && Enum.IsDefined(typeof(ConsolePlatform), platformChooser.SelectedItem))
Settings.Default.Platform = (Core.ConsolePlatform)Enum.Parse(typeof(ConsolePlatform), platformChooser.SelectedItem);
}
ApplicationScope.Initialize();
DLCManager.Default.SetPlatform(Settings.Default.Platform);
Trace.TraceInformation("Startup");
RPC.Initialize();
MainInstance = new MainForm();
Internal.SettingsManager.Default.RegisterPropertyChangedCallback<AppLanguage>(nameof(Settings.Default.UserLanguage), DLCManager.Default.SetPreferredLanguage);
Internal.SettingsManager.Default.RegisterPropertyChangedCallback<ConsolePlatform>(nameof(Settings.Default.Platform), DLCManager.Default.SetPlatform);
Updater.SetOwner(MainInstance);
if (args.Length > 0)
{

View File

@@ -467,5 +467,7 @@ namespace PckStudio.Core.DLC
_platform = platform;
_byteOrder = GetByteOrderForPlatform(platform);
}
public bool CloseDLCPackage(int identifier) => _packageRegistry.UnregisterPackage(identifier);
}
}

View File

@@ -29,5 +29,10 @@ namespace PckStudio.Core.DLC
internal bool ContainsPackage(int identifier) => _openPackages.ContainsKey(identifier) && _localisationFiles.ContainsKey(identifier);
internal LOCFile GetLocalisation(int identifier) => _localisationFiles[identifier];
internal bool UnregisterPackage(int identifier)
{
return _openPackages.Remove(identifier) && _localisationFiles.Remove(identifier);
}
}
}