-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathschematic-parser.js
More file actions
74 lines (61 loc) · 2.64 KB
/
Copy pathschematic-parser.js
File metadata and controls
74 lines (61 loc) · 2.64 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
var nbt = require("prismarine-nbt");
var Vec3 = require("vec3");
var config = require("./config.json");
var blockStateParser = require("./blockstate-parser.js");
var mcdata = require("minecraft-data")(config.version);
function parse(data, cb) {
if(!cb) cb = (err) => {console.log(err)};
try {
nbt.parse(data, (error, data) => {
if(data) {
var simplified = nbt.simplify(data);
//console.log("Data simplified:", simplified);
var old = simplified.Blocks !== undefined;//"new" uses BlockData
cb(undefined, blockDataToString(simplified, old), simplified);
} else if(error) {
cb(error);
}
});
} catch(e) {
cb(e);
}
}
//TODO actually make it able to read "old" schematic format
// https://pastebin.com/ht3bLDWn
// old = old version schematics // https://minecraft.gamepedia.com/Schematic_file_format
// !old = new schematics? used FAWE to get the "new" ones
function blockDataToString(nbtData, old) {
//console.log(nbtData);
var outputData = [];
var reversedPalette = old ? undefined : swapKeysWithValues(nbtData.Palette);
var blockdata = old ? nbtData.Blocks : nbtData.BlockData;
var width = nbtData.Width;
var height = nbtData.Height;
var length = nbtData.Length;
for (var y = 0; y < height; y++) {
for (var x = 0; x < width; x++) {
for (var z = 0; z < length; z++) {
var index = (y * length + z) * width + x;
var data = blockdata.slice(index, index + 7);
var blockType = old ? "minecraft:"+(mcdata.blocks[data[0]] == undefined ? "stone" : mcdata.blocks[data[0]].name) : reversedPalette[data[0].toString()];
var testBlockData = undefined;
if(!old && blockType.includes("[") && blockType.includes("]")) {
testBlockData = blockStateParser.minecraftDataToJSON(blockType);// extract things like facing occupied etc
}
var block = mcdata.blocksByName[((blockType.includes("[") && blockType.includes("]")) ?
blockType.split("[")[0].split("minecraft:")[1] : blockType.split("minecraft:")[1])];
testBlockData == undefined ? undefined : block = mergeObjects(testBlockData, block);
outputData.push({ position: new Vec3(x, y, z), data, blockType, block, old });
}
}
}
//console.log(outputData);
return outputData;
}
function mergeObjects(a, b) {
return {...a, ...b};
}
function swapKeysWithValues(obj) {
return Object.assign({}, ...Object.entries(obj).map(([a,b]) => ({ [b]: a })));
}
module.exports.parse = parse;