/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package com.bekvon.bukkit.residence.selection;
import com.bekvon.bukkit.residence.Residence;
import com.bekvon.bukkit.residence.permissions.PermissionGroup;
import com.bekvon.bukkit.residence.protection.CuboidArea;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import org.bukkit.ChatColor;
import org.bukkit.Chunk;
import org.bukkit.Location;
import org.bukkit.Server;
import org.bukkit.entity.Player;
/**
*
* @author Administrator
*/
public class SelectionManager {
protected Map<String,Location> playerLoc1;
protected Map<String,Location> playerLoc2;
protected Server server;
public static final int MAX_HEIGHT = 255,MIN_HEIGHT = 0;
public enum Direction
{
UP,DOWN,PLUSX,PLUSZ,MINUSX,MINUSZ
}
public SelectionManager(Server server)
{
this.server = server;
playerLoc1 = Collections.synchronizedMap(new HashMap<String,Location>());
playerLoc2 = Collections.synchronizedMap(new HashMap<String,Location>());
}
public void placeLoc1(Player player, Location loc)
{
if(loc!=null)
{
playerLoc1.put(player.getName(), loc);
}
}
public void placeLoc2(Player player, Location loc)
{
if(loc!=null)
{
playerLoc2.put(player.getName(), loc);
}
}
public Location getPlayerLoc1(String player)
{
return playerLoc1.get(player);
}
public Location getPlayerLoc2(String player)
{
return playerLoc2.get(player);
}
public boolean hasPlacedBoth(String player)
{
return (playerLoc1.containsKey(player) && playerLoc2.containsKey(player));
}
public void showSelectionInfo(Player player) {
String pname = player.getName();
if (this.hasPlacedBoth(pname)) {
CuboidArea cuboidArea = new CuboidArea(getPlayerLoc1(pname), getPlayerLoc2(pname));
player.sendMessage(ChatColor.YELLOW+Residence.getLanguage().getPhrase("Selection.Total.Size")+":"+ChatColor.DARK_AQUA+" " + cuboidArea.getSize());
PermissionGroup group = Residence.getPermissionManager().getGroup(player);
if(Residence.getConfigManager().enableEconomy())
player.sendMessage(ChatColor.YELLOW+Residence.getLanguage().getPhrase("Land.Cost")+":"+ChatColor.DARK_AQUA+" " + ((int)Math.ceil((double)cuboidArea.getSize()*group.getCostPerBlock())));
player.sendMessage(ChatColor.YELLOW+"X"+Residence.getLanguage().getPhrase("Size")+":"+ChatColor.DARK_AQUA+" " + cuboidArea.getXSize());
player.sendMessage(ChatColor.YELLOW+"Y"+Residence.getLanguage().getPhrase("Size")+":"+ChatColor.DARK_AQUA+" " + cuboidArea.getYSize());
player.sendMessage(ChatColor.YELLOW+"Z"+Residence.getLanguage().getPhrase("Size")+":"+ChatColor.DARK_AQUA+" " + cuboidArea.getZSize());
}
else
player.sendMessage(ChatColor.RED+Residence.getLanguage().getPhrase("SelectPoints"));
}
public void vert(Player player, boolean resadmin)
{
if(hasPlacedBoth(player.getName()))
{
this.sky(player, resadmin);
this.bedrock(player, resadmin);
}
else
{
player.sendMessage(ChatColor.RED + Residence.getLanguage().getPhrase("SelectPoints"));
}
}
public void sky(Player player, boolean resadmin)
{
if(hasPlacedBoth(player.getName()))
{
PermissionGroup group = Residence.getPermissionManager().getGroup(player);
int y1 = playerLoc1.get(player.getName()).getBlockY();
int y2 = playerLoc2.get(player.getName()).getBlockY();
if(y1>y2)
{
int newy = MAX_HEIGHT;
if(!resadmin)
{
if(group.getMaxHeight()<newy)
newy = group.getMaxHeight();
if(newy - y2 > (group.getMaxY()-1))
newy = y2 + (group.getMaxY()-1);
}
playerLoc1.get(player.getName()).setY(newy);
}
else
{
int newy = MAX_HEIGHT;
if(!resadmin)
{
if(group.getMaxHeight()<newy)
newy = group.getMaxHeight();
if(newy - y1 > (group.getMaxY()-1))
newy = y1 + (group.getMaxY()-1);
}
playerLoc2.get(player.getName()).setY(newy);
}
player.sendMessage(ChatColor.GREEN+Residence.getLanguage().getPhrase("SelectionSky"));
}
else
{
player.sendMessage(ChatColor.RED+Residence.getLanguage().getPhrase("SelectPoints"));
}
}
public void bedrock(Player player, boolean resadmin)
{
if(hasPlacedBoth(player.getName()))
{
PermissionGroup group = Residence.getPermissionManager().getGroup(player);
int y1 = playerLoc1.get(player.getName()).getBlockY();
int y2 = playerLoc2.get(player.getName()).getBlockY();
if(y1<y2)
{
int newy = MIN_HEIGHT;
if(!resadmin)
{
if(newy<group.getMinHeight())
newy = group.getMinHeight();
if(y2 - newy > (group.getMaxY()-1))
newy = y2 - (group.getMaxY()-1);
}
playerLoc1.get(player.getName()).setY(newy);
}
else
{
int newy = MIN_HEIGHT;
if(!resadmin)
{
if(newy<group.getMinHeight())
newy = group.getMinHeight();
if(y1 - newy > (group.getMaxY()-1))
newy = y1 - (group.getMaxY()-1);
}
playerLoc2.get(player.getName()).setY(newy);
}
player.sendMessage(ChatColor.GREEN+Residence.getLanguage().getPhrase("SelectionBedrock"));
}
else
{
player.sendMessage(ChatColor.RED+Residence.getLanguage().getPhrase("SelectPoints"));
}
}
public void clearSelection(Player player)
{
playerLoc1.remove(player.getName());
playerLoc2.remove(player.getName());
}
public void selectChunk(Player player)
{
Chunk chunk = player.getWorld().getChunkAt(player.getLocation());
int xcoord = chunk.getX() * 16;
int zcoord = chunk.getZ() * 16;
int ycoord = MIN_HEIGHT;
int xmax = xcoord + 15;
int zmax = zcoord + 15;
int ymax = MAX_HEIGHT;
this.playerLoc1.put(player.getName(), new Location(player.getWorld(), xcoord, ycoord, zcoord));
this.playerLoc2.put(player.getName(), new Location(player.getWorld(), xmax,ymax,zmax));
player.sendMessage(ChatColor.GREEN+Residence.getLanguage().getPhrase("SelectionSuccess"));
}
public boolean worldEdit(Player player) {
player.sendMessage(ChatColor.RED+Residence.getLanguage().getPhrase("WorldEditNotFound"));
return false;
}
public void selectBySize(Player player, int xsize, int ysize, int zsize) {
Location myloc = player.getLocation();
Location loc1 = new Location(myloc.getWorld(), myloc.getBlockX() + xsize, myloc.getBlockY() + ysize, myloc.getBlockZ() + zsize);
Location loc2 = new Location(myloc.getWorld(), myloc.getBlockX() - xsize, myloc.getBlockY() - ysize, myloc.getBlockZ() - zsize);
placeLoc1(player, loc1);
placeLoc2(player, loc2);
player.sendMessage(ChatColor.GREEN+Residence.getLanguage().getPhrase("SelectionSuccess"));
showSelectionInfo(player);
}
public void modify(Player player, boolean shift, int amount)
{
if(!this.hasPlacedBoth(player.getName()))
{
player.sendMessage(ChatColor.RED+Residence.getLanguage().getPhrase("SelectPoints"));
return;
}
Direction d = this.getDirection(player);
if(d==null)
{
player.sendMessage(ChatColor.RED+Residence.getLanguage().getPhrase("InvalidDirection"));
}
CuboidArea area = new CuboidArea (playerLoc1.get(player.getName()),playerLoc2.get(player.getName()));
if(d == Direction.UP)
{
int oldy = area.getHighLoc().getBlockY();
oldy = oldy + amount;
if(oldy>MAX_HEIGHT)
{
player.sendMessage(ChatColor.RED+Residence.getLanguage().getPhrase("SelectTooHigh"));
oldy = MAX_HEIGHT;
}
area.getHighLoc().setY(oldy);
if(shift)
{
int oldy2 = area.getLowLoc().getBlockY();
oldy2 = oldy2 + amount;
area.getLowLoc().setY(oldy2);
player.sendMessage(ChatColor.YELLOW+Residence.getLanguage().getPhrase("Shifting.Up")+"...");
}
else
player.sendMessage(ChatColor.YELLOW+Residence.getLanguage().getPhrase("Expanding.Up")+"...");
}
if(d == Direction.DOWN)
{
int oldy = area.getLowLoc().getBlockY();
oldy = oldy - amount;
if(oldy<MIN_HEIGHT)
{
player.sendMessage(ChatColor.RED + Residence.getLanguage().getPhrase("SelectTooLow"));
oldy = MIN_HEIGHT;
}
area.getLowLoc().setY(oldy);
if(shift)
{
int oldy2 = area.getHighLoc().getBlockY();
oldy2 = oldy2 - amount;
area.getHighLoc().setY(oldy2);
player.sendMessage(ChatColor.YELLOW+Residence.getLanguage().getPhrase("Shifting.Down")+"...");
}
else
player.sendMessage(ChatColor.YELLOW+Residence.getLanguage().getPhrase("Expanding.Down")+"...");
}
if(d == Direction.MINUSX)
{
int oldx = area.getLowLoc().getBlockX();
oldx = oldx - amount;
area.getLowLoc().setX(oldx);
if(shift)
{
int oldx2 = area.getHighLoc().getBlockX();
oldx2 = oldx2 - amount;
area.getHighLoc().setX(oldx2);
player.sendMessage(ChatColor.YELLOW+Residence.getLanguage().getPhrase("Shifting")+" -X...");
}
else
player.sendMessage(ChatColor.YELLOW+Residence.getLanguage().getPhrase("Expanding")+" -X...");
}
if(d == Direction.PLUSX)
{
int oldx = area.getHighLoc().getBlockX();
oldx = oldx + amount;
area.getHighLoc().setX(oldx);
if(shift)
{
int oldx2 = area.getLowLoc().getBlockX();
oldx2 = oldx2 + amount;
area.getLowLoc().setX(oldx2);
player.sendMessage(ChatColor.YELLOW+Residence.getLanguage().getPhrase("Shifting")+" +X...");
}
else
player.sendMessage(ChatColor.YELLOW+Residence.getLanguage().getPhrase("Expanding")+" +X...");
}
if(d == Direction.MINUSZ)
{
int oldz = area.getLowLoc().getBlockZ();
oldz = oldz - amount;
area.getLowLoc().setZ(oldz);
if(shift)
{
int oldz2 = area.getHighLoc().getBlockZ();
oldz2 = oldz2 - amount;
area.getHighLoc().setZ(oldz2);
player.sendMessage(ChatColor.YELLOW+Residence.getLanguage().getPhrase("Shifting")+" -Z...");
}
else
player.sendMessage(ChatColor.YELLOW+Residence.getLanguage().getPhrase("Expanding")+" -Z...");
}
if(d == Direction.PLUSZ)
{
int oldz = area.getHighLoc().getBlockZ();
oldz = oldz + amount;
area.getHighLoc().setZ(oldz);
if(shift)
{
int oldz2 = area.getLowLoc().getBlockZ();
oldz2 = oldz2 + amount;
area.getLowLoc().setZ(oldz2);
player.sendMessage(ChatColor.YELLOW+Residence.getLanguage().getPhrase("Shifting")+" +Z...");
}
else
player.sendMessage(ChatColor.YELLOW+Residence.getLanguage().getPhrase("Expanding")+" +Z...");
}
playerLoc1.put(player.getName(), area.getHighLoc());
playerLoc2.put(player.getName(), area.getLowLoc());
}
private Direction getDirection(Player player)
{
float pitch = player.getLocation().getPitch();
float yaw = player.getLocation().getYaw();
if(pitch<-50)
return Direction.UP;
if(pitch > 50)
return Direction.DOWN;
if((yaw>45 && yaw<135) || (yaw<-45 && yaw>-135))
return Direction.PLUSX;
if((yaw>225 && yaw<315) || (yaw<-225 && yaw>-315))
return Direction.MINUSX;
if((yaw>135 && yaw<225) || (yaw<-135 && yaw>-225))
return Direction.MINUSZ;
if((yaw<45 || yaw>315) || (yaw>-45 || yaw<-315))
return Direction.PLUSZ;
return null;
}
}