diff --git a/src/main/java/net/minecraft/server/management/ServerConfigurationManager.java b/src/main/java/net/minecraft/server/management/ServerConfigurationManager.java index 7548fc1..758c89f 100644 --- a/src/main/java/net/minecraft/server/management/ServerConfigurationManager.java +++ b/src/main/java/net/minecraft/server/management/ServerConfigurationManager.java @@ -61,12 +61,14 @@ import net.minecraft.world.WorldProvider; import net.minecraft.world.WorldServer; import net.minecraft.world.WorldSettings; +import net.minecraft.world.chunk.Chunk; import net.minecraft.world.demo.DemoWorldManager; import net.minecraft.world.storage.IPlayerFileData; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.ultramine.server.ConfigurationHandler; +import org.ultramine.server.chunk.IChunkLoadCallback; public abstract class ServerConfigurationManager { @@ -261,10 +263,10 @@ } else { - worldserver.theChunkProviderServer.loadAsync(cx, cz, new Runnable() + worldserver.theChunkProviderServer.loadAsync(cx, cz, new IChunkLoadCallback() { @Override - public void run() + public void onChunkLoaded(Chunk chunk) { worldserver.spawnEntityInWorld(par1EntityPlayerMP); func_72375_a(par1EntityPlayerMP, (WorldServer)null); diff --git a/src/main/java/net/minecraft/world/gen/ChunkProviderServer.java b/src/main/java/net/minecraft/world/gen/ChunkProviderServer.java index a911cad..59510f1 100644 --- a/src/main/java/net/minecraft/world/gen/ChunkProviderServer.java +++ b/src/main/java/net/minecraft/world/gen/ChunkProviderServer.java @@ -39,6 +39,7 @@ import org.ultramine.server.chunk.ChunkHash; import org.ultramine.server.chunk.ChunkIOExecutor; import org.ultramine.server.chunk.ChunkMap; +import org.ultramine.server.chunk.IChunkLoadCallback; public class ChunkProviderServer implements IChunkProvider { @@ -367,11 +368,12 @@ /* ======================================== ULTRAMINE START =====================================*/ - public void loadAsync(int x, int z, Runnable callback) //XXX + public void loadAsync(int x, int z, IChunkLoadCallback callback) //XXX { - if(loadedChunkHashMap.contains(x, z)) + Chunk chunk = loadedChunkHashMap.get(x, z); + if(chunk != null) { - callback.run(); + callback.onChunkLoaded(chunk); return; } else diff --git a/src/main/java/org/ultramine/server/chunk/ChunkIOExecutor.java b/src/main/java/org/ultramine/server/chunk/ChunkIOExecutor.java index 4fc71af..bef04a1 100644 --- a/src/main/java/org/ultramine/server/chunk/ChunkIOExecutor.java +++ b/src/main/java/org/ultramine/server/chunk/ChunkIOExecutor.java @@ -10,20 +10,20 @@ static final int BASE_THREADS = 1; static final int PLAYERS_PER_THREAD = 50; - private static final AsynchronousExecutor instance = new AsynchronousExecutor( - new ChunkIOProvider(), BASE_THREADS); + private static final AsynchronousExecutor instance = + new AsynchronousExecutor(new ChunkIOProvider(), BASE_THREADS); // public static void waitForChunkLoad(World world, int x, int z) { // instance.get(new QueuedChunk(ChunkHash.chunkToKey(x, z), null, world, // null)); // } - public static void queueChunkLoad(World world, AnvilChunkLoader loader, ChunkProviderServer provider, int x, int z, Runnable runnable) + public static void queueChunkLoad(World world, AnvilChunkLoader loader, ChunkProviderServer provider, int x, int z, IChunkLoadCallback runnable) { instance.add(new QueuedChunk(ChunkHash.chunkToKey(x, z), loader, world, provider), runnable); } - public static void dropQueuedChunkLoad(net.minecraft.world.World world, int x, int z, Runnable runnable) + public static void dropQueuedChunkLoad(net.minecraft.world.World world, int x, int z, IChunkLoadCallback runnable) { instance.drop(new QueuedChunk(ChunkHash.chunkToKey(x, z), null, world, null), runnable); } diff --git a/src/main/java/org/ultramine/server/chunk/ChunkIOProvider.java b/src/main/java/org/ultramine/server/chunk/ChunkIOProvider.java index 407b4f4..53d431f 100644 --- a/src/main/java/org/ultramine/server/chunk/ChunkIOProvider.java +++ b/src/main/java/org/ultramine/server/chunk/ChunkIOProvider.java @@ -7,7 +7,7 @@ import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.world.ChunkDataEvent; -class ChunkIOProvider implements AsynchronousExecutor.CallBackProvider +class ChunkIOProvider implements AsynchronousExecutor.CallBackProvider { private final AtomicInteger threadNumber = new AtomicInteger(1); @@ -69,9 +69,9 @@ chunk.func_150804_b(false); } - public void callStage3(QueuedChunk queuedChunk, Chunk chunk, Runnable runnable) throws RuntimeException + public void callStage3(QueuedChunk queuedChunk, Chunk chunk, IChunkLoadCallback runnable) throws RuntimeException { - runnable.run(); + runnable.onChunkLoaded(chunk); } public Thread newThread(Runnable runnable) diff --git a/src/main/java/org/ultramine/server/chunk/ChunkSendManager.java b/src/main/java/org/ultramine/server/chunk/ChunkSendManager.java index 2c674fa..1cf40ad 100644 --- a/src/main/java/org/ultramine/server/chunk/ChunkSendManager.java +++ b/src/main/java/org/ultramine/server/chunk/ChunkSendManager.java @@ -207,7 +207,7 @@ sendingQueueSize.incrementAndGet(); int ncx = ChunkHash.keyToX(key); int ncz = ChunkHash.keyToZ(key); - manager.getWorldServer().theChunkProviderServer.loadAsync(ncx, ncz, new ChunkLoadCallback(ncx, ncz)); + manager.getWorldServer().theChunkProviderServer.loadAsync(ncx, ncz, chunkLoadCallback); } } @@ -287,23 +287,14 @@ - private class ChunkLoadCallback implements Runnable + private IChunkLoadCallback chunkLoadCallback = new IChunkLoadCallback() { - private final int x; - private final int z; - - public ChunkLoadCallback(int x, int z) - { - this.x = x; - this.z = z; - } - @Override - public void run() + public void onChunkLoaded(Chunk chunk) { - executor.execute(new CompressAndSendChunkTask(player.worldObj.getChunkFromChunkCoords(x, z))); + executor.execute(new CompressAndSendChunkTask(chunk)); } - } + }; private class CompressAndSendChunkTask implements Runnable { diff --git a/src/main/java/org/ultramine/server/chunk/IChunkLoadCallback.java b/src/main/java/org/ultramine/server/chunk/IChunkLoadCallback.java new file mode 100644 index 0000000..a4ca323 --- /dev/null +++ b/src/main/java/org/ultramine/server/chunk/IChunkLoadCallback.java @@ -0,0 +1,8 @@ +package org.ultramine.server.chunk; + +import net.minecraft.world.chunk.Chunk; + +public interface IChunkLoadCallback +{ + public void onChunkLoaded(Chunk chunk); +}