From bf9a55049e6be249856d07b1bda99552b0f902f7 Mon Sep 17 00:00:00 2001 From: VictorD Date: Sun, 20 Feb 2011 23:22:28 +0100 Subject: [PATCH] Second part of NPE and arctan update :3 --- src/main/java/net/minecraft/server/Chunk.java | 5 ++- .../net/minecraft/server/EntityCreature.java | 3 +- .../net/minecraft/server/EntityHuman.java | 3 +- .../net/minecraft/server/EntityLiving.java | 3 +- .../org/bukkit/craftbukkit/CraftChunk.java | 31 ++++++++++++------- .../org/bukkit/craftbukkit/CraftWorld.java | 5 ++- .../java/org/bukkit/craftbukkit/TrigMath.java | 3 +- 7 files changed, 34 insertions(+), 19 deletions(-) diff --git a/src/main/java/net/minecraft/server/Chunk.java b/src/main/java/net/minecraft/server/Chunk.java index 592e34086b..ef81adf90f 100644 --- a/src/main/java/net/minecraft/server/Chunk.java +++ b/src/main/java/net/minecraft/server/Chunk.java @@ -6,6 +6,8 @@ import java.util.List; import java.util.Map; import java.util.Random; +import org.bukkit.craftbukkit.CraftWorld; + public class Chunk { public static boolean a; @@ -44,7 +46,8 @@ public class Chunk { } // CraftBukkit start - bukkitChunk = ((WorldServer) world).getWorld().popPreservedChunk( i, j ); + CraftWorld cw = ((WorldServer) world).getWorld(); + bukkitChunk = (cw == null) ? null:cw.popPreservedChunk( i, j ); if (bukkitChunk == null) { bukkitChunk = new org.bukkit.craftbukkit.CraftChunk( this ); } diff --git a/src/main/java/net/minecraft/server/EntityCreature.java b/src/main/java/net/minecraft/server/EntityCreature.java index c867b32caa..49b4c7a260 100644 --- a/src/main/java/net/minecraft/server/EntityCreature.java +++ b/src/main/java/net/minecraft/server/EntityCreature.java @@ -4,6 +4,7 @@ package net.minecraft.server; import org.bukkit.craftbukkit.entity.CraftMonster; import org.bukkit.craftbukkit.CraftServer; import org.bukkit.craftbukkit.entity.CraftEntity; +import org.bukkit.craftbukkit.TrigMath; import org.bukkit.event.entity.EntityDamageByEntityEvent; import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.entity.EntityDamageEvent.DamageCause; @@ -118,7 +119,7 @@ public class EntityCreature extends EntityLiving { double d1 = vec3d.a - this.locX; double d2 = vec3d.c - this.locZ; double d3 = vec3d.b - (double) l1; - float f4 = (float) (Math.atan2(d2, d1) * 180.0D / 3.1415927410125732D) - 90.0F; + float f4 = (float) (TrigMath.atan2(d2, d1) * 180.0D / 3.1415927410125732D) - 90.0F; float f5 = f4 - this.yaw; for (this.by = this.bC; f5 < -180.0F; f5 += 360.0F) { diff --git a/src/main/java/net/minecraft/server/EntityHuman.java b/src/main/java/net/minecraft/server/EntityHuman.java index 2e3e71774c..66bae6e112 100644 --- a/src/main/java/net/minecraft/server/EntityHuman.java +++ b/src/main/java/net/minecraft/server/EntityHuman.java @@ -4,6 +4,7 @@ import java.util.List; // CraftBukkit start import org.bukkit.craftbukkit.CraftServer; +import org.bukkit.craftbukkit.TrigMath; import org.bukkit.craftbukkit.entity.CraftItemDrop; import org.bukkit.entity.Player; import org.bukkit.event.entity.EntityDamageByEntityEvent; @@ -124,7 +125,7 @@ public abstract class EntityHuman extends EntityLiving { this.as = this.at; super.o(); float f = MathHelper.a(this.motX * this.motX + this.motZ * this.motZ); - float f1 = (float) Math.atan(-this.motY * 0.20000000298023224D) * 15.0F; + float f1 = (float) TrigMath.atan(-this.motY * 0.20000000298023224D) * 15.0F; if (f > 0.1F) { f = 0.1F; diff --git a/src/main/java/net/minecraft/server/EntityLiving.java b/src/main/java/net/minecraft/server/EntityLiving.java index 366f8f1efa..c2c371db1c 100644 --- a/src/main/java/net/minecraft/server/EntityLiving.java +++ b/src/main/java/net/minecraft/server/EntityLiving.java @@ -10,6 +10,7 @@ import org.bukkit.craftbukkit.CraftServer; import org.bukkit.craftbukkit.CraftWorld; import org.bukkit.craftbukkit.entity.CraftEntity; import org.bukkit.craftbukkit.inventory.CraftItemStack; +import org.bukkit.craftbukkit.TrigMath; import org.bukkit.event.Event.Type; import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.entity.EntityDamageEvent.DamageCause; @@ -236,7 +237,7 @@ public abstract class EntityLiving extends Entity { if (f > 0.05F) { f3 = 1.0F; f2 = f * 3.0F; - f1 = (float) Math.atan2(d1, d0) * 180.0F / 3.1415927F - 90.0F; + f1 = (float) TrigMath.atan2(d1, d0) * 180.0F / 3.1415927F - 90.0F; } if (this.aY > 0.0F) { diff --git a/src/main/java/org/bukkit/craftbukkit/CraftChunk.java b/src/main/java/org/bukkit/craftbukkit/CraftChunk.java index 592e12033e..c9469f5d21 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftChunk.java +++ b/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/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java index 2f3fe70563..aca525176d 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java +++ b/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/src/main/java/org/bukkit/craftbukkit/TrigMath.java b/src/main/java/org/bukkit/craftbukkit/TrigMath.java index 0d207b37da..2a623bf0f7 100644 --- a/src/main/java/org/bukkit/craftbukkit/TrigMath.java +++ b/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 {