package ru.serega6531.AnimatedItems;
import ...
public class AnimatedItems extends JavaPlugin implements Listener {
List<String>[] frames;
int frame, slot;
long speed = 5;
String name, lore, command;
Color[] colors = {
new Color(0, 0, 0),
new Color(0, 0, 170),
new Color(0, 170, 0),
new Color(0, 170, 170),
new Color(170, 0, 0),
new Color(170, 0, 170),
new Color(255, 170, 0),
new Color(170, 170, 170),
new Color(85, 85, 85),
new Color(85, 85, 255),
new Color(85, 255, 85),
new Color(85, 255, 255),
new Color(255, 85, 85),
new Color(255, 85, 255),
new Color(255, 255, 85),
new Color(255, 255, 255)
};
@EventHandler
public void onJoin(PlayerJoinEvent e){
giveBook(e.getPlayer());
}
/*@EventHandler
public void onDrop(PlayerDropItemEvent e){
if(e.getItemDrop().getItemStack().getItemMeta().getLore().contains("⬛")) e.setCancelled(true);
}*/
@EventHandler
public void onClickInventory(InventoryClickEvent e){
if(e.getSlot() == slot && e.getCurrentItem().getType() == Material.BOOK && command != null) {
Bukkit.dispatchCommand((CommandSender) e.getWhoClicked(), command);
e.setCancelled(true);
}
}
@EventHandler
public void onClick(PlayerInteractEvent e){
if(e.getMaterial() == Material.BOOK && e.getPlayer().getInventory().getHeldItemSlot() == slot && command != null){
Bukkit.dispatchCommand(e.getPlayer(), command);
}
}
private void giveBook(Player player){
ItemStack item = new ItemStack(Material.BOOK);
ItemMeta meta = item.getItemMeta();
meta.setDisplayName(name);
item.setItemMeta(meta);
player.getInventory().setItem(slot, item);
}
private BufferedImage[] getGIFFrames(File gif) throws IOException {
ImageReader reader = ImageIO.getImageReadersBySuffix("GIF").next();
ImageInputStream in = ImageIO.createImageInputStream(gif);
reader.setInput(in);
BufferedImage[] images = new BufferedImage[reader.getNumImages(true)];
for (int i = 0, count = reader.getNumImages(true); i < count; i++){
images[i] = reader.read(i);
}
return images;
}
@SuppressWarnings("unchecked")
public void onEnable() {
getDataFolder().mkdirs();
File file = new File(getDataFolder(), getConfig().getString("name", "image") + ".gif");
speed = getConfig().getLong("speed", 5L);
slot = getConfig().getInt("slot", 8);
name = getConfig().getString("title", "Name of item");
lore = getConfig().getString("lore", "Lore of item");
command = getConfig().getString("command");
if(!file.exists()){
getLogger().warning("No " + file.getName() + " in plugin directory.");
Bukkit.getPluginManager().disablePlugin(this);
return;
}
Bukkit.getPluginManager().registerEvents(this, this);
try {
BufferedImage[] fr = getGIFFrames(file);
frames = (List<String>[])new List[fr.length];
for(int i = 0; i < fr.length; i++){
frames[i] = frameAsStringList(fr[i]);
}
} catch (IOException e) {
e.printStackTrace();
}
Bukkit.getServer().getScheduler().scheduleSyncRepeatingTask(this, new Runnable() {
@Override
public void run() {
for(Player player : Bukkit.getOnlinePlayers()){
ItemStack item = player.getInventory().getItem(slot);
if(item != null && Material.BOOK.equals(item.getType())){
ItemMeta meta = item.getItemMeta();
meta.setLore(frames[frame]);
item.setItemMeta(meta);
player.getInventory().setItem(slot, item);
if(frame < frames.length - 1) frame++; else frame = 0;
}
}
}
}, 0L, speed);
}
private List<String> frameAsStringList(BufferedImage frame){
List<String> result = new ArrayList<String>();
result.add(lore);
String string = "";
for(int i = 0; i < frame.getWidth(); i++){
for(int j = 0; j < frame.getHeight(); j++){
string += colorToChatColor(new Color(frame.getRGB(j, i))) + "⬛";
}
result.add(string);
string = "";
}
return result;
}
private ChatColor colorToChatColor(Color color){
if(color.getAlpha() < 128) return ChatColor.WHITE;
double fi, f_min=1000000;
int i, index = 0;
for(i = 0; i < colors.length; i++){
fi = getDistance(color, colors[i]);
if(fi < f_min){
index = i;
f_min = fi;
}
}
return ChatColor.values()[index];
}
private double getDistance(Color c1, Color c2){
int r, g, b;
r = c2.getRed() - c1.getRed();
g = c2.getGreen() - c1.getGreen();
b = c2.getBlue() - c1.getBlue();
return 30 * r * r + 59 * g * g + 11 * b * b;
}
}