Started refactoring. Plugin is not working yet !

* NEW: Added proper license headers.
* NEW: New image loading management.
* NEW: Added a threaded worker to run the image loading/saving.
* OPT: Moved images to the images/ subdirectory.
This commit is contained in:
Prokopyl 2015-03-16 20:40:44 +01:00
parent bdf35e9eef
commit 1cb42e4965
33 changed files with 876 additions and 2087 deletions

21
licenseheader.txt Normal file
View File

@ -0,0 +1,21 @@
<#if licenseFirst??>
${licenseFirst}
</#if>
${licensePrefix}Copyright (C) 2013 Moribus
${licensePrefix}Copyright (C) 2015 ProkopyL <prokopylmc@gmail.com>
${licensePrefix?replace(" +$", "", "r")}
${licensePrefix}This program is free software: you can redistribute it and/or modify
${licensePrefix}it under the terms of the GNU General Public License as published by
${licensePrefix}the Free Software Foundation, either version 3 of the License, or
${licensePrefix}(at your option) any later version.
${licensePrefix?replace(" +$", "", "r")}
${licensePrefix}This program is distributed in the hope that it will be useful,
${licensePrefix}but WITHOUT ANY WARRANTY; without even the implied warranty of
${licensePrefix}MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
${licensePrefix}GNU General Public License for more details.
${licensePrefix?replace(" +$", "", "r")}
${licensePrefix}You should have received a copy of the GNU General Public License
${licensePrefix}along with this program. If not, see <http://www.gnu.org/licenses/>.
<#if licenseLast??>
${licenseLast}
</#if>

18
nb-configuration.xml Normal file
View File

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="UTF-8"?>
<project-shared-configuration>
<!--
This file contains additional configuration written by modules in the NetBeans IDE.
The configuration is intended to be shared among all the users of project and
therefore it is assumed to be part of version control checkout.
Without this configuration present, some functionality in the IDE may be limited or fail altogether.
-->
<properties xmlns="http://www.netbeans.org/ns/maven-properties-data/1">
<!--
Properties that influence various parts of the IDE, especially code formatting and the like.
You can copy and paste the single properties, into the pom.xml file and the IDE will pick them up.
That way multiple projects can share the same settings (useful for formatting rules for example).
Any value defined here will override the pom.xml file value but is only applicable to the current project.
-->
<netbeans.hint.licensePath>${project.basedir}/licenseheader.txt</netbeans.hint.licensePath>
</properties>
</project-shared-configuration>

View File

@ -1,30 +1,38 @@
/*
* Copyright (C) 2013 Moribus
* Copyright (C) 2015 ProkopyL <prokopylmc@gmail.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package fr.moribus.imageonmap;
import fr.moribus.imageonmap.commands.MapToolCommand;
import fr.moribus.imageonmap.commands.ImageRenduCommande;
import fr.moribus.imageonmap.image.ImageIOExecutor;
import fr.moribus.imageonmap.image.MapInitEvent;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Set;
import java.util.logging.Level;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.inventory.ItemStack;
import org.bukkit.plugin.java.JavaPlugin;
import fr.moribus.imageonmap.map.ImageMap;
import fr.moribus.imageonmap.map.SingleMap;
public final class ImageOnMap extends JavaPlugin
{
static private final String IMAGES_DIRECTORY_NAME = "images";
static private ImageOnMap plugin;
private final File imagesDirectory;
public ImageOnMap()
{
imagesDirectory = new File(this.getDataFolder(), IMAGES_DIRECTORY_NAME);
plugin = this;
}
@ -32,170 +40,36 @@ public final class ImageOnMap extends JavaPlugin
{
return plugin;
}
private boolean dossierCree;
private FileConfiguration customConfig = null;
private File customConfigFile = null;
/* liste contenant les maps ne pouvant être placé dans l'inventaire du joueur. Je le fous ici afin que ce soit
accessible de partout dans le plugin. */
private HashMap<String, ArrayList<ItemStack>> cache = new HashMap<String, ArrayList<ItemStack>>();
// Index des maps chargées sur le serveur
public ArrayList<Short> mapChargee = new ArrayList<Short>();
public File getImagesDirectory() {return imagesDirectory;}
public File getImageFile(short mapID)
{
return new File(imagesDirectory, "map"+mapID+".png");
}
@Override
public void onEnable()
{
// On crée si besoin le dossier les images seront stockées
dossierCree = ImgUtility.CreeRepImg(this);
// On ajoute si besoin les params par défaut du plugin
ImgUtility.CreeSectionConfig(this);
if (getConfig().get("map_path") == null)
// Creating the images directory if necessary
if(!imagesDirectory.exists())
{
getConfig().set("map_path", getServer().getWorlds().get(0).getName());
}
else if (getConfig().get("map_path") != getServer().getWorlds().get(0).getName())
{
getConfig().set("map_path", getServer().getWorlds().get(0).getName());
}
if (getConfig().getBoolean("import-maps"))
{
ImgUtility.ImporterConfig(this);
}
if (this.getConfig().getBoolean("collect-data"))
{
try
if(!imagesDirectory.mkdirs())
{
MetricsLite metrics = new MetricsLite(this);
metrics.start();
getLogger().info("Metrics launched for ImageOnMap");
}
catch (IOException e)
{
PluginLogger.LogError("Failed to start Plugin metrics", e);
PluginLogger.LogError("FATAL : Could not create the images directory.", null);
this.setEnabled(false);
return;
}
}
if (dossierCree)
{
getCommand("tomap").setExecutor(new ImageRenduCommande(this));
getCommand("maptool").setExecutor(new MapToolCommand(this));
getServer().getPluginManager().registerEvents(new SendMapOnFrameEvent(this), this);
getServer().getPluginManager().registerEvents(new SendMapOnInvEvent(this), this);
this.saveDefaultConfig();
//ChargerMap();
}
else
{
getLogger().info("[ImageOnMap] An error occured ! Unable to create Image folder. Plugin will NOT work !");
this.setEnabled(false);
}
MetricsLite.startMetrics();
ImageIOExecutor.start();
getServer().getPluginManager().registerEvents(new MapInitEvent(), this);
}
@Override
public void onDisable()
{
getLogger().info("Stopping ImageOnMap");
ImageIOExecutor.stop();
}
public void ChargerMap()
{
Set<String> cle = getCustomConfig().getKeys(false);
int nbMap = 0, nbErr = 0;
for (String s : cle)
{
if (getCustomConfig().getStringList(s).size() >= 3)
{
ImageMap map;
String stringID = getCustomConfig().getStringList(s).get(0);
try
{
map = new SingleMap(Short.valueOf(stringID));
map.load();
nbMap++;
}
catch (NumberFormatException e)
{
PluginLogger.LogWarning("Could not parse map ID from config", e);
nbErr++;
}
catch (IOException e)
{
PluginLogger.LogError("Could not load map ID " + stringID, e);
nbErr++;
}
}
}
PluginLogger.LogInfo(nbMap + " maps successfuly loaded.");
if (nbErr != 0)
PluginLogger.LogWarning(nbErr + " couldn't be loaded.");
}
/* Méthodes pour charger / recharger / sauvegarder
* le fichier conf des maps (map.yml).
* Je les ai juste copié depuis un tuto du wiki Bukkit.
*/
@SuppressWarnings("deprecation")
public void reloadCustomConfig()
{
if (customConfigFile == null)
{
customConfigFile = new File(getDataFolder(), "map.yml");
}
customConfig = YamlConfiguration.loadConfiguration(customConfigFile);
// Look for defaults in the jar
InputStream defConfigStream = this.getResource("map.yml");
if (defConfigStream != null)
{
YamlConfiguration defConfig = YamlConfiguration.loadConfiguration(defConfigStream);
customConfig.setDefaults(defConfig);
}
}
public FileConfiguration getCustomConfig()
{
if (customConfig == null)
{
reloadCustomConfig();
}
return customConfig;
}
public void saveCustomConfig()
{
if (customConfig == null || customConfigFile == null)
{
return;
}
try
{
getCustomConfig().save(customConfigFile);
}
catch (IOException ex)
{
getLogger().log(Level.SEVERE, "Could not save config to " + customConfigFile, ex);
}
}
public ArrayList<ItemStack> getRemainingMaps(String j)
{
return cache.get(j);
}
public void setRemainingMaps(String j, ArrayList<ItemStack> remaining)
{
cache.put(j, remaining);
}
public void removeRemaingMaps(String j)
{
cache.remove(j);
}
}

View File

