first working stuff

This commit is contained in:
LabyStudio
2022-02-02 14:46:53 +01:00
parent f1b6779221
commit 1fc627b501
4 changed files with 62 additions and 64 deletions
@@ -103,13 +103,20 @@ window.WorldRenderer = class {
renderChunks(cameraChunkX, cameraChunkZ) {
let world = this.minecraft.world;
for (let [index, chunk] of world.chunks) {
let renderDistance = WorldRenderer.RENDER_DISTANCE;
for (let x = -renderDistance; x <= renderDistance; x++) {
for (let z = -renderDistance; z <= renderDistance; z++) {
world.getChunkAt(cameraChunkX + x, cameraChunkZ + z);
}
}
for (let [index, chunk] of world.chunks) {
let distanceX = Math.abs(cameraChunkX - chunk.x);
let distanceZ = Math.abs(cameraChunkZ - chunk.z);
// Is in render distance check
if (distanceX < WorldRenderer.RENDER_DISTANCE && distanceZ < WorldRenderer.RENDER_DISTANCE) {
if (distanceX < renderDistance && distanceZ < renderDistance) {
// Make chunk visible
chunk.group.visible = true;
@@ -152,20 +159,6 @@ window.WorldRenderer = class {
if (this.chunkSectionUpdateQueue.length !== 0) {
let chunkSection = this.chunkSectionUpdateQueue.shift();
if (chunkSection != null) {
// Load chunk
let chunk = chunkSection.chunk;
if (!chunk.isLoaded()) {
world.loadChunk(chunk);
// Rebuild neighbor chunks to update transparent blocks
for (let relX = -1; relX <= 1; relX++) {
for (let relZ = -1; relZ <= 1; relZ++) {
let neighborChunk = world.getChunkAt(chunk.x + relX, chunk.z + relZ);
neighborChunk.queueForRebuild();
}
}
}
// Rebuild chunk
chunkSection.rebuild(this);
}
+5 -6
View File
@@ -21,10 +21,9 @@ window.Chunk = class {
// Create height map
this.heightMap = [];
this.initHeightMapAndLight();
}
initHeightMapAndLight() {
generateSkylightMap() {
let highest = World.TOTAL_HEIGHT;
for (let x = 0; x < 16; x++) {
for (let z = 0; z < 16; z++) {
@@ -160,6 +159,10 @@ window.Chunk = class {
this.getSection(y >> 4).setBlockAt(x, y & 15, z, byte0);
if (!this.loaded) {
return;
}
//if (k1 !== 0 && !this.worldObj.multiplayerWorld) {
//Block.blocksList[k1].onBlockRemoval(this.world, l1, j, i2);
//}
@@ -222,10 +225,6 @@ window.Chunk = class {
}
}
load() {
this.loaded = true;
}
isLoaded() {
return this.loaded;
}
+46 -42
View File
@@ -20,20 +20,34 @@ window.World = class {
}
loadChunk(chunk) {
// Load chunk
chunk.load();
getChunkAt(x, z) {
let index = x + (z << 16);
let chunk = this.chunks.get(index);
if (typeof chunk === 'undefined') {
let chunk = new Chunk(this, x, z);
// Generate new chunk
this.generator.generateChunk(chunk);
// Generate new chunk
this.generator.generateChunk(chunk);
// Populate chunk
this.generator.populateChunk(chunk.x, chunk.z);
// Init
chunk.generateSkylightMap();
// Register
chunk.loaded = true;
this.chunks.set(index, chunk);
this.group.add(chunk.group);
// Populate chunk
this.generator.populateChunk(chunk.x, chunk.z);
}
return chunk;
}
getChunkAtBlock(x, y, z) {
let chunk = this.getChunkAt(x >> 4, z >> 4);
return y < 0 || y > World.TOTAL_HEIGHT ? null : chunk.getSection(y >> 4);
if (!this.blockExists(x, y, z)) {
return null;
}
return this.getChunkAt(x >> 4, z >> 4).getSection(y >> 4);
}
getCollisionBoxes(region) {
@@ -58,6 +72,21 @@ window.World = class {
return boundingBoxList;
}
updateLights() {
// Update lights in queue
let i = 5000;
while (this.lightUpdateQueue.length > 0) {
if (i <= 0) {
return true;
}
this.lightUpdateQueue.shift().updateBlockLightning(this);
i--;
}
return false;
}
static prev = 0;
updateLight(sourceType, x1, y1, z1, x2, y2, z2, notifyNeighbor = true) {
if (this.lightUpdates >= 50) {
return;
@@ -83,8 +112,13 @@ window.World = class {
return;
}
}
}
if (World.prev !== this.lightUpdateQueue.length && this.lightUpdateQueue.length % 100 === 0) {
World.prev = this.lightUpdateQueue.length;
console.log(this.lightUpdateQueue.length + " in queue");
}
this.lightUpdateQueue.push(new MetadataChunkBlock(sourceType, x1, y1, z1, x2, y2, z2));
if (this.lightUpdateQueue.length > 0x186a0) {
this.lightUpdateQueue = [];
@@ -124,26 +158,6 @@ window.World = class {
}
}
updateLights() {
if (this.lightUpdateProcesses >= 50) {
return false;
}
this.lightUpdateProcesses++;
// Update lights in queue
let i = 5000;
while (this.lightUpdateQueue.length > 0) {
if (i <= 0) {
return true;
}
this.lightUpdateQueue.shift().updateBlockLightning(this);
i--;
}
this.lightUpdateProcesses--;
return false;
}
getHeightAt(x, z) {
if (!this.chunkExists(x >> 4, z >> 4)) {
return 0;
@@ -167,7 +181,7 @@ window.World = class {
}
getSavedLightValue(sourceType, x, y, z) {
if (y < 0) {
if (!this.chunkExists(x >> 4, z >> 4)) {
return 15;
}
@@ -176,7 +190,7 @@ window.World = class {
}
setLightAt(sourceType, x, y, z, lightLevel) {
if (y < 0) {
if (!this.chunkExists(x >> 4, z >> 4)) {
return;
}
@@ -215,16 +229,6 @@ window.World = class {
return this.getChunkAt(chunkX, chunkZ).getSection(layerY);
}
getChunkAt(x, z) {
let index = x + (z << 16);
let chunk = this.chunks.get(index);
if (typeof chunk === 'undefined') {
this.chunks.set(index, chunk = new Chunk(this, x, z));
this.group.add(chunk.group);
}
return chunk;
}
onBlockChanged(x, y, z) {
this.queueForRebuildInRegion(x - 1, y - 1, z - 1, x + 1, y + 1, z + 1);
}
@@ -23,6 +23,8 @@ window.Block = class {
// Register block
Block.blocks.set(id, this);
Block.lightOpacity[id] = this.isSolid() ? 255 : 0;
Block.lightOpacity[0] = 0;
}
getId() {