geforkt von Mirrors/Paper
134 Zeilen
6.4 KiB
Diff
134 Zeilen
6.4 KiB
Diff
--- 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<String, MapIcon> decorations = Maps.newLinkedHashMap();
|
|
private final Map<String, WorldMapFrame> 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<World> resourcekey) {
|
|
@@ -52,12 +71,30 @@
|
|
|
|
@Override
|
|
public void a(NBTTagCompound nbttagcompound) {
|
|
- DataResult dataresult = DimensionManager.a(new Dynamic(DynamicOpsNBT.a, nbttagcompound.get("dimension")));
|
|
+ DataResult<ResourceKey<World>> 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<NBTBase> 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<MapIcon> icons = new java.util.ArrayList<MapIcon>();
|
|
+
|
|
+ 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) {
|