@ -1,266 +0,0 @@
package fr.moribus.imageonmap;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Set;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.command.BlockCommandSender;
import org.bukkit.command.CommandSender;
import org.bukkit.command.ConsoleCommandSender;
import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.map.MapView;
import fr.moribus.imageonmap.map.SingleMap;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.image.BufferedImage;
public class ImgUtility
{
// Vérifie que c'est bien un joueur qui exécute la commande
static public boolean VerifierIdentite(CommandSender sender)
{
if (sender instanceof Player)
{
return true;
}
else if (sender instanceof ConsoleCommandSender)
{System.out.println(ChatColor.RED + "Cette commande ne peut être utilisée dans la console !"); return false;}
else if (sender instanceof BlockCommandSender)
{System.out.println(ChatColor.RED + "Cette commande ne peut être utilisée par un bloc-commande !"); return false;}
else
{System.out.println(ChatColor.RED + "Cette commande ne peut être lancée de cette façon !"); return false;}
}
// Creation du dossier sera stocké les images
static public boolean CreeRepImg(ImageOnMap plugin)
{
File dossier;
dossier = new File(plugin.getDataFolder().getPath() + "/Image");
if (!dossier.exists())
{
return dossier.mkdirs();
}
else
return true;
}
static void CreeSectionConfig(ImageOnMap plugin)
{
if(plugin.getConfig().get("Limit-map-by-server") == null)
plugin.getConfig().set("Limit-map-by-server", 0);
if(plugin.getConfig().get("Limit-map-by-player") == null)
plugin.getConfig().set("Limit-map-by-player", 0);
if(plugin.getConfig().get("collect-data") == null)
plugin.getConfig().set("collect-data", true);
if(plugin.getConfig().get("import-maps") == null)
plugin.getConfig().set("import-maps", true);
if(plugin.getConfig().get("send-entire-maps") == null)
plugin.getConfig().set("send-entire-maps", 0);
plugin.saveConfig();
}
static int getNombreDeMaps(ImageOnMap plugin)
{
int nombre = 0;
Set<String> cle = plugin.getCustomConfig().getKeys(false);
for (String s: cle)
{
if(plugin.getCustomConfig().getStringList(s).size() >= 3)
{
nombre++;
}
}
return nombre;
}
static int getNombreDeMapsParJoueur(ImageOnMap plugin, String pseudo)
{
int nombre = 0;
Set<String> cle = plugin.getCustomConfig().getKeys(false);
for (String s: cle)
{
if(plugin.getCustomConfig().getStringList(s).size() >= 3 && plugin.getCustomConfig().getStringList(s).get(2).contentEquals(pseudo))
{
nombre++;
}
}
return nombre;
}
static boolean EstDansFichier(ImageOnMap plugin, short id)
{
Set<String> cle = plugin.getCustomConfig().getKeys(false);
for (String s: cle)
{
if(plugin.getCustomConfig().getStringList(s).size() >= 3 && Short.parseShort(plugin.getCustomConfig().getStringList(s).get(0)) == id)
{
return true;
}
}
return false;
}
public static boolean EstDansFichier(ImageOnMap plugin, short id, String pseudo)
{
Set<String> cle = plugin.getCustomConfig().getKeys(false);
for (String s: cle)
{
if(plugin.getCustomConfig().getStringList(s).size() >= 3 && Short.parseShort(plugin.getCustomConfig().getStringList(s).get(0)) == id && plugin.getCustomConfig().getStringList(s).get(2).contentEquals(pseudo))
{
return true;
}
}
return false;
}
static boolean ImporterConfig(ImageOnMap plugin)
{
Set<String> cle = plugin.getConfig().getKeys(false);
plugin.getLogger().info("Start importing maps config to maps.yml...");
int i = 0;
for (String s: cle)
{
if(plugin.getConfig().getStringList(s).size() >= 3)
{
//plugin.getLogger().info("Importing "+ plugin.getConfig().getStringList(s).get(1));
ArrayList<String> liste = new ArrayList<String>();
liste.add(String.valueOf(plugin.getConfig().getStringList(s).get(0)));
liste.add(plugin.getConfig().getStringList(s).get(1));
liste.add(plugin.getConfig().getStringList(s).get(2));
plugin.getCustomConfig().set(plugin.getConfig().getStringList(s).get(1), liste);
plugin.getConfig().set(s, null);
i++;
}
}
plugin.getLogger().info("Importing finished. "+ i+ "maps were imported");
plugin.getConfig().set("import-maps", false);
plugin.saveConfig();
plugin.saveCustomConfig();
return true;
}
// Fait la même chose que EstDansFichier() mais en retournant un objet MapView
@SuppressWarnings("deprecation")
static MapView getMap(ImageOnMap plugin, short id)
{
MapView map;
if(!ImgUtility.EstDansFichier(plugin, id))
{
return null;
}
map = Bukkit.getMap(id);
if(map == null)
{
plugin.getLogger().warning("Map#"+ id+ " exists in maps.yml but not in the world folder !");
return null;
}
return map;
}
static public boolean RemoveMap(ImageOnMap plugin, short id)
{
@SuppressWarnings("deprecation")
MapView carte = Bukkit.getMap(id);
Set<String> cle = plugin.getCustomConfig().getKeys(false);
for (String s: cle)
{
if(plugin.getCustomConfig().getStringList(s).size() >= 3)
{
if(carte == null && id == Short.parseShort(plugin.getCustomConfig().getStringList(s).get(0)))
{
//joueur.sendMessage("Suppression de la map dans fichier conf");
plugin.getCustomConfig().set(s, null);
plugin.saveCustomConfig();
File map = new File("./plugins/ImageOnMap/Image/" + s + ".png");
boolean isDeleted = map.delete();
//joueur.sendMessage("The picture have been deleted");
if(isDeleted)
return true;
else
{
plugin.getLogger().warning("Picture "+ s+ ".png cannot be deleted !");
return false;
}
}
else if(id == Short.parseShort(plugin.getCustomConfig().getStringList(s).get(0)))
{
//joueur.sendMessage("Suppression de la map dans fichier conf + fichier dat");
SingleMap.SupprRendu(carte);
/*if(plugin.getConfig().get("delete") != null);
{
ArrayList<String> ListeSuppr = (ArrayList<String>) plugin.getConfig().getStringList("delete");
ListeSuppr.add(plugin.getCustomConfig().getStringList(s).get(0));
plugin.getConfig().set("delete", ListeSuppr);
}*/
plugin.getCustomConfig().set(s, null);
plugin.saveCustomConfig();
plugin.saveConfig();
File map = new File("./plugins/ImageOnMap/Image/" + s + ".png");
boolean isDeleted = map.delete();
//joueur.sendMessage("DEBUG: booléen isDeleted :"+ isDeleted+ "; Nom de la map : "+ plugin.getServer().getWorlds().get(0).getName());
//joueur.sendMessage("The map has been deleted");
if(isDeleted)
return true;
else
{
plugin.getLogger().warning("Picture "+ s+ ".png cannot be deleted !");
return false;
}
}
}
}
//plugin.getLogger().info("No map with id"+ id+ " was found");
return false;
}
static public ArrayList<String> getListMapByPlayer(ImageOnMap plugin, String pseudo)
{
ArrayList<String> listeMap = new ArrayList<String>();
Set<String> cle = plugin.getCustomConfig().getKeys(false);
for (String s: cle)
{
if(plugin.getCustomConfig().getStringList(s).size() >= 3 && pseudo.equalsIgnoreCase(plugin.getCustomConfig().getStringList(s).get(2)))
{
listeMap.add(plugin.getCustomConfig().getStringList(s).get(0));
}
}
return listeMap;
}
static public void AddMap(ItemStack map, Inventory inv, ArrayList<ItemStack> restant)
{
HashMap<Integer,ItemStack> reste = inv.addItem(map);
if(!reste.isEmpty())
{
restant.add(reste.get(0));
}
}
public static BufferedImage scaleImage(Image image, int width, int height)
{
BufferedImage newImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
Graphics2D g = newImage.createGraphics();
g.drawImage(image, 0, 0, width, height, null);
g.dispose();
return newImage;
}
}

View File

