How can I get a fully loaded map Without traveling it.

Discussion in 'Spigot Plugin Development' started by AdrianSR, Jul 23, 2018.

  1. Hi!, i have a custom MapRenderer class, it render the map, and show custom cursors, and have a custom scale. But, how can render the all map blocks without travelling it?.



    Code (Java):
    package com.hotmail.AdrianSR.Fortnite.map.battlemap.render;

    import java.lang.reflect.Constructor;
    import java.lang.reflect.Field;
    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    import java.util.List;

    import org.bukkit.Bukkit;
    import org.bukkit.Location;
    import org.bukkit.entity.Player;
    import org.bukkit.map.MapCanvas;
    import org.bukkit.map.MapCursor;
    import org.bukkit.map.MapRenderer;
    import org.bukkit.map.MapView;
    import org.bukkit.map.MapView.Scale;

    import com.hotmail.AdrianSR.Fortnite.game.BRPlayer;
    import com.hotmail.AdrianSR.Fortnite.map.battlemap.BattleMap;
    import com.hotmail.AdrianSR.Fortnite.map.managers.MapsManager;
    import com.hotmail.AdrianSR.Fortnite.util.RenderUtils;
    import com.hotmail.AdrianSR.core.util.localization.Loc;

    /**
    * Represents a Battle Royale minimap renderer.
    *
    * @author AdrianSR
    */

    public class BattleMapRenderer extends MapRenderer {

        /**
         * Class values.
         */

        private boolean cleared;

        /**
         * Construct a new Battle Royale minimap renderer.
         */

        public BattleMapRenderer() {
            // super
            super(true);
         
            // set no cleared.
            cleared = false;
        }
     
        @Override
        public void render(MapView mapView, MapCanvas mapCanvas, Player player) {
            // clear canvas
            if (!cleared) {
                RenderUtils.clearCanvas(mapCanvas);
                cleared = true;
            }

            // get map.
            final BattleMap map = MapsManager.BATTLE_MAP;
         
            // remove old render.
            mapView.getRenderers().remove(0);
         
            // render map.
            try {
                // render map.
                Method getServer = RenderUtils.MinecraftS.getMethod("getServer");
                Object s = getServer.invoke(null); // Returns MinecraftServer
                Field worlds_1 = s.getClass().getField("worlds");
                worlds_1.setAccessible(true);
                List worlds_final = (List) worlds_1.get(s);
                Object worlds = RenderUtils.WorldS.cast(worlds_final.get(0));
                Field world_maps        = worlds.getClass().getField("worldMaps");
                Object world_maps_final = RenderUtils.PersistantC.cast(world_maps.get(worlds)); // worldMaps of the world.
                Method w                = world_maps_final.getClass().getMethod("get", RenderUtils.PersistantC.getClass(), String.class);
                Constructor craftMapConstructor = RenderUtils.CraftMapRender.getDeclaredConstructor(RenderUtils.CraftMapV, RenderUtils.WorldM);
                craftMapConstructor.setAccessible(true);
                Object world_map        = RenderUtils.WorldM.cast(w.invoke(world_maps_final, RenderUtils.WorldM.getClass(), "map_" + mapView.getId()));
                Object craftMapRenderer = craftMapConstructor.newInstance(RenderUtils.CraftMapV.cast(mapView), world_map);
                craftMapRenderer.getClass().getMethod("initialize", MapView.class).invoke(craftMapRenderer, mapView);
                craftMapRenderer.getClass().getMethod("render", MapView.class, MapCanvas.class, Player.class).invoke(craftMapRenderer, mapView, mapCanvas, player);
    //            final CraftMapRenderer rr    = (CraftMapRenderer) craftMapRenderer;//new CraftMapRenderer((CraftMapView) mapView, wmp);
    //            rr.initialize(mapView);
    //            rr.render(mapView, mapCanvas, player);
            } catch (NoSuchMethodException | IllegalAccessException | NoSuchFieldException | InstantiationException
                    | InvocationTargetException exception) {
                // Do nothing.
                exception.printStackTrace();
            }
         
            // set scale
            mapView.setScale(Scale.NORMAL);
         
            // get center.
            final Loc center  = map.getConfig().getMapCenterPoint();
            final int centerX = center.getBlockX();
            final int centerZ = center.getBlockZ();
         
            // set center.
            mapView.setCenterX(centerX);
            mapView.setCenterZ(centerZ);

            // change players cursor color.
            for (int x = 0; x < mapCanvas.getCursors().size(); x++) {
                // get and check cursor.
                MapCursor cur = mapCanvas.getCursors().getCursor(x);
                if (cur == null) {
                    continue;
                }

                // check is visible.
                if (!cur.isVisible()) {
                    continue;
                }

                // set color.
                cur.setType(MapCursor.Type.BLUE_POINTER);
             
                // get coords.
                int[] coords = RenderUtils.locationToCoords(centerX, centerZ, player.getLocation());
                int coX      = coords[0]; // get X.
                int coY      = coords[1]; // get Y.
             
                // check coords.
                if (Math.abs(coX) > 128 || Math.abs(coY) > 128) {
                    // set invisible.
                    cur.setVisible(false);
                 
                    // remove cursor.
                    mapCanvas.getCursors().removeCursor(cur);
                    continue;
                }

                // update cursor coords.
                cur.setX((byte) coX);
                cur.setY((byte) coY);
            }

            // add team mates cursors.
            for (Player o : Bukkit.getOnlinePlayers()) {
                // check is not this player.
                if (player.getUniqueId().equals(o.getUniqueId())) {
                    continue;
                }
             
                // check is same team.
                BRPlayer bp = BRPlayer.getBRPlayer(player);
                BRPlayer bo = BRPlayer.getBRPlayer(o);
                if (!bp.getTeam().equals(bo.getTeam())) {
                    continue;
                }

                // get location.
                Location oloc = o.getLocation();
             
                // check is same world.
                if (!mapView.getWorld().getName().equals(oloc.getWorld().getName())) {
                    continue;
                }

                // get coords.
                int[] coords = RenderUtils.locationToCoords(centerX, centerZ, oloc);
                int coX      = coords[0]; // get X.
                int coY      = coords[1]; // get Y.
             
                // check coords.
                if (Math.abs(coX) > 128 || Math.abs(coY) > 128) {
                    continue;
                }

                // add.
                mapCanvas.getCursors().addCursor(
                        coords[0], coords[1], // localization
                        (byte) coords[2], // direction
                        MapCursor.Type.GREEN_POINTER.getValue(), // type
                        true); // visible ?
            }
         
            // set cleared.
            cleared = false;
        }
     

        @Override
        public void initialize(MapView map) {
            super.initialize(map);
        }

    }
     
  2. it's possible?