Adding custom map to players inventory

Discussion in 'Plugin Development' started by ThunderWaffeMC, Mar 6, 2014.

Thread Status:
Not open for further replies.
  1. Offline

    ThunderWaffeMC

    Hi. I'm having a lot of trouble trying to add a map (item) with a custom image (from a folder in plugin directory) to a players inventory. I just have no idea how to combine it all and I would greatly appreciate some help. Would anyone be able to help me out?

    Thank you!
     
  2. Offline

    candjxd

    This was taken straight from the Bukkit map api (http://wiki.sk89q.com/wiki/Bukkit_map_API) which you can use to do this more in depth but here is an example




    Code:
    //Register map listener
    getServer().getPluginManager().registerEvent(Event.Type.MAP_INITIALIZE,
        new MapListener(), Priority.Normal, this);
    //Map listener
    public class MapListener {
        @Override
        public void onMapInitialize(MapInitializeEvent event) {
            if (event.getMapView().getId() == 1) {
                event.getMapView().registerVirtualBase(new NyanCatBase(), plugin);
                return;
            }
        }
    }
    //Base map renderer
    import org.bukkit.maps.MapCanvas;
    import org.bukkit.maps.MapPrintOrder;
    import org.bukkit.maps.MapRenderer;
    import org.bukkit.maps.MapView;
    import com.sk89q.mapbook.Liquid.LiquidTest;
     
    public class NyanCatBase implements MapRenderer {
        int inj = -1;
        int cont = 0;
     
        public void render(MapView map, MapCanvas canvas) {
            map.setRate(128);
            map.setPrintOrder(MapPrintOrder.Sequential);
     
            if ((cont++ % 60) != 0)
                return;
     
            inj++;
            BufferedImage img;
     
            try {
                img = ImageIO.read(new File("acertaincat_"
                        + (((inj) % 12) + 1) + ".png"));
            } catch (IOException e) {
                e.printStackTrace();
                return;
            }
     
            map.getDrawer().drawImage(img);
     
            return;
        }
     
        public void initialize(MapView map) {
        }
     
    }
     
    ThunderWaffeMC likes this.
  3. Offline

    ThunderWaffeMC

    Hm... I've got two classes:

    Code:java
    1.  
    2. package net.muosu.easyasabc;
    3.  
    4. import org.bukkit.event.EventHandler;
    5. import org.bukkit.event.Listener;
    6. import org.bukkit.event.server.MapInitializeEvent;
    7. import org.bukkit.map.MapRenderer;
    8. import org.bukkit.map.MapView;
    9.  
    10. public class MapRendererClass implements Listener {
    11. private EasyAsABC plugin;
    12. public MapRendererClass(EasyAsABC plugin) {
    13. this.plugin = plugin;
    14. }
    15.  
    16. @EventHandler
    17. public void onMap(MapInitializeEvent event) {
    18. MapView map = event.getMap();
    19. for(MapRenderer renderer : map.getRenderers()) {
    20. map.removeRenderer(renderer);
    21. map.addRenderer(new a());
    22. }
    23. }
    24. }
    25.  


    Code:java
    1.  
    2. package net.muosu.easyasabc;
    3.  
    4. import java.io.IOException;
    5. import java.net.MalformedURLException;
    6. import java.net.URL;
    7.  
    8. import javax.imageio.ImageIO;
    9.  
    10. import org.bukkit.entity.Player;
    11. import org.bukkit.map.MapCanvas;
    12. import org.bukkit.map.MapRenderer;
    13. import org.bukkit.map.MapView;
    14.  
    15. public class a extends MapRenderer {
    16.  
    17. @Override
    18. public void render(MapView view, MapCanvas canvas, Player player) {
    19. try {
    20. canvas.drawImage(25, 25, ImageIO.read(new URL("[url]http://i57.tinypic.com/ofcbav.png[/url]")));
    21. } catch (MalformedURLException e) {
    22. // TODO Auto-generated catch block
    23. e.printStackTrace();
    24. } catch (IOException e) {
    25. // TODO Auto-generated catch block
    26. e.printStackTrace();
    27. }
    28. }
    29. }
    30.  


    It seems to print the image on the map fine but how can I use it onCommand? For example: player types /a and it prints the a class. If they type /b then it would print another class with a different image. Any idea?
     
  4. Offline

    ImPhantom

    candjxd There is no need to make your post all bold.
     
  5. Offline

    candjxd

    Here is an example i found.
    i take no credit for this as it was just a forum post i found all credit goes to Cirno
    Code:java
    1. public class ImageRenderer extends MapRenderer {
    2.  
    3. // So fancy.
    4. private SoftReference<BufferedImage> cacheImage;
    5. private boolean hasRendered = false;
    6.  
    7. public ImageRenderer(String url) throws IOException {
    8. this.cacheImage = new SoftReference<BufferedImage>(this.getImage(url));
    9. }
    10.  
    11. @SuppressWarnings("deprecation")
    12. @Override
    13. public void render(MapView view, MapCanvas canvas, Player player){
    14. if(this.hasRendered){
    15. return;
    16. }
    17.  
    18. if(this.cacheImage.get() != null){
    19. canvas.drawImage(0, 0, this.cacheImage.get());
    20. this.hasRendered = true;
    21. }else{
    22. player.sendMessage(ChatColor.RED + "Attempted to render the image, but the cached image was null!");
    23. this.hasRendered = true;
    24. }
    25. }
    26.  
    27. public BufferedImage getImage(String url) throws IOException{
    28. boolean useCache = ImageIO.getUseCache();
    29.  
    30. // Temporarily disable cache, if it isn't already,
    31. // so we can get the latest image.
    32. ImageIO.setUseCache(false);
    33.  
    34. BufferedImage image = resize(new URL(url), new Dimension(128,128));
    35. // TODO find import for RenderUtils
    36. //RenderUtils.resizeImage(image);
    37.  
    38. // Renable it with the old value.
    39. ImageIO.setUseCache(useCache);
    40.  
    41. return image;
    42. }
    43.  
    44. public BufferedImage resize(final URL url, final Dimension size) throws IOException{
    45. final BufferedImage image = ImageIO.read(url);
    46. final BufferedImage resized = new BufferedImage(size.width, size.height, BufferedImage.TYPE_INT_ARGB);
    47. final Graphics2D g = resized.createGraphics();
    48. g.drawImage(image, 0, 0, size.width, size.height, null);
    49. g.dispose();
    50. return resized;
    51. }
    52.  
    53. }



    Code:java
    1. @Override
    2. public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
    3. Player player = (Player) sender;
    4. if(args.length==1){
    5. MapView view = Bukkit.getMap(player.getItemInHand().getDurability());
    6. Iterator<MapRenderer> iter = view.getRenderers().iterator();
    7. while(iter.hasNext()){
    8. view.removeRenderer(iter.next());
    9. }
    10.  
    11. try{
    12. ImageRenderer renderer = new ImageRenderer(args[0]);
    13. view.addRenderer(renderer);
    14. player.sendMessage(ChatColor.AQUA + "[ImgMap] Rendering " + args[0] + "!");
    15. }catch (IOException e){
    16. player.sendMessage(ChatColor.RED + "[ImgMap] An error occured! Is the URL correct?");
    17. }
    18. return true;
    19. }
    20. return false;
    21. }
    22.  
    23. }
     
Thread Status:
Not open for further replies.

Share This Page