@ -50,7 +50,25 @@ import java.util.UUID;
import java.util.logging.Level;
import java.util.zip.GZIPOutputStream;
public class MetricsLite {
public class MetricsLite
{
/**
* Starts MetricsLite, unless disabled in config
*/
static public void startMetrics()
{
if(!PluginConfiguration.COLLECT_DATA.getBoolean()) return;
try
{
MetricsLite metrics = new MetricsLite(ImageOnMap.getPlugin());
metrics.start();
}
catch (IOException e)
{
PluginLogger.LogError("Failed to start MetricsLite", e);
}
}
/**
* The current revision number

View File

@ -1,43 +0,0 @@
package fr.moribus.imageonmap;
import java.util.HashMap;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerLoginEvent;
import org.bukkit.event.player.PlayerQuitEvent;
public class PlayerListener implements Listener
{
ImageOnMap plugin;
HashMap<String, SendEntireMapTask> hmap;
int send;
PlayerListener(ImageOnMap p)
{
plugin = p;
hmap = new HashMap<String, SendEntireMapTask>();
send = plugin.getConfig().getInt("send-entire-maps");
}
@EventHandler
public void OnPlayerLogin(PlayerLoginEvent event)
{
if(send > 0)
{
Player joueur = event.getPlayer();
hmap.put(joueur.getName(), new SendEntireMapTask(plugin, event.getPlayer()));
hmap.get(joueur.getName()).runTaskTimer(plugin, 40, 20);
}
}
@EventHandler
public void OnPlayerLeft(PlayerQuitEvent event)
{
if(send > 0)
{
Player joueur = event.getPlayer();
hmap.get(joueur.getName()).cancel();
}
}
}

View File

@ -0,0 +1,79 @@
/*
* Copyright (C) 2013 Moribus
* Copyright (C) 2015 ProkopyL <prokopylmc@gmail.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package fr.moribus.imageonmap;
import org.bukkit.configuration.file.FileConfiguration;
public enum PluginConfiguration
{
//Configuration field Names, with default values
COLLECT_DATA("collect-data", true),
MAP_GLOBAL_LIMIT("map-global-limit", 0),
MAP_PLAYER_LIMIT("map-player-limit", 0);
private final String fieldName;
private final Object defaultValue;
private PluginConfiguration(String fieldName, Object defaultValue)
{
this.fieldName = fieldName;
this.defaultValue = defaultValue;
}
public Object get()
{
return getConfig().get(fieldName, defaultValue);
}
public Object getDefaultValue()
{
return defaultValue;
}
public boolean isDefaultValue()
{
return get().equals(defaultValue);
}
@Override
public String toString()
{
return get().toString();
}
public String getString()
{
return getConfig().getString(fieldName, (String)defaultValue);
}
public int getInteger()
{
return getConfig().getInt(fieldName, (Integer)defaultValue);
}
public boolean getBoolean()
{
return getConfig().getBoolean(fieldName, (Boolean)defaultValue);
}
static public FileConfiguration getConfig()
{
return ImageOnMap.getPlugin().getConfig();
}
}

View File

@ -1,10 +1,11 @@
/*
* Copyright (C) 2014 ProkopyL
* Copyright (C) 2013 Moribus
* Copyright (C) 2015 ProkopyL <prokopylmc@gmail.com>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
@ -12,8 +13,7 @@
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package fr.moribus.imageonmap;

View File

@ -1,107 +0,0 @@
package fr.moribus.imageonmap;
import fr.moribus.imageonmap.image.Renderer;
import fr.moribus.imageonmap.image.ImageRendererThread;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Set;
import javax.imageio.ImageIO;
import org.bukkit.Bukkit;
import org.bukkit.map.MapPalette;
import org.bukkit.map.MapView;
public class SavedMap
{
ImageOnMap plugin;
String nomImg, nomJoueur, nomMonde;
short idMap;
BufferedImage image;
boolean loaded = false;
SavedMap(ImageOnMap plug, String nomJ, short id, BufferedImage img, String nomM)
{
plugin = plug;
nomJoueur = nomJ;
idMap = id;
image = img;
nomImg = "map" + id;
nomMonde = nomM;
loaded = true;
}
SavedMap(ImageOnMap plug, short id) throws IOException
{
idMap = id;
plugin = plug;
Set<String> cle = plugin.getCustomConfig().getKeys(false);
for (String s : cle)
{
if (plugin.getCustomConfig().getStringList(s).size() >= 3 && Short.valueOf(plugin.getCustomConfig().getStringList(s).get(0)) == id)
{
//System.out.println(tmp);
//MapView carte = Bukkit.getMap(Short.parseShort(plugin.getConfig().getStringList(s).get(0)));
nomImg = plugin.getCustomConfig().getStringList(s).get(1);
nomJoueur = plugin.getCustomConfig().getStringList(s).get(2);
image = ImageIO.read(new File("./plugins/ImageOnMap/Image/" + nomImg + ".png"));
loaded = true;
break;
}
}
if (!loaded)
{
//plugin.getLogger().info("No map was loaded");
}
}
public void saveMap() throws IOException
{
if (!loaded)
{
PluginLogger.LogWarning("Tried to save a map that wasn't loaded. ID:" + idMap);
return;
}
plugin.getLogger().info("Saving map " + idMap);
// Enregistrement de l'image sur le disque dur
File outputfile = new File("./plugins/ImageOnMap/Image/" + nomImg + ".png");
ImageIO.write(MapPalette.resizeImage(image), "png", outputfile);
// Enregistrement de la map dans la config
ArrayList<String> liste = new ArrayList<String>();
liste.add(String.valueOf(idMap));
liste.add(nomImg);
liste.add(nomJoueur);
liste.add(nomMonde);
plugin.getCustomConfig().set(nomImg, liste);
plugin.saveCustomConfig();
if (!plugin.mapChargee.contains(idMap))
{
plugin.mapChargee.add(idMap);
}
}
@SuppressWarnings("deprecation")
public Boolean LoadMap()
{
MapView carte = Bukkit.getMap(idMap);
if (carte != null && loaded)
{
ImageRendererThread.SupprRendu(carte);
carte.addRenderer(new Renderer(image));
if (!plugin.mapChargee.contains(idMap))
{
plugin.mapChargee.add(idMap);
}
return true;
}
else
{
return false;
}
}
}

View File

@ -1,155 +0,0 @@
package fr.moribus.imageonmap;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Set;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;
public class SavedPoster
{
ImageOnMap plugin;
short[] ids;
private FileConfiguration customConfig = null;
private File customConfigFile = null;
String posterName, playerName;
public SavedPoster(ImageOnMap plugin, short[] ids, String playerName, String posterName)
{
this.ids = ids;
this.plugin = plugin;
this.playerName = playerName;
this.posterName = posterName;
}
public SavedPoster(ImageOnMap plugin, short[] ids, String playerName)
{
this(plugin, ids, playerName, null);
}
public SavedPoster(ImageOnMap plugin)
{
this(plugin, null, null, null);
}
public SavedPoster(ImageOnMap p, String id)
{
plugin = p;
posterName = id;
ArrayList<String> liste = (ArrayList<String>) getCustomConfig().getStringList(posterName);
if (!liste.isEmpty() || liste != null)
{
playerName = liste.get(0);
ids = new short[liste.size() - 1];
for (int i = 0; i < ids.length; i++)
{
ids[i] = Short.parseShort(liste.get(i + 1));
}
}
}
public String Save() throws IOException
{
int increment = increment();
ArrayList<String> liste = new ArrayList<String>();
liste.add(playerName);
for (int i = 0; i < ids.length; i++)
{
liste.add(String.valueOf(ids[i]));
}
posterName = "poster" + increment;
getCustomConfig().set(posterName, liste);
saveCustomConfig();
return posterName;
}
public void Remove() throws IOException
{
if (posterName == null || posterName.isEmpty()) return;
for (int i = 0; i < ids.length; i++)
{
ImgUtility.RemoveMap(plugin, ids[i]);
}
getCustomConfig().set(posterName, null);
saveCustomConfig();
}
int increment()
{
int i;
if (getCustomConfig().get("IdCount") != null)
{
i = getCustomConfig().getInt("IdCount");
}
else
{
i = 0;
}
i++;
this.getCustomConfig().set("IdCount", i);
return i;
}
String getId()
{
return posterName;
}
public ArrayList<String> getListMapByPlayer(ImageOnMap plugin, String pseudo)
{
ArrayList<String> listeMap = new ArrayList<String>();
Set<String> cle = getCustomConfig().getKeys(false);
for (String s : cle)
{
if (getCustomConfig().getStringList(s).size() > 1 && pseudo.equalsIgnoreCase(getCustomConfig().getStringList(s).get(0)))
{
listeMap.add(s);
}
}
return listeMap;
}
/* Méthodes pour charger / recharger / sauvegarder
* le fichier conf des Posters (poster.yml).
* Je les ai juste copié depuis un tuto du wiki Bukkit...
*/
@SuppressWarnings("deprecation")
public void reloadCustomConfig()
{
if (customConfigFile == null)
{
customConfigFile = new File(plugin.getDataFolder(), "poster.yml");
}
customConfig = YamlConfiguration.loadConfiguration(customConfigFile);
// Look for defaults in the jar
InputStream defConfigStream = plugin.getResource("poster.yml");
if (defConfigStream != null)
{
YamlConfiguration defConfig = YamlConfiguration.loadConfiguration(defConfigStream);
customConfig.setDefaults(defConfig);
}
}
public FileConfiguration getCustomConfig()
{
if (customConfig == null)
{
reloadCustomConfig();
}
return customConfig;
}
public void saveCustomConfig() throws IOException
{
if (customConfig == null || customConfigFile == null)
{
return;
}
getCustomConfig().save(customConfigFile);
}
}

View File

@ -1,81 +0,0 @@
package fr.moribus.imageonmap;
import java.util.ArrayList;
import java.util.List;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.map.MapView;
import org.bukkit.scheduler.BukkitRunnable;
public class SendEntireMapTask extends BukkitRunnable
{
ImageOnMap plugin;
Player joueur;
ArrayList<Short> listeMap;
List<Short> partListe;
boolean allsent;
int index, toIndex, nbSend;
SendEntireMapTask(ImageOnMap p, Player j)
{
plugin = p;
joueur = j;
allsent = false;
index = 0;
nbSend = plugin.getConfig().getInt("send-entire-maps");
toIndex = nbSend;
}
@SuppressWarnings("deprecation")
@Override
public void run()
{
if(nbSend > 0)
{
if(listeMap == null)
{
//plugin.getLogger().info("test de nullité");
listeMap = new ArrayList<Short>();
listeMap.addAll(plugin.mapChargee);
}
else if(listeMap.equals(plugin.mapChargee) != true)
{
//plugin.getLogger().info("taille des maps : " + listeMap.size()+ " ; "+ plugin.mapChargee.size());
//plugin.getLogger().info("test d'égalité");
listeMap.clear();
listeMap.addAll(plugin.mapChargee);
allsent = false;
}
if(!allsent)
{
//plugin.getLogger().info("test 1");
if(toIndex > listeMap.size())
{
//plugin.getLogger().info("test 3");
partListe = listeMap.subList(index, listeMap.size());
index = listeMap.size();
toIndex = listeMap.size() + nbSend;
allsent = true;
}
else
{
//plugin.getLogger().info("taille des index : " + index+ " ; "+ toIndex+ ". taille de la map : "
// + listeMap.size());
//plugin.getLogger().info("test 2");
partListe = listeMap.subList(index, toIndex);
index = toIndex;
toIndex += nbSend;
}
for(int i= 0; i< partListe.size(); i++)
{
//plugin.getLogger().info("test 4");
MapView map = Bukkit.getMap(partListe.get(i));
joueur.sendMap(map);
}
}
}
}
}

View File

@ -1,57 +0,0 @@
package fr.moribus.imageonmap;
import java.util.ArrayList;
import org.bukkit.Chunk;
import org.bukkit.Material;
import org.bukkit.entity.Entity;
import org.bukkit.entity.ItemFrame;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.world.ChunkLoadEvent;
import org.bukkit.inventory.ItemStack;
import fr.moribus.imageonmap.map.SingleMap;
public class SendMapOnFrameEvent implements Listener
{
ImageOnMap plugin;
Chunk chunk;
Entity[] entites;
ItemFrame frame;
SendMapOnFrameEvent(ImageOnMap plug)
{
plugin = plug;
}
@EventHandler
public void onChunkLoad(ChunkLoadEvent event)
{
chunk = event.getChunk();
entites = chunk.getEntities().clone();
for (Entity entite : entites)
{
if (entite instanceof ItemFrame)
{
ArrayList<Short> ListeId = plugin.mapChargee;
frame = (ItemFrame) entite;
ItemStack stack = frame.getItem();
if (stack.getType() == Material.MAP && !ListeId.contains(stack.getDurability()))
{
try
{
new SingleMap(stack.getDurability()).load();
}
catch (Exception e)
{
PluginLogger.LogWarning("Could not send frame map", e);
}
}
}
}
}
}

View File

@ -1,59 +0,0 @@
package fr.moribus.imageonmap;
import java.util.ArrayList;
import java.util.Set;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerItemHeldEvent;
import org.bukkit.inventory.ItemStack;
import fr.moribus.imageonmap.map.SingleMap;
public class SendMapOnInvEvent implements Listener
{
ImageOnMap plugin;
SendMapOnInvEvent(ImageOnMap p)
{
plugin = p;
}
@EventHandler
public void onPlayerInv(PlayerItemHeldEvent event)
{
Player joueur = event.getPlayer();
int slot = event.getNewSlot();
ItemStack stack = joueur.getInventory().getItem(slot);
if (stack != null && stack.getType() == Material.MAP)
{
ArrayList<Short> listeId = plugin.mapChargee;
Set<String> cle = plugin.getCustomConfig().getKeys(false);
for (String s : cle)
{
if (!listeId.contains(stack.getDurability()))
{
if (plugin.getCustomConfig().getStringList(s).get(0).equals(String.valueOf(stack.getDurability())))
{
try
{
new SingleMap(stack.getDurability()).load();
}
catch (Exception e)
{
PluginLogger.LogWarning("Could not send inventory map.", e);
}
}
}
}
}
}
}

View File

@ -1,29 +0,0 @@
package fr.moribus.imageonmap;
import java.awt.image.BufferedImage;
import org.bukkit.entity.Player;
import fr.moribus.imageonmap.map.ImageMap;
import java.io.IOException;
import java.net.URL;
public class TacheTraitementMajMap extends TacheTraitementMap
{
private ImageMap m;
public TacheTraitementMajMap(ImageMap m, URL url, Player joueur)
{
super(url);
setJoueur(joueur);
this.m = m;
}
@Override
public void traiterMap(BufferedImage img) throws IOException
{
m.setImage(img);
m.save();
m.send(getJoueur());
}
}

View File

@ -1,194 +0,0 @@
package fr.moribus.imageonmap;
import fr.moribus.imageonmap.image.DownloadImageThread;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.PlayerInventory;
import org.bukkit.scheduler.BukkitRunnable;
public abstract class TacheTraitementMap extends BukkitRunnable
{
private Player joueur;
private DownloadImageThread renduImg;
private PlayerInventory inv;
private ItemStack map;
private ImageOnMap plugin;
private boolean resized, renamed;
private ExecutorService dlImg;
private Future<BufferedImage> futurDlImg;
private int compteurExec;
protected TacheTraitementMap(URL url)
{
renduImg = new DownloadImageThread(url);
dlImg = Executors.newSingleThreadExecutor();
futurDlImg = dlImg.submit(renduImg);
plugin = (ImageOnMap) Bukkit.getPluginManager().getPlugin("ImageOnMap");
}
public TacheTraitementMap(Player j, URL url, boolean rs, boolean rn)
{
this(url);
joueur = j;
inv = joueur.getInventory();
resized = rs;
renamed = rn;
}
@Override
public void run()
{
compteurExec = 0;
if (!futurDlImg.isDone())
{
compteurExec++;
if (compteurExec > 20)
{
joueur.sendMessage("TIMEOUT: the render took too many time");
futurDlImg.cancel(true);
cancel();
}
}
else
{
if (!futurDlImg.isCancelled())
{
cancel();
int nbImage = 1;
if (plugin.getConfig().getInt("Limit-map-by-server") != 0 && nbImage + ImgUtility.getNombreDeMaps(plugin) > plugin.getConfig().getInt("Limit-map-by-server"))
{
joueur.sendMessage("ERROR: cannot render " + nbImage + " picture(s): the limit of maps per server would be exceeded.");
return;
}
if (!joueur.hasPermission("imageonmap.nolimit"))
{
if (plugin.getConfig().getInt("Limit-map-by-player") != 0 && nbImage + ImgUtility.getNombreDeMapsParJoueur(plugin, joueur.getName()) > plugin.getConfig().getInt("Limit-map-by-player"))
{
joueur.sendMessage(ChatColor.RED + "ERROR: cannot render " + nbImage + " picture(s): the limit of maps allowed for you (per player) would be exceeded.");
return;
}
}
try
{
BufferedImage dlimg = futurDlImg.get();
traiterMap(dlimg);
joueur.sendMessage("Image successfuly downloaded !");
}
catch (InterruptedException ex)
{
joueur.sendMessage(ChatColor.RED + "Download task has been interrupted unexpectedly. Check server console for details.");
PluginLogger.LogError("Download task has been interrupted", ex);
}
catch (ExecutionException ex)
{
joueur.sendMessage(ChatColor.RED + "Download failed : " + ex.getMessage());
joueur.sendMessage(ChatColor.RED + "Please check your URL");
}
catch(IOException ex)
{
joueur.sendMessage(ChatColor.RED + "Failed to process the image. Check server console for details.");
PluginLogger.LogError("Image processing failed", ex);
}
}
else
{
joueur.sendMessage(ChatColor.RED + "An error occured. See the console for details");
}
}
}
public abstract void traiterMap(BufferedImage img) throws IOException;
protected Player getJoueur()
{
return joueur;
}
protected void setJoueur(Player joueur)
{
this.joueur = joueur;
}
protected DownloadImageThread getRenduImg()
{
return renduImg;
}
protected void setRenduImg(DownloadImageThread renduImg)
{
this.renduImg = renduImg;
}
protected PlayerInventory getInv()
{
return inv;
}
protected void setInv(PlayerInventory inv)
{
this.inv = inv;
}
protected ItemStack getMap()
{
return map;
}
protected void setMap(ItemStack map)
{
this.map = map;
}
protected ImageOnMap getPlugin()
{
return plugin;
}
protected void setPlugin(ImageOnMap plugin)
{
this.plugin = plugin;
}
protected boolean isResized()
{
return resized;
}
protected void setResized(boolean resized)
{
this.resized = resized;
}
protected boolean isRenamed()
{
return renamed;
}
protected void setRenamed(boolean renamed)
{
this.renamed = renamed;
}
protected int getCompteurExec()
{
return compteurExec;
}
protected void setCompteurExec(int compteurExec)
{
this.compteurExec = compteurExec;
}
}

View File

@ -1,32 +0,0 @@
package fr.moribus.imageonmap;
import java.awt.image.BufferedImage;
import org.bukkit.entity.Player;
import fr.moribus.imageonmap.map.ImageMap;
import fr.moribus.imageonmap.map.ImageMap.Type;
import java.io.IOException;
import java.net.URL;
public class TacheTraitementNouvelleMap extends TacheTraitementMap
{
private final Type type;
public TacheTraitementNouvelleMap(Player player, URL url, Type type, boolean rs, boolean rn)
{
super(player, url, rs, rn);
this.type = type;
}
@Override
public void traiterMap(BufferedImage img) throws IOException
{
ImageMap m = ImageMap.Type.createNewMap(type, img, getJoueur());
m.load();
m.give(getJoueur().getInventory());
m.save();
}
}

View File

@ -1,86 +0,0 @@
package fr.moribus.imageonmap.commands;
import fr.moribus.imageonmap.ImageOnMap;
import fr.moribus.imageonmap.ImgUtility;
import fr.moribus.imageonmap.TacheTraitementMap;
import fr.moribus.imageonmap.TacheTraitementNouvelleMap;
import fr.moribus.imageonmap.map.ImageMap;
import org.bukkit.ChatColor;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import java.net.MalformedURLException;
import java.net.URL;
public class ImageRenduCommande implements CommandExecutor
{
Player joueur;
boolean renderName, imgSvg;
ImageOnMap plugin;
boolean resize, rename;
public ImageRenduCommande(ImageOnMap p)
{
plugin = p;
}
@Override
public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args)
{
// On vérifie si celui qui exécute la commande est bien un joueur
if (!ImgUtility.VerifierIdentite(sender))
{
return false;
}
joueur = (Player) sender;
resize = false;
rename = true;
if (!joueur.hasPermission("imageonmap.userender"))
{
joueur.sendMessage("You are not allowed to use this command ( " + cmd.getName() + " )!");
return false;
}
if (args.length < 1)
{
joueur.sendMessage(ChatColor.RED + "You must enter image url.");
return false;
}
URL url;
try
{
url = new URL(args[0]);
}
catch (MalformedURLException ex)
{
joueur.sendMessage("§cInvalid URL.");
return false;
}
ImageMap.Type type = ImageMap.Type.SINGLE;
if (args.length >= 2)
{
try
{
type = Enum.valueOf(ImageMap.Type.class, args[1]);
}
catch (IllegalArgumentException ex)
{
joueur.sendMessage("Specified map type doesn't exist");
}
}
TacheTraitementMap tache = new TacheTraitementNouvelleMap(joueur, url, type, resize, rename);
tache.runTaskTimer(plugin, 0, 5);
return true;
}
}

