@etothepii/satisfactory-file-parser 0.0.31 → 0.0.33

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 (50) hide show
  1. package/LICENCE.md +20 -20
  2. package/README.md +112 -112
  3. package/build/index.d.ts +5 -1
  4. package/build/index.js +7 -7
  5. package/build/parser/byte/binary-operable.interface.d.ts +6 -0
  6. package/build/parser/byte/binary-operable.interface.js +12 -0
  7. package/build/parser/byte/binary-readable.interface.d.ts +22 -0
  8. package/build/parser/byte/binary-readable.interface.js +12 -0
  9. package/build/parser/byte/byte-reader.class.d.ts +11 -9
  10. package/build/parser/byte/byte-reader.class.js +23 -15
  11. package/build/parser/error/parser.error.d.ts +6 -0
  12. package/build/parser/error/parser.error.js +13 -1
  13. package/build/parser/satisfactory/blueprint/blueprint-reader.d.ts +3 -2
  14. package/build/parser/satisfactory/blueprint/blueprint-writer.js +1 -1
  15. package/build/parser/satisfactory/objects/DataFields.d.ts +34 -6
  16. package/build/parser/satisfactory/objects/DataFields.js +86 -3
  17. package/build/parser/satisfactory/objects/ObjectReference.d.ts +2 -2
  18. package/build/parser/satisfactory/objects/Property.d.ts +72 -72
  19. package/build/parser/satisfactory/objects/Property.js +24 -23
  20. package/build/parser/satisfactory/objects/SaveComponent.d.ts +8 -5
  21. package/build/parser/satisfactory/objects/SaveComponent.js +2 -2
  22. package/build/parser/satisfactory/objects/SaveEntity.d.ts +9 -4
  23. package/build/parser/satisfactory/objects/SaveEntity.js +2 -2
  24. package/build/parser/satisfactory/objects/SaveObject.d.ts +9 -4
  25. package/build/parser/satisfactory/objects/SaveObject.js +3 -3
  26. package/build/parser/satisfactory/save/asynchronous-level.class.d.ts +9 -0
  27. package/build/parser/satisfactory/save/asynchronous-level.class.js +76 -0
  28. package/build/parser/satisfactory/save/level.class.d.ts +5 -5
  29. package/build/parser/satisfactory/save/level.class.js +6 -6
  30. package/build/parser/satisfactory/save/save-reader.d.ts +4 -13
  31. package/build/parser/satisfactory/save/save-reader.js +17 -72
  32. package/build/parser/satisfactory/structs/util.types.d.ts +7 -7
  33. package/build/parser/satisfactory/structs/util.types.js +10 -10
  34. package/build/parser/stream/byte-stream-reader.class.d.ts +57 -0
  35. package/build/parser/stream/byte-stream-reader.class.js +251 -0
  36. package/build/parser/stream/json-stream-state-writer.d.ts +12 -0
  37. package/build/parser/stream/json-stream-state-writer.js +28 -0
  38. package/build/parser/stream/json-stream-writable.d.ts +20 -0
  39. package/build/parser/stream/json-stream-writable.js +93 -0
  40. package/build/parser/stream/json-stream-writer.d.ts +22 -0
  41. package/build/parser/stream/json-stream-writer.js +137 -0
  42. package/build/parser/stream/save-stream-json-stringifier.d.ts +6 -0
  43. package/build/parser/stream/save-stream-json-stringifier.js +43 -0
  44. package/build/parser/stream/save-stream-reader.class.d.ts +15 -0
  45. package/build/parser/stream/save-stream-reader.class.js +131 -0
  46. package/build/parser/stream/save-stream-writer.class.d.ts +22 -0
  47. package/build/parser/stream/save-stream-writer.class.js +115 -0
  48. package/build/parser/stream/stream-level.class.d.ts +12 -0
  49. package/build/parser/stream/stream-level.class.js +113 -0
  50. package/package.json +3 -1
@@ -1,14 +1,19 @@
1
- import { ByteReader } from "../../byte/byte-reader.class";
1
+ import { BinaryReadable } from "../../byte/binary-readable.interface";
2
2
  import { ByteWriter } from "../../byte/byte-writer.class";
3
3
  import { DataFields } from "./DataFields";
