# MapReflectionAPI This plugin helps developer with displaying images on maps. It supports Spigot 1.12 - 1.20. ## Usage: ### Using the API: First, include the API using Maven: ```xml sbdevelopment-repo-releases SBDevelopment Repository https://repo.sbdevelopment.tech/releases tech.sbdevelopment MapReflectionAPI 1.6 provided ``` Then, use our API. Below is an example. ```java //--- Wrap image --- MapWrapper wrapper = MapReflectionAPI.getMapManager().wrapImage(ImageIO.read(new File("image.png"))); MapController controller = wrapper.getController(); final Player p = Bukkit.getPlayer("SBDeveloper"); //--- Add viewer --- try { controller.addViewer(p); } catch (MapLimitExceededException e) { e.printStackTrace(); return; } controller.sendContent(p); //--- Show in frame --- ItemFrame frame = ...; //This is your ItemFrame. controller.showInFrame(p, frame, true); //--- Or show in hand --- controller.showInHand(p, true); ``` It's also possible to split one image onto multiple itemframes. For example using the following code. ```java //--- Wrap image (into 2 rows and 2 columns) --- MultiMapWrapper wrapper = MapReflectionAPI.getMapManager().wrapMultiImage(ImageIO.read(new File("image.png")), 2, 2); MultiMapController controller = wrapper.getController(); final Player p = Bukkit.getPlayer("SBDeveloper"); //--- Add viewer --- try { controller.addViewer(p); } catch (MapLimitExceededException e) { e.printStackTrace(); return; } controller.sendContent(p); //--- Show in frames --- //These are your itemframes ItemFrame leftTopFrame = ...; ItemFrame leftBottomFrame = ...; ItemFrame rightTopFrame = ...; ItemFrame rightBottomFrame = ...; ItemFrame[][] frames = { {leftTopFrame, rightTopFrame}, {leftBottomFrame, rightBottomFrame} }; controller.showInFrames(p, frames, true); ``` More information can be found on the [JavaDoc](https://sbdevelopment.tech/javadoc/mapreflectionapi/). ### Notes on map render distance: MapReflectionAPI does not implement render distance to images shown on maps. This should be implemented by yourself. An example of this is below. ```java import org.bukkit.event.EventHandler; import org.bukkit.event.entity.PlayerDeathEvent; import org.bukkit.event.player.PlayerChangedWorldEvent; import org.bukkit.event.player.PlayerRespawnEvent; public class MapRenderDistanceListener implements Listener { private static final int MAP_RENDER_DISTANCE_SQUARED = 1024; @EventHandler public void onPlayerJoin(PlayerJoinEvent e) { Bukkit.getScheduler().runTaskLaterAsynchronously(MyPluginInstance, () -> { //Show the maps to the player which are within distance }); } @EventHandler public void onPlayerLeave(PlayerQuitEvent e) { Bukkit.getScheduler().runTaskLaterAsynchronously(MyPluginInstance, () -> { //Hide the maps to the player which are within distance }); } @EventHandler public void onPlayerChangeWorld(PlayerChangedWorldEvent e) { //Hide all the maps in the e.getFrom() world Bukkit.getScheduler().runTaskLaterAsynchronously(MyPluginInstance, () -> { //Show the maps to the player which are within distance in e.getPlayer().getWorld() }, 20); } @EventHandler(priority = EventPriority.MONITOR) public void onPlayerDeath(PlayerDeathEvent e) { //Hide all the maps in the e.getEntity().getWorld() } @EventHandler(priority = EventPriority.MONITOR) public void onPlayerRespawn(PlayerRespawnEvent e) { Bukkit.getScheduler().runTaskLaterAsynchronously(MyPluginInstance, () -> { //Show the maps to the player which are within distance in e.getPlayer().getWorld() }, 20); } @EventHandler public void onPlayerMove(PlayerMoveEvent e) { //Hide all the maps in the e.getFrom() world //Show the maps to the player which are within distance in e.getTo().getWorld() //FOR EXAMPLE: if (e.getTo() == null) return; if (e.getFrom().getChunk().equals(e.getTo().getChunk())) return; for (Frame frame : API.getFramesInWorld(e.getPlayer().getWorld())) { double distanceSquared = e.getTo().distanceSquared(frame.getLocation()); if (distanceSquared > MAP_RENDER_DISTANCE_SQUARED) { API.hideFrame(e.getPlayer(), frame); } else { API.showFrame(e.getPlayer(), frame); } } } @EventHandler public void onPlayerTeleport(PlayerTeleportEvent e) { //Hide all the maps in the e.getFrom() world //Show the maps to the player which are within distance in e.getTo().getWorld() //SEE EXAMPLE ABOVE } } ``` ## Credits: This is a fork of [MapManager](https://github.com/InventivetalentDev/MapManager). It updates the API to 1.19 and uses other dependencies. This plugin includes classes from BKCommonLib. Please checkout the README in that package for more information.