Haven't updated nbtoolkit in a while. Updated for latest Substrate usage.

This commit is contained in:
Justin Aquadro 2011-07-24 20:03:14 +00:00
parent fd9551079c
commit f19d86a27e
10 changed files with 156 additions and 22 deletions

View file

@ -28,6 +28,9 @@ namespace NBToolkit
int ExcludedBlockCount { get; } int ExcludedBlockCount { get; }
double? ProbMatch { get; } double? ProbMatch { get; }
bool IncludedBlocksContains (int id);
bool ExcludedBlocksContains (int id);
} }
public class BlockFilter : IOptions, IBlockFilter public class BlockFilter : IOptions, IBlockFilter
@ -51,11 +54,13 @@ namespace NBToolkit
public int? XAboveEq public int? XAboveEq
{ {
get { return _xAboveEq; } get { return _xAboveEq; }
set { _xAboveEq = value; }
} }
public int? XBelowEq public int? XBelowEq
{ {
get { return _xBelowEq; } get { return _xBelowEq; }
set { _xBelowEq = value; }
} }
public int? YAboveEq public int? YAboveEq
@ -130,8 +135,24 @@ namespace NBToolkit
v => _invertXYZ = true }, v => _invertXYZ = true },
{ "bi|BlockInclude=", "Match blocks of type {ID}. This option is repeatable.", { "bi|BlockInclude=", "Match blocks of type {ID}. This option is repeatable.",
v => _includedBlocks.Add(Convert.ToInt32(v) % 256) }, v => _includedBlocks.Add(Convert.ToInt32(v) % 256) },
{ "bir|BlockIncludeRange=", "Match blocks of type between {0:V1} and {1:V2}, inclusive. This option is repeatable.",
(v1, v2) => {
int i1 = Math.Max(0, Math.Min(255, Convert.ToInt32(v1)));
int i2 = Math.Max(0, Math.Min(255, Convert.ToInt32(v2)));
for (int i = i1; i <= i2; i++) {
_includedBlocks.Add(i);
}
} },
{ "bx|BlockExclude=", "Match all blocks except blocks of type {ID}. This option is repeatable.", { "bx|BlockExclude=", "Match all blocks except blocks of type {ID}. This option is repeatable.",
v => _excludedBlocks.Add(Convert.ToInt32(v) % 256) }, v => _excludedBlocks.Add(Convert.ToInt32(v) % 256) },
{ "ber|BlockExcludeRange=", "Match all blocks except blocks of type between {0:V1} and {1:V2}, inclusive. This option is repeatable.",
(v1, v2) => {
int i1 = Math.Max(0, Math.Min(255, Convert.ToInt32(v1)));
int i2 = Math.Max(0, Math.Min(255, Convert.ToInt32(v2)));
for (int i = i1; i <= i2; i++) {
_excludedBlocks.Add(i);
}
} },
{ "bp|BlockProbability=", "Selects a matching block with probability {VAL} (0.0-1.0)", { "bp|BlockProbability=", "Selects a matching block with probability {VAL} (0.0-1.0)",
v => _prob = Convert.ToDouble(v) }, v => _prob = Convert.ToDouble(v) },
}; };
@ -153,5 +174,15 @@ namespace NBToolkit
Console.WriteLine("Block Filtering Options:"); Console.WriteLine("Block Filtering Options:");
_options.WriteOptionDescriptions(Console.Out); _options.WriteOptionDescriptions(Console.Out);
} }
public bool IncludedBlocksContains (int id)
{
return _includedBlocks.Contains(id);
}
public bool ExcludedBlocksContains (int id)
{
return _excludedBlocks.Contains(id);
}
} }
} }

View file

@ -31,6 +31,9 @@ namespace NBToolkit
bool ExcludeMatchAll { get; } bool ExcludeMatchAll { get; }
double? ProbMatch { get; } double? ProbMatch { get; }
bool IncludedBlocksContains (int id);
bool ExcludedBlocksContains (int id);
} }
public class ChunkFilter : IOptions, IChunkFilter public class ChunkFilter : IOptions, IChunkFilter
@ -55,21 +58,25 @@ namespace NBToolkit
public int? XAboveEq public int? XAboveEq
{ {
get { return _xAboveEq; } get { return _xAboveEq; }
set { _xAboveEq = value; }
} }
public int? XBelowEq public int? XBelowEq
{ {
get { return _xBelowEq; } get { return _xBelowEq; }
set { _xBelowEq = value; }
} }
public int? ZAboveEq public int? ZAboveEq
{ {
get { return _zAboveEq; } get { return _zAboveEq; }
set { _zAboveEq = value; }
} }
public int? ZBelowEq public int? ZBelowEq
{ {
get { return _zBelowEq; } get { return _zBelowEq; }
set { _zBelowEq = value; }
} }
public bool InvertXZ public bool InvertXZ
@ -167,5 +174,15 @@ namespace NBToolkit
Console.WriteLine("Chunk Filtering Options:"); Console.WriteLine("Chunk Filtering Options:");
_options.WriteOptionDescriptions(Console.Out); _options.WriteOptionDescriptions(Console.Out);
} }
public bool IncludedBlocksContains (int id)
{
return _includedBlocks.Contains(id);
}
public bool ExcludedBlocksContains (int id)
{
return _excludedBlocks.Contains(id);
}
} }
} }