4
- export declare abstract class SaveObject {
4
+ export interface SaveObjectHeader {
5
+ typePath: string;
6
+ rootObject: string;
7
+ instanceName: string;
8
+ }
9
+ export declare abstract class SaveObject implements SaveObjectHeader {
5
10
  typePath: string;
6
11
  rootObject: string;
7
12
  instanceName: string;
8
13
  dataFields: DataFields;
9
14
  constructor(typePath: string, rootObject: string, instanceName: string);
10
- protected static ParseHeader(reader: ByteReader, obj: SaveObject): void;
15
+ protected static ParseHeader(reader: BinaryReadable, obj: SaveObject): void;
11
16
  protected static SerializeHeader(writer: ByteWriter, obj: SaveObject): void;
12
- static ParseData(obj: SaveObject, length: number, reader: ByteReader, buildVersion: number): void;
17
+ static ParseData(obj: SaveObject, length: number, reader: BinaryReadable, buildVersion: number, typePath: string): void;
13
18
  static SerializeData(writer: any, obj: SaveObject, buildVersion: number): void;
14
19
  }
@@ -28,11 +28,11 @@
28
28
  writer.writeString(obj.rootObject);
29
29
  writer.writeString(obj.instanceName);
30
30
  }
31
- static ParseData(obj, length, reader, buildVersion) {
32
- obj.dataFields = DataFields_1.DataFields.Parse(length, reader, buildVersion);
31
+ static ParseData(obj, length, reader, buildVersion, typePath) {
32
+ obj.dataFields = DataFields_1.DataFields.Parse(length, reader, buildVersion, typePath);
33
33
  }
34
34
  static SerializeData(writer, obj, buildVersion) {
35
- DataFields_1.DataFields.Serialize(writer, obj.dataFields, buildVersion);
35
+ DataFields_1.DataFields.Serialize(writer, obj.dataFields, buildVersion, obj.typePath);
36
36
  }
37
37
  }
38
38
  exports.SaveObject = SaveObject;
