"use strict";
var MCAManager = require('./mca.js'),
nbt = require('prismarine-nbt'),
findDiff = require('deep-diff').diff;
var arrPromise = [];
function MCADiff(file1, file2, output) {
function readChunk(m, x, z) {
return new Promise((resolve, reject) => {
m.read(x, z, function(err, region) {
if (err) throw err;
if (region) {
nbt.parse(region, function(err, data) {
if (err) throw err;
data = nbt.simplify(data);
data.Level.Sections = data.Level.Sections.map(v => {
v.Add = byteTo4bits(v.Add);
v.Data = byteTo4bits(v.Data);
v.BlockLight = byteTo4bits(v.BlockLight);
v.SkyLight = byteTo4bits(v.SkyLight);
return v;
})
resolve(data);
})
}
})
});
}
function byteTo4bits(byteArray) {
if (!byteArray) return;
var newArr = [];
byteArray.forEach(ele => {
newArr.push(ele & 0xF);
newArr.push(ele >> 4);
})
return newArr;
}
function processDiff(diff, blocks, lChunk, rChunk) {
switch (diff.path[1]) {
case "Sections":
if (diff.path[3] == "Y") break;
blocks[diff.path[2]] = (diff.path[2] in blocks) ? blocks[diff.path[2]] : {};
blocks[diff.path[2]][diff.path[4]] = blocks[diff.path[2]][diff.path[4]] ? blocks[diff.path[2]][diff.path[4]] : {};
blocks[diff.path[2]][diff.path[4]][diff.path[3]] = {
lhs: diff.lhs,
rhs: diff.rhs
}
default:
// code
}
return blocks;
}
var m = new MCAManager(file1);
var n = new MCAManager(file2);
//var i = 0,
// j = 31;
for (var i = 0; i <= 31; i++) {
for (var j = 0; j <= 31; j++) {
arrPromise.push(Promise.all([readChunk(m, i, j), readChunk(n, i, j)]).then(values => {
var blocks = {
xPos: values[0].Level.xPos,
zPos: values[0].Level.zPos
};
if(values[0].Level.LastUpdate==values[1].Level.LastUpdate) return;
var difference = {
diff: findDiff(values[0], values[1])
};
if (difference.diff) {
difference.xPos = values[0].Level.xPos;
difference.zPos = values[0].Level.zPos;
difference.diff.forEach((ele) => {
switch (ele.kind) {
case 'E':
blocks = processDiff(ele, blocks, values[0], values[1]);
break;
default:
// code
}
});
output(blocks);
}
}));
}
}
return Promise.all(arrPromise);
}
module.exports = MCADiff;
/*
MCADiff("r.0.-1_old.mca", "r.0.-1.mca", diff => {
console.log(JSON.stringify(diff));
});*/