From b3e1c48f9717ea14b14e76ab985e89427e24f3c0 Mon Sep 17 00:00:00 2001 From: Daniel Mills Date: Tue, 20 Oct 2020 10:52:30 -0400 Subject: [PATCH] Stupid spigot & paper --- pom.xml | 2 +- .../iris/gen/TopographicTerrainProvider.java | 9 +- ....java => NMSChunkGenerator16_2_PAPER.java} | 8 +- .../v16_2/NMSChunkGenerator16_2_SPIGOT.java | 722 ++++++++++++++++++ .../iris/gen/nms/v16_2/NMSCreator16_2.java | 4 +- .../volmit/iris/gen/scaffold/IrisWorlds.java | 22 +- .../volmit/iris/manager/IrisBoardManager.java | 2 +- .../com/volmit/iris/object/IrisCaveFluid.java | 1 - .../com/volmit/iris/object/IrisDimension.java | 4 + 9 files changed, 763 insertions(+), 11 deletions(-) rename src/main/java/com/volmit/iris/gen/nms/v16_2/{NMSChunkGenerator16_2.java => NMSChunkGenerator16_2_PAPER.java} (97%) create mode 100644 src/main/java/com/volmit/iris/gen/nms/v16_2/NMSChunkGenerator16_2_SPIGOT.java diff --git a/pom.xml b/pom.xml index a0d52f42d..4a54ead13 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 bytecode.ninja Iris - 1.0.19 + 1.0.20 Iris false diff --git a/src/main/java/com/volmit/iris/gen/TopographicTerrainProvider.java b/src/main/java/com/volmit/iris/gen/TopographicTerrainProvider.java index 8e4c3efd3..842cea0c9 100644 --- a/src/main/java/com/volmit/iris/gen/TopographicTerrainProvider.java +++ b/src/main/java/com/volmit/iris/gen/TopographicTerrainProvider.java @@ -20,6 +20,7 @@ import com.volmit.iris.object.DecorationPart; import com.volmit.iris.object.InferredType; import com.volmit.iris.object.IrisBiome; import com.volmit.iris.object.IrisBiomeDecorator; +import com.volmit.iris.object.IrisCaveFluid; import com.volmit.iris.object.IrisDepositGenerator; import com.volmit.iris.object.IrisDimension; import com.volmit.iris.object.IrisGenerator; @@ -142,6 +143,7 @@ public abstract class TopographicTerrainProvider extends ParallelTerrainProvider IrisBiome biome = sampleTrueBiome(rx, rz); IrisBiome carveBiome = null; Biome onlyBiome = Iris.biome3d ? null : biome.getGroundBiome(getMasterRandom(), rz, getDimension().getFluidHeight(), rx); + IrisCaveFluid forceFluid = getDimension().getForceFluid().hasFluid(getData()) ? getDimension().getForceFluid() : null; if(biome == null) { @@ -282,6 +284,11 @@ public abstract class TopographicTerrainProvider extends ParallelTerrainProvider decorateLand(crand, carveBiome, sliver, k, rx, rz, block); } + + if(forceFluid != null && B.isAir(block) && (forceFluid.isInverseHeight() ? k >= forceFluid.getFluidHeight() : k <= forceFluid.getFluidHeight())) + { + sliver.set(k, forceFluid.getFluid(getData())); + } } // Carve out biomes @@ -353,7 +360,7 @@ public abstract class TopographicTerrainProvider extends ParallelTerrainProvider { generateDeposits(random.nextParallelRNG(x * ((z * 39) + 10000)).nextParallelRNG(z + z - x), terrain, x, z); } - + return map; } diff --git a/src/main/java/com/volmit/iris/gen/nms/v16_2/NMSChunkGenerator16_2.java b/src/main/java/com/volmit/iris/gen/nms/v16_2/NMSChunkGenerator16_2_PAPER.java similarity index 97% rename from src/main/java/com/volmit/iris/gen/nms/v16_2/NMSChunkGenerator16_2.java rename to src/main/java/com/volmit/iris/gen/nms/v16_2/NMSChunkGenerator16_2_PAPER.java index d2578ce0c..5d57d40f6 100644 --- a/src/main/java/com/volmit/iris/gen/nms/v16_2/NMSChunkGenerator16_2.java +++ b/src/main/java/com/volmit/iris/gen/nms/v16_2/NMSChunkGenerator16_2_PAPER.java @@ -78,7 +78,7 @@ import net.minecraft.server.v1_16_R2.WorldGenStage; import net.minecraft.server.v1_16_R2.WorldServer; @SuppressWarnings("deprecation") -public class NMSChunkGenerator16_2 extends ChunkGenerator implements ProvisionedHolder +public class NMSChunkGenerator16_2_PAPER extends ChunkGenerator implements ProvisionedHolder { private static final IBlockData k = Blocks.AIR.getBlockData(); private final Provisioned provisioned; @@ -91,12 +91,12 @@ public class NMSChunkGenerator16_2 extends ChunkGenerator implements Provisioned private final O ws; private BlockColumn BC; - public NMSChunkGenerator16_2(Provisioned p, O ws, WorldChunkManager worldchunkmanager, long i, Supplier supplier) + public NMSChunkGenerator16_2_PAPER(Provisioned p, O ws, WorldChunkManager worldchunkmanager, long i, Supplier supplier) { this(p, ws, worldchunkmanager, worldchunkmanager, i, supplier); } - private NMSChunkGenerator16_2(Provisioned p, O ws, WorldChunkManager worldchunkmanager, WorldChunkManager worldchunkmanager1, long i, Supplier supplier) + private NMSChunkGenerator16_2_PAPER(Provisioned p, O ws, WorldChunkManager worldchunkmanager, WorldChunkManager worldchunkmanager1, long i, Supplier supplier) { super(worldchunkmanager, worldchunkmanager1, supplier.get().a(), i); this.provisioned = p; @@ -174,7 +174,7 @@ public class NMSChunkGenerator16_2 extends ChunkGenerator implements Provisioned } else { - iblockdata = NMSChunkGenerator16_2.k; + iblockdata = NMSChunkGenerator16_2_PAPER.k; } return iblockdata; diff --git a/src/main/java/com/volmit/iris/gen/nms/v16_2/NMSChunkGenerator16_2_SPIGOT.java b/src/main/java/com/volmit/iris/gen/nms/v16_2/NMSChunkGenerator16_2_SPIGOT.java new file mode 100644 index 000000000..38c8942a6 --- /dev/null +++ b/src/main/java/com/volmit/iris/gen/nms/v16_2/NMSChunkGenerator16_2_SPIGOT.java @@ -0,0 +1,722 @@ +package com.volmit.iris.gen.nms.v16_2; + +import java.util.Collections; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Random; +import java.util.function.Supplier; + +import org.bukkit.Material; +import org.bukkit.block.Biome; +import org.bukkit.block.data.BlockData; +import org.bukkit.craftbukkit.libs.it.unimi.dsi.fastutil.objects.ObjectArrayList; +import org.bukkit.craftbukkit.libs.it.unimi.dsi.fastutil.objects.ObjectList; +import org.bukkit.craftbukkit.v1_16_R2.block.CraftBlock; +import org.bukkit.craftbukkit.v1_16_R2.block.data.CraftBlockData; +import org.bukkit.craftbukkit.v1_16_R2.util.CraftMagicNumbers; +import org.bukkit.generator.ChunkGenerator.BiomeGrid; +import org.bukkit.generator.ChunkGenerator.ChunkData; +import org.bukkit.material.MaterialData; + +import com.mojang.serialization.Codec; +import com.volmit.iris.gen.IrisTerrainProvider; +import com.volmit.iris.gen.provisions.ProvisionBukkit; +import com.volmit.iris.gen.scaffold.GeneratedChunk; +import com.volmit.iris.gen.scaffold.Provisioned; +import com.volmit.iris.gen.scaffold.ProvisionedHolder; +import com.volmit.iris.gen.scaffold.TerrainProvider; +import com.volmit.iris.util.O; +import com.volmit.iris.util.V; + +import net.minecraft.server.v1_16_R2.BiomeBase; +import net.minecraft.server.v1_16_R2.BiomeManager; +import net.minecraft.server.v1_16_R2.BiomeSettingsMobs; +import net.minecraft.server.v1_16_R2.Block; +import net.minecraft.server.v1_16_R2.BlockColumn; +import net.minecraft.server.v1_16_R2.BlockPosition; +import net.minecraft.server.v1_16_R2.Blocks; +import net.minecraft.server.v1_16_R2.ChunkCoordIntPair; +import net.minecraft.server.v1_16_R2.ChunkGenerator; +import net.minecraft.server.v1_16_R2.ChunkGeneratorAbstract; +import net.minecraft.server.v1_16_R2.CrashReport; +import net.minecraft.server.v1_16_R2.CrashReportSystemDetails; +import net.minecraft.server.v1_16_R2.DefinedStructureManager; +import net.minecraft.server.v1_16_R2.EnumCreatureType; +import net.minecraft.server.v1_16_R2.GeneratorAccess; +import net.minecraft.server.v1_16_R2.GeneratorAccessSeed; +import net.minecraft.server.v1_16_R2.GeneratorSettingBase; +import net.minecraft.server.v1_16_R2.HeightMap; +import net.minecraft.server.v1_16_R2.IBlockAccess; +import net.minecraft.server.v1_16_R2.IBlockData; +import net.minecraft.server.v1_16_R2.IChunkAccess; +import net.minecraft.server.v1_16_R2.IRegistry; +import net.minecraft.server.v1_16_R2.IRegistryCustom; +import net.minecraft.server.v1_16_R2.IStructureAccess; +import net.minecraft.server.v1_16_R2.NoiseSettings; +import net.minecraft.server.v1_16_R2.PacketDebug; +import net.minecraft.server.v1_16_R2.ProtoChunk; +import net.minecraft.server.v1_16_R2.RegionLimitedWorldAccess; +import net.minecraft.server.v1_16_R2.ReportedException; +import net.minecraft.server.v1_16_R2.ResourceKey; +import net.minecraft.server.v1_16_R2.SectionPosition; +import net.minecraft.server.v1_16_R2.SeededRandom; +import net.minecraft.server.v1_16_R2.SpawnerCreature; +import net.minecraft.server.v1_16_R2.StructureBoundingBox; +import net.minecraft.server.v1_16_R2.StructureFeature; +import net.minecraft.server.v1_16_R2.StructureFeatures; +import net.minecraft.server.v1_16_R2.StructureGenerator; +import net.minecraft.server.v1_16_R2.StructureManager; +import net.minecraft.server.v1_16_R2.StructurePiece; +import net.minecraft.server.v1_16_R2.StructureSettingsFeature; +import net.minecraft.server.v1_16_R2.StructureStart; +import net.minecraft.server.v1_16_R2.WorldChunkManager; +import net.minecraft.server.v1_16_R2.WorldGenFeatureDefinedStructureJigsawJunction; +import net.minecraft.server.v1_16_R2.WorldGenFeatureDefinedStructurePoolTemplate; +import net.minecraft.server.v1_16_R2.WorldGenFeaturePillagerOutpostPoolPiece; +import net.minecraft.server.v1_16_R2.WorldGenStage; +import net.minecraft.server.v1_16_R2.WorldServer; + +@SuppressWarnings("deprecation") +public class NMSChunkGenerator16_2_SPIGOT extends ChunkGenerator implements ProvisionedHolder +{ + private static final IBlockData k = Blocks.AIR.getBlockData(); + private final Provisioned provisioned; + private final int maxHeight; + private final int xzSize; + protected final IBlockData f; + protected final IBlockData g; + private final long w; + protected final Supplier h; + private final O ws; + private BlockColumn BC; + + public NMSChunkGenerator16_2_SPIGOT(Provisioned p, O ws, WorldChunkManager worldchunkmanager, long i, Supplier supplier) + { + this(p, ws, worldchunkmanager, worldchunkmanager, i, supplier); + } + + private NMSChunkGenerator16_2_SPIGOT(Provisioned p, O ws, WorldChunkManager worldchunkmanager, WorldChunkManager worldchunkmanager1, long i, Supplier supplier) + { + super(worldchunkmanager, worldchunkmanager1, supplier.get().a(), i); + this.provisioned = p; + this.ws = ws; + this.w = i; + GeneratorSettingBase generatorsettingbase = supplier.get(); + + this.h = supplier; + NoiseSettings noisesettings = generatorsettingbase.b(); + + this.maxHeight = noisesettings.f() * 4; + this.f = generatorsettingbase.c(); + this.g = generatorsettingbase.d(); + this.xzSize = noisesettings.a() / this.maxHeight; + BC = new BlockColumn(new IBlockData[this.xzSize * this.maxHeight]); + } + + public int getSpawnHeight() + { + return getSeaLevel() + 8; + } + + public WorldChunkManager getWorldChunkManager() + { + return this.c; + } + + public int getGenerationDepth() + { + return 256; + } + + public void doCarving(long i, BiomeManager biomemanager, IChunkAccess ichunkaccess, WorldGenStage.Features worldgenstage_features) + { + if(((IrisTerrainProvider) provisioned.getProvider()).getDimension().isVanillaCaves()) + { + super.doCarving(i, biomemanager, ichunkaccess, worldgenstage_features); + } + } + + @Override + protected Codec a() + { + return ChunkGeneratorAbstract.d; + } + + public boolean a(long i, ResourceKey resourcekey) + { + return this.w == i && this.h.get().a(resourcekey); + } + + @Override + public int getBaseHeight(int i, int j, HeightMap.Type heightmap_type) + { + return 63; + } + + @Override + public IBlockAccess a(int x, int z) + { + return BC; + } + + protected IBlockData a(double d0, int i) + { + IBlockData iblockdata; + + if(d0 > 0.0D) + { + iblockdata = this.f; + } + else if(i < this.getSeaLevel()) + { + iblockdata = this.g; + } + else + { + iblockdata = NMSChunkGenerator16_2_SPIGOT.k; + } + + return iblockdata; + } + + @Override + public void buildBase(RegionLimitedWorldAccess regionlimitedworldaccess, IChunkAccess ichunkaccess) + { + + } + + @Override + public void buildNoise(GeneratorAccess generatoraccess, StructureManager structuremanager, IChunkAccess ichunkaccess) + { + ObjectList objectlist = new ObjectArrayList(10); + ObjectList objectlist1 = new ObjectArrayList(32); + ChunkCoordIntPair chunkcoordintpair = ichunkaccess.getPos(); + int i = chunkcoordintpair.x; + int j = chunkcoordintpair.z; + + if(((IrisTerrainProvider) provisioned.getProvider()).shouldGenerateVanillaStructures()) + { + int k = i << 4; + int l = j << 4; + Iterator iterator = StructureGenerator.t.iterator(); + + while(iterator.hasNext()) + { + StructureGenerator structuregenerator = (StructureGenerator) iterator.next(); + + structuremanager.a(SectionPosition.a(chunkcoordintpair, 0), structuregenerator).forEach((structurestart) -> + { + Iterator iterator1 = structurestart.d().iterator(); + + while(iterator1.hasNext()) + { + StructurePiece structurepiece = (StructurePiece) iterator1.next(); + + if(structurepiece.a(chunkcoordintpair, 12)) + { + if(structurepiece instanceof WorldGenFeaturePillagerOutpostPoolPiece) + { + WorldGenFeaturePillagerOutpostPoolPiece worldgenfeaturepillageroutpostpoolpiece = (WorldGenFeaturePillagerOutpostPoolPiece) structurepiece; + WorldGenFeatureDefinedStructurePoolTemplate.Matching worldgenfeaturedefinedstructurepooltemplate_matching = worldgenfeaturepillageroutpostpoolpiece.b().e(); + + if(worldgenfeaturedefinedstructurepooltemplate_matching == WorldGenFeatureDefinedStructurePoolTemplate.Matching.RIGID) + { + objectlist.add(worldgenfeaturepillageroutpostpoolpiece); + } + + Iterator iterator2 = worldgenfeaturepillageroutpostpoolpiece.e().iterator(); + + while(iterator2.hasNext()) + { + WorldGenFeatureDefinedStructureJigsawJunction worldgenfeaturedefinedstructurejigsawjunction = (WorldGenFeatureDefinedStructureJigsawJunction) iterator2.next(); + int i1 = worldgenfeaturedefinedstructurejigsawjunction.a(); + int j1 = worldgenfeaturedefinedstructurejigsawjunction.c(); + + if(i1 > k - 12 && j1 > l - 12 && i1 < k + 15 + 12 && j1 < l + 15 + 12) + { + objectlist1.add(worldgenfeaturedefinedstructurejigsawjunction); + } + } + } + else + { + objectlist.add(structurepiece); + } + } + } + }); + } + } + + ProtoChunk protochunk = (ProtoChunk) ichunkaccess; + HeightMap heightmap = protochunk.a(HeightMap.Type.OCEAN_FLOOR_WG); + HeightMap heightmap1 = protochunk.a(HeightMap.Type.WORLD_SURFACE_WG); + GeneratedChunk gc = ((ProvisionBukkit) provisioned).generateNMSChunkData(ws.get().getWorld(), new Random(i + j), i, j, new ChunkData() + { + public int getMaxHeight() + { + return 256; + } + + public void setBlock(int x, int y, int z, Material material) + { + this.setBlock(x, y, z, material.createBlockData()); + } + + public void setBlock(int x, int y, int z, MaterialData material) + { + this.setBlock(x, y, z, CraftMagicNumbers.getBlock((MaterialData) material)); + } + + public void setBlock(int x, int y, int z, BlockData blockData) + { + this.setBlock(x, y, z, ((CraftBlockData) blockData).getState()); + } + + public void setRegion(int xMin, int yMin, int zMin, int xMax, int yMax, int zMax, Material material) + { + this.setRegion(xMin, yMin, zMin, xMax, yMax, zMax, material.createBlockData()); + } + + public void setRegion(int xMin, int yMin, int zMin, int xMax, int yMax, int zMax, MaterialData material) + { + this.setRegion(xMin, yMin, zMin, xMax, yMax, zMax, CraftMagicNumbers.getBlock((MaterialData) material)); + } + + public void setRegion(int xMin, int yMin, int zMin, int xMax, int yMax, int zMax, BlockData blockData) + { + this.setRegion(xMin, yMin, zMin, xMax, yMax, zMax, ((CraftBlockData) blockData).getState()); + } + + public Material getType(int x, int y, int z) + { + return CraftMagicNumbers.getMaterial((Block) this.getTypeId(x, y, z).getBlock()); + } + + public MaterialData getTypeAndData(int x, int y, int z) + { + return CraftMagicNumbers.getMaterial((IBlockData) this.getTypeId(x, y, z)); + } + + public BlockData getBlockData(int x, int y, int z) + { + return CraftBlockData.fromData((IBlockData) this.getTypeId(x, y, z)); + } + + public void setRegion(int xMin, int yMin, int zMin, int xMax, int yMax, int zMax, IBlockData type) + { + if(xMin > 15 || yMin >= getMaxHeight() || zMin > 15) + { + return; + } + if(xMin < 0) + { + xMin = 0; + } + if(yMin < 0) + { + yMin = 0; + } + if(zMin < 0) + { + zMin = 0; + } + if(xMax > 16) + { + xMax = 16; + } + if(yMax > getMaxHeight()) + { + yMax = getMaxHeight(); + } + if(zMax > 16) + { + zMax = 16; + } + if(xMin >= xMax || yMin >= yMax || zMin >= zMax) + { + return; + } + int y = yMin; + while(y < yMax) + { + int x = xMin; + while(x < xMax) + { + int z = zMin; + while(z < zMax) + { + protochunk.setType(new BlockPosition(x, y, z), type, false); + ++z; + } + ++x; + } + ++y; + } + } + + public IBlockData getTypeId(int x, int y, int z) + { + if(x != (x & 15) || y < 0 || y >= getMaxHeight() || z != (z & 15)) + { + return Blocks.AIR.getBlockData(); + } + return protochunk.getType(new BlockPosition(x, y, z)); + } + + public byte getData(int x, int y, int z) + { + return CraftMagicNumbers.toLegacyData((IBlockData) this.getTypeId(x, y, z)); + } + + private void setBlock(int x, int y, int z, IBlockData type) + { + if(x != (x & 15) || y < 0 || y >= getMaxHeight() || z != (z & 15)) + { + return; + } + + protochunk.setType(new BlockPosition(x, y, z), type, false); + + if(type.getBlock().isTileEntity()) + { + // if (this.tiles == null) { + // this.tiles = new HashSet(); + // } + // this.tiles.add(new BlockPosition(x, y, z)); + } + } + }, new BiomeGrid() + { + @Override + public void setBiome(int x, int y, int z, Biome bio) + { + protochunk.getBiomeIndex().setBiome(x, y, z, CraftBlock.biomeToBiomeBase(ws.get().r().b(IRegistry.ay), bio)); + } + + @Override + public void setBiome(int x, int z, Biome bio) + { + protochunk.getBiomeIndex().setBiome(x, 0, z, CraftBlock.biomeToBiomeBase(ws.get().r().b(IRegistry.ay), bio)); + } + + @Override + public Biome getBiome(int x, int y, int z) + { + return CraftBlock.biomeBaseToBiome(ws.get().r().b(IRegistry.ay), protochunk.getBiomeIndex().getBiome(x, y, z)); + } + + @Override + public Biome getBiome(int x, int z) + { + return CraftBlock.biomeBaseToBiome(ws.get().r().b(IRegistry.ay), protochunk.getBiomeIndex().getBiome(x, 0, z)); + } + }); + + for(int xx = 0; xx < 16; xx++) + { + for(int zz = 0; zz < 16; zz++) + { + int y = gc.getHeight().getHeight(xx, zz); + if(y < getSeaLevel()) + { + heightmap.a(xx, y, zz, Blocks.STONE.getBlockData()); + } + heightmap1.a(xx, Math.max(y, getSeaLevel()), zz, Blocks.STONE.getBlockData()); + } + } + } + + public void addDecorations(RegionLimitedWorldAccess regionlimitedworldaccess, StructureManager structuremanager) + { + if(((IrisTerrainProvider) provisioned.getProvider()).shouldGenerateVanillaStructures()) + { + int i = regionlimitedworldaccess.a(); + int j = regionlimitedworldaccess.b(); + int k = i * 16; + int l = j * 16; + BlockPosition blockposition = new BlockPosition(k, 0, l); + BiomeBase biomebase = this.b.getBiome((i << 2) + 2, 2, (j << 2) + 2); + SeededRandom seededrandom = new SeededRandom(); + long i1 = seededrandom.a(regionlimitedworldaccess.getSeed(), k, l); + try + { + a(biomebase, structuremanager, this, regionlimitedworldaccess, i1, seededrandom, blockposition); + } + catch(Exception exception) + { + + } + } + } + + public void a(BiomeBase bbase, StructureManager var0, ChunkGenerator var1, RegionLimitedWorldAccess var2, long var3, SeededRandom var5, BlockPosition var6) + { + if(!((IrisTerrainProvider) provisioned.getProvider()).shouldGenerateVanillaStructures()) + { + return; + } + + int stages = WorldGenStage.Decoration.values().length; + for(int stage = 0; stage < stages; ++stage) + { + WorldGenStage.Decoration st = WorldGenStage.Decoration.values()[stage]; + + if(st.equals(WorldGenStage.Decoration.LAKES)) + { + continue; + } + + if(st.equals(WorldGenStage.Decoration.LOCAL_MODIFICATIONS)) + { + continue; + } + + if(st.equals(WorldGenStage.Decoration.RAW_GENERATION)) + { + continue; + } + + if(st.equals(WorldGenStage.Decoration.TOP_LAYER_MODIFICATION)) + { + continue; + } + + if(st.equals(WorldGenStage.Decoration.UNDERGROUND_DECORATION)) + { + continue; + } + + if(st.equals(WorldGenStage.Decoration.UNDERGROUND_ORES)) + { + continue; + } + + if(st.equals(WorldGenStage.Decoration.VEGETAL_DECORATION)) + { + continue; + } + + StructureGenerator var13; + int var10 = 0; + if(var0.a()) + { + @SuppressWarnings("unchecked") + List> structureGenerators = ((Map>>) new V(bbase).get("g")).getOrDefault(stage, Collections.emptyList()); + Iterator> iterator = structureGenerators.iterator(); + while(iterator.hasNext()) + { + var13 = (StructureGenerator) iterator.next(); + + if(var13.equals(StructureGenerator.VILLAGE)) + { + continue; + } + + if(var13.equals(StructureGenerator.JUNGLE_PYRAMID)) + { + continue; + } + + if(var13.equals(StructureGenerator.IGLOO)) + { + continue; + } + + if(var13.equals(StructureGenerator.NETHER_FOSSIL)) + { + continue; + } + + if(var13.equals(StructureGenerator.SHIPWRECK)) + { + continue; + } + + if(var13.equals(StructureGenerator.SHIPWRECK)) + { + continue; + } + + if(var13.equals(StructureGenerator.MONUMENT)) + { + continue; + } + + if(var13.equals(StructureGenerator.BASTION_REMNANT)) + { + continue; + } + + var5.b(var3, var10, stage); + int var14 = var6.getX() >> 4; + int var15 = var6.getZ() >> 4; + int var16 = var14 << 4; + int var17 = var15 << 4; + + try + { + var0.a(SectionPosition.a((BlockPosition) var6), var13).forEach(var8 -> var8.a((GeneratorAccessSeed) var2, var0, var1, (Random) var5, new StructureBoundingBox(var16, var17, var16 + 15, var17 + 15), new ChunkCoordIntPair(var14, var15))); + } + + catch(Exception var18) + { + + } + + ++var10; + } + } + } + } + + @Override + public int getSeaLevel() + { + return ((IrisTerrainProvider) provisioned.getProvider()).getFluidHeight(); + } + + @Override + public List getMobsFor(BiomeBase biomebase, StructureManager structuremanager, EnumCreatureType enumcreaturetype, BlockPosition blockposition) + { + if(structuremanager.a(blockposition, true, StructureGenerator.SWAMP_HUT).e()) + { + if(enumcreaturetype == EnumCreatureType.MONSTER) + { + return StructureGenerator.SWAMP_HUT.c(); + } + + if(enumcreaturetype == EnumCreatureType.CREATURE) + { + return StructureGenerator.SWAMP_HUT.j(); + } + } + + if(enumcreaturetype == EnumCreatureType.MONSTER) + { + if(structuremanager.a(blockposition, false, StructureGenerator.PILLAGER_OUTPOST).e()) + { + return StructureGenerator.PILLAGER_OUTPOST.c(); + } + + if(structuremanager.a(blockposition, false, StructureGenerator.MONUMENT).e()) + { + return StructureGenerator.MONUMENT.c(); + } + + if(structuremanager.a(blockposition, true, StructureGenerator.FORTRESS).e()) + { + return StructureGenerator.FORTRESS.c(); + } + } + + return super.getMobsFor(biomebase, structuremanager, enumcreaturetype, blockposition); + } + + @Override + public void addMobs(RegionLimitedWorldAccess regionlimitedworldaccess) + { + int i = regionlimitedworldaccess.a(); + int j = regionlimitedworldaccess.b(); + BiomeBase biomebase = regionlimitedworldaccess.getBiome((new ChunkCoordIntPair(i, j)).l()); + SeededRandom seededrandom = new SeededRandom(); + seededrandom.a(regionlimitedworldaccess.getSeed(), i << 4, j << 4); + SpawnerCreature.a(regionlimitedworldaccess, biomebase, i, j, seededrandom); + } + + public void createStructures(IRegistryCustom iregistrycustom, StructureManager structuremanager, IChunkAccess ichunkaccess, DefinedStructureManager definedstructuremanager, long i) + { + ChunkCoordIntPair chunkcoordintpair = ichunkaccess.getPos(); + BiomeBase biomebase = this.b.getBiome((chunkcoordintpair.x << 2) + 2, 0, (chunkcoordintpair.z << 2) + 2); + this.a(StructureFeatures.k, iregistrycustom, structuremanager, ichunkaccess, definedstructuremanager, i, chunkcoordintpair, biomebase); + for(Supplier> supplier : biomebase.e().a()) + { + StructureFeature structurefeature = (StructureFeature) supplier.get(); + if(StructureFeature.c == StructureGenerator.STRONGHOLD) + { + StructureFeature structureFeature = structurefeature; + synchronized(structureFeature) + { + this.a(structurefeature, iregistrycustom, structuremanager, ichunkaccess, definedstructuremanager, i, chunkcoordintpair, biomebase); + continue; + } + } + this.a(structurefeature, iregistrycustom, structuremanager, ichunkaccess, definedstructuremanager, i, chunkcoordintpair, biomebase); + } + } + + private void a(StructureFeature structurefeature, IRegistryCustom iregistrycustom, StructureManager structuremanager, IChunkAccess ichunkaccess, DefinedStructureManager definedstructuremanager, long i, ChunkCoordIntPair chunkcoordintpair, BiomeBase biomebase) + { + StructureStart structurestart = structuremanager.a(SectionPosition.a((ChunkCoordIntPair) ichunkaccess.getPos(), (int) 0), structurefeature.d, (IStructureAccess) ichunkaccess); + int j = structurestart != null ? structurestart.j() : 0; + StructureSettingsFeature structuresettingsfeature = getSettings().a(structurefeature.d); + if(structuresettingsfeature != null) + { + StructureStart structurestart1 = structurefeature.a(iregistrycustom, this, this.b, definedstructuremanager, i, chunkcoordintpair, biomebase, j, structuresettingsfeature); + structuremanager.a(SectionPosition.a((ChunkCoordIntPair) ichunkaccess.getPos(), (int) 0), structurefeature.d, structurestart1, (IStructureAccess) ichunkaccess); + } + } + + public void storeStructures(GeneratorAccessSeed generatoraccessseed, StructureManager structuremanager, IChunkAccess ichunkaccess) + { + int i = ichunkaccess.getPos().x; + int j = ichunkaccess.getPos().z; + int k = i << 4; + int l = j << 4; + SectionPosition sectionposition = SectionPosition.a((ChunkCoordIntPair) ichunkaccess.getPos(), (int) 0); + int i1 = i - 8; + while(i1 <= i + 8) + { + int j1 = j - 8; + while(j1 <= j + 8) + { + long k1 = ChunkCoordIntPair.pair((int) i1, (int) j1); + for(StructureStart structurestart : generatoraccessseed.getChunkAt(i1, j1).h().values()) + { + try + { + if(structurestart == StructureStart.a || !structurestart.c().a(k, l, k + 15, l + 15)) + continue; + structuremanager.a(sectionposition, structurestart.l(), k1, (IStructureAccess) ichunkaccess); + PacketDebug.a((GeneratorAccessSeed) generatoraccessseed, (StructureStart) structurestart); + } + catch(Exception exception) + { + CrashReport crashreport = CrashReport.a((Throwable) exception, (String) "Generating structure reference"); + CrashReportSystemDetails crashreportsystemdetails = crashreport.a("Structure"); + crashreportsystemdetails.a("Name", () -> structurestart.l().i()); + crashreportsystemdetails.a("Class", () -> structurestart.l().getClass().getCanonicalName()); + throw new ReportedException(crashreport); + } + } + ++j1; + } + ++i1; + } + } + + @Override + public Provisioned getProvisioned() + { + return provisioned; + } + + @Override + public void clearRegeneratedLists() + { + getProvisioned().clearRegeneratedLists(); + } + + @Override + public TerrainProvider getProvider() + { + return getProvisioned().getProvider(); + } + + @Override + public void regenerate(int x, int z) + { + getProvisioned().regenerate(x, z); + } +} diff --git a/src/main/java/com/volmit/iris/gen/nms/v16_2/NMSCreator16_2.java b/src/main/java/com/volmit/iris/gen/nms/v16_2/NMSCreator16_2.java index f6325475b..8d4f13b93 100644 --- a/src/main/java/com/volmit/iris/gen/nms/v16_2/NMSCreator16_2.java +++ b/src/main/java/com/volmit/iris/gen/nms/v16_2/NMSCreator16_2.java @@ -23,6 +23,7 @@ import com.google.common.collect.ImmutableSet; import com.mojang.serialization.DynamicOps; import com.mojang.serialization.Lifecycle; import com.volmit.iris.gen.nms.INMSCreator; +import com.volmit.iris.gen.scaffold.IrisWorlds; import com.volmit.iris.gen.scaffold.Provisioned; import com.volmit.iris.util.O; import com.volmit.iris.util.V; @@ -154,7 +155,7 @@ class NMSCreator16_2 implements INMSCreator long ll = creator.seed(); dimensionmanager = (DimensionManager) getConsoleDimension(console).a().d(DimensionManager.OVERWORLD); O ws = new O(); - chunkgenerator = new NMSChunkGenerator16_2(pro, ws, (WorldChunkManager) new WorldChunkManagerOverworld(ll, false, false, (IRegistry) getConsoleDimension(console).b(IRegistry.ay)), ll, () -> (GeneratorSettingBase) getConsoleDimension(console).b(IRegistry.ar).d(GeneratorSettingBase.c)); + chunkgenerator = PaperLib.isPaper() ? new NMSChunkGenerator16_2_PAPER(pro, ws, (WorldChunkManager) new WorldChunkManagerOverworld(ll, false, false, (IRegistry) getConsoleDimension(console).b(IRegistry.ay)), ll, () -> (GeneratorSettingBase) getConsoleDimension(console).b(IRegistry.ar).d(GeneratorSettingBase.c)) : new NMSChunkGenerator16_2_SPIGOT(pro, ws, (WorldChunkManager) new WorldChunkManagerOverworld(ll, false, false, (IRegistry) getConsoleDimension(console).b(IRegistry.ay)), ll, () -> (GeneratorSettingBase) getConsoleDimension(console).b(IRegistry.ar).d(GeneratorSettingBase.c)); final ResourceKey worldKey = (ResourceKey) ResourceKey.a(IRegistry.L, new MinecraftKey(name.toLowerCase(Locale.ENGLISH))); //@builder final WorldServer internal = new WorldServer((MinecraftServer) console, @@ -171,6 +172,7 @@ class NMSCreator16_2 implements INMSCreator creator.environment(), server.getGenerator(name)); //@done + IrisWorlds.register(internal.getWorld(), pro); ws.set(internal); if(!worlds.containsKey(name.toLowerCase(Locale.ENGLISH))) { diff --git a/src/main/java/com/volmit/iris/gen/scaffold/IrisWorlds.java b/src/main/java/com/volmit/iris/gen/scaffold/IrisWorlds.java index d3b4f5cb8..160aaa8b9 100644 --- a/src/main/java/com/volmit/iris/gen/scaffold/IrisWorlds.java +++ b/src/main/java/com/volmit/iris/gen/scaffold/IrisWorlds.java @@ -4,19 +4,32 @@ import org.bukkit.World; import com.volmit.iris.gen.IrisTerrainProvider; import com.volmit.iris.gen.provisions.ProvisionBukkit; +import com.volmit.iris.util.KMap; public class IrisWorlds { + private static final KMap provisioned = new KMap<>(); + + public static void register(World w, Provisioned p) + { + provisioned.put(w.getUID().toString(), p); + } + public static boolean isIrisWorld(World world) { - return world.getGenerator() instanceof Provisioned; + if(provisioned.containsKey(world.getUID().toString())) + { + return true; + } + + return world.getGenerator() instanceof Provisioned || world.getGenerator() instanceof ProvisionedHolder; } public static IrisTerrainProvider getProvider(World world) { if(isIrisWorld(world)) { - return (IrisTerrainProvider) ((Provisioned) world.getGenerator()).getProvider(); + return (IrisTerrainProvider) getProvisioned(world).getProvider(); } return null; @@ -26,6 +39,11 @@ public class IrisWorlds { if(isIrisWorld(world)) { + if(provisioned.containsKey(world.getUID().toString())) + { + return (ProvisionBukkit) provisioned.get(world.getUID().toString()); + } + if(world.getGenerator() instanceof ProvisionedHolder) { return (ProvisionBukkit) ((ProvisionedHolder) world.getGenerator()).getProvisioned(); diff --git a/src/main/java/com/volmit/iris/manager/IrisBoardManager.java b/src/main/java/com/volmit/iris/manager/IrisBoardManager.java index 19eec679d..063233d35 100644 --- a/src/main/java/com/volmit/iris/manager/IrisBoardManager.java +++ b/src/main/java/com/volmit/iris/manager/IrisBoardManager.java @@ -56,7 +56,7 @@ public class IrisBoardManager implements BoardProvider, Listener @DontObfuscate private boolean isIrisWorld(World w) { - return IrisWorlds.getProvider(w).isDev(); + return IrisWorlds.isIrisWorld(w) && IrisWorlds.getProvider(w).isDev(); } public void updatePlayer(Player p) diff --git a/src/main/java/com/volmit/iris/object/IrisCaveFluid.java b/src/main/java/com/volmit/iris/object/IrisCaveFluid.java index 19e8d05de..b3c825a8a 100644 --- a/src/main/java/com/volmit/iris/object/IrisCaveFluid.java +++ b/src/main/java/com/volmit/iris/object/IrisCaveFluid.java @@ -22,7 +22,6 @@ import lombok.experimental.Accessors; @Data public class IrisCaveFluid { - @Required @MaxNumber(255) @MinNumber(0) diff --git a/src/main/java/com/volmit/iris/object/IrisDimension.java b/src/main/java/com/volmit/iris/object/IrisDimension.java index d136fefe1..efddb39ab 100644 --- a/src/main/java/com/volmit/iris/object/IrisDimension.java +++ b/src/main/java/com/volmit/iris/object/IrisDimension.java @@ -163,6 +163,10 @@ public class IrisDimension extends IrisRegistrant @Desc("Generate vanilla structures") private boolean vanillaStructures = false; + @DontObfuscate + @Desc("If defined, If air is defined below the area, this fluid will always place") + private IrisCaveFluid forceFluid = new IrisCaveFluid(); + @DontObfuscate @Desc("Generate decorations or not") private boolean decorate = true;