From 846a22304ca741ed8a39e1d881ab1b09f842b2d6 Mon Sep 17 00:00:00 2001 From: Travis Watkins Date: Fri, 7 Dec 2012 19:49:01 -0600 Subject: [PATCH] Provide a faster way to get a location. Adds BUKKIT-3120 Currently when a plugin wants to get the location of something it calls getLocation() which returns a new Location object. In some scenarios this can cause enough object creation/destruction churn to be a significant overhead. For this cases we add a method that updates a provided Location object so there is no object creation done. This allows well written code to work on several locations with only a single Location object getting created. Providing a more efficient way to set a location was also looked at but the current solution is the fastest we can provide. You are not required to create a new Location object every time you want to set something's location so, with proper design, you can set locations with only a single Location object being created. --- .../org/bukkit/craftbukkit/block/CraftBlock.java | 13 +++++++++++++ .../bukkit/craftbukkit/block/CraftBlockState.java | 13 +++++++++++++ .../org/bukkit/craftbukkit/entity/CraftEntity.java | 13 +++++++++++++ 3 files changed, 39 insertions(+) diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java b/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java index a5c0bed8da..70e7df7ece 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java @@ -48,6 +48,19 @@ public class CraftBlock implements Block { return new Location(getWorld(), x, y, z); } + public Location getLocation(Location loc) { + if (loc != null) { + loc.setWorld(getWorld()); + loc.setX(x); + loc.setY(y); + loc.setZ(z); + loc.setYaw(0); + loc.setPitch(0); + } + + return loc; + } + public BlockVector getVector() { return new BlockVector(x, y, z); } diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftBlockState.java b/src/main/java/org/bukkit/craftbukkit/block/CraftBlockState.java index e83eb3017e..0529689887 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftBlockState.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftBlockState.java @@ -148,6 +148,19 @@ public class CraftBlockState implements BlockState { return new Location(world, x, y, z); } + public Location getLocation(Location loc) { + if (loc != null) { + loc.setWorld(world); + loc.setX(x); + loc.setY(y); + loc.setZ(z); + loc.setYaw(0); + loc.setPitch(0); + } + + return loc; + } + public void setRawData(byte data) { this.data.setData(data); } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java index e68edf10c8..503c8a9adc 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java @@ -156,6 +156,19 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { return new Location(getWorld(), entity.locX, entity.locY, entity.locZ, entity.yaw, entity.pitch); } + public Location getLocation(Location loc) { + if (loc != null) { + loc.setWorld(getWorld()); + loc.setX(entity.locX); + loc.setY(entity.locY); + loc.setZ(entity.locZ); + loc.setYaw(entity.yaw); + loc.setPitch(entity.pitch); + } + + return loc; + } + public Vector getVelocity() { return new Vector(entity.motX, entity.motY, entity.motZ); }