@@ -0,0 +1,9 @@
1
+ import { ByteReader } from "../../byte/byte-reader.class";
2
+ import { SaveStreamWriter } from "../../stream/save-stream-writer.class";
3
+ import { SaveObject } from "../objects/SaveObject";
4
+ import { Level } from "./level.class";
5
+ import { SaveReader } from "./save-reader";
6
+ export declare class AsynchronousLevel {
7
+ static StreamReadObjectContents(reader: ByteReader, objectsList: SaveObject[], buildVersion: number, writer: SaveStreamWriter, onProgressCallback: (progress: number, msg?: string) => void): Promise<void>;
8
+ static StreamReadLevel(reader: SaveReader, levelName: string, buildVersion: number, writer: SaveStreamWriter): Promise<Level>;
9
+ }
@@ -0,0 +1,76 @@
1
+ (function (factory) {
2
+ if (typeof module === "object" && typeof module.exports === "object") {
3
+ var v = factory(require, exports);
4
+ if (v !== undefined) module.exports = v;
5
+ }
6
+ else if (typeof define === "function" && define.amd) {
7
+ define(["require", "exports", "../objects/SaveComponent", "../objects/SaveEntity", "./level.class"], factory);
8
+ }
9
+ })(function (require, exports) {
10
+ "use strict";
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.AsynchronousLevel = void 0;
13
+ const SaveComponent_1 = require("../objects/SaveComponent");
14
+ const SaveEntity_1 = require("../objects/SaveEntity");
15
+ const level_class_1 = require("./level.class");
16
+ class AsynchronousLevel {
17
+ static async StreamReadObjectContents(reader, objectsList, buildVersion, writer, onProgressCallback) {
18
+ const binarySize = reader.readInt32();
19
+ const posBefore = reader.getBufferPosition();
20
+ await reader.allocate(binarySize);
21
+ const countEntities = reader.readInt32();
22
+ if (countEntities !== objectsList.length) {
23
+ throw new Error(`possibly corrupt. entity content count ${countEntities} does not equal object count of ${objectsList.length}`);
24
+ }
25
+ let dynamicObjectBatch = [];
26
+ for (let i = 0; i < countEntities; i++) {
27
+ if (i % 1000 === 0) {
28
+ console.log(`having some objects, writing ${i + 1}/${countEntities}.`);
29
+ onProgressCallback(reader.getBufferProgress());
30
+ await writer.writeObjects(...dynamicObjectBatch);
31
+ dynamicObjectBatch = [];
32
+ }
33
+ const len = reader.readInt32();
34
+ const before = reader.getBufferPosition();
35
+ if (len < reader.getAmountAllocatedLeft()) {
36
+ await reader.allocate(Math.max(before - binarySize, 300 * 1000 * 1000));
37
+ }
38
+ const obj = objectsList[i];
39
+ if ((0, SaveEntity_1.isSaveEntity)(obj)) {
40
+ SaveEntity_1.SaveEntity.ParseData(obj, len, reader, buildVersion, obj.typePath);
41
+ }
42
+ else if ((0, SaveComponent_1.isSaveComponent)(obj)) {
43
+ SaveComponent_1.SaveComponent.ParseData(obj, len, reader, buildVersion, obj.typePath);
44
+ }
45
+ dynamicObjectBatch.push(obj);
46
+ const after = reader.getBufferPosition();
47
+ if (after - before !== len) {
48
+ console.warn('entity may be corrupt', this.name, i);
49
+ }
50
+ }
51
+ await writer.writeObjects(...dynamicObjectBatch);
52
+ const posAfter = reader.getBufferPosition();
53
+ if (posAfter - posBefore !== binarySize) {
54
+ console.warn('save seems corrupt.', this.name);
55
+ }
56
+ }
57
+ static async StreamReadLevel(reader, levelName, buildVersion, writer) {
58
+ const level = new level_class_1.Level(levelName);
59
+ const binaryLength = reader.readInt32();
60
+ await reader.allocate(binaryLength);
61
+ await writer.openLevel(levelName);
62
+ level_class_1.Level.ReadObjectHeaders(reader, level.objects, reader.onProgressCallback);
63
+ reader.onProgressCallback(reader.getBufferProgress());
64
+ level.collectables = level_class_1.Level.ReadCollectablesList(reader);
65
+ console.log(`before object contents buffer pos ${reader.getBufferPosition()}`);
66
+ await AsynchronousLevel.StreamReadObjectContents(reader, level.objects, buildVersion, writer, reader.onProgressCallback);
67
+ await writer.switchInLevelToCollectables();
68
+ await writer.writeCollectables(...level.collectables);
69
+ reader.onProgressCallback(reader.getBufferProgress());
70
+ level_class_1.Level.ReadCollectablesList(reader);
71
+ await writer.endLevel();
72
+ return level;
73
+ }
74
+ }
75
+ exports.AsynchronousLevel = AsynchronousLevel;
76
+ });
@@ -1,4 +1,4 @@
1
- import { ByteReader } from "../../byte/byte-reader.class";
1
+ import { BinaryReadable } from "../../byte/binary-readable.interface";
2
2
  import { ByteWriter } from "../../byte/byte-writer.class";
3
3
  import { ObjectReference } from "../objects/ObjectReference";
4
4
  import { SaveComponent } from "../objects/SaveComponent";
@@ -12,10 +12,10 @@ export declare class Level {
12
12
  constructor(name: string);
13
13
  static SerializeObjectHeaders(writer: ByteWriter, objects: (SaveEntity | SaveComponent)[]): void;
14
14
  static WriteLevel(writer: ByteWriter, level: Level, buildVersion: number): void;
15
- static SerializeObjectContents(writer: ByteWriter, objects: (SaveEntity | SaveComponent)[], buildVersion: number): void;
16
- static ReadObjectHeaders(reader: ByteReader, objectsList: SaveObject[], onProgressCallback: (progress: number, msg?: string) => void): void;
17
- static ReadObjectContents(reader: ByteReader, objectsList: SaveObject[], buildVersion: number, onProgressCallback: (progress: number, msg?: string) => void): void;
15
+ static SerializeObjectContents(writer: ByteWriter, objects: (SaveEntity | SaveComponent)[], buildVersion: number, levelName: string): void;
16
+ static ReadObjectHeaders(reader: BinaryReadable, objectsList: SaveObject[], onProgressCallback: (progress: number, msg?: string) => void): void;
17
+ static ReadObjectContents(reader: BinaryReadable, objectsList: SaveObject[], buildVersion: number, onProgressCallback: (progress: number, msg?: string) => void): Promise<void>;
18
18
  static ReadLevel(reader: SaveReader, levelName: string, buildVersion: number): Level;
19
19
  static SerializeCollectablesList(writer: ByteWriter, collectables: ObjectReference[]): void;
20
- static ReadCollectablesList(reader: SaveReader): ObjectReference[];
20
+ static ReadCollectablesList(reader: BinaryReadable): ObjectReference[];
21
21
  }
