--- ../src_base/common/net/minecraft/src/WorldServer.java +++ ../src_work/common/net/minecraft/src/WorldServer.java @@ -2,6 +2,8 @@ import cpw.mods.fml.common.Side; import cpw.mods.fml.common.asm.SideOnly; + +import java.io.File; import java.util.ArrayList; import java.util.HashSet; import java.util.Iterator; @@ -10,6 +12,11 @@ import java.util.Set; import java.util.TreeSet; import net.minecraft.server.MinecraftServer; +import net.minecraftforge.common.ChestGenHooks; +import static net.minecraftforge.common.ChestGenHooks.*; +import net.minecraftforge.common.DimensionManager; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.event.world.WorldEvent; public class WorldServer extends World { @@ -71,6 +78,7 @@ { this.pendingTickListEntries = new TreeSet(); } + DimensionManager.setWorld(par4, this); } /** @@ -179,10 +187,7 @@ private void resetRainAndThunder() { - this.worldInfo.setRainTime(0); - this.worldInfo.setRaining(false); - this.worldInfo.setThunderTime(0); - this.worldInfo.setThundering(false); + provider.resetRainAndThunder(); } public boolean areAllPlayersAsleep() @@ -270,7 +275,7 @@ int var10; int var11; - if (this.rand.nextInt(100000) == 0 && this.isRaining() && this.isThundering()) + if (provider.canDoLightning(var7) && this.rand.nextInt(100000) == 0 && this.isRaining() && this.isThundering()) { this.updateLCG = this.updateLCG * 3 + 1013904223; var8 = this.updateLCG >> 2; @@ -288,7 +293,7 @@ this.theProfiler.endStartSection("iceandsnow"); int var13; - if (this.rand.nextInt(16) == 0) + if (provider.canDoRainSnowIce(var7) && this.rand.nextInt(16) == 0) { this.updateLCG = this.updateLCG * 3 + 1013904223; var8 = this.updateLCG >> 2; @@ -362,7 +367,8 @@ public void scheduleBlockUpdate(int par1, int par2, int par3, int par4, int par5) { NextTickListEntry var6 = new NextTickListEntry(par1, par2, par3, par4); - byte var7 = 8; + boolean isForced = getPersistentChunks().containsKey(new ChunkCoordIntPair(var6.xCoord >> 4, var6.zCoord >> 4)); + byte var7 = isForced ? (byte)0 : 8; if (this.scheduledUpdatesAreImmediate) { @@ -418,7 +424,7 @@ */ public void updateEntities() { - if (this.playerEntities.isEmpty()) + if (this.playerEntities.isEmpty() && getPersistentChunks().isEmpty()) { if (this.updateEntityTick++ >= 60) { @@ -462,7 +468,8 @@ this.pendingTickListEntries.remove(var4); this.field_73064_N.remove(var4); - byte var5 = 8; + boolean isForced = getPersistentChunks().containsKey(new ChunkCoordIntPair(var4.xCoord >> 4, var4.zCoord >> 4)); + byte var5 = isForced ? (byte)0 : 8; if (this.checkChunksExist(var4.xCoord - var5, var4.yCoord - var5, var4.zCoord - var5, var4.xCoord + var5, var4.yCoord + var5, var4.zCoord + var5)) { @@ -559,15 +566,27 @@ public List getAllTileEntityInBox(int par1, int par2, int par3, int par4, int par5, int par6) { ArrayList var7 = new ArrayList(); - Iterator var8 = this.loadedTileEntityList.iterator(); - - while (var8.hasNext()) - { - TileEntity var9 = (TileEntity)var8.next(); - - if (var9.xCoord >= par1 && var9.yCoord >= par2 && var9.zCoord >= par3 && var9.xCoord < par4 && var9.yCoord < par5 && var9.zCoord < par6) - { - var7.add(var9); + + for(int x = (par1 >> 4); x <= (par4 >> 4); x++) + { + for(int z = (par3 >> 4); z <= (par6 >> 4); z++) + { + Chunk chunk = getChunkFromChunkCoords(x, z); + if (chunk != null) + { + for(Object obj : chunk.chunkTileEntityMap.values()) + { + TileEntity entity = (TileEntity)obj; + if (!entity.isInvalid()) + { + if (entity.xCoord >= par1 && entity.yCoord >= par2 && entity.zCoord >= par3 && + entity.xCoord <= par4 && entity.yCoord <= par5 && entity.zCoord <= par6) + { + var7.add(entity); + } + } + } + } } } @@ -578,6 +597,11 @@ * Called when checking if a certain block can be mined or not. The 'spawn safe zone' check is located here. */ public boolean canMineBlock(EntityPlayer par1EntityPlayer, int par2, int par3, int par4) + { + return super.canMineBlock(par1EntityPlayer, par2, par3, par4); + } + + public boolean canMineBlockBody(EntityPlayer par1EntityPlayer, int par2, int par3, int par4) { int var5 = MathHelper.abs_int(par2 - this.worldInfo.getSpawnX()); int var6 = MathHelper.abs_int(par4 - this.worldInfo.getSpawnZ()); @@ -587,7 +611,7 @@ var6 = var5; } - return var6 > 16 || this.mcServer.getConfigurationManager().areCommandsAllowed(par1EntityPlayer.username) || this.mcServer.isSinglePlayer(); + return var6 > mcServer.spawnProtectionSize || this.mcServer.getConfigurationManager().areCommandsAllowed(par1EntityPlayer.username) || this.mcServer.isSinglePlayer(); } protected void initialize(WorldSettings par1WorldSettings) @@ -670,7 +694,7 @@ */ protected void createBonusChest() { - WorldGeneratorBonusChest var1 = new WorldGeneratorBonusChest(bonusChestContent, 10); + WorldGeneratorBonusChest var1 = new WorldGeneratorBonusChest(ChestGenHooks.getItems(BONUS_CHEST), ChestGenHooks.getCount(BONUS_CHEST, rand)); for (int var2 = 0; var2 < 10; ++var2) { @@ -713,6 +737,7 @@ } this.chunkProvider.saveChunks(par1, par2IProgressUpdate); + MinecraftForge.EVENT_BUS.post(new WorldEvent.Save(this)); } } @@ -971,4 +996,9 @@ { return this.thePlayerManager; } + + public File getChunkSaveLocation() + { + return ((AnvilChunkLoader)theChunkProviderServer.currentChunkLoader).chunkSaveLocation; + } }