mdx-m3-viewer
Version:
A browser WebGL model viewer. Mainly focused on models of the games Warcraft 3 and Starcraft 2.
250 lines (209 loc) • 6.65 kB
JavaScript
import DroppedItemSet from './droppeditemset';
import InventoryItem from './inventoryitem';
import ModifiedAbility from './modifiedability';
import RandomUnit from './randomunit';
/**
* A unit.
*/
export default class Unit {
/**
*
*/
constructor() {
/** @member {string} */
this.id = '\0\0\0\0';
/** @member {number} */
this.variation = 0;
/** @member {Float32Array} */
this.location = new Float32Array(3);
/** @member {number} */
this.angle = 0;
/** @member {Float32Array} */
this.scale = new Float32Array([1, 1, 1]);
/** @member {number} */
this.flags = 0;
/** @member {number} */
this.player = 0;
/** @member {number} */
this.unknown = 0;
/** @member {number} */
this.hitpoints = -1;
/** @member {number} */
this.mana = -1;
/** @member {number} */
this.droppedItemTable = 0; // VERSION 8
/** @member {Array<DroppedItemSet>} */
this.droppedItemSets = [];
/** @member {number} */
this.goldAmount = 0;
/** @member {number} */
this.targetAcquisition = 0;
/** @member {number} */
this.heroLevel = 0;
/** @member {number} */
this.heroStrength = 0; // VERSION 8
/** @member {number} */
this.heroAgility = 0; // VERSION 8
/** @member {number} */
this.heroIntelligence = 0; // VERSION 8
/** @member {Array<InventoryItem>} */
this.itemsInInventory = [];
/** @member {Array<ModifiedAbility>} */
this.modifiedAbilities = [];
/** @member {number} */
this.randomFlag = 0;
/** @member {Uint8Array} */
this.level = new Uint8Array(3);
/** @member {number} */
this.itemClass = 0;
/** @member {number} */
this.unitGroup = 0;
/** @member {number} */
this.positionInGroup = 0;
/** @member {Array<RandomUnit>} */
this.randomUnitTables = [];
/** @member {number} */
this.customTeamColor = 0;
/** @member {number} */
this.waygate = 0;
/** @member {number} */
this.creationNumber = 0;
}
/**
* @param {BinaryStream} stream
* @param {number} version
*/
load(stream, version) {
this.id = stream.read(4);
this.variation = stream.readInt32();
this.location = stream.readFloat32Array(3);
this.angle = stream.readFloat32();
this.scale = stream.readFloat32Array(3);
this.flags = stream.readUint8();
this.player = stream.readInt32();
this.unknown = stream.readUint16();
this.hitpoints = stream.readInt32();
this.mana = stream.readInt32();
if (version > 7) {
this.droppedItemTable = stream.readInt32();
}
for (let i = 0, l = stream.readInt32(); i < l; i++) {
let set = new DroppedItemSet();
set.load(stream);
this.droppedItemSets[i] = set;
}
this.goldAmount = stream.readInt32();
this.targetAcquisition = stream.readFloat32();
this.heroLevel = stream.readInt32();
if (version > 7) {
this.heroStrength = stream.readInt32();
this.heroAgility = stream.readInt32();
this.heroIntelligence = stream.readInt32();
}
for (let i = 0, l = stream.readInt32(); i < l; i++) {
let item = new InventoryItem();
item.load(stream);
this.itemsInInventory[i] = item;
}
for (let i = 0, l = stream.readInt32(); i < l; i++) {
let modifiedAbility = new ModifiedAbility();
modifiedAbility.load(stream);
this.modifiedAbilities[i] = modifiedAbility;
}
this.randomFlag = stream.readInt32();
if (this.randomFlag === 0) {
this.level = stream.readUint8Array(3); // 24bit number
this.itemClass = stream.readUint8();
} else if (this.randomFlag === 1) {
this.unitGroup = stream.readUint32();
this.positionInGroup = stream.readUint32();
} else if (this.randomFlag === 2) {
for (let i = 0, l = stream.readInt32(); i < l; i++) {
let randomUnit = new RandomUnit();
randomUnit.load(stream);
this.randomUnitTables[i] = randomUnit;
}
}
this.customTeamColor = stream.readInt32();
this.waygate = stream.readInt32();
this.creationNumber = stream.readInt32();
}
/**
* @param {BinaryStream} stream
* @param {number} version
*/
save(stream, version) {
stream.write(this.id);
stream.writeInt32(this.variation);
stream.writeFloat32Array(this.location);
stream.writeFloat32(this.angle);
stream.writeFloat32Array(this.scale);
stream.writeUint8(this.flags);
stream.writeInt32(this.player);
stream.writeUint16(this.unknown);
stream.writeInt32(this.hitpoints);
stream.writeInt32(this.mana);
if (version > 7) {
stream.writeInt32(this.droppedItemTable);
}
stream.writeInt32(this.droppedItemSets.length);
for (let droppedItemSet of this.droppedItemSets) {
droppedItemSet.save(stream);
}
stream.writeInt32(this.goldAmount);
stream.writeFloat32(this.targetAcquisition);
stream.writeInt32(this.heroLevel);
if (version > 7) {
stream.writeInt32(this.heroStrength);
stream.writeInt32(this.heroAgility);
stream.writeInt32(this.heroIntelligence);
}
stream.writeInt32(this.itemsInInventory.length);
for (let itemInInventory of this.itemsInInventory) {
itemInInventory.save(stream);
}
stream.writeInt32(this.modifiedAbilities.length);
for (let modifiedAbility of this.modifiedAbilities) {
modifiedAbility.save(stream);
}
stream.writeInt32(this.randomFlag);
if (this.randomFlag === 0) {
stream.writeUint8Array(this.level);
stream.writeUint8(this.itemClass);
} else if (this.randomFlag === 1) {
stream.writeUint32(this.unitGroup);
stream.writeUint32(this.positionInGroup);
} else if (this.randomFlag === 2) {
stream.writeInt32(this.randomUnitTables.length);
for (let randomUnitTable of this.randomUnitTables) {
randomUnitTable.save(stream);
}
}
stream.writeInt32(this.customTeamColor);
stream.writeInt32(this.waygate);
stream.writeInt32(this.creationNumber);
}
/**
* @param {number} version
* @return {number}
*/
getByteLength(version) {
let size = 91;
if (version > 7) {
size += 16;
}
for (let droppedItemSet of this.droppedItemSets) {
size += droppedItemSet.getByteLength();
}
size += this.itemsInInventory.length * 8;
size += this.modifiedAbilities.length * 12;
if (this.randomFlag === 0) {
size += 4;
} else if (this.randomFlag === 1) {
size += 8;
} else if (this.randomFlag === 2) {
size += 4 + this.randomUnitTables.length * 8;
}
return size;
}
}