View File

@ -1,265 +0,0 @@
package fr.moribus.imageonmap.commands;
import fr.moribus.imageonmap.ImageOnMap;
import fr.moribus.imageonmap.ImgUtility;
import fr.moribus.imageonmap.PluginLogger;
import fr.moribus.imageonmap.SavedPoster;
import fr.moribus.imageonmap.TacheTraitementMajMap;
import java.util.ArrayList;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.map.MapView;
import fr.moribus.imageonmap.map.ImageMap;
import fr.moribus.imageonmap.map.PosterMap;
import fr.moribus.imageonmap.map.SingleMap;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
public class MapToolCommand implements CommandExecutor
{
short id;
ImageOnMap plugin;
MapView map;
Player joueur;
Inventory inv;
public MapToolCommand(ImageOnMap p)
{
plugin = p;
}
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args)
{
if (!ImgUtility.VerifierIdentite(sender))
{
return false;
}
joueur = (Player) sender;
inv = joueur.getInventory();
if (args.length < 1)
{
joueur.sendMessage("Map tools usage:"
+ "\n/" + ChatColor.GOLD + label + ChatColor.RESET + " get [id]: get the map corresponding to this id"
+ "\n/" + ChatColor.GOLD + label + ChatColor.RESET + " delete [id]: remove the map corresponding to this id"
+ "\n/" + ChatColor.GOLD + label + ChatColor.RESET + " list: show all ids of maps in your possession");
return true;
}
if (args[0].equalsIgnoreCase("get"))
{
try
{
id = Short.parseShort(args[1]);
}
catch (NumberFormatException err)
{
joueur.sendMessage("you must enter a number !");
return true;
}
SingleMap smap;
try
{
smap = new SingleMap(id);
smap.load();
if (inv.firstEmpty() == -1)
{
joueur.sendMessage("Your inventory is full, you can't take the map !");
return true;
}
smap.give(joueur.getInventory());
joueur.sendMessage("Map " + ChatColor.ITALIC + id + ChatColor.RESET + " was added in your inventory.");
}
catch (IllegalArgumentException ex)
{
joueur.sendMessage(ChatColor.RED + "Invalid argument : " + ex.getMessage());
}
catch(IOException ex)
{
joueur.sendMessage(ChatColor.RED + "Unable to load the map. Check server console for details.");
PluginLogger.LogError("Could not load the map", ex);
}
return true;
}
else if (args[0].equalsIgnoreCase("set"))
{
ImageMap smap;
try
{
if (args[1].startsWith("poster"))
{
smap = new PosterMap(args[1]);
}
else
{
id = Short.parseShort(args[1]);
smap = new SingleMap(id);
}
}
catch (NumberFormatException err)
{
joueur.sendMessage("you must enter a number !");
return true;
}
catch (Exception e)
{
e.printStackTrace();
joueur.sendMessage(ChatColor.RED + "ERROR while loading maps");
return true;
}
if(args.length < 3)
{
joueur.sendMessage("§cYou must enter a valid URL.");
return true;
}
URL url;
try
{
url = new URL(args[2]);
}
catch (MalformedURLException ex)
{
joueur.sendMessage("§Invalid URL.");
return true;
}
TacheTraitementMajMap tache = new TacheTraitementMajMap(smap, url, joueur);
tache.runTaskTimer(plugin, 0, 5);
return true;
}
else if (args[0].equalsIgnoreCase("delete"))
{
if (!joueur.hasPermission("imageonmap.usermmap"))
{
joueur.sendMessage("You are not allowed to delete map !");
return true;
}
if (args.length == 2 && args[1].startsWith("poster"))
{
SavedPoster poster = new SavedPoster(plugin, args[1]);
try
{
poster.Remove();
}
catch (IOException ex)
{
joueur.sendMessage("Unable to remove the entire poster, check the server log for more information");
PluginLogger.LogError("Unable to remove the entire poster", ex);
}
return true;
}
if (args.length <= 1)
{
if (joueur.getItemInHand().getType() == Material.MAP)
{
id = joueur.getItemInHand().getDurability();
}
else
{
joueur.sendMessage(ChatColor.RED + "You must hold a map or enter an id");
}
}
else
{
try
{
id = Short.parseShort(args[1]);
}
catch (NumberFormatException err)
{
joueur.sendMessage("you must enter a number !");
return true;
}
}
boolean success = ImgUtility.RemoveMap(plugin, id);
if (success)
{
joueur.sendMessage("Map#" + id + " was deleted");
return true;
}
else
{
joueur.sendMessage(ChatColor.RED + "Can't delete delete Map#" + id + ": check the server log");
return true;
}
}
else if (args[0].equalsIgnoreCase("list"))
{
String msg = "", msg2 = "";
int compteur = 0;
ArrayList<String> liste = new ArrayList<String>();
liste = ImgUtility.getListMapByPlayer(plugin, joueur.getName());
for (; compteur < liste.size(); compteur++)
{
msg += liste.get(compteur) + " ";
}
SavedPoster tmp = new SavedPoster(plugin);
ArrayList<String> listePoster = tmp.getListMapByPlayer(plugin, joueur.getName());
for (int i = 0; i < listePoster.size(); i++)
{
msg2 += listePoster.get(i) + " ";
}
joueur.sendMessage(msg
+ "\nYou have rendered " + ChatColor.DARK_PURPLE + (compteur + 1) + ChatColor.RESET + " pictures");
joueur.sendMessage("Your posters: \n" + msg2);
}
else if (args[0].equalsIgnoreCase("getrest"))
{
if (plugin.getRemainingMaps(joueur.getName()) == null)
{
joueur.sendMessage("All maps have already be placed in your inventory");
return true;
}
ArrayList<ItemStack> reste = plugin.getRemainingMaps(joueur.getName());
ArrayList<ItemStack> restant = new ArrayList<ItemStack>();
for (int i = 0; i < reste.size(); i++)
{
ImgUtility.AddMap(reste.get(i), inv, restant);
}
if (restant.isEmpty())
{
plugin.removeRemaingMaps(joueur.getName());
joueur.sendMessage("All maps have been placed in your inventory");
}
else
{
plugin.setRemainingMaps(joueur.getName(), restant);
joueur.sendMessage(restant.size() + " maps can't be placed in your inventory. Please run " + ChatColor.GOLD + "/maptool getrest again");
}
}
return true;
}
}