View file

@ -4,7 +4,8 @@ using System.Text;
using System.IO; using System.IO;
using NDesk.Options; using NDesk.Options;
using Substrate; using Substrate;
using Substrate.NBT; using Substrate.Nbt;
using Substrate.Core;
namespace NBToolkit namespace NBToolkit
{ {
@ -96,7 +97,7 @@ namespace NBToolkit
public override void Run () public override void Run ()
{ {
INBTWorld world = GetWorld(opt); NbtWorld world = GetWorld(opt);
IChunkManager cm = world.GetChunkManager(opt.OPT_DIM); IChunkManager cm = world.GetChunkManager(opt.OPT_DIM);
FilteredChunkManager fcm = new FilteredChunkManager(cm, opt.GetChunkFilter()); FilteredChunkManager fcm = new FilteredChunkManager(cm, opt.GetChunkFilter());

View file

@ -3,6 +3,7 @@ using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using System.Text; using System.Text;
using Substrate; using Substrate;
using Substrate.Core;
namespace NBToolkit namespace NBToolkit
{ {
@ -230,5 +231,15 @@ namespace NBToolkit
} }
#endregion #endregion
#region IChunkContainer Members
public bool CanDelegateCoordinates
{
get { return false; }
}
#endregion
} }
} }

View file

