--- a/net/minecraft/server/WorldMap.java +++ b/net/minecraft/server/WorldMap.java @@ -11,6 +11,15 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +// CraftBukkit start +import java.util.UUID; + +import org.bukkit.craftbukkit.CraftServer; +import org.bukkit.craftbukkit.CraftWorld; +import org.bukkit.craftbukkit.map.CraftMapView; +import org.bukkit.craftbukkit.util.CraftChatMessage; +// CraftBukkit end + public class WorldMap extends PersistentBase { private static final Logger LOGGER = LogManager.getLogger(); @@ -28,8 +37,18 @@ public final Map decorations = Maps.newLinkedHashMap(); private final Map n = Maps.newHashMap(); + // 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(int i, int j, int k, boolean flag, boolean flag1, ResourceKey resourcekey) { @@ -52,12 +71,30 @@ @Override public void a(NBTTagCompound nbttagcompound) { - DataResult dataresult = DimensionManager.a(new Dynamic(DynamicOpsNBT.a, nbttagcompound.get("dimension"))); + DataResult> dataresult = DimensionManager.a(new Dynamic(DynamicOpsNBT.a, nbttagcompound.get("dimension"))); // CraftBukkit - decompile error Logger logger = WorldMap.LOGGER; logger.getClass(); - this.map = (ResourceKey) dataresult.resultOrPartial(logger::error).orElseThrow(() -> { - return new IllegalArgumentException("Invalid map dimension: " + nbttagcompound.get("dimension")); + // CraftBukkit start + this.map = (ResourceKey) dataresult.resultOrPartial(logger::error).orElseGet(() -> { + 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. */ + // PAIL: Use Vanilla exception handling for now + } else { + return world.getHandle().getDimensionKey(); + } + } + throw new IllegalArgumentException("Invalid map dimension: " + nbttagcompound.get("dimension")); + // CraftBukkit end }); this.centerX = nbttagcompound.getInt("xCenter"); this.centerZ = nbttagcompound.getInt("zCenter"); @@ -92,13 +129,32 @@ @Override public NBTTagCompound b(NBTTagCompound nbttagcompound) { - DataResult dataresult = MinecraftKey.a.encodeStart(DynamicOpsNBT.a, this.map.a()); + DataResult dataresult = MinecraftKey.a.encodeStart(DynamicOpsNBT.a, this.map.a()); // CraftBukkit - decompile error Logger logger = WorldMap.LOGGER; logger.getClass(); dataresult.resultOrPartial(logger::error).ifPresent((nbtbase) -> { nbttagcompound.set("dimension", nbtbase); }); + // CraftBukkit start + if (true) { + if (this.uniqueId == null) { + for (org.bukkit.World world : server.getWorlds()) { + CraftWorld cWorld = (CraftWorld) world; + if (cWorld.getHandle().getDimensionKey() == 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.setInt("xCenter", this.centerX); nbttagcompound.setInt("zCenter", this.centerZ); nbttagcompound.setByte("scale", this.scale); @@ -389,12 +445,25 @@ @Nullable public Packet a(ItemStack itemstack) { + // CraftBukkit start + org.bukkit.craftbukkit.map.RenderData render = WorldMap.this.mapView.render((org.bukkit.craftbukkit.entity.CraftPlayer) this.trackee.getBukkitEntity()); // CraftBukkit + + java.util.Collection icons = new java.util.ArrayList(); + + for ( org.bukkit.map.MapCursor cursor : render.cursors) { + + if (cursor.isVisible()) { + icons.add(new MapIcon(MapIcon.Type.a(cursor.getRawType()), cursor.getX(), cursor.getY(), cursor.getDirection(), CraftChatMessage.fromStringOrNull(cursor.getCaption()))); + } + } + if (this.d) { this.d = false; - return new PacketPlayOutMap(ItemWorldMap.d(itemstack), WorldMap.this.scale, WorldMap.this.track, WorldMap.this.locked, WorldMap.this.decorations.values(), WorldMap.this.colors, this.e, this.f, this.g + 1 - this.e, this.h + 1 - this.f); + return new PacketPlayOutMap(ItemWorldMap.d(itemstack), WorldMap.this.scale, WorldMap.this.track, WorldMap.this.locked, icons, render.buffer, this.e, this.f, this.g + 1 - this.e, this.h + 1 - this.f); } else { - return this.i++ % 5 == 0 ? new PacketPlayOutMap(ItemWorldMap.d(itemstack), WorldMap.this.scale, WorldMap.this.track, WorldMap.this.locked, WorldMap.this.decorations.values(), WorldMap.this.colors, 0, 0, 0, 0) : null; + return this.i++ % 5 == 0 ? new PacketPlayOutMap(ItemWorldMap.d(itemstack), WorldMap.this.scale, WorldMap.this.track, WorldMap.this.locked, icons, render.buffer, 0, 0, 0, 0) : null; } + // CraftBukkit end } public void a(int i, int j) {