mca-json 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (231) hide show
  1. package/.editorconfig +14 -0
  2. package/.prettierrc +4 -0
  3. package/README.md +373 -0
  4. package/dist/bin/mca-chunks.d.ts +3 -0
  5. package/dist/bin/mca-chunks.d.ts.map +1 -0
  6. package/dist/bin/mca-chunks.js +43 -0
  7. package/dist/bin/mca-chunks.js.map +1 -0
  8. package/dist/bin/mca-find-chunks-with-signs.d.ts +3 -0
  9. package/dist/bin/mca-find-chunks-with-signs.d.ts.map +1 -0
  10. package/dist/bin/mca-find-chunks-with-signs.js +79 -0
  11. package/dist/bin/mca-find-chunks-with-signs.js.map +1 -0
  12. package/dist/bin/mca-json.d.ts +3 -0
  13. package/dist/bin/mca-json.d.ts.map +1 -0
  14. package/dist/bin/mca-json.js +73 -0
  15. package/dist/bin/mca-json.js.map +1 -0
  16. package/dist/bin/mca-trim-chunks-without-signs.d.ts +3 -0
  17. package/dist/bin/mca-trim-chunks-without-signs.d.ts.map +1 -0
  18. package/dist/bin/mca-trim-chunks-without-signs.js +117 -0
  19. package/dist/bin/mca-trim-chunks-without-signs.js.map +1 -0
  20. package/dist/bin/nbt-get-player-location.d.ts +3 -0
  21. package/dist/bin/nbt-get-player-location.d.ts.map +1 -0
  22. package/dist/bin/nbt-get-player-location.js +83 -0
  23. package/dist/bin/nbt-get-player-location.js.map +1 -0
  24. package/dist/bin/nbt-json.d.ts +3 -0
  25. package/dist/bin/nbt-json.d.ts.map +1 -0
  26. package/dist/bin/nbt-json.js +64 -0
  27. package/dist/bin/nbt-json.js.map +1 -0
  28. package/dist/block/banner.d.ts +13 -0
  29. package/dist/block/banner.d.ts.map +1 -0
  30. package/dist/block/banner.js +28 -0
  31. package/dist/block/banner.js.map +1 -0
  32. package/dist/block/barrel.d.ts +17 -0
  33. package/dist/block/barrel.d.ts.map +1 -0
  34. package/dist/block/barrel.js +21 -0
  35. package/dist/block/barrel.js.map +1 -0
  36. package/dist/block/beacon.d.ts +14 -0
  37. package/dist/block/beacon.d.ts.map +1 -0
  38. package/dist/block/beacon.js +14 -0
  39. package/dist/block/beacon.js.map +1 -0
  40. package/dist/block/bed.d.ts +4 -0
  41. package/dist/block/bed.d.ts.map +1 -0
  42. package/dist/block/bed.js +4 -0
  43. package/dist/block/bed.js.map +1 -0
  44. package/dist/block/beehive.d.ts +9 -0
  45. package/dist/block/beehive.d.ts.map +1 -0
  46. package/dist/block/beehive.js +10 -0
  47. package/dist/block/beehive.js.map +1 -0
  48. package/dist/block/bell.d.ts +4 -0
  49. package/dist/block/bell.d.ts.map +1 -0
  50. package/dist/block/bell.js +4 -0
  51. package/dist/block/bell.js.map +1 -0
  52. package/dist/block/block.d.ts +23 -0
  53. package/dist/block/block.d.ts.map +1 -0
  54. package/dist/block/block.js +49 -0
  55. package/dist/block/block.js.map +1 -0
  56. package/dist/block/generic.d.ts +10 -0
  57. package/dist/block/generic.d.ts.map +1 -0
  58. package/dist/block/generic.js +14 -0
  59. package/dist/block/generic.js.map +1 -0
  60. package/dist/block/has-entity-data.d.ts +8 -0
  61. package/dist/block/has-entity-data.d.ts.map +1 -0
  62. package/dist/block/has-entity-data.js +12 -0
  63. package/dist/block/has-entity-data.js.map +1 -0
  64. package/dist/block/mixins/custom-name.d.ts +5 -0
  65. package/dist/block/mixins/custom-name.d.ts.map +1 -0
  66. package/dist/block/mixins/custom-name.js +7 -0
  67. package/dist/block/mixins/custom-name.js.map +1 -0
  68. package/dist/block/mixins/lock.d.ts +5 -0
  69. package/dist/block/mixins/lock.d.ts.map +1 -0
  70. package/dist/block/mixins/lock.js +7 -0
  71. package/dist/block/mixins/lock.js.map +1 -0
  72. package/dist/block/mixins/mixin.d.ts +27 -0
  73. package/dist/block/mixins/mixin.d.ts.map +1 -0
  74. package/dist/block/mixins/mixin.js +36 -0
  75. package/dist/block/mixins/mixin.js.map +1 -0
  76. package/dist/block/sign.d.ts +15 -0
  77. package/dist/block/sign.d.ts.map +1 -0
  78. package/dist/block/sign.js +91 -0
  79. package/dist/block/sign.js.map +1 -0
  80. package/dist/index.d.ts +39 -0
  81. package/dist/index.d.ts.map +1 -0
  82. package/dist/index.js +39 -0
  83. package/dist/index.js.map +1 -0
  84. package/dist/lib/anvil.d.ts +54 -0
  85. package/dist/lib/anvil.d.ts.map +1 -0
  86. package/dist/lib/anvil.js +141 -0
  87. package/dist/lib/anvil.js.map +1 -0
  88. package/dist/lib/binary-data.d.ts +48 -0
  89. package/dist/lib/binary-data.d.ts.map +1 -0
  90. package/dist/lib/binary-data.js +188 -0
  91. package/dist/lib/binary-data.js.map +1 -0
  92. package/dist/lib/bit-data.d.ts +16 -0
  93. package/dist/lib/bit-data.d.ts.map +1 -0
  94. package/dist/lib/bit-data.js +75 -0
  95. package/dist/lib/bit-data.js.map +1 -0
  96. package/dist/lib/block-data.d.ts +20 -0
  97. package/dist/lib/block-data.d.ts.map +1 -0
  98. package/dist/lib/block-data.js +125 -0
  99. package/dist/lib/block-data.js.map +1 -0
  100. package/dist/lib/chunk.d.ts +112 -0
  101. package/dist/lib/chunk.d.ts.map +1 -0
  102. package/dist/lib/chunk.js +299 -0
  103. package/dist/lib/chunk.js.map +1 -0
  104. package/dist/nbt/nbt-base.d.ts +20 -0
  105. package/dist/nbt/nbt-base.d.ts.map +1 -0
  106. package/dist/nbt/nbt-base.js +30 -0
  107. package/dist/nbt/nbt-base.js.map +1 -0
  108. package/dist/nbt/nbt-byte-array.d.ts +13 -0
  109. package/dist/nbt/nbt-byte-array.d.ts.map +1 -0
  110. package/dist/nbt/nbt-byte-array.js +30 -0
  111. package/dist/nbt/nbt-byte-array.js.map +1 -0
  112. package/dist/nbt/nbt-byte.d.ts +13 -0
  113. package/dist/nbt/nbt-byte.d.ts.map +1 -0
  114. package/dist/nbt/nbt-byte.js +25 -0
  115. package/dist/nbt/nbt-byte.js.map +1 -0
  116. package/dist/nbt/nbt-compound.d.ts +15 -0
  117. package/dist/nbt/nbt-compound.d.ts.map +1 -0
  118. package/dist/nbt/nbt-compound.js +68 -0
  119. package/dist/nbt/nbt-compound.js.map +1 -0
  120. package/dist/nbt/nbt-double.d.ts +13 -0
  121. package/dist/nbt/nbt-double.d.ts.map +1 -0
  122. package/dist/nbt/nbt-double.js +25 -0
  123. package/dist/nbt/nbt-double.js.map +1 -0
  124. package/dist/nbt/nbt-end.d.ts +11 -0
  125. package/dist/nbt/nbt-end.d.ts.map +1 -0
  126. package/dist/nbt/nbt-end.js +22 -0
  127. package/dist/nbt/nbt-end.js.map +1 -0
  128. package/dist/nbt/nbt-float.d.ts +13 -0
  129. package/dist/nbt/nbt-float.d.ts.map +1 -0
  130. package/dist/nbt/nbt-float.js +25 -0
  131. package/dist/nbt/nbt-float.js.map +1 -0
  132. package/dist/nbt/nbt-int-array.d.ts +13 -0
  133. package/dist/nbt/nbt-int-array.d.ts.map +1 -0
  134. package/dist/nbt/nbt-int-array.js +30 -0
  135. package/dist/nbt/nbt-int-array.js.map +1 -0
  136. package/dist/nbt/nbt-int.d.ts +13 -0
  137. package/dist/nbt/nbt-int.d.ts.map +1 -0
  138. package/dist/nbt/nbt-int.js +25 -0
  139. package/dist/nbt/nbt-int.js.map +1 -0
  140. package/dist/nbt/nbt-list.d.ts +17 -0
  141. package/dist/nbt/nbt-list.d.ts.map +1 -0
  142. package/dist/nbt/nbt-list.js +70 -0
  143. package/dist/nbt/nbt-list.js.map +1 -0
  144. package/dist/nbt/nbt-long-array.d.ts +13 -0
  145. package/dist/nbt/nbt-long-array.d.ts.map +1 -0
  146. package/dist/nbt/nbt-long-array.js +32 -0
  147. package/dist/nbt/nbt-long-array.js.map +1 -0
  148. package/dist/nbt/nbt-long.d.ts +13 -0
  149. package/dist/nbt/nbt-long.d.ts.map +1 -0
  150. package/dist/nbt/nbt-long.js +25 -0
  151. package/dist/nbt/nbt-long.js.map +1 -0
  152. package/dist/nbt/nbt-short.d.ts +13 -0
  153. package/dist/nbt/nbt-short.d.ts.map +1 -0
  154. package/dist/nbt/nbt-short.js +25 -0
  155. package/dist/nbt/nbt-short.js.map +1 -0
  156. package/dist/nbt/nbt-string.d.ts +13 -0
  157. package/dist/nbt/nbt-string.d.ts.map +1 -0
  158. package/dist/nbt/nbt-string.js +27 -0
  159. package/dist/nbt/nbt-string.js.map +1 -0
  160. package/dist/nbt/nbt-tag-type.d.ts +16 -0
  161. package/dist/nbt/nbt-tag-type.d.ts.map +1 -0
  162. package/dist/nbt/nbt-tag-type.js +17 -0
  163. package/dist/nbt/nbt-tag-type.js.map +1 -0
  164. package/dist/nbt/nbt.d.ts +11 -0
  165. package/dist/nbt/nbt.d.ts.map +1 -0
  166. package/dist/nbt/nbt.js +57 -0
  167. package/dist/nbt/nbt.js.map +1 -0
  168. package/dist/nbt/snbt-data.d.ts +18 -0
  169. package/dist/nbt/snbt-data.d.ts.map +1 -0
  170. package/dist/nbt/snbt-data.js +34 -0
  171. package/dist/nbt/snbt-data.js.map +1 -0
  172. package/dist/nbt/snbt-parse.d.ts +3 -0
  173. package/dist/nbt/snbt-parse.d.ts.map +1 -0
  174. package/dist/nbt/snbt-parse.js +201 -0
  175. package/dist/nbt/snbt-parse.js.map +1 -0
  176. package/dist/nbt/snbt-to-nbt.d.ts +7 -0
  177. package/dist/nbt/snbt-to-nbt.d.ts.map +1 -0
  178. package/dist/nbt/snbt-to-nbt.js +178 -0
  179. package/dist/nbt/snbt-to-nbt.js.map +1 -0
  180. package/dist/types/coords.d.ts +3 -0
  181. package/dist/types/coords.d.ts.map +1 -0
  182. package/dist/types/coords.js +2 -0
  183. package/dist/types/coords.js.map +1 -0
  184. package/package.json +28 -0
  185. package/src/bin/mca-chunks.ts +54 -0
  186. package/src/bin/mca-find-chunks-with-signs.ts +109 -0
  187. package/src/bin/mca-json.ts +96 -0
  188. package/src/bin/mca-trim-chunks-without-signs.ts +146 -0
  189. package/src/bin/nbt-get-player-location.ts +102 -0
  190. package/src/bin/nbt-json.ts +85 -0
  191. package/src/block/banner.ts +50 -0
  192. package/src/block/barrel.ts +34 -0
  193. package/src/block/beacon.ts +20 -0
  194. package/src/block/bed.ts +3 -0
  195. package/src/block/beehive.ts +17 -0
  196. package/src/block/bell.ts +3 -0
  197. package/src/block/block.ts +62 -0
  198. package/src/block/generic.ts +14 -0
  199. package/src/block/has-entity-data.ts +20 -0
  200. package/src/block/mixins/custom-name.ts +8 -0
  201. package/src/block/mixins/lock.ts +8 -0
  202. package/src/block/mixins/mixin.ts +53 -0
  203. package/src/block/sign.ts +121 -0
  204. package/src/index.ts +38 -0
  205. package/src/lib/anvil.ts +178 -0
  206. package/src/lib/binary-data.ts +247 -0
  207. package/src/lib/bit-data.ts +101 -0
  208. package/src/lib/block-data.ts +180 -0
  209. package/src/lib/chunk.ts +389 -0
  210. package/src/nbt/nbt-base.ts +38 -0
  211. package/src/nbt/nbt-byte-array.ts +38 -0
  212. package/src/nbt/nbt-byte.ts +31 -0
  213. package/src/nbt/nbt-compound.ts +95 -0
  214. package/src/nbt/nbt-double.ts +31 -0
  215. package/src/nbt/nbt-end.ts +27 -0
  216. package/src/nbt/nbt-float.ts +31 -0
  217. package/src/nbt/nbt-int-array.ts +38 -0
  218. package/src/nbt/nbt-int.ts +31 -0
  219. package/src/nbt/nbt-list.ts +103 -0
  220. package/src/nbt/nbt-long-array.ts +40 -0
  221. package/src/nbt/nbt-long.ts +31 -0
  222. package/src/nbt/nbt-short.ts +31 -0
  223. package/src/nbt/nbt-string.ts +35 -0
  224. package/src/nbt/nbt-tag-type.ts +15 -0
  225. package/src/nbt/nbt.ts +70 -0
  226. package/src/nbt/snbt-data.ts +70 -0
  227. package/src/nbt/snbt-parse.ts +256 -0
  228. package/src/nbt/snbt-to-nbt.ts +219 -0
  229. package/src/types/coords.ts +2 -0
  230. package/src/types/neodoc.d.ts +28 -0
  231. package/tsconfig.json +25 -0
