Fix loading not actually working because of bogus instanceof checks
This commit is contained in:
parent
dd257acfe2
commit
47f6d5cc37
3 changed files with 31 additions and 7 deletions
|
@ -13,6 +13,7 @@ export class Reader {
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NOTE: This had to be a copy as the subarray is only cropped & offset
|
||||||
public readUint8Array(bytes:number) {
|
public readUint8Array(bytes:number) {
|
||||||
const croppedBuffer = this.readBuffer(bytes);
|
const croppedBuffer = this.readBuffer(bytes);
|
||||||
const newArray = new Uint8Array(croppedBuffer.length);
|
const newArray = new Uint8Array(croppedBuffer.length);
|
||||||
|
|
|
@ -20,20 +20,20 @@ export class Chunk {
|
||||||
return (x >= 0 ? 0 : 2147483648) | (x & 0x7fff) << 16 | (z >= 0 ? 0 : 0x8000) | z & 0x7fff;
|
return (x >= 0 ? 0 : 2147483648) | (x & 0x7fff) << 16 | (z >= 0 ? 0 : 0x8000) | z & 0x7fff;
|
||||||
}
|
}
|
||||||
|
|
||||||
public constructor(world:World, x:number, z:number, generateOrBlockData?:boolean|ArrayBuffer, metadata?:ArrayBuffer) {
|
public constructor(world:World, x:number, z:number, generateOrBlockData?:boolean|Uint8Array, metadata?:Uint8Array) {
|
||||||
this.world = world;
|
this.world = world;
|
||||||
this.x = x;
|
this.x = x;
|
||||||
this.z = z;
|
this.z = z;
|
||||||
this.playersInChunk = new FunkyArray<number, Player>();
|
this.playersInChunk = new FunkyArray<number, Player>();
|
||||||
|
|
||||||
if (generateOrBlockData instanceof ArrayBuffer && metadata instanceof ArrayBuffer) {
|
if (generateOrBlockData instanceof Uint8Array && metadata instanceof Uint8Array) {
|
||||||
this.blocks = new Uint8Array(generateOrBlockData);
|
this.blocks = new Uint8Array(generateOrBlockData);
|
||||||
this.metadata = new NibbleArray(metadata);
|
this.metadata = new NibbleArray(metadata);
|
||||||
} else {
|
} else {
|
||||||
this.blocks = new Uint8Array(16 * 16 * this.MAX_HEIGHT);
|
this.blocks = new Uint8Array(16 * 16 * this.MAX_HEIGHT);
|
||||||
this.metadata = new NibbleArray(16 * 16 * this.MAX_HEIGHT);
|
this.metadata = new NibbleArray(16 * 16 * this.MAX_HEIGHT);
|
||||||
|
|
||||||
if (generateOrBlockData) {
|
if (typeof(generateOrBlockData) === "boolean" && generateOrBlockData) {
|
||||||
this.world.generator.generate(this);
|
this.world.generator.generate(this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -43,7 +43,7 @@ export class Chunk {
|
||||||
if (x < 0 || x > 15 || y < 0 || y > 127 || z < 0 || z > 15) {
|
if (x < 0 || x > 15 || y < 0 || y > 127 || z < 0 || z > 15) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.blocks[x << 11 | z << 7 | y] = blockId;
|
this.blocks[x << 11 | z << 7 | y] = blockId;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -96,7 +96,14 @@ export class World {
|
||||||
const chunkX = x >> 4,
|
const chunkX = x >> 4,
|
||||||
chunkZ = z >> 4;
|
chunkZ = z >> 4;
|
||||||
|
|
||||||
return this.getChunk(chunkX, chunkZ).getBlockId(x - chunkX << 4, y, z - chunkZ << 4);
|
return this.getChunk(chunkX, chunkZ).getBlockId(x & 0xf, y, z & 0xf);
|
||||||
|
}
|
||||||
|
|
||||||
|
public getBlockMetadata(x:number, y:number, z:number) {
|
||||||
|
const chunkX = x >> 4,
|
||||||
|
chunkZ = z >> 4;
|
||||||
|
|
||||||
|
return this.getChunk(chunkX, chunkZ).getBlockMetadata(x & 0xf, y, z & 0xf);
|
||||||
}
|
}
|
||||||
|
|
||||||
public setBlock(blockId:number, x:number, y:number, z:number, doBlockUpdate?:boolean) {
|
public setBlock(blockId:number, x:number, y:number, z:number, doBlockUpdate?:boolean) {
|
||||||
|
@ -104,10 +111,26 @@ export class World {
|
||||||
chunkZ = z >> 4;
|
chunkZ = z >> 4;
|
||||||
|
|
||||||
const chunk = this.getChunk(chunkX, chunkZ);
|
const chunk = this.getChunk(chunkX, chunkZ);
|
||||||
chunk.setBlock(blockId, x - chunkX << 4, y, z - chunkZ << 4);
|
chunk.setBlockWithMetadata(blockId, 0, x & 0xf, y, z & 0xf);
|
||||||
|
|
||||||
const blockUpdatePacket = new PacketBlockChange(x, y, z, blockId, 0).writeData(); // TODO: Handle metadata
|
|
||||||
if (doBlockUpdate) {
|
if (doBlockUpdate) {
|
||||||
|
const blockUpdatePacket = new PacketBlockChange(x, y, z, blockId, 0).writeData();
|
||||||
|
// Send block update to all players that have this chunk loaded
|
||||||
|
chunk.playersInChunk.forEach(player => {
|
||||||
|
player.mpClient?.send(blockUpdatePacket);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public setBlockWithMetadata(blockId:number, metadata:number, x:number, y:number, z:number, doBlockUpdate?:boolean) {
|
||||||
|
const chunkX = x >> 4,
|
||||||
|
chunkZ = z >> 4;
|
||||||
|
|
||||||
|
const chunk = this.getChunk(chunkX, chunkZ);
|
||||||
|
chunk.setBlockWithMetadata(blockId, metadata, x & 0xf, y, z & 0xf);
|
||||||
|
|
||||||
|
if (doBlockUpdate) {
|
||||||
|
const blockUpdatePacket = new PacketBlockChange(x, y, z, blockId, metadata).writeData(); // TODO: Handle metadata
|
||||||
// Send block update to all players that have this chunk loaded
|
// Send block update to all players that have this chunk loaded
|
||||||
chunk.playersInChunk.forEach(player => {
|
chunk.playersInChunk.forEach(player => {
|
||||||
player.mpClient?.send(blockUpdatePacket);
|
player.mpClient?.send(blockUpdatePacket);
|
||||||
|
|
Loading…
Reference in a new issue