diff --git a/src/main/java/net/minecraft/server/BiomeCache.java b/src/main/java/net/minecraft/server/BiomeCache.java new file mode 100644 index 000000000..e33c645b2 --- /dev/null +++ b/src/main/java/net/minecraft/server/BiomeCache.java @@ -0,0 +1,52 @@ +package net.minecraft.server; + +import com.google.common.cache.CacheBuilder; +import com.google.common.cache.CacheLoader; +import com.google.common.cache.LoadingCache; +import java.util.concurrent.TimeUnit; + +public class BiomeCache { + + private final WorldChunkManager a; + private final LoadingCache b; + + public BiomeCache(WorldChunkManager worldchunkmanager) { + this.b = CacheBuilder.newBuilder().expireAfterAccess(30000L, TimeUnit.MILLISECONDS).build(new CacheLoader() { + public BiomeCache.a load(ChunkCoordIntPair chunkcoordintpair) throws Exception { + return BiomeCache.this.new a(chunkcoordintpair.x, chunkcoordintpair.z); + } + }); + this.a = worldchunkmanager; + } + + public BiomeCache.a a(int i, int j) { + i >>= 4; + j >>= 4; + return (BiomeCache.a) this.b.getUnchecked(new ChunkCoordIntPair(i, j)); + } + + public BiomeBase a(int i, int j, BiomeBase biomebase) { + BiomeBase biomebase1 = this.a(i, j).a(i, j); + + return biomebase1 == null ? biomebase : biomebase1; + } + + public void a() {} + + public BiomeBase[] b(int i, int j) { + return this.a(i, j).b; + } + + public class a { + + private final BiomeBase[] b; + + public a(int i, int j) { + this.b = BiomeCache.this.a.a(i << 4, j << 4, 16, 16, false); + } + + public BiomeBase a(int i, int j) { + return this.b[i & 15 | (j & 15) << 4]; + } + } +} diff --git a/src/main/java/net/minecraft/server/WorldGenDecoratorSpike.java b/src/main/java/net/minecraft/server/WorldGenDecoratorSpike.java new file mode 100644 index 000000000..27f70cd52 --- /dev/null +++ b/src/main/java/net/minecraft/server/WorldGenDecoratorSpike.java @@ -0,0 +1,70 @@ +package net.minecraft.server; + +import com.google.common.cache.CacheBuilder; +import com.google.common.cache.CacheLoader; +import com.google.common.cache.LoadingCache; +import com.google.common.collect.ContiguousSet; +import com.google.common.collect.DiscreteDomain; +import com.google.common.collect.Lists; +import com.google.common.collect.Range; +import java.util.Collections; +import java.util.List; +import java.util.Random; +import java.util.concurrent.TimeUnit; + +public class WorldGenDecoratorSpike extends WorldGenDecorator { + + private static final LoadingCache a = CacheBuilder.newBuilder().expireAfterWrite(5L, TimeUnit.MINUTES).build(new WorldGenDecoratorSpike.a()); + + public WorldGenDecoratorSpike() {} + + public boolean a(GeneratorAccess generatoraccess, ChunkGenerator chunkgenerator, Random random, BlockPosition blockposition, WorldGenFeatureDecoratorEmptyConfiguration worldgenfeaturedecoratoremptyconfiguration, WorldGenerator worldgenerator, C c0) { + WorldGenEnder.Spike[] aworldgenender_spike = a(generatoraccess); + boolean flag = false; + WorldGenEnder.Spike[] aworldgenender_spike1 = aworldgenender_spike; + int i = aworldgenender_spike.length; + + for (int j = 0; j < i; ++j) { + WorldGenEnder.Spike worldgenender_spike = aworldgenender_spike1[j]; + + if (worldgenender_spike.a(blockposition)) { + ((WorldGenEnder) worldgenerator).a(worldgenender_spike); + flag |= ((WorldGenEnder) worldgenerator).a(generatoraccess, chunkgenerator, random, new BlockPosition(worldgenender_spike.a(), 45, worldgenender_spike.b()), WorldGenFeatureConfiguration.e); + } + } + + return flag; + } + + public static WorldGenEnder.Spike[] a(GeneratorAccess generatoraccess) { + Random random = new Random(generatoraccess.getSeed()); + long i = random.nextLong() & 65535L; + + return (WorldGenEnder.Spike[]) WorldGenDecoratorSpike.a.getUnchecked(i); + } + + static class a extends CacheLoader { + + private a() {} + + public WorldGenEnder.Spike[] load(Long olong) throws Exception { + List list = Lists.newArrayList(ContiguousSet.create(Range.closedOpen(0, 10), DiscreteDomain.integers())); + + Collections.shuffle(list, new Random(olong)); + WorldGenEnder.Spike[] aworldgenender_spike = new WorldGenEnder.Spike[10]; + + for (int i = 0; i < 10; ++i) { + int j = (int) (42.0D * Math.cos(2.0D * (-3.141592653589793D + 0.3141592653589793D * (double) i))); + int k = (int) (42.0D * Math.sin(2.0D * (-3.141592653589793D + 0.3141592653589793D * (double) i))); + int l = (Integer) list.get(i); + int i1 = 2 + l / 3; + int j1 = 76 + l * 3; + boolean flag = l == 1 || l == 2; + + aworldgenender_spike[i] = new WorldGenEnder.Spike(j, k, i1, j1, flag); + } + + return aworldgenender_spike; + } + } +}