From d373632275d943c0006b40c43cb63fd22ee73174 Mon Sep 17 00:00:00 2001 From: LexManos Date: Thu, 27 Sep 2012 23:58:40 -0700 Subject: [PATCH] Fix vanilla bug where the player would load chunks outside its range that would be 'abandoned' and never unloaded. --- common/forge_at.cfg | 2 ++ .../minecraft/src/EntityPlayerMP.java.patch | 14 ++++++++++- .../minecraft/src/PlayerInstance.java.patch | 24 +++++++++++++++++++ 3 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 patches/common/net/minecraft/src/PlayerInstance.java.patch diff --git a/common/forge_at.cfg b/common/forge_at.cfg index 4e901758a..55f09a92f 100644 --- a/common/forge_at.cfg +++ b/common/forge_at.cfg @@ -78,3 +78,5 @@ public abu.a # ComponentVillageHouse2.villageBlacksmithChestContents default wy.d # ChunkProviderServer.currentChunkLoader default gq.e +# PlayerManager +default go.a(IIZ)Lgp; # getOrCreateChunkWatcher \ No newline at end of file diff --git a/patches/common/net/minecraft/src/EntityPlayerMP.java.patch b/patches/common/net/minecraft/src/EntityPlayerMP.java.patch index af9cc01f8..6b5959d76 100644 --- a/patches/common/net/minecraft/src/EntityPlayerMP.java.patch +++ b/patches/common/net/minecraft/src/EntityPlayerMP.java.patch @@ -29,7 +29,19 @@ this.setLocationAndAngles((double)var6 + 0.5D, (double)var8, (double)var7 + 0.5D, 0.0F, 0.0F); this.mcServer = par1MinecraftServer; -@@ -336,8 +332,27 @@ +@@ -193,7 +189,10 @@ + if (var4 != null && this.worldObj.blockExists(var4.chunkXPos << 4, 0, var4.chunkZPos << 4)) + { + var6.add(this.worldObj.getChunkFromChunkCoords(var4.chunkXPos, var4.chunkZPos)); +- var3.addAll(((WorldServer)this.worldObj).getAllTileEntityInBox(var4.chunkXPos * 16, 0, var4.chunkZPos * 16, var4.chunkXPos * 16 + 16, 256, var4.chunkZPos * 16 + 16)); ++ //BugFix: 16 makes it load an extra chunk, which isn't associated with a player, which makes it not unload unless a player walks near it. ++ //ToDo: Find a way to efficiently clean abandoned chunks. ++ //var3.addAll(((WorldServer)this.worldObj).getAllTileEntityInBox(var4.chunkXPos * 16, 0, var4.chunkZPos * 16, var4.chunkXPos * 16 + 16, 256, var4.chunkZPos * 16 + 16)); ++ var3.addAll(((WorldServer)this.worldObj).getAllTileEntityInBox(var4.chunkXPos * 16, 0, var4.chunkZPos * 16, var4.chunkXPos * 16 + 15, 256, var4.chunkZPos * 16 + 15)); + } + } + +@@ -336,8 +335,27 @@ */ public void onDeath(DamageSource par1DamageSource) { diff --git a/patches/common/net/minecraft/src/PlayerInstance.java.patch b/patches/common/net/minecraft/src/PlayerInstance.java.patch new file mode 100644 index 000000000..8e8ebfda2 --- /dev/null +++ b/patches/common/net/minecraft/src/PlayerInstance.java.patch @@ -0,0 +1,24 @@ +--- ../src_base/common/net/minecraft/src/PlayerInstance.java ++++ ../src_work/common/net/minecraft/src/PlayerInstance.java +@@ -3,6 +3,9 @@ + import java.util.ArrayList; + import java.util.Iterator; + import java.util.List; ++ ++import cpw.mods.fml.common.FMLCommonHandler; ++import cpw.mods.fml.common.Side; + + class PlayerInstance + { +@@ -140,7 +143,10 @@ + if ((this.field_73260_f & 1 << var3) != 0) + { + var4 = var3 << 4; +- List var5 = PlayerManager.getWorldServer(this.myManager).getAllTileEntityInBox(var1, var4, var2, var1 + 16, var4 + 16, var2 + 16); ++ //BugFix: 16 makes it load an extra chunk, which isn't associated with a player, which makes it not unload unless a player walks near it. ++ //ToDo: Find a way to efficiently clean abandoned chunks. ++ List var5 = PlayerManager.getWorldServer(this.myManager).getAllTileEntityInBox(var1, var4, var2, var1 + 15, var4 + 16, var2 + 15); ++ List var5 = PlayerManager.getWorldServer(this.myManager).getAllTileEntityInBox(var1, var4, var2, var1 + 15, var4 + 16, var2 + 15); + Iterator var6 = var5.iterator(); + + while (var6.hasNext())