Fork of Poseidon providing Bukkit #1060 to older Beta versions (b1.0-b1.7.3)
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}