ForgePatch/patches/common/net/minecraft/src/WorldServer.java.patch
Christian 384f795d52 Some more tweaks to the chunkloading code. The world.load event fires slightly later- once the entity watcher is
set up, so entities can actually load into the server world. Also, tickets actually save and load properly
and null entities don't break the server
2012-09-25 19:12:10 -04:00

175 lines
6.4 KiB
Diff

--- ../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;
+ }
}