summaryrefslogtreecommitdiffstats
path: root/nms-patches/WorldMap.patch
blob: 76d3581a2b33d4165333e6c8e5c423f9d32c34b0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
--- ../work/decompile-8eb82bde//net/minecraft/server/WorldMap.java	2014-11-28 11:22:56.262823156 +0000
+++ src/main/java/net/minecraft/server/WorldMap.java	2014-11-28 11:01:54.000000000 +0000
@@ -6,6 +6,14 @@
 import java.util.List;
 import java.util.Map;
 
+// CraftBukkit start
+import java.util.UUID;
+
+import org.bukkit.craftbukkit.CraftServer;
+import org.bukkit.craftbukkit.CraftWorld;
+import org.bukkit.craftbukkit.map.CraftMapView;
+// CraftBukkit end
+
 public class WorldMap extends PersistentBase {
 
     public int centerX;
@@ -16,9 +24,19 @@
     public List g = Lists.newArrayList();
     private Map i = Maps.newHashMap();
     public Map decorations = Maps.newLinkedHashMap();
+ 
+    // CraftBukkit start
+    public final CraftMapView mapView;
+    private CraftServer server;
+    private UUID uniqueId = null;
+    // CraftBukkit end
 
     public WorldMap(String s) {
         super(s);
+        // CraftBukkit start
+        mapView = new CraftMapView(this);
+        server = (CraftServer) org.bukkit.Bukkit.getServer();
+        // CraftBukkit end
     }
 
     public void a(double d0, double d1, int i) {
@@ -31,7 +49,30 @@
     }
 
     public void a(NBTTagCompound nbttagcompound) {
-        this.map = nbttagcompound.getByte("dimension");
+        // CraftBukkit start
+        byte dimension = nbttagcompound.getByte("dimension");
+
+        if (dimension >= 10) {
+            long least = nbttagcompound.getLong("UUIDLeast");
+            long most = nbttagcompound.getLong("UUIDMost");
+
+            if (least != 0L && most != 0L) {
+                this.uniqueId = new UUID(most, least);
+
+                CraftWorld world = (CraftWorld) server.getWorld(this.uniqueId);
+                // Check if the stored world details are correct.
+                if (world == null) {
+                    /* All Maps which do not have their valid world loaded are set to a dimension which hopefully won't be reached.
+                       This is to prevent them being corrupted with the wrong map data. */
+                    dimension = 127;
+                } else {
+                    dimension = (byte) world.getHandle().dimension;
+                }
+            }
+        }
+
+        this.map = dimension;
+        // CraftBukkit end
         this.centerX = nbttagcompound.getInt("xCenter");
         this.centerZ = nbttagcompound.getInt("zCenter");
         this.scale = nbttagcompound.getByte("scale");
@@ -66,6 +107,25 @@
     }
 
     public void b(NBTTagCompound nbttagcompound) {
+        // CraftBukkit start
+        if (this.map >= 10) {
+            if (this.uniqueId == null) {
+                for (org.bukkit.World world : server.getWorlds()) {
+                    CraftWorld cWorld = (CraftWorld) world;
+                    if (cWorld.getHandle().dimension == this.map) {
+                        this.uniqueId = cWorld.getUID();
+                        break;
+                    }
+                }
+            }
+            /* Perform a second check to see if a matching world was found, this is a necessary
+               change incase Maps are forcefully unlinked from a World and lack a UID.*/
+            if (this.uniqueId != null) {
+                nbttagcompound.setLong("UUIDLeast", this.uniqueId.getLeastSignificantBits());
+                nbttagcompound.setLong("UUIDMost", this.uniqueId.getMostSignificantBits());
+            }
+        }
+        // CraftBukkit end
         nbttagcompound.setByte("dimension", this.map);
         nbttagcompound.setInt("xCenter", this.centerX);
         nbttagcompound.setInt("zCenter", this.centerZ);