From 42ef270e2eb4214afed27d674c8080261c209cef Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Tue, 6 Oct 2020 16:40:26 +0300 Subject: [PATCH] Mushroom fixes --- .../mixin/common/LocateCommandMixin.java | 45 ++++++++++++++ .../betterend/registry/StructureRegistry.java | 2 +- .../ru/betterend/util/StructureHelper.java | 62 +++++++++++++++++++ .../world/structures/EndStructureFeature.java | 1 - .../world/structures/StructureWorld.java | 15 ++++- .../features/SDFStructureFeature.java | 17 +++-- .../features/StructureFeatureBase.java | 46 ++++++++++++++ .../StructureGiantMossyGlowshroom.java | 4 -- .../world/structures/piece/VoxelPiece.java | 3 + .../resources/betterend.mixins.common.json | 3 +- 10 files changed, 181 insertions(+), 17 deletions(-) create mode 100644 src/main/java/ru/betterend/mixin/common/LocateCommandMixin.java create mode 100644 src/main/java/ru/betterend/util/StructureHelper.java create mode 100644 src/main/java/ru/betterend/world/structures/features/StructureFeatureBase.java diff --git a/src/main/java/ru/betterend/mixin/common/LocateCommandMixin.java b/src/main/java/ru/betterend/mixin/common/LocateCommandMixin.java new file mode 100644 index 00000000..331df4e3 --- /dev/null +++ b/src/main/java/ru/betterend/mixin/common/LocateCommandMixin.java @@ -0,0 +1,45 @@ +package ru.betterend.mixin.common; + +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import com.mojang.brigadier.exceptions.SimpleCommandExceptionType; + +import net.minecraft.server.command.LocateCommand; +import net.minecraft.server.command.ServerCommandSource; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import net.minecraft.world.gen.feature.StructureFeature; +import ru.betterend.util.StructureHelper; + +@Mixin(LocateCommand.class) +public class LocateCommandMixin { + @Shadow + @Final + private static SimpleCommandExceptionType FAILED_EXCEPTION; + + @Shadow + public static int sendCoordinates(ServerCommandSource source, String structure, BlockPos sourcePos, + BlockPos structurePos, String successMessage) { + return 0; + } + + @Inject(method = "execute", at = @At("HEAD"), cancellable = true) + private static void execute(ServerCommandSource source, StructureFeature structureFeature, CallbackInfoReturnable info) throws CommandSyntaxException { + if (source.getWorld().getRegistryKey() == World.END) { + BlockPos blockPos = new BlockPos(source.getPosition()); + BlockPos blockPos2 = StructureHelper.getNearestStructure(structureFeature, source.getWorld(), blockPos, 100); + if (blockPos2 == null) { + throw FAILED_EXCEPTION.create(); + } else { + info.setReturnValue(sendCoordinates(source, structureFeature.getName(), blockPos, blockPos2, "commands.locate.success")); + info.cancel(); + } + } + } +} diff --git a/src/main/java/ru/betterend/registry/StructureRegistry.java b/src/main/java/ru/betterend/registry/StructureRegistry.java index a4f1e987..68889457 100644 --- a/src/main/java/ru/betterend/registry/StructureRegistry.java +++ b/src/main/java/ru/betterend/registry/StructureRegistry.java @@ -11,7 +11,7 @@ import ru.betterend.world.structures.piece.VoxelPiece; public class StructureRegistry { public static final StructurePieceType VOXEL_PIECE = register("voxel", VoxelPiece::new); - public static final EndStructureFeature GIANT_MOSSY_GLOWSHROOM = new EndStructureFeature("giant_mossy_glowshroom", new StructureGiantMossyGlowshroom(), Feature.RAW_GENERATION, 32, 8); + public static final EndStructureFeature GIANT_MOSSY_GLOWSHROOM = new EndStructureFeature("giant_mossy_glowshroom", new StructureGiantMossyGlowshroom(), Feature.SURFACE_STRUCTURES, 16, 8); public static void register() {} diff --git a/src/main/java/ru/betterend/util/StructureHelper.java b/src/main/java/ru/betterend/util/StructureHelper.java new file mode 100644 index 00000000..5b1ddf06 --- /dev/null +++ b/src/main/java/ru/betterend/util/StructureHelper.java @@ -0,0 +1,62 @@ +package ru.betterend.util; + +import java.util.HashSet; +import java.util.Iterator; +import java.util.Set; + +import net.minecraft.server.world.ServerWorld; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.ChunkPos; +import net.minecraft.world.gen.ChunkRandom; +import net.minecraft.world.gen.chunk.StructureConfig; +import net.minecraft.world.gen.feature.StructureFeature; + +public class StructureHelper { + private static final Set POSITIONS = new HashSet(64); + + private static void collectNearby(ServerWorld world, StructureFeature feature, int chunkX, int chunkZ, int radius, StructureConfig config, long worldSeed, ChunkRandom chunkRandom) { + int x1 = chunkX - radius; + int x2 = chunkX + radius; + int z1 = chunkZ - radius; + int z2 = chunkZ + radius; + + POSITIONS.clear(); + for (int x = x1; x <= x2; x += 8) { + for (int z = z1; z <= z2; z += 8) { + ChunkPos chunk = feature.getStartChunk(config, worldSeed, chunkRandom, x, z); + if (world.getBiome(chunk.getStartPos()).getGenerationSettings().hasStructureFeature(feature)) + POSITIONS.add(chunk); + } + } + } + + private static long sqr(int x) { + return (long) x * (long) x; + } + + public static BlockPos getNearestStructure(StructureFeature feature, ServerWorld world, BlockPos pos, int radius) { + int cx = pos.getX() >> 4; + int cz = pos.getZ() >> 4; + + StructureConfig config = world.getChunkManager().getChunkGenerator().getStructuresConfig().getForType(feature); + if (config == null) + return null; + + collectNearby(world, feature, cx, cz, radius, config, world.getSeed(), new ChunkRandom()); + Iterator iterator = POSITIONS.iterator(); + if (iterator.hasNext()) { + ChunkPos nearest = POSITIONS.iterator().next(); + long d = sqr(nearest.x - cx) + sqr(nearest.z - cz); + while (iterator.hasNext()) { + ChunkPos n = iterator.next(); + long d2 = sqr(n.x - cx) + sqr(n.z - cz); + if (d2 < d) { + d = d2; + nearest = n; + } + } + return nearest.getStartPos(); + } + return null; + } +} diff --git a/src/main/java/ru/betterend/world/structures/EndStructureFeature.java b/src/main/java/ru/betterend/world/structures/EndStructureFeature.java index f883fbaa..5e10a5fa 100644 --- a/src/main/java/ru/betterend/world/structures/EndStructureFeature.java +++ b/src/main/java/ru/betterend/world/structures/EndStructureFeature.java @@ -24,7 +24,6 @@ public class EndStructureFeature { this.structure = FabricStructureBuilder.create(id, structure) .step(step) .defaultConfig(spacing, separation, RANDOM.nextInt(8192)) - .adjustsSurface() .register(); this.featureConfigured = this.structure.configure(DefaultFeatureConfig.DEFAULT); diff --git a/src/main/java/ru/betterend/world/structures/StructureWorld.java b/src/main/java/ru/betterend/world/structures/StructureWorld.java index 5ecde77b..eb2d712f 100644 --- a/src/main/java/ru/betterend/world/structures/StructureWorld.java +++ b/src/main/java/ru/betterend/world/structures/StructureWorld.java @@ -18,8 +18,10 @@ import net.minecraft.world.chunk.Chunk; public class StructureWorld { private Map parts = Maps.newHashMap(); private int minX = Integer.MAX_VALUE; + private int minY = Integer.MAX_VALUE; private int minZ = Integer.MAX_VALUE; private int maxX = Integer.MIN_VALUE; + private int maxY = Integer.MIN_VALUE; private int maxZ = Integer.MIN_VALUE; public StructureWorld() {} @@ -27,8 +29,11 @@ public class StructureWorld { public StructureWorld(CompoundTag tag) { minX = tag.getInt("minX"); maxX = tag.getInt("maxX"); + minY = tag.getInt("minY"); + maxY = tag.getInt("maxY"); minZ = tag.getInt("minZ"); maxZ = tag.getInt("maxZ"); + ListTag map = tag.getList("parts", 10); map.forEach((element) -> { CompoundTag compound = (CompoundTag) element; @@ -51,6 +56,8 @@ public class StructureWorld { if (cPos.z < minZ) minZ = cPos.z; if (cPos.z > maxZ) maxZ = cPos.z; } + if (pos.getY() < minY) minY = pos.getY(); + if (pos.getY() > maxY) maxY = pos.getY(); part.addBlock(pos, state); } @@ -68,6 +75,8 @@ public class StructureWorld { CompoundTag tag = new CompoundTag(); tag.putInt("minX", minX); tag.putInt("maxX", maxX); + tag.putInt("minY", minY); + tag.putInt("maxY", maxY); tag.putInt("minZ", minZ); tag.putInt("maxZ", maxZ); ListTag map = new ListTag(); @@ -79,7 +88,10 @@ public class StructureWorld { } public BlockBox getBounds() { - return new BlockBox(minX << 4, minZ << 4, (maxX << 4) | 15, (maxZ << 4) | 15); + if (minX == Integer.MAX_VALUE || maxX == Integer.MIN_VALUE || minZ == Integer.MAX_VALUE || maxZ == Integer.MIN_VALUE) { + return BlockBox.empty(); + } + return new BlockBox(minX << 4, minY, minZ << 4, (maxX << 4) | 15, maxY, (maxZ << 4) | 15); } private static final class Part { @@ -104,6 +116,7 @@ public class StructureWorld { void placeChunk(Chunk chunk) { blocks.forEach((pos, state) -> { + //if (pos.getY() > 10) chunk.setBlockState(pos, state, false); }); } diff --git a/src/main/java/ru/betterend/world/structures/features/SDFStructureFeature.java b/src/main/java/ru/betterend/world/structures/features/SDFStructureFeature.java index baee4af4..42a31a73 100644 --- a/src/main/java/ru/betterend/world/structures/features/SDFStructureFeature.java +++ b/src/main/java/ru/betterend/world/structures/features/SDFStructureFeature.java @@ -16,11 +16,8 @@ import ru.betterend.util.MHelper; import ru.betterend.util.sdf.SDF; import ru.betterend.world.structures.piece.VoxelPiece; -public abstract class SDFStructureFeature extends StructureFeature { - public SDFStructureFeature() { - super(DefaultFeatureConfig.CODEC); - } - +public abstract class SDFStructureFeature extends StructureFeatureBase { + protected abstract SDF getSDF(BlockPos pos, Random random); @Override @@ -38,10 +35,12 @@ public abstract class SDFStructureFeature extends StructureFeature { ((SDFStructureFeature) this.getFeature()).getSDF(start, this.random).fillRecursive(world, start); }, random.nextInt()); - this.children.add(piece); - this.boundingBox = piece.getBoundingBox(); + if (y > 5) { + BlockPos start = new BlockPos(x, y, z); + VoxelPiece piece = new VoxelPiece((world) -> { ((SDFStructureFeature) this.getFeature()).getSDF(start, this.random).fillRecursive(world, start); }, random.nextInt()); + this.children.add(piece); + } + this.setBoundingBoxFromChildren(); } } } diff --git a/src/main/java/ru/betterend/world/structures/features/StructureFeatureBase.java b/src/main/java/ru/betterend/world/structures/features/StructureFeatureBase.java new file mode 100644 index 00000000..167fae91 --- /dev/null +++ b/src/main/java/ru/betterend/world/structures/features/StructureFeatureBase.java @@ -0,0 +1,46 @@ +package ru.betterend.world.structures.features; + +import java.util.Random; + +import net.minecraft.util.BlockRotation; +import net.minecraft.util.math.ChunkPos; +import net.minecraft.world.Heightmap; +import net.minecraft.world.biome.Biome; +import net.minecraft.world.biome.source.BiomeSource; +import net.minecraft.world.gen.ChunkRandom; +import net.minecraft.world.gen.chunk.ChunkGenerator; +import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import net.minecraft.world.gen.feature.StructureFeature; + +public abstract class StructureFeatureBase extends StructureFeature { + public StructureFeatureBase() { + super(DefaultFeatureConfig.CODEC); + } + + protected boolean shouldStartAt(ChunkGenerator chunkGenerator, BiomeSource biomeSource, long worldSeed, ChunkRandom chunkRandom, int chunkX, int chunkZ, Biome biome, ChunkPos chunkPos, DefaultFeatureConfig featureConfig) { + return getGenerationHeight(chunkX, chunkZ, chunkGenerator) >= 50; + } + + private static int getGenerationHeight(int chunkX, int chunkZ, ChunkGenerator chunkGenerator) { + Random random = new Random((long) (chunkX + chunkZ * 10387313)); + BlockRotation blockRotation = BlockRotation.random(random); + int i = 5; + int j = 5; + if (blockRotation == BlockRotation.CLOCKWISE_90) { + i = -5; + } else if (blockRotation == BlockRotation.CLOCKWISE_180) { + i = -5; + j = -5; + } else if (blockRotation == BlockRotation.COUNTERCLOCKWISE_90) { + j = -5; + } + + int k = (chunkX << 4) + 7; + int l = (chunkZ << 4) + 7; + int m = chunkGenerator.getHeightInGround(k, l, Heightmap.Type.WORLD_SURFACE_WG); + int n = chunkGenerator.getHeightInGround(k, l + j, Heightmap.Type.WORLD_SURFACE_WG); + int o = chunkGenerator.getHeightInGround(k + i, l, Heightmap.Type.WORLD_SURFACE_WG); + int p = chunkGenerator.getHeightInGround(k + i, l + j, Heightmap.Type.WORLD_SURFACE_WG); + return Math.min(Math.min(m, n), Math.min(o, p)); + } +} diff --git a/src/main/java/ru/betterend/world/structures/features/StructureGiantMossyGlowshroom.java b/src/main/java/ru/betterend/world/structures/features/StructureGiantMossyGlowshroom.java index 1a43c1ad..88fd448b 100644 --- a/src/main/java/ru/betterend/world/structures/features/StructureGiantMossyGlowshroom.java +++ b/src/main/java/ru/betterend/world/structures/features/StructureGiantMossyGlowshroom.java @@ -3,8 +3,6 @@ package ru.betterend.world.structures.features; import java.util.List; import java.util.Random; -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; import net.minecraft.client.util.math.Vector3f; import net.minecraft.util.math.BlockPos; import ru.betterend.blocks.BlockMossyGlowshroomCap; @@ -28,8 +26,6 @@ import ru.betterend.util.sdf.primitive.SDFPrimitive; import ru.betterend.util.sdf.primitive.SDFSphere; public class StructureGiantMossyGlowshroom extends SDFStructureFeature { - private static final BlockState AIR = Blocks.AIR.getDefaultState(); - @Override protected SDF getSDF(BlockPos center, Random random) { System.out.println(center); diff --git a/src/main/java/ru/betterend/world/structures/piece/VoxelPiece.java b/src/main/java/ru/betterend/world/structures/piece/VoxelPiece.java index 84c56f49..89c63bce 100644 --- a/src/main/java/ru/betterend/world/structures/piece/VoxelPiece.java +++ b/src/main/java/ru/betterend/world/structures/piece/VoxelPiece.java @@ -22,10 +22,13 @@ public class VoxelPiece extends BasePiece { world = new StructureWorld(); function.accept(world); this.boundingBox = world.getBounds(); + System.out.println(this.boundingBox); } public VoxelPiece(StructureManager manager, CompoundTag tag) { super(StructureRegistry.VOXEL_PIECE, tag); + this.boundingBox = world.getBounds(); + System.out.println(this.boundingBox); } @Override diff --git a/src/main/resources/betterend.mixins.common.json b/src/main/resources/betterend.mixins.common.json index 19458ad8..33fd2062 100644 --- a/src/main/resources/betterend.mixins.common.json +++ b/src/main/resources/betterend.mixins.common.json @@ -14,7 +14,8 @@ "AbstractBlockMixin", "LivingEntityMixin", "BiomeMixin", - "SlimeEntityMixin" + "SlimeEntityMixin", + "LocateCommandMixin" ], "injectors": { "defaultRequire": 1