View File

@ -1,31 +0,0 @@
package fr.moribus.imageonmap.image;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
import java.util.concurrent.Callable;
import javax.imageio.ImageIO;
public class DownloadImageThread implements Callable<BufferedImage>
{
private final URL imageURL;
private BufferedImage imgSrc;
public DownloadImageThread(URL imageURL)
{
this.imageURL = imageURL;
}
@Override
public BufferedImage call() throws IOException
{
imgSrc = ImageIO.read(imageURL);
if(imgSrc == null) throw new IOException("URL does not points to a valid image.");
return imgSrc;
}
}

View File

@ -0,0 +1,62 @@
/*
* Copyright (C) 2013 Moribus
* Copyright (C) 2015 ProkopyL <prokopylmc@gmail.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package fr.moribus.imageonmap.image;
import fr.moribus.imageonmap.PluginLogger;
import fr.moribus.imageonmap.worker.Worker;
import fr.moribus.imageonmap.worker.WorkerRunnable;
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;
public class ImageIOExecutor extends Worker
{
static private ImageIOExecutor instance;
static public void start()
{
if(instance != null) stop();
instance = new ImageIOExecutor();
instance.init();
}
static public void stop()
{
instance.exit();
instance = null;
}
private ImageIOExecutor()
{
super("Image IO");
}
static public void loadImage(final File file, final Renderer mapRenderer)
{
instance.submitQuery(new WorkerRunnable()
{
@Override
public void run() throws Exception
{
BufferedImage image = ImageIO.read(file);
mapRenderer.setImage(image);
}
});
}
}

View File

@ -1,152 +0,0 @@
package fr.moribus.imageonmap.image;
import fr.moribus.imageonmap.image.PosterImage;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URI;
import javax.imageio.ImageIO;
import org.bukkit.map.MapView;
public class ImageRendererThread extends Thread
{
private String URL;
private BufferedImage imgSrc;
private BufferedImage[] img;
private PosterImage poster;
private boolean estPrete = false, resized;
public boolean erreur = false;
public boolean isErreur()
{
return erreur;
}
public ImageRendererThread(String u, boolean r)
{
URL = u;
resized = r;
}
public BufferedImage[] getImg()
{
if (estPrete)
return img;
else
return null;
}
public Boolean getStatut()
{
return estPrete;
}
@Override
public void run()
{
URI uri = null;
java.net.URL url = null;
try
{
uri = URI.create(URL);
url = uri.toURL();
}
catch (IllegalArgumentException | MalformedURLException e) {
e.printStackTrace();
erreur = true;
return;
}
if(erreur != true)
{
try {
imgSrc = ImageIO.read(url.openStream());
} catch (IOException e) {
// TODO Auto-generated catch block
erreur = true;
e.printStackTrace();
}
if(resized)
{
img = new BufferedImage[1];
Image i = imgSrc.getScaledInstance(128, 128, Image.SCALE_SMOOTH);
BufferedImage imgScaled = new BufferedImage(128, 128, BufferedImage.TYPE_INT_ARGB);
imgScaled.getGraphics().drawImage(i, 0, 0 , null);
img[0] = imgScaled;
}
else
{
int width = imgSrc.getWidth();
int height = imgSrc.getHeight();
// Fonction qui cherche le multiple de 128 le plus proche
// de la hauteur / largeur de l'image
int tmpW = 0, tmpH = 0;
int i = 1;
while (tmpW < width)
{
tmpW = i * 128;
i++;
}
i = 0;
while (tmpH < height)
{
tmpH = i * 128;
i++;
}
// On crée un "canvas" = une image vide qui a une taille multiple de 128
// dans laquelle on dessinera l'image téléchargées
BufferedImage canvas = new BufferedImage(tmpW, tmpH, BufferedImage.TYPE_INT_ARGB);
// On récupère l'objet Grapics2D, servant à dessiner dans notre canvas
Graphics2D graph = canvas.createGraphics();
// Variable servant à cadrer l'image
int centerX = 0, centerY = 0;
centerX = (tmpW - imgSrc.getWidth()) / 2;
centerY = (tmpH - imgSrc.getHeight()) / 2;
//On déplace le point d'origine de graph afin que l'image soit dessinée au milieu du canvas
graph.translate(centerX, centerY);
//graph.rotate(45);
// on dessine l'image dans le canvas
graph.drawImage(imgSrc, null, null);
// on crée un Poster à partir de notre canvas
poster = new PosterImage(canvas);
img = poster.getImages();
}
estPrete = true;
}
}
static public void SupprRendu(MapView map)
{
if (map.getRenderers().size() > 0)
{
int i = 0, t = map.getRenderers().size();
while (i < t)
{
map.removeRenderer(map.getRenderers().get(i));
i++;
}
}
}
}

View File

@ -0,0 +1,74 @@
/*
* Copyright (C) 2013 Moribus
* Copyright (C) 2015 ProkopyL <prokopylmc@gmail.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package fr.moribus.imageonmap.image;
import fr.moribus.imageonmap.ImageOnMap;
import java.io.File;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.entity.Entity;
import org.bukkit.entity.ItemFrame;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerItemHeldEvent;
import org.bukkit.event.world.ChunkLoadEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.map.MapView;
public class MapInitEvent implements Listener
{
@EventHandler
public void onChunkLoad(ChunkLoadEvent event)
{
for (Entity entity : event.getChunk().getEntities())
{
if (entity instanceof ItemFrame)
{
ItemStack item = ((ItemFrame)entity).getItem();
if (item.getType() == Material.MAP)
{
MapView map = Bukkit.getMap(item.getDurability());
if(!Renderer.isHandled(map)) initMap(map);
}
}
}
}
@EventHandler
public void onPlayerInv(PlayerItemHeldEvent event)
{
ItemStack item = event.getPlayer().getInventory().getItem(event.getNewSlot());
if (item != null && item.getType() == Material.MAP)
{
MapView map = Bukkit.getMap(item.getDurability());
if (!Renderer.isHandled(map)) initMap(map);
}
}
protected void initMap(MapView map)
{
File imageFile = ImageOnMap.getPlugin().getImageFile(map.getId());
if(imageFile.isFile())
{
ImageIOExecutor.loadImage(imageFile, Renderer.installRenderer(map));
}
}
}

View File

@ -1,8 +1,24 @@
/*
* Copyright (C) 2013 Moribus
* Copyright (C) 2015 ProkopyL <prokopylmc@gmail.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package fr.moribus.imageonmap.image;
import fr.moribus.imageonmap.map.ImageMap;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
/**
@ -10,6 +26,9 @@ import java.awt.image.BufferedImage;
*/
public class PosterImage
{
static private final int WIDTH = 128;
static private final int HEIGHT = 128;
private BufferedImage[] cutImages;
private int lines;
private int columns;
@ -30,11 +49,11 @@ public class PosterImage
int originalWidth = originalImage.getWidth();
int originalHeight = originalImage.getHeight();
columns = (int) Math.ceil(originalWidth / ImageMap.WIDTH);
lines = (int) Math.ceil(originalHeight / ImageMap.HEIGHT);
columns = (int) Math.ceil(originalWidth / WIDTH);
lines = (int) Math.ceil(originalHeight / HEIGHT);
remainderX = originalWidth % ImageMap.WIDTH;
remainderY = originalHeight % ImageMap.HEIGHT;
remainderX = originalWidth % WIDTH;
remainderY = originalHeight % HEIGHT;
if(remainderX > 0) columns++;
if(remainderY > 0) lines++;
@ -43,16 +62,16 @@ public class PosterImage
cutImages = new BufferedImage[cutImagesCount];
int imageX;
int imageY = (remainderY - ImageMap.HEIGHT) / 2;
int imageY = (remainderY - HEIGHT) / 2;
for(int i = 0; i < lines; i++)
{
imageX = (remainderX - ImageMap.WIDTH) / 2;
imageX = (remainderX - WIDTH) / 2;
for(int j = 0; j < columns; j++)
{
cutImages[i * columns + j] = makeSubImage(originalImage, imageX, imageY);
imageX += ImageMap.WIDTH;
imageX += WIDTH;
}
imageY += ImageMap.HEIGHT;
imageY += HEIGHT;
}
}
@ -64,7 +83,7 @@ public class PosterImage
*/
private BufferedImage makeSubImage(BufferedImage originalImage, int x, int y)
{
BufferedImage newImage = new BufferedImage(ImageMap.WIDTH, ImageMap.HEIGHT, BufferedImage.TYPE_INT_ARGB);
BufferedImage newImage = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_ARGB);
Graphics graphics = newImage.getGraphics();
@ -73,13 +92,6 @@ public class PosterImage
return newImage;
}
private int boundValue(int min, int value, int max)
{
return Math.max(Math.min(value, max), min);
}
/**
*
* @return the split images

View File

@ -1,3 +1,21 @@
/*
* Copyright (C) 2013 Moribus
* Copyright (C) 2015 ProkopyL <prokopylmc@gmail.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package fr.moribus.imageonmap.image;
import java.awt.image.BufferedImage;
@ -8,11 +26,40 @@ import org.bukkit.map.MapView;
public class Renderer extends MapRenderer
{
private boolean isRendered;
private final BufferedImage image;
public Renderer(BufferedImage image)
static public boolean isHandled(MapView map)
{
for(MapRenderer renderer : map.getRenderers())
{
if(renderer instanceof Renderer) return true;
}
return false;
}
static public Renderer installRenderer(MapView map)
{
Renderer renderer = new Renderer();
removeRenderers(map);
map.addRenderer(renderer);
return renderer;
}
static public void removeRenderers(MapView map)
{
for(MapRenderer renderer : map.getRenderers())
{
map.removeRenderer(renderer);
}
}
private BufferedImage image;
protected Renderer()
{
this(null);
}
protected Renderer(BufferedImage image)
{
isRendered = false;
this.image = image;
}
@ -20,10 +67,19 @@ public class Renderer extends MapRenderer
public void render(MapView v, final MapCanvas canvas, Player p)
{
//Render only once to avoid overloading the server
if (!isRendered)
{
canvas.drawImage(0, 0, image);
isRendered = true;
}
if (image == null) return;
canvas.drawImage(0, 0, image);
image = null;
}
public BufferedImage getImage()
{
return image;
}
public void setImage(BufferedImage image)
{
this.image = image;
}
}

View File

@ -1,90 +1,77 @@
/*
* Copyright (C) 2013 Moribus
* Copyright (C) 2015 ProkopyL <prokopylmc@gmail.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package fr.moribus.imageonmap.map;
import fr.moribus.imageonmap.image.PosterImage;
import java.awt.image.BufferedImage;
import java.io.IOException;
import org.bukkit.Material;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import org.bukkit.configuration.serialization.ConfigurationSerializable;
import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
public abstract class ImageMap
public abstract class ImageMap implements ConfigurationSerializable
{
static public enum Type
{
SINGLE, POSTER;
static public ImageMap createNewMap(Type type, BufferedImage image, Player player)
{
switch(type)
{
case POSTER:
return new PosterMap(new PosterImage(image), player);
default:
return new SingleMap(image, player);
}
}
static public Type fromString(String string)
{
switch(string.toLowerCase())
{
case "poster":
case "multi":
return POSTER;
default:
return SINGLE;
}
}
}
static public final int WIDTH = 128;
static public final int HEIGHT = 128;
protected String imageName;
protected String ownerName;
protected String worldName;
private final UUID userUUID;
private String imageName;
public abstract void load() throws IOException;
public abstract void save() throws IOException;
public abstract void give(Inventory inv);
public abstract void setImage(BufferedImage image);
public abstract void send(Player joueur);
public ImageMap()
protected ImageMap(UUID userUUID)
{
this(null, null, null);
}
public ImageMap(String imageName, String ownerName, String worldName)
{
this.imageName = imageName;
this.ownerName = ownerName;
this.worldName = worldName;
this.userUUID = userUUID;
}
public abstract short[] getMapsIDs();
public abstract boolean managesMap(short mapID);
protected void give(Inventory inventory, short mapID)
{
give(inventory, mapID, getImageName());
}
/*** Serialization methods ***/
protected void give(Inventory inventory, short mapID, String itemName)
protected ImageMap(Map<String, Object> map, UUID userUUID) throws IllegalArgumentException
{
ItemStack itemMap = new ItemStack(Material.MAP, 1, mapID);
if(itemName != null)
try
{
ItemMeta meta = itemMap.getItemMeta();
meta.setDisplayName(itemName);
itemMap.setItemMeta(meta);
this.userUUID = userUUID;
this.imageName = (String) map.get("name");
}
catch(ClassCastException ex)
{
throw new IllegalArgumentException(ex);
}
inventory.addItem(itemMap);
}
// Getters & Setters
protected abstract void postSerialize(Map<String, Object> map);
@Override
public Map<String, Object> serialize()
{
Map<String, Object> map = new HashMap<String, Object>();
map.put("name", imageName);
return map;
}
/*** Getters & Setters ***/
public UUID getUserUUID()
{
return userUUID;
}
public String getImageName()
{
@ -95,29 +82,4 @@ public abstract class ImageMap
{
this.imageName = imageName;
}
public boolean isNamed()
{
return imageName != null;
}
public String getOwnerName()
{
return ownerName;
}
public void setOwnerName(String ownerName)
{
this.ownerName = ownerName;
}
public String getWorldName()
{
return worldName;
}
public void setWorldName(String worldName)
{
this.worldName = worldName;
}
}

