Saber-Factions/src/main/java/com/massivecraft/factions/FLocation.java

221 lines
4.6 KiB
Java
Raw Normal View History

2011-07-18 22:06:02 +02:00
package com.massivecraft.factions;
2011-03-19 13:00:03 +01:00
2011-04-08 21:01:46 +02:00
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.Set;
2011-04-08 21:01:46 +02:00
import org.bukkit.Bukkit;
2011-03-19 13:00:03 +01:00
import org.bukkit.Location;
import org.bukkit.World;
2011-03-19 13:00:03 +01:00
import org.bukkit.block.Block;
import org.bukkit.entity.Player;
2011-07-18 22:06:02 +02:00
import com.massivecraft.factions.util.MiscUtil;
2011-03-19 13:00:03 +01:00
2011-10-09 18:35:39 +02:00
public class FLocation
{
2011-03-19 13:00:03 +01:00
private String worldName = "world";
2011-03-22 17:20:21 +01:00
private int x = 0;
private int z = 0;
2011-03-19 13:00:03 +01:00
//----------------------------------------------//
// Constructors
//----------------------------------------------//
2011-10-09 18:35:39 +02:00
public FLocation()
{
2011-03-19 13:00:03 +01:00
}
2011-10-09 18:35:39 +02:00
public FLocation(String worldName, int x, int z)
{
2011-03-19 13:00:03 +01:00
this.worldName = worldName;
this.x = x;
this.z = z;
}
2011-10-09 18:35:39 +02:00
public FLocation(Location location)
{
this( location.getWorld().getName(), blockToChunk(location.getBlockX()), blockToChunk(location.getBlockZ()) );
2011-03-19 13:00:03 +01:00
}
2011-10-09 18:35:39 +02:00
public FLocation(Player player)
{
2011-03-19 13:00:03 +01:00
this(player.getLocation());
}
2011-10-09 18:35:39 +02:00
public FLocation(FPlayer fplayer)
{
2011-03-19 13:00:03 +01:00
this(fplayer.getPlayer());
}
2011-10-09 18:35:39 +02:00
public FLocation(Block block)
{
2011-03-19 13:00:03 +01:00
this(block.getLocation());
}
//----------------------------------------------//
// Getters and Setters
//----------------------------------------------//
2011-10-09 18:35:39 +02:00
public String getWorldName()
{
2011-03-19 13:00:03 +01:00
return worldName;
}
public World getWorld()
{
return Bukkit.getWorld(worldName);
}
2011-10-09 18:35:39 +02:00
public void setWorldName(String worldName)
{
2011-03-19 13:00:03 +01:00
this.worldName = worldName;
}
2011-10-09 18:35:39 +02:00
public long getX()
{
2011-03-19 13:00:03 +01:00
return x;
}
2011-10-09 18:35:39 +02:00
public void setX(int x)
{
2011-03-19 13:00:03 +01:00
this.x = x;
}
2011-10-09 18:35:39 +02:00
public long getZ()
{
2011-03-19 13:00:03 +01:00
return z;
}
2011-10-09 18:35:39 +02:00
public void setZ(int z)
{
2011-03-19 13:00:03 +01:00
this.z = z;
}
2011-10-09 18:35:39 +02:00
public String getCoordString()
{
2011-03-19 13:00:03 +01:00
return ""+x+","+z;
}
2011-03-23 12:45:21 +01:00
@Override
public String toString() {
return "["+this.getWorldName()+","+this.getCoordString()+"]";
}
2011-03-19 13:00:03 +01:00
//----------------------------------------------//
// Block/Chunk/Region Value Transformation
//----------------------------------------------//
// bit-shifting is used because it's much faster than standard division and multiplication
public static int blockToChunk(int blockVal)
{ // 1 chunk is 16x16 blocks
return blockVal >> 4; // ">> 4" == "/ 16"
}
public static int blockToRegion(int blockVal)
{ // 1 region is 512x512 blocks
return blockVal >> 9; // ">> 9" == "/ 512"
}
public static int chunkToRegion(int chunkVal)
{ // 1 region is 32x32 chunks
return chunkVal >> 5; // ">> 5" == "/ 32"
}
public static int chunkToBlock(int chunkVal)
{
return chunkVal << 4; // "<< 4" == "* 16"
}
public static int regionToBlock(int regionVal)
{
return regionVal << 9; // "<< 9" == "* 512"
}
public static int regionToChunk(int regionVal)
{
return regionVal << 5; // "<< 5" == "* 32"
}
2011-03-19 13:00:03 +01:00
//----------------------------------------------//
2011-04-08 21:01:46 +02:00
// Misc Geometry
2011-03-19 13:00:03 +01:00
//----------------------------------------------//
public FLocation getRelative(int dx, int dz)
{
2011-03-19 13:00:03 +01:00
return new FLocation(this.worldName, this.x + dx, this.z + dz);
}
public double getDistanceTo(FLocation that)
{
double dx = that.x - this.x;
double dz = that.z - this.z;
return Math.sqrt(dx*dx+dz*dz);
}
//----------------------------------------------//
// Some Geometry
//----------------------------------------------//
public Set<FLocation> getCircle(double radius)
{
Set<FLocation> ret = new LinkedHashSet<FLocation>();
if (radius <= 0) return ret;
int xfrom = (int) Math.floor(this.x - radius);
int xto = (int) Math.ceil(this.x + radius);
int zfrom = (int) Math.floor(this.z - radius);
int zto = (int) Math.ceil(this.z + radius);
for (int x=xfrom; x<=xto; x++)
{
for (int z=zfrom; z<=zto; z++)
{
FLocation potential = new FLocation(this.worldName, x, z);
if (this.getDistanceTo(potential) <= radius)
ret.add(potential);
}
}
return ret;
}
2011-10-09 18:35:39 +02:00
public static HashSet<FLocation> getArea(FLocation from, FLocation to)
{
2011-04-08 21:01:46 +02:00
HashSet<FLocation> ret = new HashSet<FLocation>();
2011-10-09 18:35:39 +02:00
for (long x : MiscUtil.range(from.getX(), to.getX()))
{
for (long z : MiscUtil.range(from.getZ(), to.getZ()))
{
2011-04-08 21:01:46 +02:00
ret.add(new FLocation(from.getWorldName(), (int)x, (int)z));
}
}
return ret;
}
2011-03-19 13:00:03 +01:00
//----------------------------------------------//
// Comparison
//----------------------------------------------//
2011-07-31 03:17:00 +02:00
@Override
2011-10-09 18:35:39 +02:00
public int hashCode()
{
// should be fast, with good range and few hash collisions: (x * 512) + z + worldName.hashCode
return (this.x << 9) + this.z + (this.worldName != null ? this.worldName.hashCode() : 0);
}
2011-03-23 12:00:38 +01:00
2011-03-19 13:00:03 +01:00
@Override
2011-10-09 18:35:39 +02:00
public boolean equals(Object obj)
{
2011-03-19 13:00:03 +01:00
if (obj == this)
return true;
if (!(obj instanceof FLocation))
return false;
2011-03-23 12:00:38 +01:00
FLocation that = (FLocation) obj;
return this.x == that.x && this.z == that.z && ( this.worldName==null ? that.worldName==null : this.worldName.equals(that.worldName) );
2011-03-19 13:00:03 +01:00
}
}