Convenience improvements

This commit is contained in:
Justin Aquadro 2012-01-13 01:20:49 -05:00
parent 43f579de7c
commit 92ce098218
8 changed files with 134 additions and 37 deletions

View file

@ -3,7 +3,6 @@ using System.Collections.Generic;
using System.ComponentModel; using System.ComponentModel;
using System.Data; using System.Data;
using System.Drawing; using System.Drawing;
using System.Linq;
using System.Text; using System.Text;
using System.Windows.Forms; using System.Windows.Forms;

View file

@ -3,7 +3,6 @@ using System.Collections.Generic;
using System.ComponentModel; using System.ComponentModel;
using System.Data; using System.Data;
using System.Drawing; using System.Drawing;
using System.Linq;
using System.Text; using System.Text;
using System.Windows.Forms; using System.Windows.Forms;
using Substrate.Nbt; using Substrate.Nbt;
@ -97,7 +96,7 @@ namespace NBTExplorer
private bool ValidateNameInput () private bool ValidateNameInput ()
{ {
string text = textBox1.Text.Trim(); string text = textBox1.Text.Trim();
if (String.IsNullOrWhiteSpace(text)) { if (String.IsNullOrEmpty(text)) {
MessageBox.Show("You must provide a nonempty name."); MessageBox.Show("You must provide a nonempty name.");
return false; return false;
} }

View file

@ -3,7 +3,6 @@ using System.Collections.Generic;
using System.ComponentModel; using System.ComponentModel;
using System.Data; using System.Data;
using System.Drawing; using System.Drawing;
using System.Linq;
using System.Text; using System.Text;
using System.Windows.Forms; using System.Windows.Forms;

31
Form1.Designer.cs generated
View file

@ -49,6 +49,7 @@
this.imageList1 = new System.Windows.Forms.ImageList(this.components); this.imageList1 = new System.Windows.Forms.ImageList(this.components);
this.toolStrip1 = new System.Windows.Forms.ToolStrip(); this.toolStrip1 = new System.Windows.Forms.ToolStrip();
this._buttonOpen = new System.Windows.Forms.ToolStripButton(); this._buttonOpen = new System.Windows.Forms.ToolStripButton();
this._buttonOpenFolder = new System.Windows.Forms.ToolStripButton();
this._buttonSave = new System.Windows.Forms.ToolStripButton(); this._buttonSave = new System.Windows.Forms.ToolStripButton();
this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();
this._buttonRename = new System.Windows.Forms.ToolStripButton(); this._buttonRename = new System.Windows.Forms.ToolStripButton();
@ -70,6 +71,7 @@
this._nodeContainerContext = new System.Windows.Forms.ContextMenuStrip(this.components); this._nodeContainerContext = new System.Windows.Forms.ContextMenuStrip(this.components);
this.openSubTreeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.openSubTreeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.saveItemToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.saveItemToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.openMinecraftSaveFolderToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.menuStrip1.SuspendLayout(); this.menuStrip1.SuspendLayout();
this.toolStripContainer1.ContentPanel.SuspendLayout(); this.toolStripContainer1.ContentPanel.SuspendLayout();
this.toolStripContainer1.TopToolStripPanel.SuspendLayout(); this.toolStripContainer1.TopToolStripPanel.SuspendLayout();
@ -96,6 +98,7 @@
this.fileToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.fileToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.openToolStripMenuItem, this.openToolStripMenuItem,
this.openFolderToolStripMenuItem, this.openFolderToolStripMenuItem,
this.openMinecraftSaveFolderToolStripMenuItem,
this.toolStripSeparator3, this.toolStripSeparator3,
this.saveToolStripMenuItem, this.saveToolStripMenuItem,
this.toolStripSeparator4, this.toolStripSeparator4,
@ -165,7 +168,7 @@
this.findToolStripMenuItem.Image = global::NBTExplorer.Properties.Resources.binocular; this.findToolStripMenuItem.Image = global::NBTExplorer.Properties.Resources.binocular;
this.findToolStripMenuItem.Name = "findToolStripMenuItem"; this.findToolStripMenuItem.Name = "findToolStripMenuItem";
this.findToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.F))); this.findToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.F)));
this.findToolStripMenuItem.Size = new System.Drawing.Size(152, 22); this.findToolStripMenuItem.Size = new System.Drawing.Size(146, 22);
this.findToolStripMenuItem.Text = "Find..."; this.findToolStripMenuItem.Text = "Find...";
this.findToolStripMenuItem.Click += new System.EventHandler(this.findToolStripMenuItem_Click); this.findToolStripMenuItem.Click += new System.EventHandler(this.findToolStripMenuItem_Click);
// //
@ -174,7 +177,7 @@
this.findNextToolStripMenuItem.Image = global::NBTExplorer.Properties.Resources.binocular__arrow; this.findNextToolStripMenuItem.Image = global::NBTExplorer.Properties.Resources.binocular__arrow;
this.findNextToolStripMenuItem.Name = "findNextToolStripMenuItem"; this.findNextToolStripMenuItem.Name = "findNextToolStripMenuItem";
this.findNextToolStripMenuItem.ShortcutKeys = System.Windows.Forms.Keys.F3; this.findNextToolStripMenuItem.ShortcutKeys = System.Windows.Forms.Keys.F3;
this.findNextToolStripMenuItem.Size = new System.Drawing.Size(152, 22); this.findNextToolStripMenuItem.Size = new System.Drawing.Size(146, 22);
this.findNextToolStripMenuItem.Text = "Find Next"; this.findNextToolStripMenuItem.Text = "Find Next";
this.findNextToolStripMenuItem.Click += new System.EventHandler(this.findNextToolStripMenuItem_Click); this.findNextToolStripMenuItem.Click += new System.EventHandler(this.findNextToolStripMenuItem_Click);
// //
@ -235,6 +238,7 @@
// //
// _nodeTree // _nodeTree
// //
this._nodeTree.AllowDrop = true;
this._nodeTree.Dock = System.Windows.Forms.DockStyle.Fill; this._nodeTree.Dock = System.Windows.Forms.DockStyle.Fill;
this._nodeTree.ImageIndex = 0; this._nodeTree.ImageIndex = 0;
this._nodeTree.ImageList = this.imageList1; this._nodeTree.ImageList = this.imageList1;
@ -243,6 +247,8 @@
this._nodeTree.SelectedImageIndex = 0; this._nodeTree.SelectedImageIndex = 0;
this._nodeTree.Size = new System.Drawing.Size(562, 351); this._nodeTree.Size = new System.Drawing.Size(562, 351);
this._nodeTree.TabIndex = 0; this._nodeTree.TabIndex = 0;
this._nodeTree.DragDrop += new System.Windows.Forms.DragEventHandler(this._nodeTree_DragDrop);
this._nodeTree.DragEnter += new System.Windows.Forms.DragEventHandler(this._nodeTree_DragEnter);
// //
// imageList1 // imageList1
// //
@ -268,6 +274,7 @@
this.toolStrip1.Dock = System.Windows.Forms.DockStyle.None; this.toolStrip1.Dock = System.Windows.Forms.DockStyle.None;
this.toolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.toolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this._buttonOpen, this._buttonOpen,
this._buttonOpenFolder,
this._buttonSave, this._buttonSave,
this.toolStripSeparator1, this.toolStripSeparator1,
this._buttonRename, this._buttonRename,
@ -302,6 +309,16 @@
this._buttonOpen.Text = "Open NBT Data Source"; this._buttonOpen.Text = "Open NBT Data Source";
this._buttonOpen.Click += new System.EventHandler(this.toolStripButton1_Click); this._buttonOpen.Click += new System.EventHandler(this.toolStripButton1_Click);
// //
// _buttonOpenFolder
//
this._buttonOpenFolder.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
this._buttonOpenFolder.Image = global::NBTExplorer.Properties.Resources.folder_open;
this._buttonOpenFolder.ImageTransparentColor = System.Drawing.Color.Magenta;
this._buttonOpenFolder.Name = "_buttonOpenFolder";
this._buttonOpenFolder.Size = new System.Drawing.Size(23, 22);
this._buttonOpenFolder.Text = "Open Folder";
this._buttonOpenFolder.Click += new System.EventHandler(this._buttonOpenFolder_Click);
//
// _buttonSave // _buttonSave
// //
this._buttonSave.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; this._buttonSave.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
@ -489,8 +506,16 @@
this.saveItemToolStripMenuItem.Size = new System.Drawing.Size(179, 22); this.saveItemToolStripMenuItem.Size = new System.Drawing.Size(179, 22);
this.saveItemToolStripMenuItem.Text = "Save Node"; this.saveItemToolStripMenuItem.Text = "Save Node";
// //
// openMinecraftSaveFolderToolStripMenuItem
//
this.openMinecraftSaveFolderToolStripMenuItem.Name = "openMinecraftSaveFolderToolStripMenuItem";
this.openMinecraftSaveFolderToolStripMenuItem.Size = new System.Drawing.Size(223, 22);
this.openMinecraftSaveFolderToolStripMenuItem.Text = "Open &Minecraft Save Folder";
this.openMinecraftSaveFolderToolStripMenuItem.Click += new System.EventHandler(this.openMinecraftSaveFolderToolStripMenuItem_Click);
//
// Form1 // Form1
// //
this.AllowDrop = true;
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(562, 400); this.ClientSize = new System.Drawing.Size(562, 400);
@ -561,6 +586,8 @@
private System.Windows.Forms.ToolStripButton _buttonFindNext; private System.Windows.Forms.ToolStripButton _buttonFindNext;
private System.Windows.Forms.StatusStrip statusStrip1; private System.Windows.Forms.StatusStrip statusStrip1;
private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabel1; private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabel1;
private System.Windows.Forms.ToolStripButton _buttonOpenFolder;
private System.Windows.Forms.ToolStripMenuItem openMinecraftSaveFolderToolStripMenuItem;
} }
} }

