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.
This commit is contained in:
Travis Watkins 2012-12-07 19:49:01 -06:00
parent c74fd4196f
commit 846a22304c
3 changed files with 39 additions and 0 deletions

View file

@ -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);
}

View file

@ -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);
}

View file

@ -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);
}