@@ -43,10 +43,10 @@
43
43
  Level.SerializeObjectHeaders(writer, level.objects);
44
44
  Level.SerializeCollectablesList(writer, level.collectables);
45
45
  writer.writeBinarySizeFromPosition(lenIndicatorHeaderAndCollectableSize, lenIndicatorHeaderAndCollectableSize + 4);
46
- Level.SerializeObjectContents(writer, level.objects, buildVersion);
46
+ Level.SerializeObjectContents(writer, level.objects, buildVersion, level.name);
47
47
  Level.SerializeCollectablesList(writer, level.collectables);
48
48
  }
49
- static SerializeObjectContents(writer, objects, buildVersion) {
49
+ static SerializeObjectContents(writer, objects, buildVersion, levelName) {
50
50
  const lenIndicatorEntities = writer.getBufferPosition();
51
51
  writer.writeInt32(0);
52
52
  writer.writeInt32(objects.length);
@@ -87,12 +87,12 @@
87
87
  }
88
88
  }
89
89
  }
90
- static ReadObjectContents(reader, objectsList, buildVersion, onProgressCallback) {
90
+ static async ReadObjectContents(reader, objectsList, buildVersion, onProgressCallback) {
91
91
  const binarySize = reader.readInt32();
92
92
  const posBefore = reader.getBufferPosition();
93
93
  const countEntities = reader.readInt32();
94
94
  if (countEntities !== objectsList.length) {
95
- throw new Error(`possibly corrupt. entity content count ${countEntities} does not object count of ${objectsList.length}`);
95
+ throw new Error(`possibly corrupt. entity content count ${countEntities} does not equal object count of ${objectsList.length}`);
96
96
  }
97
97
  for (let i = 0; i < countEntities; i++) {
98
98
  if (i % 1000 === 0) {
@@ -102,10 +102,10 @@
102
102
  const before = reader.getBufferPosition();
103
103
  const obj = objectsList[i];
104
104
  if ((0, SaveEntity_1.isSaveEntity)(obj)) {
105
- SaveEntity_1.SaveEntity.ParseData(obj, len, reader, buildVersion);
105
+ SaveEntity_1.SaveEntity.ParseData(obj, len, reader, buildVersion, obj.typePath);
106
106
  }
107
107
  else if ((0, SaveComponent_1.isSaveComponent)(obj)) {
108
- SaveComponent_1.SaveComponent.ParseData(obj, len, reader, buildVersion);
108
+ SaveComponent_1.SaveComponent.ParseData(obj, len, reader, buildVersion, obj.typePath);
109
109
  }
110
110
  const after = reader.getBufferPosition();
111
111
  if (after - before !== len) {
@@ -1,9 +1,9 @@
1
1
  import { ByteReader } from "../../byte/byte-reader.class";
2
2
  import { ChunkCompressionInfo } from "../../file.types";
3
+ import { SaveStreamWriter } from "../../stream/save-stream-writer.class";
3
4
  import { ObjectReference } from "../objects/ObjectReference";
4
5
  import { SaveComponent } from "../objects/SaveComponent";
5
6
  import { SaveEntity } from "../objects/SaveEntity";
6
- import { SaveObject } from "../objects/SaveObject";
7
7
  import { Level } from "./level.class";
8
8
  import { SatisfactorySaveHeader } from "./save.types";
9
9
  export type EntityPathFilter = {
@@ -15,6 +15,8 @@ export type SaveProjectionConfig = {
15
15
  includeComponents: boolean;
16
16
  };
17
17
  export declare const projectionFilterApplies: (config: SaveProjectionConfig, object: SaveComponent | SaveEntity) => boolean;
18
+ export type ReadMode = 'stream' | 'whole';
19
+ export declare const DEFAULT_SATISFACTORY_CHUNK_HEADER_SIZE = 48;
18
20
  export declare class SaveReader extends ByteReader {
19
21
  onProgressCallback: (progress: number, msg?: string) => void;
20
22
  header: SatisfactorySaveHeader | undefined;
@@ -29,16 +31,5 @@ export declare class SaveReader extends ByteReader {
29
31
  numChunks: number;
30
32
  };
31
33
  readLevels(): Level[];
32
- }
33
- export declare class Conveyor {
34
- static getConveyorBeltRegex(): RegExp;
35
- static getConveyorLiftRegex(): RegExp;
36
- static isAConveyorBelt(obj: SaveObject): boolean;
37
- static isAConveyorLift(obj: SaveObject): boolean;
38
- static get availableConnections(): string[];
39
- static get availableConveyorBelts(): string[];
40
- static get availableConveyorLifts(): string[];
41
- static isConveyor(currentObject: any): boolean;
42
- static isConveyorBelt(currentObject: any): boolean;
43
- static isConveyorLift(currentObject: any): boolean;
34
+ readLevelsAsynchronously(writer: SaveStreamWriter): Promise<Level[]>;
44
35
  }
@@ -7,18 +7,19 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
7
7
  if (v !== undefined) module.exports = v;
8
8
  }
9
9
  else if (typeof define === "function" && define.amd) {
10
- define(["require", "exports", "pako", "../../byte/alignment.enum", "../../byte/byte-reader.class", "../../error/parser.error", "../objects/SaveComponent", "../objects/SaveEntity", "./level.class"], factory);
10
+ define(["require", "exports", "pako", "../../byte/alignment.enum", "../../byte/byte-reader.class", "../../error/parser.error", "../objects/SaveComponent", "../objects/SaveEntity", "./asynchronous-level.class", "./level.class"], factory);
11
11
  }
12
12
  })(function (require, exports) {
13
13
  "use strict";
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
- exports.Conveyor = exports.SaveReader = exports.projectionFilterApplies = void 0;
15
+ exports.SaveReader = exports.DEFAULT_SATISFACTORY_CHUNK_HEADER_SIZE = exports.projectionFilterApplies = void 0;
16
16
  const pako_1 = __importDefault(require("pako"));
17
17
  const alignment_enum_1 = require("../../byte/alignment.enum");
18
18
  const byte_reader_class_1 = require("../../byte/byte-reader.class");
19
19
  const parser_error_1 = require("../../error/parser.error");
20
20
  const SaveComponent_1 = require("../objects/SaveComponent");
21
21
  const SaveEntity_1 = require("../objects/SaveEntity");
22
+ const asynchronous_level_class_1 = require("./asynchronous-level.class");
22
23
  const level_class_1 = require("./level.class");
23
24
  const projectionFilterApplies = (config, object) => {
24
25
  let cond1 = false;
@@ -38,6 +39,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
38
39
  return cond1 && cond2;
39
40
  };
40
41
  exports.projectionFilterApplies = projectionFilterApplies;
42
+ exports.DEFAULT_SATISFACTORY_CHUNK_HEADER_SIZE = 48;
41
43
  class SaveReader extends byte_reader_class_1.ByteReader {
42
44
  constructor(fileBuffer, onProgressCallback = () => { }) {
43
45
  super(fileBuffer, alignment_enum_1.Alignment.LITTLE_ENDIAN);
@@ -47,7 +49,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
47
49
  this.compressionInfo = {
48
50
  packageFileTag: 0,
49
51
  maxChunkContentSize: 0,
50
- chunkHeaderSize: 48
52
+ chunkHeaderSize: exports.DEFAULT_SATISFACTORY_CHUNK_HEADER_SIZE
51
53
  };
52
54
  }
53
55
  readHeader() {
@@ -168,76 +170,19 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
168
170
  }
169
171
  return this.levels;
170
172
  }
171
- }
172
- SaveReader.EPOCH_TICKS = 621355968000000000n;
173
- exports.SaveReader = SaveReader;
174
- class Conveyor {
175
- static getConveyorBeltRegex() {
176
- return /\/Game\/FactoryGame\/Buildable\/Factory\/(ConveyorBeltMk[0-9]+)\/Build_(\1)\.Build_(\1)_C/g;
177
- }
178
- ;
179
- static getConveyorLiftRegex() {
180
- return /\/Game\/FactoryGame\/Buildable\/Factory\/(ConveyorLiftMk[0-9]+)\/Build_(\1)\.Build_(\1)_C/g;
181
- }
182
- ;
183
- static isAConveyorBelt(obj) {
184
- return obj.typePath.match(this.getConveyorBeltRegex()) !== null;
185
- }
186
- static isAConveyorLift(obj) {
187
- return obj.typePath.match(this.getConveyorLiftRegex()) !== null;
188
- }
189
- static get availableConnections() { return ['.ConveyorAny0', '.ConveyorAny1', '.Input0', '.Input1', '.Input2', '.Input3', '.InPut3', '.Input4', '.Input5', '.Input6', '.Output0', '.Output1', '.Output2', '.Output3']; }
190
- static get availableConveyorBelts() {
191
- return [
192
- '/Game/FactoryGame/Buildable/Factory/ConveyorBeltMk1/Build_ConveyorBeltMk1.Build_ConveyorBeltMk1_C',
193
- '/Game/FactoryGame/Buildable/Factory/ConveyorBeltMk2/Build_ConveyorBeltMk2.Build_ConveyorBeltMk2_C',
194
- '/Game/FactoryGame/Buildable/Factory/ConveyorBeltMk3/Build_ConveyorBeltMk3.Build_ConveyorBeltMk3_C',
195
- '/Game/FactoryGame/Buildable/Factory/ConveyorBeltMk4/Build_ConveyorBeltMk4.Build_ConveyorBeltMk4_C',
196
- '/Game/FactoryGame/Buildable/Factory/ConveyorBeltMk5/Build_ConveyorBeltMk5.Build_ConveyorBeltMk5_C'
197
- ];
198
- }
199
- static get availableConveyorLifts() {
200
- return [
201
- '/Game/FactoryGame/Buildable/Factory/ConveyorLiftMk1/Build_ConveyorLiftMk1.Build_ConveyorLiftMk1_C',
202
- '/Game/FactoryGame/Buildable/Factory/ConveyorLiftMk2/Build_ConveyorLiftMk2.Build_ConveyorLiftMk2_C',
203
- '/Game/FactoryGame/Buildable/Factory/ConveyorLiftMk3/Build_ConveyorLiftMk3.Build_ConveyorLiftMk3_C',
204
- '/Game/FactoryGame/Buildable/Factory/ConveyorLiftMk4/Build_ConveyorLiftMk4.Build_ConveyorLiftMk4_C',
205
- '/Game/FactoryGame/Buildable/Factory/ConveyorLiftMk5/Build_ConveyorLiftMk5.Build_ConveyorLiftMk5_C'
206
- ];
207
- }
208
- static isConveyor(currentObject) {
209
- return Conveyor.isConveyorBelt(currentObject) || Conveyor.isConveyorLift(currentObject);
210
- }
211
- static isConveyorBelt(currentObject) {
212
- if (Conveyor.availableConveyorBelts.includes(currentObject.className)) {
213
- return true;
214
- }
215
- if (currentObject.className.startsWith('/Conveyors_Mod/Build_BeltMk')
216
- || currentObject.className.startsWith('/Game/Conveyors_Mod/Build_BeltMk')
217
- || currentObject.className.startsWith('/UltraFastLogistics/Buildable/build_conveyorbeltMK')
218
- || currentObject.className.startsWith('/FlexSplines/Conveyor/Build_Belt')
219
- || currentObject.className.startsWith('/conveyorbeltmod/Belt/mk')
220
- || currentObject.className.startsWith('/minerplus/content/buildable/Factory/belt_')
221
- || currentObject.className.startsWith('/bamfp/content/buildable/Factory/belt_')) {
222
- return true;
223
- }
224
- return false;
225
- }
226
- static isConveyorLift(currentObject) {
227
- if (Conveyor.availableConveyorLifts.includes(currentObject.className)) {
228
- return true;
229
- }
230
- if (currentObject.className.startsWith('/minerplus/content/buildable/Factory/lift')
231
- || currentObject.className.startsWith('/bamfp/content/buildable/Factory/lift')
232
- || currentObject.className.startsWith('/Game/Conveyors_Mod/Build_LiftMk')
233
- || currentObject.className.startsWith('/Conveyors_Mod/Build_LiftMk')
234
- || currentObject.className.startsWith('/Game/CoveredConveyor')
235
- || currentObject.className.startsWith('/CoveredConveyor')
236
- || currentObject.className.startsWith('/conveyorbeltmod/lift/')) {
237
- return true;
173
+ async readLevelsAsynchronously(writer) {
174
+ const numSubLevels = this.readInt32();
175
+ this.levels = new Array(numSubLevels + 1);
176
+ await writer.openLevels();
177
+ for (let j = 0; j <= numSubLevels; j++) {
178
+ let levelName = (j === numSubLevels) ? '' + this.header.mapName : this.readString();
179
+ this.onProgressCallback(this.getBufferProgress(), `reading level [${(j + 1)}/${(numSubLevels + 1)}] ${levelName}`);
180
+ this.levels[j] = await asynchronous_level_class_1.AsynchronousLevel.StreamReadLevel(this, levelName, this.header.buildVersion, writer);
238
181
  }
239
- return false;
182
+ await writer.endLevels();
183
+ return this.levels;
240
184
  }
241
185
  }
242
- exports.Conveyor = Conveyor;
186
+ SaveReader.EPOCH_TICKS = 621355968000000000n;
187
+ exports.SaveReader = SaveReader;
243
188
  });
@@ -1,4 +1,4 @@
1
- import { ByteReader } from "../../byte/byte-reader.class";
1
+ import { BinaryReadable } from "../../byte/binary-readable.interface";
2
2
  import { ByteWriter } from "../../byte/byte-writer.class";
3
3
  export type col4 = {
4
4
  r: number;
@@ -7,13 +7,13 @@ export type col4 = {
7
7
  a: number;
8
8
  };
9
9
  export declare const SerializeCol4RGBA: (writer: ByteWriter, value: col4) => void;
10
- export declare const ParseCol4RGBA: (reader: ByteReader) => col4;
10
+ export declare const ParseCol4RGBA: (reader: BinaryReadable) => col4;
11
11
  export declare const SerializeCol4BGRA: (writer: ByteWriter, value: col4) => void;
12
- export declare const ParseCol4BGRA: (reader: ByteReader) => col4;
12
+ export declare const ParseCol4BGRA: (reader: BinaryReadable) => col4;
13
13
  export type vec4 = vec3 & {
14
14
  w: number;
15
15
  };
16
- export declare const ParseVec4: (reader: ByteReader) => vec4;
16
+ export declare const ParseVec4: (reader: BinaryReadable) => vec4;
17
17
  export declare const SerializeVec4: (writer: ByteWriter, vec: vec4) => void;
18
18
  export declare const sub: (other: vec3, vec: vec3) => vec3;
19
19
  export declare const add: (vec: vec3, other: vec3) => vec3;
@@ -23,18 +23,18 @@ export declare const norm: (vec: vec3) => vec3;
23
23
  export type vec3 = vec2 & {
24
24
  z: number;
25
25
  };
26
- export declare const ParseVec3: (reader: ByteReader) => vec3;
26
+ export declare const ParseVec3: (reader: BinaryReadable) => vec3;
27
27
  export declare const SerializeVec3: (writer: ByteWriter, vec: vec3) => void;
28
28
  export type vec2 = {
29
29
  x: number;
30
30
  y: number;
31
31
  };
32
- export declare const ParseVec2: (reader: ByteReader) => vec2;
32
+ export declare const ParseVec2: (reader: BinaryReadable) => vec2;
33
33
  export declare const SerializeVec2: (writer: ByteWriter, vec: vec2) => void;
34
34
  export type Transform = {
35
35
  rotation: vec4;
36
36
  translation: vec3;
37
37
  scale3d: vec3;
38
38
  };
39
- export declare const ParseTransform: (reader: ByteReader) => Transform;
39
+ export declare const ParseTransform: (reader: BinaryReadable) => Transform;
40
40
  export declare const SerializeTransform: (writer: ByteWriter, transform: Transform) => void;
@@ -19,10 +19,10 @@
19
19
  exports.SerializeCol4RGBA = SerializeCol4RGBA;
20
20
  const ParseCol4RGBA = (reader) => {
21
21
  return {
22
- r: reader.readFloat(),
23
- g: reader.readFloat(),
24
- b: reader.readFloat(),
25
- a: reader.readFloat(),
22
+ r: reader.readFloat32(),
23
+ g: reader.readFloat32(),
24
+ b: reader.readFloat32(),
25
+ a: reader.readFloat32(),
26
26
  };
27
27
  };
28
28
  exports.ParseCol4RGBA = ParseCol4RGBA;
@@ -44,8 +44,8 @@
44
44
  exports.ParseCol4BGRA = ParseCol4BGRA;
45
45
  const ParseVec4 = (reader) => {
46
46
  return {
47
- ...(0, exports.ParseVec3)(reader),
48
- w: reader.readFloat()
47
+ ...((0, exports.ParseVec3)(reader)),
48
+ w: reader.readFloat32()
49
49
  };
50
50
  };
51
51
  exports.ParseVec4 = ParseVec4;
@@ -66,8 +66,8 @@
66
66
  exports.norm = norm;
67
67
  const ParseVec3 = (reader) => {
68
68
  return {
69
- ...(0, exports.ParseVec2)(reader),
70
- z: reader.readFloat()
69
+ ...((0, exports.ParseVec2)(reader)),
70
+ z: reader.readFloat32()
71
71
  };
72
72
  };
73
73
  exports.ParseVec3 = ParseVec3;
@@ -78,8 +78,8 @@
78
78
  exports.SerializeVec3 = SerializeVec3;
79
79
  const ParseVec2 = (reader) => {
80
80
  return {
81
- x: reader.readFloat(),
82
- y: reader.readFloat(),
81
+ x: reader.readFloat32(),
82
+ y: reader.readFloat32(),
83
83
  };
84
84
  };
85
85
  exports.ParseVec2 = ParseVec2;
@@ -0,0 +1,57 @@
1
+ /// <reference types="node" />
2
+ import { ReadableStreamDefaultReader } from "stream/web";
3
+ import { Alignment } from "../byte/alignment.enum";
4
+ import { BinaryReadable } from "../byte/binary-readable.interface";
5
+ export interface StreamBinaryReadable extends BinaryReadable {
6
+ pause: () => void;
7
+ resume: () => void;
8
+ hasInput: () => boolean;
9
+ }
10
+ export declare abstract class ByteStreamReader implements StreamBinaryReadable {
11
+ private reader;
12
+ onCloseCallback: () => Promise<void>;
13
+ private timeout;
14
+ maxBufferThreshold: number;
15
+ alignment: Alignment;
16
+ protected operatingStreamBuffer: Uint8Array;
17
+ protected operatingDataView: DataView;
18
+ protected callbackAfterRead: undefined | (() => void);
19
+ protected currentByte: number;
20
+ protected inputStreamIsDone: boolean;
21
+ protected paused: boolean;
22
+ debug: boolean;
23
+ protected closedAlready: boolean;
24
+ protected neededNextAmountOfBytes: number;
25
+ private readLoopHandle;
26
+ private waitingTimeoutHandle;
27
+ protected totalNumberOfBytesRead: number;
28
+ protected trailingBufferSize: number;
29
+ constructor(reader: ReadableStreamDefaultReader<Uint8Array>, onCloseCallback: () => Promise<void>, timeout?: number, maxBufferThreshold?: number, alignment?: Alignment);
30
+ pause(): void;
31
+ resume(): void;
32
+ hasInput(): boolean;
33
+ close(): Promise<void>;
34
+ protected continuousRead: () => Promise<void>;
35
+ allocate(count: number): Promise<void>;
36
+ private waitUntilNumBytesAvailable;
37
+ skipBytes(byteLength?: number): void;
38
+ readByte(): number;
39
+ readBytes(count: number): Uint8Array;
40
+ readHex(hexLength: number): string;
41
+ readInt8(): number;
42
+ readUint8(): number;
43
+ readInt16(): number;
44
+ readUint16(): number;
45
+ readInt32(): number;
46
+ readUint32(): number;
47
+ readLong(): bigint;
48
+ readInt64(): bigint;
49
+ readUint64(): bigint;
50
+ readFloat32(): number;
51
+ readDouble(): number;
52
+ readString(): string;
53
+ getBufferPosition(): number;
54
+ getBufferProgress(): number;
55
+ getBufferLength(): number;
56
+ getAmountAllocatedLeft(): number;
57
+ }