118
Form1.cs
View file

@ -26,16 +26,13 @@ namespace NBTExplorer
_nodeTree.NodeMouseClick += NodeClicked; _nodeTree.NodeMouseClick += NodeClicked;
_nodeTree.NodeMouseDoubleClick += NodeDoubleClicked; _nodeTree.NodeMouseDoubleClick += NodeDoubleClicked;
string path = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData); string[] args = Environment.GetCommandLineArgs();
path = Path.Combine(path, ".minecraft"); if (args.Length > 1) {
path = Path.Combine(path, "saves"); OpenFile(args[1]);
}
if (!Directory.Exists(path)) { else {
path = Environment.GetFolderPath(Environment.SpecialFolder.MyComputer); OpenMinecraftDir();
} }
LoadDirectory(path);
_nodeTree.Nodes[0].Expand();
} }
public void LoadNbtStream (TreeNodeCollection parent, Stream stream) public void LoadNbtStream (TreeNodeCollection parent, Stream stream)
@ -481,6 +478,48 @@ namespace NBTExplorer
_buttonAddTagCompound.Enabled = state; _buttonAddTagCompound.Enabled = state;
} }
public void OpenDirectory (string path)
{
_nodeTree.Nodes.Clear();
LoadDirectory(path);
if (_nodeTree.Nodes.Count > 0) {
_nodeTree.Nodes[0].Expand();
}
}
public void OpenPaths (string[] paths)
{
_nodeTree.Nodes.Clear();
foreach (string path in paths) {
if (Directory.Exists(path)) {
LoadDirectory(path);
}
else if (File.Exists(path)) {
TryLoadFile(_nodeTree.Nodes, path);
}
}
if (_nodeTree.Nodes.Count > 0) {
_nodeTree.Nodes[0].Expand();
}
}
public void OpenMinecraftDir ()
{
string path = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
path = Path.Combine(path, ".minecraft");
path = Path.Combine(path, "saves");
if (!Directory.Exists(path)) {
path = Environment.GetFolderPath(Environment.SpecialFolder.MyComputer);
}
OpenDirectory(path);
}
public void LoadDirectory (string path) public void LoadDirectory (string path)
{ {
LoadDirectory(path, _nodeTree.Nodes); LoadDirectory(path, _nodeTree.Nodes);
@ -559,18 +598,36 @@ namespace NBTExplorer
{ {
OpenFileDialog ofd = new OpenFileDialog(); OpenFileDialog ofd = new OpenFileDialog();
ofd.RestoreDirectory = true; ofd.RestoreDirectory = true;
ofd.Multiselect = false; ofd.Multiselect = true;
if (ofd.ShowDialog() == DialogResult.OK) { if (ofd.ShowDialog() == DialogResult.OK) {
_nodeTree.Nodes.Clear(); OpenPaths(ofd.FileNames);
TryLoadFile(_nodeTree.Nodes, ofd.FileName); }
}
private void OpenFile (string file)
{
_nodeTree.Nodes.Clear();
TryLoadFile(_nodeTree.Nodes, file);
}
private string _openFolderPath = null;
private void OpenFolder ()
{
FolderBrowserDialog ofd = new FolderBrowserDialog();
if (_openFolderPath != null)
ofd.SelectedPath = _openFolderPath;
if (ofd.ShowDialog() == DialogResult.OK) {
_openFolderPath = ofd.SelectedPath;
OpenDirectory(ofd.SelectedPath);
} }
} }
private void SaveAll () private void SaveAll ()
{ {
if (_nodeTree.Nodes.Count > 0) { foreach (TreeNode node in _nodeTree.Nodes) {
SaveNode(_nodeTree.Nodes[0]); SaveNode(node);
} }
} }
@ -627,11 +684,7 @@ namespace NBTExplorer
private void openFolderToolStripMenuItem_Click (object sender, EventArgs e) private void openFolderToolStripMenuItem_Click (object sender, EventArgs e)
{ {
FolderBrowserDialog ofd = new FolderBrowserDialog(); OpenFolder();
if (ofd.ShowDialog() == DialogResult.OK) {
_nodeTree.Nodes.Clear();
LoadDirectory(ofd.SelectedPath);
}
} }
private void toolStripButton1_Click (object sender, EventArgs e) private void toolStripButton1_Click (object sender, EventArgs e)
@ -1138,6 +1191,33 @@ namespace NBTExplorer
else else
FindNext(); FindNext();
} }
private void _buttonOpenFolder_Click (object sender, EventArgs e)
{
OpenFolder();
}
private void DropFile (DragEventArgs e)
{
string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
OpenPaths(files);
}
private void _nodeTree_DragDrop (object sender, DragEventArgs e)
{
DropFile(e);
}
private void _nodeTree_DragEnter (object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(DataFormats.FileDrop))
e.Effect = DragDropEffects.Copy;
}
private void openMinecraftSaveFolderToolStripMenuItem_Click (object sender, EventArgs e)
{
OpenMinecraftDir();
}
} }
public class TagKey : IComparable<TagKey> public class TagKey : IComparable<TagKey>

