From 094c4c043fd86f6d9c1ab8feb1a1910fb58c9f9b Mon Sep 17 00:00:00 2001 From: CraftBukkit/Spigot Date: Sun, 20 Feb 2011 23:22:28 +0100 Subject: [PATCH] Second part of NPE and arctan update :3 By: VictorD --- .../org/bukkit/craftbukkit/CraftChunk.java | 31 ++++++++++++------- .../org/bukkit/craftbukkit/CraftWorld.java | 5 ++- .../java/org/bukkit/craftbukkit/TrigMath.java | 3 +- 3 files changed, 24 insertions(+), 15 deletions(-) diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/CraftChunk.java b/paper-server/src/main/java/org/bukkit/craftbukkit/CraftChunk.java index 592e12033e..c9469f5d21 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/CraftChunk.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/CraftChunk.java @@ -1,6 +1,7 @@ package org.bukkit.craftbukkit; +import java.lang.ref.WeakReference; import java.util.HashMap; import net.minecraft.server.WorldServer; @@ -11,27 +12,38 @@ import org.bukkit.block.Block; import org.bukkit.craftbukkit.block.CraftBlock; public class CraftChunk implements Chunk { - private net.minecraft.server.Chunk chunk; + private WeakReference weakChunk; private final HashMap cache = new HashMap(); - + private WorldServer worldServer; + private int x; + private int z; + public CraftChunk(net.minecraft.server.Chunk chunk) { - this.chunk = chunk; + this.weakChunk = new WeakReference(chunk); + worldServer = (WorldServer) getHandle().d; + x = getHandle().j; + z = getHandle().k; } public World getWorld() { - return ((WorldServer) chunk.d).getWorld(); + return worldServer.getWorld(); } public net.minecraft.server.Chunk getHandle() { - return chunk; + net.minecraft.server.Chunk c = weakChunk.get(); + if (c == null) { + weakChunk = new WeakReference(worldServer.c(x,z)); + c = weakChunk.get(); + } + return c; } public int getX() { - return chunk.j; + return x; } public int getZ() { - return chunk.k; + return z; } @Override @@ -48,8 +60,5 @@ public class CraftChunk implements Chunk { } return block; } - - public void breakLink() { - this.chunk = null; - } } + diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/paper-server/src/main/java/org/bukkit/craftbukkit/CraftWorld.java index 2f3fe70563..aca525176d 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/CraftWorld.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/CraftWorld.java @@ -47,12 +47,11 @@ public class CraftWorld implements World { } public void preserveChunk( CraftChunk chunk ) { - chunk.breakLink(); - unloadedChunks.put( chunk.getX() << 16 + chunk.getZ(), chunk ); + unloadedChunks.put( (chunk.getX() << 16) + chunk.getZ(), chunk ); } public CraftChunk popPreservedChunk( int x, int z ) { - return unloadedChunks.remove( x << 16 + z ); + return unloadedChunks.remove( (x << 16) + z ); } public Block getBlockAt(int x, int y, int z) { diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/TrigMath.java b/paper-server/src/main/java/org/bukkit/craftbukkit/TrigMath.java index 0d207b37da..2a623bf0f7 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/TrigMath.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/TrigMath.java @@ -1,6 +1,7 @@ package org.bukkit.craftbukkit; /** - * Got this code from a post by user aioobe on stackoverflow.com + * Credits for this class goes to user aioobe on stackoverflow.com + * Source: http://stackoverflow.com/questions/4454630/j2me-calculate-the-the-distance-between-2-latitude-and-longitude * */ public class TrigMath {