Source

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

Posts Quoted:
Reply
Clear All Quotes