@ -2,6 +2,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Text; using System.Text;
using Substrate; using Substrate;
using Substrate.Core;
namespace NBToolkit namespace NBToolkit
{ {
@ -100,8 +101,8 @@ namespace NBToolkit
for (int iz = zStart; iz <= zEnd; iz++) { for (int iz = zStart; iz <= zEnd; iz++) {
double zThresh = (iz + 0.5D - zPos) / (fuzzXZ / 2.0D); double zThresh = (iz + 0.5D - zPos) / (fuzzXZ / 2.0D);
if (xThresh * xThresh + yThresh * yThresh + zThresh * zThresh < 1.0D) { if (xThresh * xThresh + yThresh * yThresh + zThresh * zThresh < 1.0D) {
BlockRef block = blockMan.GetBlockRef(ix, iy, iz); AlphaBlockRef block = blockMan.GetBlockRef(ix, iy, iz);
if (block != null) { if (block.IsValid) {
block.ID = _blockId; block.ID = _blockId;
block.Data = _blockData; block.Data = _blockData;
} }

View file

@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.Text; using System.Text;
using NDesk.Options; using NDesk.Options;
using Substrate; using Substrate;
using Substrate.Core;
namespace NBToolkit namespace NBToolkit
{ {
@ -181,7 +182,7 @@ namespace NBToolkit
public override void Run () public override void Run ()
{ {
INBTWorld world = GetWorld(opt); NbtWorld world = GetWorld(opt);
IChunkManager cm = world.GetChunkManager(opt.OPT_DIM); IChunkManager cm = world.GetChunkManager(opt.OPT_DIM);
FilteredChunkManager fcm = new FilteredChunkManager(cm, opt.GetChunkFilter()); FilteredChunkManager fcm = new FilteredChunkManager(cm, opt.GetChunkFilter());
@ -205,7 +206,7 @@ namespace NBToolkit
Console.WriteLine("Affected Chunks: " + affectedChunks); Console.WriteLine("Affected Chunks: " + affectedChunks);
} }
public void ApplyChunk (INBTWorld world, ChunkRef chunk) public void ApplyChunk (NbtWorld world, ChunkRef chunk)
{ {
if (opt.OPT_V) { if (opt.OPT_V) {
Console.WriteLine("Generating {0} size {1} deposits of {2} between {3} and {4}", Console.WriteLine("Generating {0} size {1} deposits of {2} between {3} and {4}",
@ -265,7 +266,7 @@ namespace NBToolkit
return false; return false;
} }
int blockID = _cache.Blocks.GetID(x & _chunkXMask, y & _chunkYMask, z & _chunkZMask); int blockID = cache.Blocks.GetID(x & chunkXMask, y & chunkYMask, z & chunkZMask);
if ( if (
((opt.OPT_OA) && (blockID != opt.OPT_ID)) || ((opt.OPT_OA) && (blockID != opt.OPT_ID)) ||

View file

@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.Text; using System.Text;
using NDesk.Options; using NDesk.Options;
using Substrate; using Substrate;
using Substrate.Core;
namespace NBToolkit namespace NBToolkit
{ {
@ -69,7 +70,7 @@ namespace NBToolkit
public override void Run () public override void Run ()
{ {
INBTWorld world = GetWorld(opt); NbtWorld world = GetWorld(opt);
IChunkManager cm = world.GetChunkManager(opt.OPT_DIM); IChunkManager cm = world.GetChunkManager(opt.OPT_DIM);
FilteredChunkManager fcm = new FilteredChunkManager(cm, opt.GetChunkFilter()); FilteredChunkManager fcm = new FilteredChunkManager(cm, opt.GetChunkFilter());

View file

@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.Text; using System.Text;
using NDesk.Options; using NDesk.Options;
using Substrate; using Substrate;
using Substrate.Core;
namespace NBToolkit namespace NBToolkit
{ {
@ -11,9 +12,9 @@ namespace NBToolkit
private OptionSet _filterOpt = null; private OptionSet _filterOpt = null;
private ChunkFilter _chunkFilter = null; private ChunkFilter _chunkFilter = null;
public bool BlockLight; public bool BlockLight = false;
public bool SkyLight; public bool SkyLight = false;
public bool HeightMap; public bool HeightMap = false;
public RelightOptions () public RelightOptions ()
: base() : base()
@ -82,7 +83,7 @@ namespace NBToolkit
public override void Run () public override void Run ()
{ {
INBTWorld world = GetWorld(opt); NbtWorld world = GetWorld(opt);
IChunkManager cm = world.GetChunkManager(opt.OPT_DIM); IChunkManager cm = world.GetChunkManager(opt.OPT_DIM);
FilteredChunkManager fcm = new FilteredChunkManager(cm, opt.GetChunkFilter()); FilteredChunkManager fcm = new FilteredChunkManager(cm, opt.GetChunkFilter());

View file

@ -4,6 +4,7 @@ using System.Text;
using System.Globalization; using System.Globalization;
using NDesk.Options; using NDesk.Options;
using Substrate; using Substrate;
using Substrate.Core;
namespace NBToolkit namespace NBToolkit
{ {
@ -134,6 +135,23 @@ namespace NBToolkit
throw new TKOptionException(); throw new TKOptionException();
} }
if (_blockFilter.XAboveEq != null) {
int cx = (int)_blockFilter.XAboveEq >> 5;
_chunkFilter.XAboveEq = Math.Max(_chunkFilter.XAboveEq ?? cx, cx);
}
if (_blockFilter.XBelowEq != null) {
int cx = (int)_blockFilter.XBelowEq >> 5;
_chunkFilter.XBelowEq = Math.Min(_chunkFilter.XBelowEq ?? cx, cx);
}
if (_blockFilter.ZAboveEq != null) {
int cx = (int)_blockFilter.ZAboveEq >> 5;
_chunkFilter.ZAboveEq = Math.Max(_chunkFilter.ZAboveEq ?? cx, cx);
}
if (_blockFilter.ZBelowEq != null) {
int cx = (int)_blockFilter.ZBelowEq >> 5;
_chunkFilter.ZBelowEq = Math.Min(_chunkFilter.ZBelowEq ?? cx, cx);
}
} }
public IChunkFilter GetChunkFilter () public IChunkFilter GetChunkFilter ()
@ -153,30 +171,38 @@ namespace NBToolkit
private static Random rand = new Random(); private static Random rand = new Random();
private List<BlockKey>[] _sort = new List<BlockKey>[256];
public Replace (ReplaceOptions o) public Replace (ReplaceOptions o)
{ {
opt = o; opt = o;
for (int i = 0; i < 256; i++) {
_sort[i] = new List<BlockKey>();
}
} }
public override void Run () public override void Run ()
{ {
INBTWorld world = GetWorld(opt); NbtWorld world = GetWorld(opt);
IChunkManager cm = world.GetChunkManager(opt.OPT_DIM); IChunkManager cm = world.GetChunkManager(opt.OPT_DIM);
FilteredChunkManager fcm = new FilteredChunkManager(cm, opt.GetChunkFilter()); FilteredChunkManager fcm = new FilteredChunkManager(cm, opt.GetChunkFilter());
int affectedChunks = 0; int affectedChunks = 0;
foreach (ChunkRef chunk in fcm) { foreach (ChunkRef chunk in fcm) {
affectedChunks++; if (opt.OPT_V) {
Console.WriteLine("Processing chunk {0},{1}...", chunk.X, chunk.Z);
}
ApplyChunk(world, chunk); ApplyChunk(world, chunk);
fcm.Save(); affectedChunks += fcm.Save() > 0 ? 1 : 0;
} }
Console.WriteLine("Affected Chunks: " + affectedChunks); Console.WriteLine("Affected Chunks: " + affectedChunks);
} }
public void ApplyChunk (INBTWorld world, ChunkRef chunk) public void ApplyChunk (NbtWorld world, ChunkRef chunk)
{ {
IBlockFilter opt_b = opt.GetBlockFilter(); IBlockFilter opt_b = opt.GetBlockFilter();
@ -195,7 +221,7 @@ namespace NBToolkit
} }
xmin = (xmin < 0) ? 0 : xmin; xmin = (xmin < 0) ? 0 : xmin;
xmax = (xmin > 15) ? 15 : xmax; xmax = (xmax > 15) ? 15 : xmax;
if (xmin > 15 || xmax < 0 || xmin > xmax) { if (xmin > 15 || xmax < 0 || xmin > xmax) {
return; return;
@ -228,7 +254,7 @@ namespace NBToolkit
} }
zmin = (zmin < 0) ? 0 : zmin; zmin = (zmin < 0) ? 0 : zmin;
zmax = (zmin > 15) ? 15 : zmax; zmax = (zmax > 15) ? 15 : zmax;
if (zmin > 15 || zmax < 0 || zmin > zmax) { if (zmin > 15 || zmax < 0 || zmin > zmax) {
return; return;
@ -238,8 +264,52 @@ namespace NBToolkit
int ydim = chunk.Blocks.YDim; int ydim = chunk.Blocks.YDim;
int zdim = chunk.Blocks.ZDim; int zdim = chunk.Blocks.ZDim;
// Process Chunk // Bin blocks
for (int y = ymin; y <= ymax; y++) { for (int y = ymin; y <= ymax; y++) {
for (int x = xmin; x <= xmax; x++) {
for (int z = zmin; z <= zmax; z++) {
int id = chunk.Blocks.GetID(x, y, z);
_sort[id].Add(new BlockKey(x, y, z));
}
}
}
// Process bins
for (int i = 0; i < 256; i++) {
if (_sort[i].Count == 0) {
continue;
}
if (opt_b.IncludedBlockCount > 0 & !opt_b.IncludedBlocksContains(i)) {
continue;
}
if (opt_b.ExcludedBlockCount > 0 & opt_b.ExcludedBlocksContains(i)) {
continue;
}
foreach (BlockKey key in _sort[i]) {
chunk.Blocks.SetID(key.x, key.y, key.z, (int)opt.OPT_AFTER);
if (opt.OPT_VV) {
int gx = chunk.X * xdim + key.x;
int gz = chunk.Z * zdim + key.z;
Console.WriteLine("Replaced block {0} at {1},{2},{3}", i, gx, key.y, gz);
}
if (opt.OPT_DATA != null) {
chunk.Blocks.SetData(key.x, key.y, key.z, (int)opt.OPT_DATA);
}
}
}
// Reset bins
for (int i = 0; i < 256; i++) {
_sort[i].Clear();
}
// Process Chunk
/*for (int y = ymin; y <= ymax; y++) {
for (int x = xmin; x <= xmax; x++) { for (int x = xmin; x <= xmax; x++) {
for (int z = zmin; z <= zmax; z++) { for (int z = zmin; z <= zmax; z++) {
// Probability test // Probability test
@ -301,7 +371,7 @@ namespace NBToolkit
} }
} }
} }
} }*/
} }
} }
} }

View file

@ -11,9 +11,9 @@ namespace NBToolkit
public abstract void Run (); public abstract void Run ();
public INBTWorld GetWorld (TKOptions opt) public NbtWorld GetWorld (TKOptions opt)
{ {
INBTWorld world = null; NbtWorld world = null;
try { try {
if (opt.OPT_ALPHA) { if (opt.OPT_ALPHA) {
world = AlphaWorld.Open(opt.OPT_WORLD); world = AlphaWorld.Open(opt.OPT_WORLD);