From f0195eee180708b96f8cc291406a6a14db60a68c Mon Sep 17 00:00:00 2001 From: Shane Freeder Date: Fri, 24 May 2019 07:53:16 +0100 Subject: [PATCH] Fix some generation concurrency issues diff --git a/src/main/java/net/minecraft/server/World.java b/src/main/java/net/minecraft/server/World.java index 9889b0543..e80cb3b97 100644 --- a/src/main/java/net/minecraft/server/World.java +++ b/src/main/java/net/minecraft/server/World.java @@ -100,6 +100,23 @@ public abstract class World implements GeneratorAccess, AutoCloseable { private int tileTickPosition; public final Map explosionDensityCache = new HashMap<>(); // Paper - Optimize explosions public java.util.ArrayDeque redstoneUpdateInfos; // Paper - Move from Map in BlockRedstoneTorch to here + // Paper start - yes this is hacky as shit + RegionLimitedWorldAccess regionLimited; + World originalWorld; + public World regionLimited(RegionLimitedWorldAccess limitedWorldAccess) { + try { + World clone = (World) super.clone(); + clone.regionLimited = limitedWorldAccess; + clone.originalWorld = this; + return clone; + } catch (CloneNotSupportedException e1) { + } + return null; + } + ChunkCoordIntPair[] strongholdCoords; + List strongholdStuctures = Lists.newArrayList(); + final java.lang.Object stuctureLock = new Object(); + // Paper end public CraftWorld getWorld() { return this.world; diff --git a/src/main/java/net/minecraft/server/WorldGenStronghold.java b/src/main/java/net/minecraft/server/WorldGenStronghold.java index b34a0683a..e002ed53f 100644 --- a/src/main/java/net/minecraft/server/WorldGenStronghold.java +++ b/src/main/java/net/minecraft/server/WorldGenStronghold.java @@ -10,10 +10,12 @@ import javax.annotation.Nullable; public class WorldGenStronghold extends StructureGenerator { + /* // Paper start - no shared state private boolean a; private ChunkCoordIntPair[] aq; private final List ar = Lists.newArrayList(); private long as; + */ public WorldGenStronghold(Function, ? extends WorldGenFeatureEmptyConfiguration> function) { super(function); @@ -21,16 +23,22 @@ public class WorldGenStronghold extends StructureGenerator chunkgenerator, Random random, int i, int j, BiomeBase biomebase) { + // Paper start + /* if (this.as != chunkgenerator.getSeed()) { this.d(); } + */ + final World world = chunkgenerator.getWorld(); - if (!this.a) { + synchronized (world.stuctureLock) { + if ( world.strongholdCoords == null) { this.a(chunkgenerator); - this.a = true; - } + // this.a = true; + }} + // Paper end - ChunkCoordIntPair[] achunkcoordintpair = this.aq; + ChunkCoordIntPair[] achunkcoordintpair = world.strongholdCoords; // Paper int k = achunkcoordintpair.length; for (int l = 0; l < k; ++l) { @@ -45,9 +53,11 @@ public class WorldGenStronghold extends StructureGenerator chunkgenerator, BlockPosition blockposition, int i, boolean flag) { // CraftBukkit - synchronized if (!chunkgenerator.getWorldChunkManager().a(this)) { return null; } else { + // Paper start - no shared state + /* if (this.as != world.getSeed()) { this.d(); } + */ - if (!this.a) { - this.a(chunkgenerator); - this.a = true; + synchronized (world.stuctureLock) { + if ( world.strongholdCoords == null) { + this.a(chunkgenerator); + //this.a = true; + } } + // Paper end BlockPosition blockposition1 = null; BlockPosition.MutableBlockPosition blockposition_mutableblockposition = new BlockPosition.MutableBlockPosition(); double d0 = Double.MAX_VALUE; - ChunkCoordIntPair[] achunkcoordintpair = this.aq; + ChunkCoordIntPair[] achunkcoordintpair = world.strongholdCoords; // Paper int j = achunkcoordintpair.length; for (int k = 0; k < j; ++k) { @@ -106,7 +123,7 @@ public class WorldGenStronghold extends StructureGenerator chunkgenerator) { - this.as = chunkgenerator.getSeed(); + //this.as = chunkgenerator.getSeed(); // Paper List list = Lists.newArrayList(); Iterator iterator = IRegistry.BIOME.iterator(); @@ -122,15 +139,15 @@ public class WorldGenStronghold extends StructureGenerator= i1) { - this.aq[l1] = new ChunkCoordIntPair(i2, j2); + strongholdCoords[l1] = new ChunkCoordIntPair(i2, j2); // Paper } d0 += 6.283185307179586D / (double) k; @@ -165,7 +182,7 @@ public class WorldGenStronghold extends StructureGenerator