diff --git a/src/main/java/net/minecraft/village/Village.java b/src/main/java/net/minecraft/village/Village.java index b5b9e0c..913a909 100644 --- a/src/main/java/net/minecraft/village/Village.java +++ b/src/main/java/net/minecraft/village/Village.java @@ -111,7 +111,7 @@ { for (int k2 = l1; k2 < l1 + p_75563_6_; ++k2) { - if (this.worldObj.getBlock(i2, j2, k2).isNormalCube()) + if (this.worldObj.getBlockIfExists(i2, j2, k2).isNormalCube()) { return false; } @@ -386,7 +386,7 @@ private boolean isBlockDoor(int p_75574_1_, int p_75574_2_, int p_75574_3_) { - return this.worldObj.getBlock(p_75574_1_, p_75574_2_, p_75574_3_) == Blocks.wooden_door; + return this.worldObj.getBlockIfExists(p_75574_1_, p_75574_2_, p_75574_3_) == Blocks.wooden_door; } private void updateVillageRadiusAndCenter() diff --git a/src/main/java/net/minecraft/world/gen/ChunkProviderServer.java b/src/main/java/net/minecraft/world/gen/ChunkProviderServer.java index f57589e..f68ca1b 100644 --- a/src/main/java/net/minecraft/world/gen/ChunkProviderServer.java +++ b/src/main/java/net/minecraft/world/gen/ChunkProviderServer.java @@ -188,7 +188,6 @@ this.loadedChunkHashMap.put(par1, par2, chunk); chunk.onChunkLoad(); chunk.populateChunk(this, this, par1, par2); - chunk.func_150804_b(false); } return chunk; diff --git a/src/main/java/org/ultramine/server/chunk/ChunkSendManager.java b/src/main/java/org/ultramine/server/chunk/ChunkSendManager.java index 6e5d638..299fb5a 100644 --- a/src/main/java/org/ultramine/server/chunk/ChunkSendManager.java +++ b/src/main/java/org/ultramine/server/chunk/ChunkSendManager.java @@ -27,6 +27,7 @@ import net.minecraft.util.MathHelper; import net.minecraft.world.WorldServer; import net.minecraft.world.chunk.Chunk; +import net.minecraft.world.gen.ChunkProviderServer; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.world.ChunkWatchEvent; @@ -219,7 +220,7 @@ { int key = ChunkHash.chunkToKey(chunk.xPosition, chunk.zPosition); - if(sending.contains(key)) + if(sending.contains(key) && ((WorldServer)chunk.worldObj).getPlayerManager() == manager) { manager.getOrCreateChunkWatcher(chunk.xPosition, chunk.zPosition, true).addPlayer(player); @@ -245,7 +246,7 @@ { player.playerNetServerHandler.sendPacket(S21PacketChunkData.makeForUnload(chunk)); - PlayerManager.PlayerInstance pi = manager.getOrCreateChunkWatcher(chunk.xPosition, chunk.zPosition, false); + PlayerManager.PlayerInstance pi = ((WorldServer)chunk.worldObj).getPlayerManager().getOrCreateChunkWatcher(chunk.xPosition, chunk.zPosition, false); if (pi == null) ((WorldServer)chunk.worldObj).theChunkProviderServer.unbindChunk(chunk); } @@ -253,7 +254,7 @@ for(Chunk chunk; (chunk = toUnload.poll()) != null;) { - PlayerManager.PlayerInstance pi = manager.getOrCreateChunkWatcher(chunk.xPosition, chunk.zPosition, false); + PlayerManager.PlayerInstance pi = ((WorldServer)chunk.worldObj).getPlayerManager().getOrCreateChunkWatcher(chunk.xPosition, chunk.zPosition, false); if (pi == null) ((WorldServer)chunk.worldObj).theChunkProviderServer.unbindChunk(chunk); } @@ -354,16 +355,26 @@ return rate; } - - - private IChunkLoadCallback chunkLoadCallback = new IChunkLoadCallback() { @Override public void onChunkLoaded(Chunk chunk) { - chunk.setBindState(ChunkBindState.PLAYER); - executor.execute(new CompressAndSendChunkTask(chunk)); + if(chunk.isTerrainPopulated) + { + chunk.func_150804_b(true); + chunk.setBindState(ChunkBindState.PLAYER); + executor.execute(new CompressAndSendChunkTask(chunk)); + } + else + { + sendingQueueSize.decrementAndGet(); + ((WorldServer)chunk.worldObj).theChunkProviderServer.loadAsyncRadius(chunk.xPosition, chunk.zPosition, 1, IChunkLoadCallback.EMPTY); + + int key = ChunkHash.chunkToKey(chunk.xPosition, chunk.zPosition); + toSend.insert(Math.min((int)rate*2+1, toSend.size()-1), key); + sending.remove(key); + } } };