mdx-m3-viewer
Version:
A browser WebGL model viewer. Mainly focused on models of the games Warcraft 3 and Starcraft 2.
108 lines (107 loc) • 3.52 kB
TypeScript
import MpqBlockTable from './blocktable';
import MpqCrypto from './crypto';
import MpqFile from './file';
import MpqHashTable from './hashtable';
/**
* MoPaQ archive (MPQ) version 0.
*/
export default class MpqArchive {
headerOffset: number;
sectorSize: number;
c: MpqCrypto;
hashTable: MpqHashTable;
blockTable: MpqBlockTable;
files: MpqFile[];
readonly: boolean;
constructor();
/**
* Load an existing archive.
*
* Note that this clears the archive from whatever it had in it before.
*/
load(buffer: ArrayBuffer | Uint8Array, readonly?: boolean): void;
/**
* Save this archive.
*
* Returns null when...
*
* 1) The archive is in readonly mode.
* 2) The offset of a file encrypted with FILE_OFFSET_ADJUSTED_KEY changed, and the file name is unknown.
*/
save(): Uint8Array | null;
/**
* Some MPQs have empty memory chunks in them, left over from files that were deleted.
* This function searches for such chunks, and removes them.
*
* Note that it is called automatically by save().
*
* Does nothing if the archive is in readonly mode.
*/
saveMemory(): number;
removeBlock(blockIndex: number): void;
/**
* Gets a list of the file names in the archive.
*
* Note that files loaded from an existing archive, without resolved names, will be named FileXXXXXXXX.
*/
getFileNames(): string[];
/**
* Count the files with unresolved names.
*/
countUnresolved(): number;
/**
* Given an iterable of file names, attempt to resolve the archive files with them.
*/
applyListfile(listfile: Iterable<string>): void;
/**
* Adds a file to this archive.
* If the file already exists, its buffer will be set.
*
* Does nothing if the archive is in readonly mode.
*/
set(name: string, buffer: ArrayBuffer | Uint8Array | string): boolean;
/**
* Gets a file from this archive.
* If the file doesn't exist, null is returned.
*/
get(name: string): MpqFile | null;
/**
* Checks if a file exists.
*
* Prefer to use get() if you are going to use get() afterwards anyway.
*/
has(name: string): boolean;
/**
* Deletes a file from this archive.
*
* Does nothing if...
*
* 1) The archive is in readonly mode.
* 2) The file does not exist.
*/
delete(name: string): boolean;
/**
* Renames a file.
*
* Does nothing if...
*
* 1) The archive is in readonly mode.
* 2) The file does not exist.
*
* Note that this sets the current file's hash's status to being deleted, rather than removing it.
* This is due to the way the search algorithm works.
*/
rename(name: string, newName: string): boolean;
/**
* Resizes the hashtable to the nearest power of two equal to or bigger than the given size.
*
* Generally speaking, the bigger the hashtable is, the quicker insertions/searches are, at the cost of added memory.
*
* Does nothing if...
*
* 1) The archive is in readonly mode.
* 2) The calculated size is smaller than the amount of files in the archive.
* 3) Not all of the file names in the archive are resolved.
*/
resizeHashtable(size: number): boolean;
}