@@ -0,0 +1,38 @@
1
+ import debug from 'debug';
2
+ import { BinaryData } from '../lib/binary-data';
3
+ import { NbtBase } from './nbt-base';
4
+ import { NbtTagType } from './nbt-tag-type';
5
+
6
+ const debugLogFromBinaryData = debug('nbt:int-array:from-binary-data');
7
+
8
+ export class NbtIntArray extends NbtBase<number[]> {
9
+ static fromBinaryData(bd: BinaryData, name?: string): NbtIntArray {
10
+ name ??= NbtIntArray.readName(bd);
11
+ const data: number[] = [];
12
+ const length = bd.getInt();
13
+ debugLogFromBinaryData(`INT_ARRAY, name ${name}, length ${length}`);
14
+
15
+ for (let i = 0; i < length; i++) {
16
+ data.push(bd.getInt());
17
+ }
18
+
19
+ debugLogFromBinaryData(`INT_ARRAY, name ${name}, data ${data}`);
20
+
21
+ return new NbtIntArray(data, name);
22
+ }
23
+
24
+ constructor(data: number[], name?: string) {
25
+ super(NbtTagType.INT_ARRAY, data, name);
26
+ }
27
+
28
+ toObject() {
29
+ return {
30
+ type: this.type,
31
+ intArray: this.data,
32
+ };
33
+ }
34
+
35
+ toSnbt() {
36
+ return `[I;${this.data.join(', ')}]`;
37
+ }
38
+ }
@@ -0,0 +1,31 @@
1
+ import debug from 'debug';
2
+ import { BinaryData } from '../lib/binary-data';
3
+ import { NbtBase } from './nbt-base';
4
+ import { NbtTagType } from './nbt-tag-type';
5
+
6
+ const debugLogFromBinaryData = debug('nbt:int:from-binary-data');
7
+
8
+ export class NbtInt extends NbtBase<number> {
9
+ static fromBinaryData(bd: BinaryData, name?: string): NbtInt {
10
+ name ??= NbtInt.readName(bd);
11
+ const data = bd.getInt();
12
+ debugLogFromBinaryData(`INT, name ${name}, data ${data}`);
13
+
14
+ return new NbtInt(data, name);
15
+ }
16
+
17
+ constructor(data: number, name?: string) {
18
+ super(NbtTagType.INT, data, name);
19
+ }
20
+
21
+ toObject() {
22
+ return {
23
+ type: this.type,
24
+ int: this.data,
25
+ };
26
+ }
27
+
28
+ toSnbt() {
29
+ return `${this.data}`;
30
+ }
31
+ }
@@ -0,0 +1,103 @@
1
+ import debug from 'debug';
2
+ import { BinaryData } from '../lib/binary-data';
3
+ import { fromBinaryData } from './nbt';
4
+ import { NbtBase } from './nbt-base';
5
+ import { NbtTagType } from './nbt-tag-type';
6
+
7
+ const debugLogFromBinaryData = debug('nbt:list:from-binary-data');
8
+ const debugLogFindChild = debug('nbt:list:find-child');
9
+
10
+ export class NbtList<T extends NbtBase<any>> extends NbtBase<T[]> {
11
+ static fromBinaryData<SOURCE extends NbtBase<any>>(
12
+ bd: BinaryData,
13
+ name?: string
14
+ ): NbtList<SOURCE> {
15
+ name ??= NbtList.readName(bd);
16
+ const subtype = bd.getByte();
17
+ const length = bd.getInt();
18
+ const data: SOURCE[] = [];
19
+ debugLogFromBinaryData(
20
+ `LIST, name ${name}, subtype ${subtype}, length ${length}, start`
21
+ );
22
+ const reader = fromBinaryData[subtype];
23
+
24
+ if (!reader) {
25
+ throw new Error(`Invalid NBT tag type ${subtype} for list tag`);
26
+ }
27
+
28
+ while (data.length < length) {
29
+ // All list items are unnamed
30
+ data.push(reader(bd, '') as SOURCE);
31
+ }
32
+
33
+ debugLogFromBinaryData(
34
+ `LIST, name ${name}, subtype ${subtype}, element count ${data.length}, end`
35
+ );
36
+
37
+ return new NbtList<SOURCE>(data, subtype, name);
38
+ }
39
+
40
+ subtype: NbtTagType;
41
+
42
+ constructor(data: T[], subtype: NbtTagType, name?: string) {
43
+ super(NbtTagType.LIST, data, name);
44
+ this.subtype = subtype;
45
+ }
46
+
47
+ override findChild<RESULT extends NbtBase<any>>(
48
+ path: string
49
+ ): RESULT | undefined {
50
+ const pathSegments = path.split('/');
51
+ const currentSegment = pathSegments.shift();
52
+
53
+ if (!currentSegment) {
54
+ return;
55
+ }
56
+
57
+ const index = parseInt(currentSegment, 10);
58
+
59
+ if (isNaN(index)) {
60
+ debugLogFindChild(`LIST, name ${this.name}, subtype ${this.subtype}, path ${path}, segment ${currentSegment}, not a number`);
61
+
62
+ return;
63
+ }
64
+
65
+ const result = this.data[index];
66
+
67
+ if (!result) {
68
+ debugLogFindChild(`LIST, name ${this.name}, subtype ${this.subtype}, path ${path}, segment ${currentSegment}, no child found at index ${index}`);
69
+
70
+ return;
71
+ }
72
+
73
+ if (pathSegments.length) {
74
+ debugLogFindChild(`LIST, name ${this.name}, subtype ${this.subtype}, path ${path}, segment ${currentSegment}, recurse`);
75
+
76
+ return result.findChild<RESULT>(pathSegments.join('/'));
77
+ }
78
+
79
+ debugLogFindChild(`LIST, name ${this.name}, subtype ${this.subtype}, path ${path}, segment ${currentSegment}, found`);
80
+
81
+ return result as unknown as RESULT;
82
+ }
83
+
84
+ override isList(subtype?: NbtTagType) {
85
+ if (subtype !== undefined && this.subtype !== subtype) {
86
+ return false;
87
+ }
88
+
89
+ return true;
90
+ }
91
+
92
+ toObject() {
93
+ return {
94
+ type: this.type,
95
+ subtype: this.subtype,
96
+ list: this.data.map((v) => v.toObject()),
97
+ };
98
+ }
99
+
100
+ toSnbt() {
101
+ return this.data.map((v) => v.toSnbt()).join(',');
102
+ }
103
+ }
@@ -0,0 +1,40 @@
1
+ import debug from 'debug';
2
+ import { BinaryData } from '../lib/binary-data';
3
+ import { NbtBase } from './nbt-base';
4
+ import { NbtTagType } from './nbt-tag-type';
5
+
6
+ const debugLogFromBinaryData = debug('nbt:long-array:from-binary-data');
7
+
8
+ export class NbtLongArray extends NbtBase<bigint[]> {
9
+ static fromBinaryData(bd: BinaryData, name?: string): NbtLongArray {
10
+ name ??= NbtLongArray.readName(bd);
11
+ const data: bigint[] = [];
12
+ const length = bd.getInt();
13
+ debugLogFromBinaryData(`LONG_ARRAY, name ${name}, length ${length}`);
14
+
15
+ for (let i = 0; i < length; i++) {
16
+ // This needs to be able to be converted back to a bit stream in
17
+ // BitData. See BitData.fromLongArrayTag().
18
+ data.push(bd.getInt64LE());
19
+ }
20
+
21
+ debugLogFromBinaryData(`LONG_ARRAY, name ${name}, data ${data}`);
22
+
23
+ return new NbtLongArray(data, name);
24
+ }
25
+
26
+ constructor(data: bigint[], name?: string) {
27
+ super(NbtTagType.LONG_ARRAY, data, name);
28
+ }
29
+
30
+ toObject() {
31
+ return {
32
+ type: this.type,
33
+ longArray: this.data.map((v) => v.toString()),
34
+ };
35
+ }
36
+
37
+ toSnbt() {
38
+ return `[L;${this.data.map((v) => v.toString()).join(', ')}]`;
39
+ }
40
+ }
@@ -0,0 +1,31 @@
1
+ import debug from 'debug';
2
+ import { BinaryData } from '../lib/binary-data';
3
+ import { NbtBase } from './nbt-base';
4
+ import { NbtTagType } from './nbt-tag-type';
5
+
6
+ const debugLogFromBinaryData = debug('nbt:long:from-binary-data');
7
+
8
+ export class NbtLong extends NbtBase<bigint> {
9
+ static fromBinaryData(bd: BinaryData, name?: string): NbtLong {
10
+ name ??= NbtLong.readName(bd);
11
+ const data = bd.getInt64LE();
12
+ debugLogFromBinaryData(`LONG, name ${name}, data ${data}`);
13
+
14
+ return new NbtLong(data, name);
15
+ }
16
+
17
+ constructor(data: bigint, name?: string) {
18
+ super(NbtTagType.LONG, data, name);
19
+ }
20
+
21
+ toObject() {
22
+ return {
23
+ type: this.type,
24
+ long: this.data.toString(),
25
+ };
26
+ }
27
+
28
+ toSnbt() {
29
+ return `${this.data}l`;
30
+ }
31
+ }
@@ -0,0 +1,31 @@
1
+ import debug from 'debug';
2
+ import { BinaryData } from '../lib/binary-data';
3
+ import { NbtBase } from './nbt-base';
4
+ import { NbtTagType } from './nbt-tag-type';
5
+
6
+ const debugLogFromBinaryData = debug('nbt:short:from-binary-data');
7
+
8
+ export class NbtShort extends NbtBase<number> {
9
+ static fromBinaryData(bd: BinaryData, name?: string): NbtShort {
10
+ name ??= NbtShort.readName(bd);
11
+ const data = bd.getShort();
12
+ debugLogFromBinaryData(`SHORT, name ${name}, data ${data}`);
13
+
14
+ return new NbtShort(data, name);
15
+ }
16
+
17
+ constructor(data: number, name?: string) {
18
+ super(NbtTagType.SHORT, data, name);
19
+ }
20
+
21
+ toObject() {
22
+ return {
23
+ type: this.type,
24
+ short: this.data,
25
+ };
26
+ }
27
+
28
+ toSnbt() {
29
+ return `${this.data}s`;
30
+ }
31
+ }
@@ -0,0 +1,35 @@
1
+ import debug from 'debug';
2
+ import { BinaryData } from '../lib/binary-data';
3
+ import { NbtBase } from './nbt-base';
4
+ import { NbtTagType } from './nbt-tag-type';
5
+
6
+ const debugLogFromBinaryData = debug('nbt:string:from-binary-data');
7
+
8
+ export class NbtString extends NbtBase<string> {
9
+ static fromBinaryData(bd: BinaryData, name?: string): NbtString {
10
+ name ??= NbtString.readName(bd);
11
+ const length = bd.getUShort();
12
+ const data = bd.getString(length);
13
+ debugLogFromBinaryData(
14
+ `STRING, name ${name}, length ${length}, data ${data}`
15
+ );
16
+
17
+ return new NbtString(data, name);
18
+ }
19
+
20
+ constructor(data: string, name?: string) {
21
+ super(NbtTagType.STRING, data, name);
22
+ }
23
+
24
+ toObject() {
25
+ return {
26
+ type: this.type,
27
+ string: this.data,
28
+ };
29
+ }
30
+
31
+ toSnbt() {
32
+ // This always works but doesn't always produce the shortest string
33
+ return JSON.stringify(this.data);
34
+ }
35
+ }
@@ -0,0 +1,15 @@
1
+ export enum NbtTagType {
2
+ END = 0,
3
+ BYTE = 1,
4
+ SHORT = 2,
5
+ INT = 3,
6
+ LONG = 4,
7
+ FLOAT = 5,
8
+ DOUBLE = 6,
9
+ BYTE_ARRAY = 7,
10
+ STRING = 8,
11
+ LIST = 9,
12
+ COMPOUND = 10,
13
+ INT_ARRAY = 11,
14
+ LONG_ARRAY = 12,
15
+ }
package/src/nbt/nbt.ts ADDED
@@ -0,0 +1,70 @@
1
+ import { BinaryData } from '../lib/binary-data';
2
+ import { NbtBase } from '../nbt/nbt-base';
3
+ import { NbtByte } from '../nbt/nbt-byte';
4
+ import { NbtByteArray } from '../nbt/nbt-byte-array';
5
+ import { NbtCompound } from '../nbt/nbt-compound';
6
+ import { NbtDouble } from '../nbt/nbt-double';
7
+ import { NbtEnd } from '../nbt/nbt-end';
8
+ import { NbtFloat } from '../nbt/nbt-float';
9
+ import { NbtInt } from '../nbt/nbt-int';
10
+ import { NbtIntArray } from '../nbt/nbt-int-array';
11
+ import { NbtList } from '../nbt/nbt-list';
12
+ import { NbtLong } from '../nbt/nbt-long';
13
+ import { NbtLongArray } from '../nbt/nbt-long-array';
14
+ import { NbtShort } from '../nbt/nbt-short';
15
+ import { NbtString } from '../nbt/nbt-string';
16
+ import { NbtTagType } from '../nbt/nbt-tag-type';
17
+ import { snbtParse } from './snbt-parse';
18
+ import { snbtToNbt } from './snbt-to-nbt';
19
+
20
+ export const fromBinaryData: {
21
+ [key: number]: (bd: BinaryData, name?: string) => NbtBase<any>;
22
+ } = {
23
+ [NbtTagType.BYTE_ARRAY]: NbtByteArray.fromBinaryData,
24
+ [NbtTagType.BYTE]: NbtByte.fromBinaryData,
25
+ [NbtTagType.COMPOUND]: NbtCompound.fromBinaryData,
26
+ [NbtTagType.DOUBLE]: NbtDouble.fromBinaryData,
27
+ [NbtTagType.END]: NbtEnd.fromBinaryData,
28
+ [NbtTagType.FLOAT]: NbtFloat.fromBinaryData,
29
+ [NbtTagType.INT_ARRAY]: NbtIntArray.fromBinaryData,
30
+ [NbtTagType.INT]: NbtInt.fromBinaryData,
31
+ [NbtTagType.LIST]: NbtList.fromBinaryData,
32
+ [NbtTagType.LONG_ARRAY]: NbtLongArray.fromBinaryData,
33
+ [NbtTagType.LONG]: NbtLong.fromBinaryData,
34
+ [NbtTagType.SHORT]: NbtShort.fromBinaryData,
35
+ [NbtTagType.STRING]: NbtString.fromBinaryData,
36
+ };
37
+
38
+ export class Nbt {
39
+ static fromBuffer(data: ArrayBufferLike): NbtBase<any> {
40
+ const bd = new BinaryData(data);
41
+ bd.seek(0);
42
+
43
+ return Nbt.getTag(bd);
44
+ }
45
+
46
+ static fromSnbt(snbt: string): NbtBase<any> {
47
+ const snbtData = snbtParse(snbt);
48
+ const token = snbtToNbt(snbtData);
49
+
50
+ if (snbtData.remainingLength()) {
51
+ const nextToken = snbtData.token();
52
+ throw new Error(
53
+ `Extra, unparsed SNBT tokens leftover starting with ${nextToken.type}, "${nextToken.content}" at position ${snbtData.currentPosition()}`
54
+ );
55
+ }
56
+
57
+ return token;
58
+ }
59
+
60
+ static getTag(bd: BinaryData): NbtBase<any> {
61
+ const type = bd.getByte();
62
+ const reader = fromBinaryData[type];
63
+
64
+ if (!reader) {
65
+ throw new Error(`Invalid NBT tag ID ${type}`);
66
+ }
67
+
68
+ return reader(bd);
69
+ }
70
+ }
@@ -0,0 +1,70 @@
1
+ export type SnbtTokenType =
2
+ | 'BYTE'
3
+ | 'BYTE_ARRAY_START'
4
+ | 'COLON'
5
+ | 'COMMA'
6
+ | 'COMPOUND_END'
7
+ | 'COMPOUND_START'
8
+ | 'DOUBLE'
9
+ | 'FLOAT'
10
+ | 'INT'
11
+ | 'INT_ARRAY_START'
12
+ | 'LIST_END'
13
+ | 'LIST_START'
14
+ | 'LONG'
15
+ | 'LONG_ARRAY_START'
16
+ | 'SHORT'
17
+ | 'STRING'
18
+ | 'WHITESPACE'; // For logging, but not made into tokens
19
+
20
+ export interface SnbtToken {
21
+ content: string;
22
+ offset: number;
23
+ type: SnbtTokenType;
24
+ }
25
+
26
+ export class SnbtData {
27
+ position = 0;
28
+ data: SnbtToken[] = [];
29
+
30
+ addToken(offset: number, type: SnbtTokenType, content: string) {
31
+ this.data.push({ type, content, offset });
32
+ }
33
+
34
+ currentPosition() {
35
+ return this.position;
36
+ }
37
+
38
+ remainingLength() {
39
+ return this.data.length - this.position;
40
+ }
41
+
42
+ seek(offset: number) {
43
+ this.position = offset;
44
+ }
45
+
46
+ showToken(token?: SnbtToken) {
47
+ if (!token) {
48
+ return 'undefined';
49
+ }
50
+
51
+ return `${token.type} at ${token.offset}: "${token.content}"`;
52
+ }
53
+
54
+ step(offset: number) {
55
+ this.position += offset;
56
+ }
57
+
58
+ token() {
59
+ if (this.position >= this.data.length) {
60
+ throw new Error(
61
+ `Ran out of tokens at position ${this.position} - previous token was ${this.showToken(this.data[this.position - 1])}`
62
+ );
63
+ }
64
+
65
+ const token = this.data[this.position];
66
+ this.position += 1;
67
+
68
+ return token;
69
+ }
70
+ }