View File

@ -0,0 +1,72 @@
/*
* Copyright (C) 2013 Moribus
* Copyright (C) 2015 ProkopyL <prokopylmc@gmail.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package fr.moribus.imageonmap.map;
import java.util.ArrayList;
import java.util.UUID;
abstract public class MapManager
{
static private final ArrayList<PlayerMapStore> playerMaps = new ArrayList<PlayerMapStore>();;
static public void init()
{
}
static public void exit()
{
playerMaps.clear();
}
static public boolean managesMap(short mapID)
{
synchronized(playerMaps)
{
for(PlayerMapStore mapStore : playerMaps)
{
if(mapStore.managesMap(mapID)) return true;
}
}
return false;
}
static private PlayerMapStore getPlayerMapStore(UUID playerUUID)
{
PlayerMapStore store = getExistingPlayerMapStore(playerUUID);
if(store == null)
{
store = new PlayerMapStore(playerUUID);
synchronized(playerMaps){playerMaps.add(store);}
}
return store;
}
static private PlayerMapStore getExistingPlayerMapStore(UUID playerUUID)
{
synchronized(playerMaps)
{
for(PlayerMapStore mapStore : playerMaps)
{
if(mapStore.getUUID().equals(playerUUID)) return mapStore;
}
}
return null;
}
}

View File

@ -0,0 +1,49 @@
/*
* Copyright (C) 2013 Moribus
* Copyright (C) 2015 ProkopyL <prokopylmc@gmail.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package fr.moribus.imageonmap.map;
import java.util.ArrayList;
import java.util.UUID;
public class PlayerMapStore
{
private final UUID playerUUID;
private final ArrayList<ImageMap> mapList = new ArrayList<ImageMap>();
public PlayerMapStore(UUID playerUUID)
{
this.playerUUID = playerUUID;
}
public boolean managesMap(short mapID)
{
for(ImageMap map : mapList)
{
if(map.managesMap(mapID)) return true;
}
return false;
}
/* ===== Getters & Setters ===== */
public UUID getUUID()
{
return playerUUID;
}
}

