package com.demigodsrpg.util; import com.demigodsrpg.util.misc.ImageUtil; import com.google.common.collect.Lists; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.OfflinePlayer; import org.bukkit.entity.Player; import org.bukkit.map.MapCanvas; import org.bukkit.map.MapPalette; import org.bukkit.map.MapRenderer; import org.bukkit.map.MapView; import java.awt.*; import java.awt.image.BufferedImage; public class BukkitImageUtil { /** * Convert an image a list of String objects. * * @param image The image to be converted. * @param symbol The symbol being used by the string. * @return The converted list. */ public static java.util.List<String> convertImage(BufferedImage image, String symbol) { // Working list. java.util.List<String> convertedImage = Lists.newArrayList(); // Get the image's height and width. int width = image.getWidth(); int height = image.getHeight(); // Iterate through the image, pixel by pixel. for (int i = 0; i < height; i++) { StringBuilder line = new StringBuilder(); for (int j = 0; j < width; j++) { // Get the color for each pixel. ChatColor color = ColorUtil.getChatColor(new Color(image.getRGB(j, i))); // Append to the line. line.append(color.toString()).append(symbol); } // Add to working list. convertedImage.add(line.toString()); } // Return finalized list. return convertedImage; } /** * Send an image to a player, in the form of an in-game Map. * * @param player The player to receive the map. * @param image The image to be converted. * @return The MapView the player receives. */ public static MapView sendMapImage(Player player, BufferedImage image) { MapView map = Bukkit.createMap(player.getWorld()); map = ImageRenderer.applyToMap(map, image); player.sendMap(map); return map; } /** * Retrieve the image of a player's head and make it suitable for chat. * * @param player The player who owns the head. * @return A list of strings to be sent in order to a player. * @throws NullPointerException */ public static java.util.List<String> getPlayerHead(OfflinePlayer player) throws NullPointerException { // Get the player's name. String playerName = player.getName(); try { // Find. BufferedImage image = ImageUtil.getPlayerHead(playerName); // Resize. image = ImageUtil.scaleImage(image, 16, 16); // Convert. // Return the converted head. return convertImage(image, "█"); } catch (Exception errored) { errored.printStackTrace(); Bukkit.getServer().getLogger().warning("[CensoredLib] " + "Something went wrong during an image conversion process."); } // Something went wrong. return null; } static class ImageRenderer extends MapRenderer { private BufferedImage image; public ImageRenderer(BufferedImage image) { this.image = MapPalette.resizeImage(image); } static MapView applyToMap(MapView map, BufferedImage image) { for (MapRenderer renderer : map.getRenderers()) map.removeRenderer(renderer); map.addRenderer(new ImageRenderer(image)); return map; } @Override public void render(MapView mapView, MapCanvas mapCanvas, Player player) { mapCanvas.drawImage(0, 0, image); } } }