diff --git a/src/main/java/net/glowstone/entity/GlowPlayer.java b/src/main/java/net/glowstone/entity/GlowPlayer.java index 213b95a49a..72edd18308 100644 --- a/src/main/java/net/glowstone/entity/GlowPlayer.java +++ b/src/main/java/net/glowstone/entity/GlowPlayer.java @@ -61,6 +61,7 @@ import net.glowstone.inventory.InventoryMonitor; import net.glowstone.inventory.crafting.PlayerRecipeMonitor; import net.glowstone.io.PlayerDataService.PlayerReader; +import net.glowstone.map.GlowMapCanvas; import net.glowstone.net.GlowSession; import net.glowstone.net.message.play.entity.AnimateEntityMessage; import net.glowstone.net.message.play.entity.DestroyEntitiesMessage; @@ -73,6 +74,7 @@ import net.glowstone.net.message.play.game.ExperienceMessage; import net.glowstone.net.message.play.game.HealthMessage; import net.glowstone.net.message.play.game.JoinGameMessage; +import net.glowstone.net.message.play.game.MapDataMessage; import net.glowstone.net.message.play.game.MultiBlockChangeMessage; import net.glowstone.net.message.play.game.NamedSoundEffectMessage; import net.glowstone.net.message.play.game.PlayEffectMessage; @@ -2404,7 +2406,9 @@ public void sendBlockEntityChange(Location location, GlowBlockEntity type, Compo @Override public void sendMap(MapView map) { - throw new UnsupportedOperationException("Not supported yet."); + GlowMapCanvas mapCanvas = GlowMapCanvas.createAndRender(map, this); + session.send(new MapDataMessage(map.getId(), map.getScale().ordinal(), Collections.emptyList(), + mapCanvas.toSection())); } @Override diff --git a/src/main/java/net/glowstone/map/GlowMapCanvas.java b/src/main/java/net/glowstone/map/GlowMapCanvas.java index bcd041dbed..5a65b8043b 100644 --- a/src/main/java/net/glowstone/map/GlowMapCanvas.java +++ b/src/main/java/net/glowstone/map/GlowMapCanvas.java @@ -1,9 +1,13 @@ package net.glowstone.map; import java.awt.Image; +import net.glowstone.net.message.play.game.MapDataMessage.Section; +import org.bukkit.entity.Player; import org.bukkit.map.MapCanvas; import org.bukkit.map.MapCursorCollection; import org.bukkit.map.MapFont; +import org.bukkit.map.MapRenderer; +import org.bukkit.map.MapView; /** * Represents a canvas for drawing to a map. Each canvas is associated with a specific {@link org.bukkit.map.MapRenderer} and represents that renderer's layer on the map. @@ -12,16 +16,25 @@ public final class GlowMapCanvas implements MapCanvas { public static final int MAP_SIZE = 128; private final byte[] buffer = new byte[MAP_SIZE * MAP_SIZE]; - private final GlowMapView mapView; + private final MapView mapView; private MapCursorCollection cursors = new MapCursorCollection(); private byte[] base; - protected GlowMapCanvas(GlowMapView mapView) { + public static GlowMapCanvas createAndRender(MapView mapView, Player player) { + GlowMapCanvas out = new GlowMapCanvas(mapView); + for (MapRenderer renderer : mapView.getRenderers()) { + renderer.initialize(mapView); + renderer.render(mapView, out, player); + } + return out; + } + + protected GlowMapCanvas(MapView mapView) { this.mapView = mapView; } @Override - public GlowMapView getMapView() { + public MapView getMapView() { return mapView; } @@ -80,4 +93,7 @@ public void drawText(int x, int y, MapFont font, String text) { throw new UnsupportedOperationException("Not supported yet."); } + public Section toSection() { + return new Section(MAP_SIZE, MAP_SIZE, mapView.getCenterX(), mapView.getCenterZ(), buffer.clone()); + } } diff --git a/src/main/java/net/glowstone/map/GlowMapView.java b/src/main/java/net/glowstone/map/GlowMapView.java index 790c79e19f..e32c2fb9d4 100644 --- a/src/main/java/net/glowstone/map/GlowMapView.java +++ b/src/main/java/net/glowstone/map/GlowMapView.java @@ -4,7 +4,6 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import net.glowstone.GlowWorld; import net.glowstone.entity.GlowPlayer; import org.bukkit.World; import org.bukkit.map.MapRenderer; @@ -21,9 +20,9 @@ public final class GlowMapView implements MapView { private final short id; private Scale scale; private int x, z; - private GlowWorld world; + private World world; - protected GlowMapView(GlowWorld world, short id) { + protected GlowMapView(World world, short id) { this.world = world; this.id = id; x = world.getSpawnLocation().getBlockX(); @@ -76,13 +75,13 @@ public void setCenterZ(int z) { } @Override - public GlowWorld getWorld() { + public World getWorld() { return world; } @Override public void setWorld(World world) { - this.world = (GlowWorld) world; + this.world = world; } @Override