View file

@ -131,7 +131,7 @@
AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAADW ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAADW
LgAAAk1TRnQBSQFMAgEBDgEAAYgBAAGIAQABEAEAARABAAT/ARkBAAj/AUIBTQE2BwABNgMAASgDAAFA LgAAAk1TRnQBSQFMAgEBDgEAAaABAAGgAQABEAEAARABAAT/ARkBAAj/AUIBTQE2BwABNgMAASgDAAFA
AwABQAMAAQEBAAEYBgABMBIAA/wD+SH4A/kD/AMAA/0D+SH4A/kD/WMAAZYBqQG8AVwBhAGuAVwBhAGu AwABQAMAAQEBAAEYBgABMBIAA/wD+SH4A/kD/AMAA/0D+SH4A/kD/WMAAZYBqQG8AVwBhAGuAVwBhAGu
AVwBhAGuAVwBhAGuAVwBhAGuAVwBhAGuAVwBhAGuAVwBhAGuAVwBhAGuAVwBhAGuAVwBhAGuAVwBhAGu AVwBhAGuAVwBhAGuAVwBhAGuAVwBhAGuAVwBhAGuAVwBhAGuAVwBhAGuAVwBhAGuAVwBhAGuAVwBhAGu
AVwBhAGuAZYBqQG8AwACzwHLArkBsAK5AbACuQGwArkBsAK5AbACuQGwArkBsAK5AbACuQGwArkBsAK5 AVwBhAGuAZYBqQG8AwACzwHLArkBsAK5AbACuQGwArkBsAK5AbACuQGwArkBsAK5AbACuQGwArkBsAK5
@ -517,11 +517,11 @@
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAFySURBVDhPY2CgBthfz8CyP4kl40AiczcM19sxnEHGyHIg YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAFySURBVDhPY2CgBthfz8CyP4kl40AiczcM19sxnEHGyHIg
tSA9cLv3xrErn6rWXPp+T+f/d7s7wHh2hikKhomD1IDUgvTADdiVwOx+c4r3EWQDlpc4/ofhJYV2cINB tSA9cLv3xrErn6rWXPp+T+f/d7s7wHh2hikKhomD1IDUgvTADdiVwOx+c4r3EWQDlpc4/ofhJYV2cINB
akBqQXrgBuyIZ8m9vyz7wbPNDf9heEuj338YXlftARcHyYPUgvTADdgawzz17anlf//fXfUfhu+uKgcy akBqQXrgBuyIZ8m9vyz7wbPNDf9heEuj338YXlftARcHyYPUgvTADdgawzz11fHlf//fXfUfhu+uKgcy
IfjMzDS4OEgepBakB27A5ijmGT8vzf//+cRUON7dEfofhjc3+KLIgdSC9MAN2BDFPPvbudn/PxyZCMcg IfjMzDS4OEgepBakB27A5ijmGT8vzf//+cRUON7dEfofhjc3+KLIgdSC9MAN2BDFPPvbudn/PxyZCMcg
zavKXcCGLCt2QJEDqQXpgRuwOoJ5/qeT0/6/2d8DxyDNID6MRpYDqQXpgRuwPIx58btD/f9f7monCoPU zavKXcCGLCt2QJEDqQXpgRuwOoJ5/qeT0/6/2d8DxyDNID6MRpYDqQXpgRuwPIx58btD/f9f7monCoPU
gvTADVgSwrjsFTDun25tIgqD1IL0wA2YH8C4+smWxv8PN9QShUFqQXrgBkzxZNzxYF31//trq4jCILUg gvTADVgSwrjsFTDun25tIgqD1IL0wA2YH8C4+smWxv8PN9QShUFqQXrgBkzxZNzxYF31//trq4jCILUg
PTAD5FKNGee1uTAeJQWD9AANkAMZwg/E4kAsRSIG6QHppQwAAARN3Xh69LLBAAAAAElFTkSuQmCC PTAD5FKNGee1uTAeJQWD9AANkAMZwg/E4kAsRSIG6QHppQwAAOQ03Wz0/VCVAAAAAElFTkSuQmCC
</value> </value>
</data> </data>
<metadata name="_nodeContainerContext.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> <metadata name="_nodeContainerContext.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">

