Fork of Poseidon providing Bukkit #1060 to older Beta versions (b1.0-b1.7.3)
at develop 155 lines 4.7 kB view raw
1package org.bukkit.craftbukkit.map; 2 3import net.minecraft.server.WorldMap; 4import org.bukkit.Bukkit; 5import org.bukkit.World; 6import org.bukkit.craftbukkit.CraftWorld; 7import org.bukkit.craftbukkit.entity.CraftPlayer; 8import org.bukkit.map.MapRenderer; 9import org.bukkit.map.MapView; 10 11import java.util.*; 12 13public final class CraftMapView implements MapView { 14 15 private final Map<CraftPlayer, RenderData> renderCache = new HashMap<CraftPlayer, RenderData>(); 16 private final List<MapRenderer> renderers = new ArrayList<MapRenderer>(); 17 private final Map<MapRenderer, Map<CraftPlayer, CraftMapCanvas>> canvases = new HashMap<MapRenderer, Map<CraftPlayer, CraftMapCanvas>>(); 18 protected final WorldMap worldMap; 19 20 public CraftMapView(WorldMap worldMap) { 21 this.worldMap = worldMap; 22 addRenderer(new CraftMapRenderer(this, worldMap)); 23 } 24 25 public short getId() { 26 String text = worldMap.a; 27 if (text.startsWith("map_")) { 28 try { 29 return Short.parseShort(text.substring("map_".length())); 30 } catch (NumberFormatException ex) { 31 throw new IllegalStateException("Map has non-numeric ID"); 32 } 33 } else { 34 throw new IllegalStateException("Map has invalid ID"); 35 } 36 } 37 38 public boolean isVirtual() { 39 return renderers.size() > 0 && !(renderers.get(0) instanceof CraftMapRenderer); 40 } 41 42 public Scale getScale() { 43 return Scale.valueOf(worldMap.e); 44 } 45 46 public void setScale(Scale scale) { 47 worldMap.e = scale.getValue(); 48 } 49 50 public World getWorld() { 51 byte dimension = worldMap.map; 52 for (World world : Bukkit.getServer().getWorlds()) { 53 if (((CraftWorld) world).getHandle().dimension == dimension) { 54 return world; 55 } 56 } 57 return null; 58 } 59 60 public void setWorld(World world) { 61 worldMap.map = (byte) ((CraftWorld) world).getHandle().dimension; 62 } 63 64 public int getCenterX() { 65 return worldMap.b; 66 } 67 68 public int getCenterZ() { 69 return worldMap.c; 70 } 71 72 public void setCenterX(int x) { 73 worldMap.b = x; 74 } 75 76 public void setCenterZ(int z) { 77 worldMap.c = z; 78 } 79 80 public List<MapRenderer> getRenderers() { 81 return new ArrayList<MapRenderer>(renderers); 82 } 83 84 public void addRenderer(MapRenderer renderer) { 85 if (!renderers.contains(renderer)) { 86 renderers.add(renderer); 87 canvases.put(renderer, new HashMap<CraftPlayer, CraftMapCanvas>()); 88 renderer.initialize(this); 89 } 90 } 91 92 public boolean removeRenderer(MapRenderer renderer) { 93 if (renderers.contains(renderer)) { 94 renderers.remove(renderer); 95 for (Map.Entry<CraftPlayer, CraftMapCanvas> entry : canvases.get(renderer).entrySet()) { 96 for (int x = 0; x < 128; ++x) { 97 for (int y = 0; y < 128; ++y) { 98 entry.getValue().setPixel(x, y, (byte) -1); 99 } 100 } 101 } 102 canvases.remove(renderer); 103 return true; 104 } else { 105 return false; 106 } 107 } 108 109 private boolean isContextual() { 110 for (MapRenderer renderer : renderers) { 111 if (renderer.isContextual()) return true; 112 } 113 return false; 114 } 115 116 public RenderData render(CraftPlayer player) { 117 boolean context = isContextual(); 118 RenderData render = renderCache.get(context ? player : null); 119 120 if (render == null) { 121 render = new RenderData(); 122 renderCache.put(context ? player : null, render); 123 } 124 125 if (context && renderCache.containsKey(null)) { 126 renderCache.remove(null); 127 } 128 129 Arrays.fill(render.buffer, (byte) 0); 130 render.cursors.clear(); 131 132 for (MapRenderer renderer : renderers) { 133 CraftMapCanvas canvas = canvases.get(renderer).get(renderer.isContextual() ? player : null); 134 if (canvas == null) { 135 canvas = new CraftMapCanvas(this); 136 canvases.get(renderer).put(renderer.isContextual() ? player : null, canvas); 137 } 138 139 canvas.setBase(render.buffer); 140 renderer.render(this, canvas, player); 141 142 byte[] buf = canvas.getBuffer(); 143 for (int i = 0; i < buf.length; ++i) { 144 if (buf[i] >= 0) render.buffer[i] = buf[i]; 145 } 146 147 for (int i = 0; i < canvas.getCursors().size(); ++i) { 148 render.cursors.add(canvas.getCursors().getCursor(i)); 149 } 150 } 151 152 return render; 153 } 154 155}