View File

@ -1,158 +1,63 @@
/*
* Copyright (C) 2013 Moribus
* Copyright (C) 2015 ProkopyL <prokopylmc@gmail.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package fr.moribus.imageonmap.map;
import fr.moribus.imageonmap.ImageOnMap;
import fr.moribus.imageonmap.image.Renderer;
import java.awt.image.BufferedImage;
import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory;
import fr.moribus.imageonmap.image.PosterImage;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import javax.imageio.ImageIO;
import org.bukkit.Bukkit;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.map.MapView;
import java.util.Map;
import java.util.UUID;
public class PosterMap extends ImageMap
{
private PosterImage image;
private final short[] mapsIDs;
protected short[] mapsIDs;
protected int columnCount;
protected int rowCount;
private FileConfiguration customConfig = null;
private File customConfigFile = null;
public PosterMap(PosterImage image, Player player)
public PosterMap(UUID userUUID, short[] mapsIDs, int columnCount, int rowCount)
{
super(null, player.getName(), player.getWorld().getName());
this.image = image;
mapsIDs = new short[image.getImagesCount()];
for (int i = 0; i < mapsIDs.length; i++)
{
mapsIDs[i] = Bukkit.createMap(player.getWorld()).getId();
}
super(userUUID);
this.mapsIDs = mapsIDs;
this.columnCount = columnCount;
this.rowCount = rowCount;
}
public PosterMap(String id) throws Exception
@Override
public short[] getMapsIDs()
{
this.imageName = id;
List<String> svg = getCustomConfig().getStringList(imageName);
if(svg != null && !svg.isEmpty())
{
this.ownerName = svg.get(0);
mapsIDs = new short[svg.size()-1];
for(int i = 0; i < mapsIDs.length; i++)
{
mapsIDs[i] = Short.parseShort(svg.get(i+1));
}
}
else
{
throw new Exception("Le poster est introuvable.");
}
return mapsIDs;
}
@Override
public void load()
public boolean managesMap(short mapID)
{
for(int i = 0; i < mapsIDs.length; i++)
{
MapView map = Bukkit.getMap(mapsIDs[i]);
SingleMap.SupprRendu(map);
map.addRenderer(new Renderer(image.getImageAt(i)));
if(mapsIDs[i] == mapID) return true;
}
}
@Override
public void save() throws IOException
{
ImageOnMap plugin = ImageOnMap.getPlugin();
for(int i = 0; i < mapsIDs.length; i++)
{
short mapID = mapsIDs[i];
String mapName = "map" + mapID;
File outputfile = new File("./plugins/ImageOnMap/Image/" + mapName + ".png");
ImageIO.write(image.getImageAt(i), "png", outputfile);
// Enregistrement de la map dans la config
ArrayList<String> liste = new ArrayList<String>();
liste.add(String.valueOf(mapID));
liste.add(mapName);
liste.add(ownerName);
liste.add(worldName);
plugin.getCustomConfig().set(mapName, liste);
}
plugin.saveCustomConfig();
return false;
}
@Override
public void give(Inventory inv)
protected void postSerialize(Map<String, Object> map)
{
String itemName;
for(int i = 0; i < mapsIDs.length; i++)
{
itemName = "Map (row " + (image.getLineAt(i) + 1) + ", column " + (image.getColumnAt(i) + 1) + ")";
give(inv, mapsIDs[i], itemName);
}
}
@Override
public void setImage(BufferedImage image)
{
}
@Override
public void send(Player player)
{
for(short mapID: mapsIDs)
{
player.sendMap(Bukkit.getMap(mapID));
}
}
private void reloadCustomConfig()
{
ImageOnMap plugin = (ImageOnMap)Bukkit.getPluginManager().getPlugin("ImageOnMap");
if (customConfigFile == null)
{
customConfigFile = new File(plugin.getDataFolder(), "poster.yml");
}
customConfig = YamlConfiguration.loadConfiguration(customConfigFile);
// Look for defaults in the jar
InputStream defConfigStream = plugin.getResource("poster.yml");
if (defConfigStream != null)
{
YamlConfiguration defConfig = YamlConfiguration.loadConfiguration(defConfigStream);
customConfig.setDefaults(defConfig);
}
}
private FileConfiguration getCustomConfig()
{
if (customConfig == null)
{
reloadCustomConfig();
}
return customConfig;
}
private void saveCustomConfig() throws IOException
{
ImageOnMap plugin = (ImageOnMap)Bukkit.getPluginManager().getPlugin("ImageOnMap");
if (customConfig == null || customConfigFile == null) {
return;
}
getCustomConfig().save(customConfigFile);
map.put("columns", columnCount);
map.put("rows", rowCount);
map.put("mapsIDs", mapsIDs);
}
}

View File

@ -1,118 +1,52 @@
/*
* Copyright (C) 2013 Moribus
* Copyright (C) 2015 ProkopyL <prokopylmc@gmail.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package fr.moribus.imageonmap.map;
import fr.moribus.imageonmap.ImageOnMap;
import fr.moribus.imageonmap.ImgUtility;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory;
import org.bukkit.map.MapView;
import fr.moribus.imageonmap.image.Renderer;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.imageio.ImageIO;
import org.bukkit.map.MapRenderer;
import java.util.Map;
import java.util.UUID;
public class SingleMap extends ImageMap
{
private final short mapID;
private BufferedImage image;
public SingleMap(BufferedImage img, Player player)
{
this(img, null, player);
}
public SingleMap(BufferedImage image, String imageName, Player player)
{
super(imageName, player.getName(), player.getWorld().getName());
this.mapID = Bukkit.createMap(player.getWorld()).getId();
this.image = ImgUtility.scaleImage(image, WIDTH, HEIGHT);
}
public SingleMap(short mapID) throws IOException, IllegalArgumentException
protected short mapID;
public SingleMap(UUID ownerUUID, short mapID)
{
super(ownerUUID);
this.mapID = mapID;
//Testing if the map id exists
MapView map = Bukkit.getMap(mapID);
if(map == null)
throw new IllegalArgumentException("Map ID '" + mapID + "' doesn't exist");
List<String> svg = ImageOnMap.getPlugin().getCustomConfig().getStringList("map" + mapID);
String nomImg = svg.get(1);
ownerName = svg.get(2);
image = ImageIO.read(new File("./plugins/ImageOnMap/Image/" + nomImg + ".png"));
}
@Override
public short[] getMapsIDs()
{
return new short[]{mapID};
}
@Override
public void save() throws IOException
public boolean managesMap(short mapID)
{
String mapName = "map" + mapID;
ImageOnMap plugin = ImageOnMap.getPlugin();
File outputfile = new File("./plugins/ImageOnMap/Image/" + mapName + ".png");
ImageIO.write(image, "png", outputfile);
// Enregistrement de la map dans la config
ArrayList<String> liste = new ArrayList<String>();
liste.add(String.valueOf(mapID));
liste.add(mapName);
liste.add(ownerName);
liste.add(worldName);
plugin.getCustomConfig().set(mapName, liste);
plugin.saveCustomConfig();
}
@SuppressWarnings("deprecation")
@Override
public void give(Inventory inventory)
{
give(inventory, mapID);
return this.mapID == mapID;
}
@Override
public void load()
protected void postSerialize(Map<String, Object> map)
{
MapView map = Bukkit.getMap(mapID);
SingleMap.SupprRendu(map);
map.addRenderer(new Renderer(image));
}
@Override
public boolean isNamed()
{
return imageName != null;
}
public short getId()
{
return mapID;
}
@Override
public void setImage(BufferedImage image)
{
this.image = image;
load();
}
@Override
public void send(Player joueur)
{
joueur.sendMap(Bukkit.getMap(mapID));
}
public static void SupprRendu(MapView map)
{
for(MapRenderer renderer : map.getRenderers())
{
map.removeRenderer(renderer);
}
map.put("mapID", mapID);
}
}

View File

@ -0,0 +1,108 @@
/*
* Copyright (C) 2013 Moribus
* Copyright (C) 2015 ProkopyL <prokopylmc@gmail.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package fr.moribus.imageonmap.worker;
import fr.moribus.imageonmap.PluginLogger;
import java.util.ArrayDeque;
public abstract class Worker
{
private final String name;
private final ArrayDeque<WorkerRunnable> runQueue = new ArrayDeque<>();
private final WorkerCallbackManager callbackManager;
private Thread thread;
protected Worker(String name)
{
this.name = name;
this.callbackManager = new WorkerCallbackManager(name);
}
public void init()
{
if(thread != null && thread.isAlive())
{
PluginLogger.LogWarning("Restarting " + name + " thread.");
exit();
}
thread = createThread();
thread.start();
}
public void exit()
{
thread.interrupt();
thread = null;
}
private void run()
{
WorkerRunnable currentRunnable;
while(!Thread.interrupted())
{
synchronized(runQueue)
{
try
{
while(runQueue.isEmpty()) runQueue.wait();
}
catch(InterruptedException ex)
{
break;
}
currentRunnable = runQueue.pop();
}
try
{
currentRunnable.run();
}
catch(Throwable ex)
{
PluginLogger.LogError("Exception from thread " + name, ex);
}
}
}
protected void submitQuery(WorkerRunnable runnable)
{
synchronized(runQueue)
{
runQueue.add(runnable);
runQueue.notify();
}
}
private Thread createThread()
{
return new Thread()
{
@Override
public void run()
{
Worker.this.run();
}
};
}
}

View File

@ -0,0 +1,24 @@
/*
* Copyright (C) 2013 Moribus
* Copyright (C) 2015 ProkopyL <prokopylmc@gmail.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package fr.moribus.imageonmap.worker;
public interface WorkerCallback
{
public void finished(Object... args);
public void errored(Throwable exception);
}

View File

@ -0,0 +1,55 @@
/*
* Copyright (C) 2013 Moribus
* Copyright (C) 2015 ProkopyL <prokopylmc@gmail.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package fr.moribus.imageonmap.worker;
import java.util.ArrayDeque;
import java.util.HashMap;
import org.bukkit.Bukkit;
class WorkerCallbackManager implements Runnable
{
static private final int WATCH_LOOP_DELAY = 5;
private final HashMap<WorkerRunnable, WorkerCallback> callbacks;
private final ArrayDeque<WorkerCallback> callbackQueue;
private final String name;
public WorkerCallbackManager(String name)
{
callbacks = new HashMap<>();
callbackQueue = new ArrayDeque<>();
this.name = name;
}
public void init()
{
//Bukkit.getScheduler().runTaskTimer(null, this, 0, WATCH_LOOP_DELAY);
}
public void exit()
{
}
@Override
public void run()
{
}
}

View File

@ -0,0 +1,23 @@
/*
* Copyright (C) 2013 Moribus
* Copyright (C) 2015 ProkopyL <prokopylmc@gmail.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package fr.moribus.imageonmap.worker;
public interface WorkerRunnable
{
public void run() throws Throwable;
}