View file

@ -37,17 +37,10 @@
<ApplicationIcon>dead_bush.ico</ApplicationIcon> <ApplicationIcon>dead_bush.ico</ApplicationIcon>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<Reference Include="Ionic.Zlib">
<HintPath>..\Substrate\SubstrateCS\bin\Release\Ionic.Zlib.dll</HintPath>
</Reference>
<Reference Include="Substrate"> <Reference Include="Substrate">
<HintPath>..\Substrate\SubstrateCS\bin\Release\Substrate.dll</HintPath> <HintPath>..\Substrate\SubstrateCS\bin\Release\NET4\Substrate.dll</HintPath>
</Reference> </Reference>
<Reference Include="System" /> <Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" /> <Reference Include="System.Data" />
<Reference Include="System.Deployment" /> <Reference Include="System.Deployment" />
<Reference Include="System.Drawing" /> <Reference Include="System.Drawing" />
@ -103,6 +96,7 @@
<DependentUpon>Resources.resx</DependentUpon> <DependentUpon>Resources.resx</DependentUpon>
<DesignTime>True</DesignTime> <DesignTime>True</DesignTime>
</Compile> </Compile>
<None Include="app.config" />
<None Include="Properties\Settings.settings"> <None Include="Properties\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator> <Generator>SettingsSingleFileGenerator</Generator>
<LastGenOutput>Settings.Designer.cs</LastGenOutput> <LastGenOutput>Settings.Designer.cs</LastGenOutput>

View file

@ -1,6 +1,5 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms; using System.Windows.Forms;
namespace NBTExplorer namespace NBTExplorer