package pixelArt;
import java.awt.Color;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.tools.JavaFileManager.Location;
import org.bukkit.Bukkit;
import org.bukkit.DyeColor;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.event.Listener;
import org.bukkit.plugin.java.JavaPlugin;
public class PixelArt extends JavaPlugin implements Listener {
@Override
public void onEnable() {
// Register a new listener for player login
Bukkit.getPluginManager().registerEvents(this, this);
}
Logger logger = Logger.getLogger("Minecraft");
public boolean onCommand(CommandSender sender, Command cmd, String label,
String[] args) {
if (!(sender instanceof Player))
{
logger.severe("[pixelArt] Only in-game players can do this.");
return false;
}
String player = sender.getName();
Player ply = Bukkit.getPlayer(player);
boolean flipVertical = false;
String omitColor = "none";
if (args.length == 2)
{
if (args[0].equalsIgnoreCase("list"))
{
File[] files = new File(args[1]).listFiles();
StringBuilder sb = new StringBuilder();
sb.append("Files in this directory:\n");
for (File file : files)
{
if (file.getName().endsWith(".bmp"))
{
sb.append(file.getName().concat("\n"));
}
}
ply.sendMessage(sb.toString());
return true;
}
}
else if (args.length > 2) {
if (args[0].equalsIgnoreCase("art")) {
if (!args[1].endsWith(".bmp"))
{
ply.sendMessage("Bitmap (.bmp) files are only supported.");
return true;
}
if (args.length == 4)
{
omitColor = args[3].toLowerCase();
}
else if (args.length > 4)
{
ply.sendMessage("Too many agruments.");
return true;
}
File file = new File(args[1]);
if (file.exists() || args[1].startsWith("http"))
{
if (args[2].equalsIgnoreCase("v"))
{
flipVertical = true;
}
else if (!args[2].equalsIgnoreCase("h"))
{
ply.sendMessage("Please specify h or v for direction.");
return true;
}
org.bukkit.Location location = Bukkit.getPlayer(player).getLocation();
// if (!location.getWorld().getName().equalsIgnoreCase("flat_pixel"))
// {
// ply.sendMessage("You can only use this command in the Pixel Art world.");
// return true;
// }
BufferedImage bi;
try {
if (args[1].contains("://"))
{
bi = ImageIO.read(new URL(args[1]));
}
else
{
bi = ImageIO.read(file);
}
int x = bi.getWidth();
int y = bi.getHeight();
if (x > 200 || y > 200)
{
ply.sendMessage("Image is too big. Please reduce it to 200x200 maximum");
return true;
}
logger.warning("[pixelArt] " + player + " created " + args[1]);
for (int iY = 0; iY < y; iY++)
{
for (int iX = 0; iX < x; iX++)
{
boolean omit = false;
int a = bi.getRGB(iX,iY);
int r = (int)((Math.pow(256,3)+a) / 65536);
int g = (int) (((Math.pow(256,3)+a) / 256 ) % 256 );
int b = (int) ((Math.pow(256,3)+a)%256);
if (r < 0) r = 0;
if (g < 0) g = 0;
if (b < 0) b = 0;
if (r > 255) r = 255;
if (g > 255) g = 255;
if (b > 255) b = 255;
Color color = null;
try
{
color = new Color(r,g,b);
}
catch (Exception e)
{
logger.severe("Color A: " + a + " R: " + r + " G: " + g + " B: " + b);
}
double d = 1000000;
byte theColor = 0;
double e = colorDistance(color, new Color(24,20,20));
if (e < d)
{
if (omitColor.equals("black"))
{
omit = true;
}
else
{
omit = false;
}
d = e;
theColor = DyeColor.BLACK.getData();
}
Color testColor = new Color(228,228,228);
e = colorDistance(color, testColor);
if (e < d)
{
if (omitColor.equals("white"))
{
omit = true;
}
else
{
omit = false;
}
d = e;
theColor = DyeColor.WHITE.getData();
}
testColor = new Color(160, 167, 167);
e = colorDistance(color, testColor);
if (e < d)
{
if (omitColor.equals("silver"))
{
omit = true;
}
else
{
omit = false;
}
d = e;
theColor = DyeColor.SILVER.getData();
}
testColor = new Color(65, 65, 65);
e = colorDistance(color, testColor);
if (e < d)
{
if (omitColor.equals("gray"))
{
omit = true;
}
else
{
omit = false;
}
d = e;
theColor = DyeColor.GRAY.getData();
}
testColor = new Color(158, 43, 39);
e = colorDistance(color, testColor);
if (e < d)
{
if (omitColor.equals("red"))
{
omit = true;
}
else
{
omit = false;
}
d = e;
theColor = DyeColor.RED.getData();
}
testColor = new Color(234, 126, 53);
e = colorDistance(color, testColor);
if (e < d)
{
if (omitColor.equals("orange"))
{
omit = true;
}
else
{
omit = false;
}
d = e;
theColor = DyeColor.ORANGE.getData();
}
testColor = new Color(194, 181, 28);
e = colorDistance(color, testColor);
if (e < d)
{
if (omitColor.equals("yellow"))
{
omit = true;
}
else
{
omit = false;
}
d = e;
theColor = DyeColor.YELLOW.getData();
}
testColor = new Color(57, 186, 46);
e = colorDistance(color, testColor);
if (e < d)
{
if (omitColor.equals("lime"))
{
omit = true;
}
else
{
omit = false;
}
d = e;
theColor = DyeColor.LIME.getData();
}
testColor = new Color(54, 75, 24);
e = colorDistance(color, testColor);
if (e < d)
{
if (omitColor.equals("green"))
{
omit = true;
}
else
{
omit = false;
}
d = e;
theColor = DyeColor.GREEN.getData();
}
testColor = new Color(99, 135, 210);
e = colorDistance(color, testColor);
if (e < d)
{
if (omitColor.equals("lightblue"))
{
omit = true;
}
else
{
omit = false;
}
d = e;
theColor = DyeColor.LIGHT_BLUE.getData();
}
testColor = new Color(38, 113, 145);
e = colorDistance(color, testColor);
if (e < d)
{
if (omitColor.equals("cyan"))
{
omit = true;
}
else
{
omit = false;
}
d = e;
theColor = DyeColor.CYAN.getData();
}
testColor = new Color(37,49,147);
e = colorDistance(color, testColor);
if (e < d)
{
if (omitColor.equals("blue"))
{
omit = true;
}
else
{
omit = false;
}
d = e;
theColor = DyeColor.BLUE.getData();
}
testColor = new Color(126,52,191);
e = colorDistance(color, testColor);
if (e < d)
{
if (omitColor.equals("purple"))
{
omit = true;
}
else
{
omit = false;
}
d = e;
theColor = DyeColor.PURPLE.getData();
}
testColor = new Color(190, 73, 201);
e = colorDistance(color, testColor);
if (e < d)
{
if (omitColor.equals("magenta"))
{
omit = true;
}
else
{
omit = false;
}
d = e;
theColor = DyeColor.MAGENTA.getData();
}
testColor = new Color(217, 129, 153);
e = colorDistance(color, testColor);
if (e < d)
{
if (omitColor.equals("pink"))
{
omit = true;
}
else
{
omit = false;
}
d = e;
theColor = DyeColor.PINK.getData();
}
testColor = new Color(86,51,28);
e = colorDistance(color, testColor);
if (e < d)
{
if (omitColor.equals("brown"))
{
omit = true;
}
else
{
omit = false;
}
d = e;
theColor = DyeColor.BROWN.getData();
}
Block block;
if (flipVertical == false)
{
block = location.getWorld().getBlockAt((int)location.getX()+iX, (int)location.getY(), (int)location.getZ()+iY);
}
else
{
block = location.getWorld().getBlockAt((int)location.getX()+iX, (int)location.getY()-iY + y, (int)location.getZ());
}
if (!omit)
{
block.setType(Material.WOOL);
block.setData(theColor);
}
}
}
return true;
} catch (IOException e1) {
ply.sendMessage("There was a problem reading the file!");
}
}
else
{
ply.sendMessage("File not found!");
return true;
}
return false;
}
}
else
{
ply.sendMessage("/p art <filename.bmp> <h - horizontal, v - vertical> <optional color> ");
return true;
}
return false;
}
public static double colorDistance(Color c1, Color c2)
{
double d = Math.pow((c2.getRed()-c1.getRed()), 2)
+ Math.pow((c2.getGreen()-c1.getGreen()),2)
+ Math.pow((c2.getBlue()-c1.getBlue()),2);
return d;
}
}
Comments