diff --git a/src/main/java/net/minecraft/world/WorldServer.java b/src/main/java/net/minecraft/world/WorldServer.java index f591798..c9207fe 100644 --- a/src/main/java/net/minecraft/world/WorldServer.java +++ b/src/main/java/net/minecraft/world/WorldServer.java @@ -1018,7 +1018,7 @@ return theChunkProviderServer.getChunkIfExists(cx, cz); } - private void updatePendingOf(Chunk chunk) + public void updatePendingOf(Chunk chunk) { long time = worldInfo.getWorldTotalTime(); int x = chunk.xPosition << 4; diff --git a/src/main/java/net/minecraft/world/gen/ChunkProviderServer.java b/src/main/java/net/minecraft/world/gen/ChunkProviderServer.java index ecccb8a..c253e4c 100644 --- a/src/main/java/net/minecraft/world/gen/ChunkProviderServer.java +++ b/src/main/java/net/minecraft/world/gen/ChunkProviderServer.java @@ -50,6 +50,7 @@ import org.ultramine.server.chunk.ChunkHash; import org.ultramine.server.chunk.ChunkMap; import org.ultramine.server.chunk.IChunkLoadCallback; +import org.ultramine.server.internal.UMHooks; import org.ultramine.server.util.VanillaChunkHashMap; import org.ultramine.server.util.VanillaChunkHashSet; @@ -322,6 +323,7 @@ if(!worldObj.getConfig().generation.disableModGeneration) GameRegistry.generateWorld(par2, par3, worldObj, currentChunkProvider, par1IChunkProvider); chunk.setChunkModified(); + UMHooks.onChunkPopulated(chunk); isGenerating = lastIsGenerating; } } diff --git a/src/main/java/org/ultramine/server/internal/UMHooks.java b/src/main/java/org/ultramine/server/internal/UMHooks.java index 91a4a9e..37fa4b7 100644 --- a/src/main/java/org/ultramine/server/internal/UMHooks.java +++ b/src/main/java/org/ultramine/server/internal/UMHooks.java @@ -1,10 +1,14 @@ package org.ultramine.server.internal; +import java.util.ArrayList; +import java.util.List; import java.util.UUID; import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.common.registry.LanguageRegistry; import net.minecraft.entity.Entity; +import net.minecraft.entity.item.EntityFallingBlock; +import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.nbt.NBTTagCompound; @@ -13,6 +17,8 @@ import net.minecraft.util.ChatComponentTranslation; import net.minecraft.util.IChatComponent; +import net.minecraft.world.WorldServer; +import net.minecraft.world.chunk.Chunk; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.ultramine.permission.internal.SyncServerExecutorImpl; @@ -170,4 +176,38 @@ return ((SyncServerExecutorImpl) GlobalExecutors.nextTick()).processOneTask() || toWait > CHUNK_GEN_THRESHOLD && ChunkGenerationQueue.instance().generateOneChunk(); } + + public static void onChunkPopulated(Chunk chunk) + { + WorldServer world = (WorldServer) chunk.worldObj; + long realTime = world.getWorldInfo().getWorldTotalTime(); + long time = realTime; + List entities = new ArrayList<>(); + for(int i = 0; i < 10; i++) + { + while(chunk.getPendingUpdatesCount() != 0 && (time - realTime) < 10) + { + world.updatePendingOf(chunk); + world.getWorldInfo().incrementTotalWorldTime(++time); + } + world.getWorldInfo().incrementTotalWorldTime(realTime); + entities.clear(); + for(List list : chunk.entityLists) + entities.addAll(list); + for(Entity ent : entities) + { + if(ent.isDead) + continue; + if(ent instanceof EntityFallingBlock) + { + for(int j = 0; j < 100 && !ent.isDead; j++) + ent.onUpdate(); + } + else if(ent instanceof EntityItem) + { + ent.setDead(); + } + } + } + } }