Advertisement
adrian_fuchs

anvilToNbt.js

May 14th, 2021
620
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. var anvilToNbt = {};
  2. global.anvilToNbt = anvilToNbt
  3.  
  4. var SECTOR = 4096;
  5.  
  6. anvilToNbt.getNbts = function (mcaRaw) {
  7.     var mca = new Uint8Array(mcaRaw);
  8.     var nbts = [];
  9.  
  10.     var offsets = [];
  11.     for (let i = 0; i < SECTOR; i+=4) {
  12.         var slice = new Uint8Array([0, ...mca.slice(i, i + 3)]);
  13.         var offset = new DataView(slice.buffer).getUint32() * SECTOR;
  14.         var chunkSize = new DataView(mca.buffer).getUint8(i + 3) * SECTOR;
  15.         offsets.push(offset);
  16.         if (offset === 0 && chunkSize === 0) continue;
  17.  
  18.         var nbt = anvilToNbt._getNbt(mca, offset);
  19.         nbts.push(nbt);
  20.     }
  21.  
  22.     return nbts;
  23. };
  24.  
  25. anvilToNbt._getNbt = function (mca, offset) {
  26.     var length = new DataView(new Uint8Array(mca.slice(offset, offset + 4)).buffer).getUint32();
  27.     var compression = mca[offset + 4];
  28.     if (compression !== 2) throw new Error('Invalid compression type');
  29.     var dataOffset = offset + 5;
  30.     var rem = length % SECTOR;
  31.     var padding = (rem) ? SECTOR - (rem) : 0;
  32.     var compressedData = new Uint8Array(mca.slice(dataOffset, dataOffset + length + padding));
  33.     return compressedData;
  34. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement