Restructuring project to support separate command-line utility

This commit is contained in:
Justin Aquadro 2014-02-16 02:56:27 -05:00
parent a03537bb99
commit d4ad1bd99a
61 changed files with 2186 additions and 162 deletions

View file

@ -3,7 +3,7 @@
<Product Id="*"
Name="NBTExplorer"
Language="1033"
Version="2.6.1.0"
Version="2.7.0.0"
Manufacturer="Justin Aquadro"
UpgradeCode="0bfb1026-21f2-4552-ad71-ca90aae10a25">
<Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" />
@ -81,6 +81,15 @@
<Component Id="C.NBTExplorer.visualelementsmanifest.xml" Guid="*">
<File Source="../Staging/Windows/NBTExplorer.visualelementsmanifest.xml" KeyPath="yes" />
</Component>
<Component Id="C.NBTUtil.exe" Guid="*">
<File Source="../Staging/NBTUtil.exe" KeyPath="yes" />
</Component>
<Component Id="C.NBTUtil.exe.config" Guid="*">
<File Source="../Staging/NBTUtil.exe.config" KeyPath="yes" />
</Component>
<Component Id="C.NBTModel.dll" Guid="*">
<File Source="../Staging/NBTModel.dll" KeyPath="yes" />
</Component>
<Component Id="C.Substrate.dll" Guid="*">
<File Source="../Staging/Substrate.dll" KeyPath="yes" />
</Component>

View file

@ -9,6 +9,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NBTExplorerMac", "NBTExplor
EndProject
Project("{930C7802-8A8C-48F9-8165-68863BCCD9DD}") = "NBTExplorer.Installer", "NBTExplorer.Installer\NBTExplorer.Installer.wixproj", "{A1566071-7CBB-4C54-AAE1-4B81B7715DB3}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NBTUtil", "NBTUtil\NBTUtil.csproj", "{BD90EED5-97B9-47D5-AFEA-C2C0D0E59FCF}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NBTModel", "NBTModel\NBTModel.csproj", "{20D7CBA3-5B6D-40B0-8D28-4C9A58E4FFBC}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
AppStore|Any CPU = AppStore|Any CPU
@ -71,6 +75,36 @@ Global
{A1566071-7CBB-4C54-AAE1-4B81B7715DB3}.Release|Mixed Platforms.Build.0 = Release|x86
{A1566071-7CBB-4C54-AAE1-4B81B7715DB3}.Release|x86.ActiveCfg = Release|x86
{A1566071-7CBB-4C54-AAE1-4B81B7715DB3}.Release|x86.Build.0 = Release|x86
{BD90EED5-97B9-47D5-AFEA-C2C0D0E59FCF}.AppStore|Any CPU.ActiveCfg = Release|Any CPU
{BD90EED5-97B9-47D5-AFEA-C2C0D0E59FCF}.AppStore|Any CPU.Build.0 = Release|Any CPU
{BD90EED5-97B9-47D5-AFEA-C2C0D0E59FCF}.AppStore|Mixed Platforms.ActiveCfg = Release|Any CPU
{BD90EED5-97B9-47D5-AFEA-C2C0D0E59FCF}.AppStore|Mixed Platforms.Build.0 = Release|Any CPU
{BD90EED5-97B9-47D5-AFEA-C2C0D0E59FCF}.AppStore|x86.ActiveCfg = Release|Any CPU
{BD90EED5-97B9-47D5-AFEA-C2C0D0E59FCF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{BD90EED5-97B9-47D5-AFEA-C2C0D0E59FCF}.Debug|Any CPU.Build.0 = Debug|Any CPU
{BD90EED5-97B9-47D5-AFEA-C2C0D0E59FCF}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{BD90EED5-97B9-47D5-AFEA-C2C0D0E59FCF}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{BD90EED5-97B9-47D5-AFEA-C2C0D0E59FCF}.Debug|x86.ActiveCfg = Debug|Any CPU
{BD90EED5-97B9-47D5-AFEA-C2C0D0E59FCF}.Release|Any CPU.ActiveCfg = Release|Any CPU
{BD90EED5-97B9-47D5-AFEA-C2C0D0E59FCF}.Release|Any CPU.Build.0 = Release|Any CPU
{BD90EED5-97B9-47D5-AFEA-C2C0D0E59FCF}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{BD90EED5-97B9-47D5-AFEA-C2C0D0E59FCF}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{BD90EED5-97B9-47D5-AFEA-C2C0D0E59FCF}.Release|x86.ActiveCfg = Release|Any CPU
{20D7CBA3-5B6D-40B0-8D28-4C9A58E4FFBC}.AppStore|Any CPU.ActiveCfg = Release|Any CPU
{20D7CBA3-5B6D-40B0-8D28-4C9A58E4FFBC}.AppStore|Any CPU.Build.0 = Release|Any CPU
{20D7CBA3-5B6D-40B0-8D28-4C9A58E4FFBC}.AppStore|Mixed Platforms.ActiveCfg = Release|Any CPU
{20D7CBA3-5B6D-40B0-8D28-4C9A58E4FFBC}.AppStore|Mixed Platforms.Build.0 = Release|Any CPU
{20D7CBA3-5B6D-40B0-8D28-4C9A58E4FFBC}.AppStore|x86.ActiveCfg = Release|Any CPU
{20D7CBA3-5B6D-40B0-8D28-4C9A58E4FFBC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{20D7CBA3-5B6D-40B0-8D28-4C9A58E4FFBC}.Debug|Any CPU.Build.0 = Debug|Any CPU
{20D7CBA3-5B6D-40B0-8D28-4C9A58E4FFBC}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{20D7CBA3-5B6D-40B0-8D28-4C9A58E4FFBC}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{20D7CBA3-5B6D-40B0-8D28-4C9A58E4FFBC}.Debug|x86.ActiveCfg = Debug|Any CPU
{20D7CBA3-5B6D-40B0-8D28-4C9A58E4FFBC}.Release|Any CPU.ActiveCfg = Release|Any CPU
{20D7CBA3-5B6D-40B0-8D28-4C9A58E4FFBC}.Release|Any CPU.Build.0 = Release|Any CPU
{20D7CBA3-5B6D-40B0-8D28-4C9A58E4FFBC}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{20D7CBA3-5B6D-40B0-8D28-4C9A58E4FFBC}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{20D7CBA3-5B6D-40B0-8D28-4C9A58E4FFBC}.Release|x86.ActiveCfg = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE

View file

@ -1,38 +0,0 @@
using Substrate.Nbt;
namespace NBTExplorer.Model
{
public class ListTagContainer : IOrderedTagContainer
{
private TagNodeList _tag;
public ListTagContainer (TagNodeList tag)
{
_tag = tag;
}
public int TagCount
{
get { return _tag.Count; }
}
public bool DeleteTag (TagNode tag)
{
return _tag.Remove(tag);
}
public int GetTagIndex (TagNode tag)
{
return _tag.IndexOf(tag);
}
public bool InsertTag (TagNode tag, int index)
{
if (index < 0 || index > _tag.Count)
return false;
_tag.Insert(index, tag);
return true;
}
}
}

View file

@ -1,16 +0,0 @@
using Substrate.Nbt;
namespace NBTExplorer.Model
{
public class TagDoubleDataNode : TagDataNode
{
public TagDoubleDataNode (TagNodeDouble tag)
: base(tag)
{ }
public override bool EditNode ()
{
return EditScalarValue(Tag);
}
}
}

View file

@ -1,16 +0,0 @@
using Substrate.Nbt;
namespace NBTExplorer.Model
{
public class TagFloatDataNode : TagDataNode
{
public TagFloatDataNode (TagNodeFloat tag)
: base(tag)
{ }
public override bool EditNode ()
{
return EditScalarValue(Tag);
}
}
}

View file

@ -1,16 +0,0 @@
using Substrate.Nbt;
namespace NBTExplorer.Model
{
public class TagIntDataNode : TagDataNode
{
public TagIntDataNode (TagNodeInt tag)
: base(tag)
{ }
public override bool EditNode ()
{
return EditScalarValue(Tag);
}
}
}

View file

@ -1,16 +0,0 @@
using Substrate.Nbt;
namespace NBTExplorer.Model
{
public class TagLongDataNode : TagDataNode
{
public TagLongDataNode (TagNodeLong tag)
: base(tag)
{ }
public override bool EditNode ()
{
return EditScalarValue(Tag);
}
}
}

View file

@ -1,16 +0,0 @@
using Substrate.Nbt;
namespace NBTExplorer.Model
{
public class TagShortDataNode : TagDataNode
{
public TagShortDataNode (TagNodeShort tag)
: base(tag)
{ }
public override bool EditNode ()
{
return EditScalarValue(Tag);
}
}
}

View file

@ -84,6 +84,9 @@
<CodeAnalysisRuleDirectories>;C:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules</CodeAnalysisRuleDirectories>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup>
<StartupObject />
</PropertyGroup>
<ItemGroup>
<Reference Include="Substrate, Version=1.3.8.0, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
@ -98,12 +101,8 @@
<ItemGroup>
<Compile Include="Controllers\ExplorerBarController.cs" />
<Compile Include="Controllers\NodeTreeController.cs" />
<Compile Include="FormRegistry.cs" />
<Compile Include="Controllers\RuleTreeController.cs" />
<Compile Include="Interop.cs" />
<Compile Include="Model\Search\SearchRule.cs" />
<Compile Include="NbtClipboardController.cs" />
<Compile Include="SnapshotList.cs" />
<Compile Include="Vendor\MultiSelectTreeView\MultiSelectTreeview.cs">
<SubType>Component</SubType>
</Compile>
@ -174,32 +173,6 @@
<Compile Include="Windows\EditHex.Designer.cs">
<DependentUpon>EditHex.cs</DependentUpon>
</Compile>
<Compile Include="Model\CompoundTagContainer.cs" />
<Compile Include="Model\CubicRegionDataNode.cs" />
<Compile Include="Model\CubicRegionFile.cs" />
<Compile Include="Model\DataNode.cs" />
<Compile Include="Model\DataNodeCollection.cs" />
<Compile Include="Model\DirectoryDataNode.cs" />
<Compile Include="Model\FileTypeRegistry.cs" />
<Compile Include="Model\ListTagContainer.cs" />
<Compile Include="Model\NbtFileDataNode.cs" />
<Compile Include="Model\NodeCapabilities.cs" />
<Compile Include="Model\RegionChunkDataNode.cs" />
<Compile Include="Model\RegionFileDataNode.cs" />
<Compile Include="Model\TagByteArrayDataNode.cs" />
<Compile Include="Model\TagByteDataNode.cs" />
<Compile Include="Model\TagCompoundDataNode.cs" />
<Compile Include="Model\TagContainerInterface.cs" />
<Compile Include="Model\TagDataNode.cs" />
<Compile Include="Model\TagDoubleDataNode.cs" />
<Compile Include="Model\TagFloatDataNode.cs" />
<Compile Include="Model\TagIntArrayDataNode.cs" />
<Compile Include="Model\TagIntDataNode.cs" />
<Compile Include="Model\TagListDataNode.cs" />
<Compile Include="Model\TagLongDataNode.cs" />
<Compile Include="Model\TagShortDataNode.cs" />
<Compile Include="Model\TagStringDataNode.cs" />
<Compile Include="NbtClipboardData.cs" />
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Properties\Settings.Designer.cs">
@ -208,7 +181,6 @@
<DependentUpon>Settings.settings</DependentUpon>
</Compile>
<Compile Include="SearchWorker.cs" />
<Compile Include="Model\TagKey.cs" />
<Compile Include="Vendor\Be.Windows.Forms.HexBox\BuiltInContextMenu.cs">
<SubType>Component</SubType>
</Compile>
@ -337,6 +309,12 @@
<Install>true</Install>
</BootstrapperPackage>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\NBTModel\NBTModel.csproj">
<Project>{20d7cba3-5b6d-40b0-8d28-4c9a58e4ffbc}</Project>
<Name>NBTModel</Name>
</ProjectReference>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.

View file

@ -14,7 +14,7 @@ namespace NBTExplorer
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main ()
static void Main (string[] args)
{
Application.ThreadException += AppThreadFailureHandler;
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);

View file

@ -10,7 +10,7 @@ using System.Runtime.InteropServices;
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("NBTExplorer")]
[assembly: AssemblyCopyright("Copyright © Justin Aquadro 2011-2012")]
[assembly: AssemblyCopyright("Copyright © Justin Aquadro 2011-2014")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("2.6.2.0")]
[assembly: AssemblyFileVersion("2.6.2.0")]
[assembly: AssemblyVersion("2.7.0.0")]
[assembly: AssemblyFileVersion("2.7.0.0")]

View file

@ -43,7 +43,7 @@
this.linkLabel1.Size = new System.Drawing.Size(256, 133);
this.linkLabel1.TabIndex = 0;
this.linkLabel1.TabStop = true;
this.linkLabel1.Text = "NBTExplorer\r\nCopyright ©2011-2013 Justin Aquadro\r\n\r\nNBTExplorer is based on NBTEd" +
this.linkLabel1.Text = "NBTExplorer\r\nCopyright ©2011-2014 Justin Aquadro\r\n\r\nNBTExplorer is based on NBTEd" +
"it by copyboy\r\nFugue icon set: p.yusukekamiyamane.com\r\n\r\nEmail: jaquadro@gmail.c" +
"om\r\nNBTExplorer Github Project Page";
this.linkLabel1.UseCompatibleTextRendering = true;

View file

@ -1,5 +1,6 @@
using System;
using System.Windows.Forms;
using NBTModel.Interop;
namespace NBTExplorer.Windows
{

View file

@ -13,6 +13,7 @@ using NBTExplorer.Controllers;
namespace NBTExplorer.Windows
{
using Predicates = NodeTreeController.Predicates;
using NBTModel.Interop;
public partial class MainForm : Form
{

View file

@ -1,5 +1,6 @@
using System;
using System.Windows.Forms;
using NBTModel.Interop;
using Substrate.Nbt;
namespace NBTExplorer.Windows

View file

@ -1,6 +1,7 @@
using System.IO;
using System.Text.RegularExpressions;
using System.Collections.Generic;
using NBTModel.Interop;
namespace NBTExplorer.Model
{

View file

@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using NBTExplorer.Utility;
namespace NBTExplorer.Model
{

View file

@ -2,7 +2,7 @@
using System.Collections.Generic;
using Substrate.Nbt;
namespace NBTExplorer
namespace NBTModel.Interop
{
public static class FormRegistry
{

View file

@ -1,6 +1,6 @@
using System;
namespace NBTExplorer
namespace NBTModel.Interop
{
public static class NbtClipboardController
{

View file

@ -2,7 +2,7 @@
using System.IO;
using Substrate.Nbt;
namespace NBTExplorer
namespace NBTModel.Interop
{
public class NbtClipboardData
{

View file

@ -0,0 +1,66 @@
using System;
using Substrate.Nbt;
namespace NBTExplorer.Model
{
public class ListTagContainer : IOrderedTagContainer
{
private TagNodeList _tag;
private Action<bool> _modifyHandler;
public ListTagContainer (TagNodeList tag, Action<bool> modifyHandler)
{
_tag = tag;
}
public int TagCount
{
get { return _tag.Count; }
}
public bool DeleteTag (TagNode tag)
{
bool result = _tag.Remove(tag);
if (result)
SetModified();
return result;
}
public int GetTagIndex (TagNode tag)
{
return _tag.IndexOf(tag);
}
public bool InsertTag (TagNode tag, int index)
{
if (index < 0 || index > _tag.Count)
return false;
if (_tag.ValueType != tag.GetTagType())
return false;
_tag.Insert(index, tag);
SetModified();
return true;
}
public bool AppendTag (TagNode tag)
{
if (_tag.ValueType != tag.GetTagType())
return false;
_tag.Add(tag);
SetModified();
return true;
}
private void SetModified ()
{
if (_modifyHandler != null)
_modifyHandler(true);
}
}
}

83
NBTModel/NBTModel.csproj Normal file
View file

@ -0,0 +1,83 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{20D7CBA3-5B6D-40B0-8D28-4C9A58E4FFBC}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>NBTExplorer.Model</RootNamespace>
<AssemblyName>NBTModel</AssemblyName>
<TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<TargetFrameworkProfile />
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="Substrate">
<HintPath>..\References\Substrate.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Data" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="CompoundTagContainer.cs" />
<Compile Include="CubicRegionDataNode.cs" />
<Compile Include="CubicRegionFile.cs" />
<Compile Include="DataNode.cs" />
<Compile Include="DataNodeCollection.cs" />
<Compile Include="DirectoryDataNode.cs" />
<Compile Include="FileTypeRegistry.cs" />
<Compile Include="Interop\FormRegistry.cs" />
<Compile Include="Interop\NbtClipboardController.cs" />
<Compile Include="Interop\NbtClipboardData.cs" />
<Compile Include="ListTagContainer.cs" />
<Compile Include="NbtFileDataNode.cs" />
<Compile Include="NodeCapabilities.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="RegionChunkDataNode.cs" />
<Compile Include="RegionFileDataNode.cs" />
<Compile Include="Search\SearchRule.cs" />
<Compile Include="TagByteArrayDataNode.cs" />
<Compile Include="TagByteDataNode.cs" />
<Compile Include="TagCompoundDataNode.cs" />
<Compile Include="TagContainerInterface.cs" />
<Compile Include="TagDataNode.cs" />
<Compile Include="TagDoubleDataNode.cs" />
<Compile Include="TagFloatDataNode.cs" />
<Compile Include="TagIntArrayDataNode.cs" />
<Compile Include="TagIntDataNode.cs" />
<Compile Include="TagKey.cs" />
<Compile Include="TagListDataNode.cs" />
<Compile Include="TagLongDataNode.cs" />
<Compile Include="TagShortDataNode.cs" />
<Compile Include="TagStringDataNode.cs" />
<Compile Include="Utility\SnapshotList.cs" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>

View file

@ -4,6 +4,7 @@ using Substrate.Core;
using Substrate.Nbt;
using System.Collections.Generic;
using System;
using NBTModel.Interop;
namespace NBTExplorer.Model
{

View file

@ -0,0 +1,36 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("NBTModel")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("NBTModel")]
[assembly: AssemblyCopyright("Copyright © 2014")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("0dd78c98-e4af-4898-a0f5-4ea5675933c8")]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

View file

@ -2,6 +2,7 @@
using System.Text.RegularExpressions;
using Substrate.Core;
using System.Collections.Generic;
using NBTModel.Interop;
namespace NBTExplorer.Model
{

View file

@ -13,6 +13,18 @@ namespace NBTExplorer.Model
get { return base.Tag as TagNodeByte; }
}
public override bool Parse (string value)
{
byte data;
if (!byte.TryParse(value, out data))
return false;
Tag.Data = data;
IsDataModified = true;
return true;
}
public override bool EditNode ()
{
return EditScalarValue(Tag);

View file

@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using NBTModel.Interop;
using Substrate.Nbt;
namespace NBTExplorer.Model

View file

@ -36,5 +36,6 @@ namespace NBTExplorer.Model
{
int GetTagIndex (TagNode tag);
bool InsertTag (TagNode tag, int index);
bool AppendTag (TagNode tag);
}
}

View file

@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using NBTModel.Interop;
using Substrate.Nbt;
namespace NBTExplorer.Model
@ -44,6 +45,9 @@ namespace NBTExplorer.Model
return false;
}
public virtual void Clear ()
{ }
#endregion
protected override NodeCapabilities Capabilities
@ -155,6 +159,11 @@ namespace NBTExplorer.Model
}
}
public virtual bool Parse (string value)
{
return false;
}
protected override NodeCapabilities Capabilities
{
get

View file

@ -0,0 +1,33 @@
using Substrate.Nbt;
namespace NBTExplorer.Model
{
public class TagDoubleDataNode : TagDataNode
{
public TagDoubleDataNode (TagNodeDouble tag)
: base(tag)
{ }
protected new TagNodeDouble Tag
{
get { return base.Tag as TagNodeDouble; }
}
public override bool Parse (string value)
{
double data;
if (!double.TryParse(value, out data))
return false;
Tag.Data = data;
IsDataModified = true;
return true;
}
public override bool EditNode ()
{
return EditScalarValue(Tag);
}
}
}

View file

@ -0,0 +1,33 @@
using Substrate.Nbt;
namespace NBTExplorer.Model
{
public class TagFloatDataNode : TagDataNode
{
public TagFloatDataNode (TagNodeFloat tag)
: base(tag)
{ }
protected new TagNodeFloat Tag
{
get { return base.Tag as TagNodeFloat; }
}
public override bool Parse (string value)
{
float data;
if (!float.TryParse(value, out data))
return false;
Tag.Data = data;
IsDataModified = true;
return true;
}
public override bool EditNode ()
{
return EditScalarValue(Tag);
}
}
}

View file

@ -0,0 +1,33 @@
using Substrate.Nbt;
namespace NBTExplorer.Model
{
public class TagIntDataNode : TagDataNode
{
public TagIntDataNode (TagNodeInt tag)
: base(tag)
{ }
protected new TagNodeInt Tag
{
get { return base.Tag as TagNodeInt; }
}
public override bool Parse (string value)
{
int data;
if (!int.TryParse(value, out data))
return false;
Tag.Data = data;
IsDataModified = true;
return true;
}
public override bool EditNode ()
{
return EditScalarValue(Tag);
}
}
}

View file

@ -1,4 +1,5 @@
using System;
using NBTModel.Interop;
using Substrate.Nbt;
namespace NBTExplorer.Model
@ -10,10 +11,10 @@ namespace NBTExplorer.Model
public TagListDataNode (TagNodeList tag)
: base(tag)
{
_container = new ListTagContainer(tag);
_container = new ListTagContainer(tag, res => IsDataModified = true);
}
protected new TagNodeList Tag
public new TagNodeList Tag
{
get { return base.Tag as TagNodeList; }
set { base.Tag = value; }
@ -99,8 +100,22 @@ namespace NBTExplorer.Model
return _container.DeleteTag(tag);
}
private void AppendTag (TagNode tag)
public override void Clear ()
{
if (TagCount == 0)
return;
Nodes.Clear();
Tag.Clear();
IsDataModified = true;
}
public bool AppendTag (TagNode tag)
{
if (tag == null || !CanCreateTag(tag.GetTagType()))
return false;
_container.InsertTag(tag, _container.TagCount);
IsDataModified = true;
@ -109,6 +124,8 @@ namespace NBTExplorer.Model
if (node != null)
Nodes.Add(node);
}
return true;
}
}
}

View file

@ -0,0 +1,33 @@
using Substrate.Nbt;
namespace NBTExplorer.Model
{
public class TagLongDataNode : TagDataNode
{
public TagLongDataNode (TagNodeLong tag)
: base(tag)
{ }
protected new TagNodeLong Tag
{
get { return base.Tag as TagNodeLong; }
}
public override bool Parse (string value)
{
long data;
if (!long.TryParse(value, out data))
return false;
Tag.Data = data;
IsDataModified = true;
return true;
}
public override bool EditNode ()
{
return EditScalarValue(Tag);
}
}
}

View file

@ -0,0 +1,33 @@
using Substrate.Nbt;
namespace NBTExplorer.Model
{
public class TagShortDataNode : TagDataNode
{
public TagShortDataNode (TagNodeShort tag)
: base(tag)
{ }
protected new TagNodeShort Tag
{
get { return base.Tag as TagNodeShort; }
}
public override bool Parse (string value)
{
short data;
if (!short.TryParse(value, out data))
return false;
Tag.Data = data;
IsDataModified = true;
return true;
}
public override bool EditNode ()
{
return EditScalarValue(Tag);
}
}
}

View file

@ -8,6 +8,19 @@ namespace NBTExplorer.Model
: base(tag)
{ }
protected new TagNodeString Tag
{
get { return base.Tag as TagNodeString; }
}
public override bool Parse (string value)
{
Tag.Data = value;
IsDataModified = true;
return true;
}
public override bool EditNode ()
{
return EditStringValue(Tag);

View file

@ -4,7 +4,7 @@ using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Text;
namespace NBTExplorer
namespace NBTExplorer.Utility
{
public class SnapshotState<T> : IDisposable
{

6
NBTUtil/App.config Normal file
View file

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup>
<supportedRuntime version="v2.0.50727"/></startup>
</configuration>

76
NBTUtil/ConsoleOptions.cs Normal file
View file

@ -0,0 +1,76 @@
using System;
using System.Collections.Generic;
using System.Text;
using NDesk.Options;
namespace NBTUtil
{
public enum ConsoleCommand
{
None,
Print,
PrintTree,
SetValue,
SetList,
Help,
}
class ConsoleOptions
{
private OptionSet _options;
private string _currentKey;
//public string FilePath { get; private set; }
//public string TagPath { get; private set; }
public string Path { get; private set; }
public ConsoleCommand Command { get; private set; }
public List<string> Values { get; private set; }
public bool ShowTypes { get; private set; }
public ConsoleOptions ()
{
Command = ConsoleCommand.None;
Values = new List<string>();
_options = new OptionSet() {
{ "path=", "Path to NBT tag from current directory", v => Path = v },
{ "print", "Print the value(s) of a tag", v => Command = ConsoleCommand.Print },
{ "printtree", "Print the NBT tree rooted at a tag", v => Command = ConsoleCommand.PrintTree },
{ "types", "Show data types when printing tags", v => ShowTypes = true },
{ "setvalue=", "Set a single tag value", v => {
Command = ConsoleCommand.SetValue;
_currentKey = "setvalue";
if (!string.IsNullOrEmpty(v))
Values.Add(v);
}},
{ "setlist=", "Replace a list tag's contents with one or more values.", v => {
Command = ConsoleCommand.SetList;
_currentKey = "setlist";
if (!string.IsNullOrEmpty(v))
Values.Add(v);
}},
{ "help", "Print this help message", v => Command = ConsoleCommand.Help },
{ "<>", v => {
switch (_currentKey) {
case "setvalue":
case "setlist":
Values.Add(v);
break;
}
}},
};
}
public void Parse (string[] args)
{
_options.Parse(args);
}
public void PrintUsage ()
{
Console.WriteLine("Program Options:");
_options.WriteOptionDescriptions(Console.Out);
}
}
}

181
NBTUtil/ConsoleRunner.cs Normal file
View file

@ -0,0 +1,181 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Runtime.InteropServices;
using System.Text;
using NBTExplorer.Model;
using NBTUtil.Ops;
using Substrate.Nbt;
namespace NBTUtil
{
class ConsoleRunner
{
private static readonly Dictionary<ConsoleCommand, ConsoleOperation> _commandTable = new Dictionary<ConsoleCommand, ConsoleOperation>() {
{ ConsoleCommand.SetValue, new EditOperation() },
{ ConsoleCommand.SetList, new SetListOperation() },
{ ConsoleCommand.Print, new PrintOperation() },
{ ConsoleCommand.PrintTree, new PrintTreeOperation() },
};
private ConsoleOptions _options;
public ConsoleRunner ()
{
_options = new ConsoleOptions();
}
public bool Run (string[] args)
{
_options.Parse(args);
if (_options.Command == ConsoleCommand.Help)
return PrintHelp();
if (_options.Path == null)
return PrintUsage("Error: You must specify a path");
if (!_commandTable.ContainsKey(_options.Command))
return PrintUsage("Error: No command specified");
NbtPath path = new NbtPath(_options.Path);
DataNode targetNode = path.Open();
if (targetNode == null)
return PrintError("Error: Invalid path");
ConsoleOperation op = _commandTable[_options.Command];
if (!op.OptionsValid(_options))
return PrintError("Error: Invalid options specified for the given command");
if (!op.CanProcess(targetNode))
return PrintError("Error: The given command can't be applied to the given tag");
if (!op.Process(targetNode, _options))
return PrintError("Error: Problem encountered applying the given command");
path.RootNode.Save();
Console.WriteLine("The operation completed successfully");
return true;
}
private DataNode OpenFile (string path)
{
DataNode node = null;
foreach (var item in FileTypeRegistry.RegisteredTypes) {
if (item.Value.NamePatternTest(path))
node = item.Value.NodeCreate(path);
}
return node;
}
private DataNode ExpandDataNode (DataNode dataNode, string tagPath)
{
string[] pathParts = tagPath.Split('/');
DataNode curTag = dataNode;
curTag.Expand();
foreach (var part in pathParts) {
TagDataNode.Container container = curTag as TagDataNode.Container;
if (curTag == null)
throw new Exception("Invalid tag path");
DataNode childTag = null;
foreach (var child in curTag.Nodes) {
if (child.NodePathName == part)
childTag = child;
}
if (childTag == null)
throw new Exception("Invalid tag path");
curTag.Expand();
}
return curTag;
}
private bool PrintHelp ()
{
Console.WriteLine("NBTUtil - Copyright 2014 Justin Aquadro");
_options.PrintUsage();
return true;
}
private bool PrintUsage (string error)
{
Console.WriteLine(error);
_options.PrintUsage();
return false;
}
private bool PrintError (string error)
{
Console.WriteLine(error);
return false;
}
}
class NbtPath
{
private class PathPart
{
public string Name;
public DataNode Node;
}
private List<PathPart> _pathParts = new List<PathPart>();
public NbtPath (string path)
{
Path = path;
string[] parts = path.Split('/', '\\');
foreach (var p in parts) {
_pathParts.Add(new PathPart() {
Name = p,
});
}
}
public string Path { get; private set; }
public DataNode RootNode
{
get { return (_pathParts.Count == 0) ? null : _pathParts[0].Node; }
}
public DataNode TargetNode
{
get { return (_pathParts.Count == 0) ? null : _pathParts[_pathParts.Count - 1].Node; }
}
public DataNode Open ()
{
DataNode dataNode = new DirectoryDataNode(Directory.GetCurrentDirectory());
dataNode.Expand();
foreach (var part in _pathParts) {
DataNode match = null;
foreach (var child in dataNode.Nodes) {
if (child.NodePathName == part.Name)
match = child;
}
if (match == null)
return null;
part.Node = match;
dataNode = match;
dataNode.Expand();
}
return dataNode;
}
}
}

81
NBTUtil/NBTUtil.csproj Normal file
View file

@ -0,0 +1,81 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{BD90EED5-97B9-47D5-AFEA-C2C0D0E59FCF}</ProjectGuid>
<OutputType>Exe</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>NBTUtil</RootNamespace>
<AssemblyName>NBTUtil</AssemblyName>
<TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<TargetFrameworkProfile />
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="Substrate">
<HintPath>..\References\Substrate.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Data" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="ConsoleOptions.cs" />
<Compile Include="ConsoleRunner.cs" />
<Compile Include="NDesk\Options.cs" />
<Compile Include="Ops\ConsoleOperation.cs" />
<Compile Include="Ops\EditOperation.cs" />
<Compile Include="Ops\PrintOperation.cs" />
<Compile Include="Ops\PrintTreeOperation.cs" />
<Compile Include="Ops\SetListOperation.cs" />
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="TypePrinter.cs" />
</ItemGroup>
<ItemGroup>
<None Include="App.config" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\NBTModel\NBTModel.csproj">
<Project>{20d7cba3-5b6d-40b0-8d28-4c9a58e4ffbc}</Project>
<Name>NBTModel</Name>
</ProjectReference>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
<Target Name="AfterBuild">
<ItemGroup>
<Staging Include="$(OutputPath)\**\*.dll" />
<Staging Include="$(OutputPath)\**\*.exe" />
<Staging Include="$(OutputPath)\**\*.exe.config" />
</ItemGroup>
<Copy SourceFiles="@(Staging)" DestinationFolder="..\Staging\%(RecursiveDir)" />
</Target>
</Project>

1123
NBTUtil/NDesk/Options.cs Normal file

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,18 @@
using System;
using System.Collections.Generic;
using System.Text;
using NBTExplorer.Model;
namespace NBTUtil.Ops
{
abstract class ConsoleOperation
{
public virtual bool OptionsValid (ConsoleOptions options)
{
return true;
}
public abstract bool CanProcess (DataNode dataNode);
public abstract bool Process (DataNode dataNode, ConsoleOptions options);
}
}

View file

@ -0,0 +1,35 @@
using System;
using System.Collections.Generic;
using System.Text;
using NBTExplorer.Model;
namespace NBTUtil.Ops
{
class EditOperation : ConsoleOperation
{
public override bool OptionsValid (ConsoleOptions options)
{
if (options.Values.Count == 0)
return false;
return true;
}
public override bool CanProcess (DataNode dataNode)
{
if (!(dataNode is TagDataNode) || !dataNode.CanEditNode)
return false;
if (dataNode is TagByteArrayDataNode || dataNode is TagIntArrayDataNode)
return false;
return true;
}
public override bool Process (DataNode dataNode, ConsoleOptions options)
{
string value = options.Values[0];
TagDataNode tagDataNode = dataNode as TagDataNode;
return tagDataNode.Parse(value);
}
}
}

View file

@ -0,0 +1,27 @@
using System;
using System.Collections.Generic;
using System.Text;
using NBTExplorer.Model;
namespace NBTUtil.Ops
{
class PrintOperation : ConsoleOperation
{
public override bool CanProcess (DataNode dataNode)
{
return true;
}
public override bool Process (DataNode dataNode, ConsoleOptions options)
{
Console.WriteLine(TypePrinter.Print(dataNode, options.ShowTypes));
if (dataNode.IsContainerType) {
foreach (var child in dataNode.Nodes)
Console.WriteLine(" | " + TypePrinter.Print(child, options.ShowTypes));
}
return true;
}
}
}

View file

@ -0,0 +1,36 @@
using System;
using System.Collections.Generic;
using System.Text;
using NBTExplorer.Model;
namespace NBTUtil.Ops
{
class PrintTreeOperation : ConsoleOperation
{
public override bool CanProcess (DataNode dataNode)
{
return true;
}
public override bool Process (DataNode dataNode, ConsoleOptions options)
{
PrintSubTree(dataNode, options, "", true);
return true;
}
private void PrintSubTree (DataNode dataNode, ConsoleOptions options, string indent, bool last)
{
Console.WriteLine(indent + " + " + TypePrinter.Print(dataNode, options.ShowTypes));
indent += last ? " " : " |";
int cnt = 0;
dataNode.Expand();
foreach (DataNode child in dataNode.Nodes) {
cnt++;
PrintSubTree(child, options, indent, cnt == dataNode.Nodes.Count);
}
}
}
}

View file

@ -0,0 +1,37 @@
using System;
using System.Collections.Generic;
using System.Text;
using NBTExplorer.Model;
using Substrate.Nbt;
namespace NBTUtil.Ops
{
class SetListOperation : ConsoleOperation
{
public override bool CanProcess (DataNode dataNode)
{
if (!(dataNode is TagListDataNode))
return false;
return true;
}
public override bool Process (DataNode dataNode, ConsoleOptions options)
{
TagListDataNode listNode = dataNode as TagListDataNode;
listNode.Clear();
foreach (string value in options.Values) {
TagNode tag = TagDataNode.DefaultTag(listNode.Tag.ValueType);
TagDataNode tagData = TagDataNode.CreateFromTag(tag);
if (!tagData.Parse(value))
return false;
if (!listNode.AppendTag(tagData.Tag))
return false;
}
return true;
}
}
}

15
NBTUtil/Program.cs Normal file
View file

@ -0,0 +1,15 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace NBTUtil
{
class Program
{
static void Main (string[] args)
{
ConsoleRunner runner = new ConsoleRunner();
runner.Run(args);
}
}
}

View file

@ -0,0 +1,36 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// General Information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly: AssemblyTitle("NBTUtil")]
[assembly: AssemblyDescription("A command-line utility to inspect and modify NBT data.")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("NBTUtil")]
[assembly: AssemblyCopyright("Copyright © Justin Aquadro 2014")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly: Guid("14c36789-324a-4cbf-8cb4-1f2bd711a631")]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

40
NBTUtil/TypePrinter.cs Normal file
View file

@ -0,0 +1,40 @@
using System;
using System.Collections.Generic;
using System.Text;
using NBTExplorer.Model;
namespace NBTUtil
{
static class TypePrinter
{
private static Dictionary<Type, string> _key = new Dictionary<Type, string>() {
{ typeof(TagByteDataNode), "b" },
{ typeof(TagShortDataNode), "s" },
{ typeof(TagIntDataNode), "i" },
{ typeof(TagLongDataNode), "l" },
{ typeof(TagFloatDataNode), "f" },
{ typeof(TagDoubleDataNode), "d" },
{ typeof(TagStringDataNode), "T" },
{ typeof(TagByteArrayDataNode), "a" },
{ typeof(TagIntArrayDataNode), "A" },
{ typeof(TagListDataNode), "L" },
{ typeof(TagCompoundDataNode), "C" },
{ typeof(NbtFileDataNode), "N" },
{ typeof(RegionFileDataNode), "R" },
{ typeof(RegionChunkDataNode), "r" },
{ typeof(CubicRegionDataNode), "R" },
{ typeof(DirectoryDataNode), "/" },
};
public static string Print (DataNode node, bool showType)
{
if (!_key.ContainsKey(node.GetType()))
return "";
if (showType)
return "<" + _key[node.GetType()] + "> " + node.NodeDisplay;
else
return node.NodeDisplay;
}
}
}