From ff0f9f18a9ddeaf6f16628cd755c923cfc8db769 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Sat, 7 Nov 2020 14:11:11 +0300 Subject: [PATCH] Fur rotation fix, new structure format --- .../blocks/basis/BlockGlowingFur.java | 13 +++++ .../ru/betterend/world/biome/EndBiome.java | 7 +-- .../betterend/world/features/ListFeature.java | 20 ++++---- .../world/features/NBTStructureFeature.java | 49 +++++++++++++++---- .../biome/shadow_forest/structures.json | 26 +++++----- 5 files changed, 80 insertions(+), 35 deletions(-) diff --git a/src/main/java/ru/betterend/blocks/basis/BlockGlowingFur.java b/src/main/java/ru/betterend/blocks/basis/BlockGlowingFur.java index 1fa1d7a9..5d7ce3d5 100644 --- a/src/main/java/ru/betterend/blocks/basis/BlockGlowingFur.java +++ b/src/main/java/ru/betterend/blocks/basis/BlockGlowingFur.java @@ -24,6 +24,8 @@ import net.minecraft.sound.BlockSoundGroup; import net.minecraft.state.StateManager; import net.minecraft.state.property.DirectionProperty; import net.minecraft.state.property.Properties; +import net.minecraft.util.BlockMirror; +import net.minecraft.util.BlockRotation; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; import net.minecraft.util.shape.VoxelShape; @@ -33,6 +35,7 @@ import net.minecraft.world.WorldAccess; import net.minecraft.world.WorldView; import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IRenderTypeable; +import ru.betterend.util.BlocksHelper; import ru.betterend.util.MHelper; public class BlockGlowingFur extends BlockBaseNotFull implements IRenderTypeable { @@ -115,6 +118,16 @@ public class BlockGlowingFur extends BlockBaseNotFull implements IRenderTypeable return ERenderLayer.CUTOUT; } + @Override + public BlockState rotate(BlockState state, BlockRotation rotation) { + return BlocksHelper.rotateHorizontal(state, rotation, FACING); + } + + @Override + public BlockState mirror(BlockState state, BlockMirror mirror) { + return BlocksHelper.mirrorHorizontal(state, mirror, FACING); + } + static { BOUNDING_SHAPES.put(Direction.UP, VoxelShapes.cuboid(0.0, 0.0, 0.0, 1.0, 0.5, 1.0)); BOUNDING_SHAPES.put(Direction.DOWN, VoxelShapes.cuboid(0.0, 0.5, 0.0, 1.0, 1.0, 1.0)); diff --git a/src/main/java/ru/betterend/world/biome/EndBiome.java b/src/main/java/ru/betterend/world/biome/EndBiome.java index 39ec7eb3..1ee9c07c 100644 --- a/src/main/java/ru/betterend/world/biome/EndBiome.java +++ b/src/main/java/ru/betterend/world/biome/EndBiome.java @@ -18,6 +18,7 @@ import ru.betterend.util.StructureHelper; import ru.betterend.world.features.EndFeature; import ru.betterend.world.features.ListFeature; import ru.betterend.world.features.ListFeature.StructureInfo; +import ru.betterend.world.features.NBTStructureFeature.TerrainMerge; public class EndBiome { protected List subbiomes = Lists.newArrayList(); @@ -142,12 +143,12 @@ public class EndBiome { enties.forEach((entry) -> { JsonObject e = entry.getAsJsonObject(); Structure structure = StructureHelper.readStructure(path + e.get("nbt").getAsString() + ".nbt"); - boolean adjustTerrain = e.get("adjustTerrain").getAsBoolean(); + TerrainMerge terrainMerge = TerrainMerge.getFromString(e.get("terrainMerge").getAsString()); int offsetY = e.get("offsetY").getAsInt(); - list.add(new StructureInfo(structure, offsetY, adjustTerrain)); + list.add(new StructureInfo(structure, offsetY, terrainMerge)); }); if (!list.isEmpty()) { - structuresFeature = EndFeature.makeChansedFeature(nm + "_structures", new ListFeature(list), 30); + structuresFeature = EndFeature.makeChansedFeature(nm + "_structures", new ListFeature(list), 15); } } } diff --git a/src/main/java/ru/betterend/world/features/ListFeature.java b/src/main/java/ru/betterend/world/features/ListFeature.java index e6da5d8b..012e84e2 100644 --- a/src/main/java/ru/betterend/world/features/ListFeature.java +++ b/src/main/java/ru/betterend/world/features/ListFeature.java @@ -26,7 +26,9 @@ public class ListFeature extends NBTStructureFeature { @Override protected boolean canSpawn(StructureWorldAccess world, BlockPos pos, Random random) { - return pos.getY() > 58 && world.getBlockState(pos.down()).isIn(EndTags.GEN_TERRAIN); + int cx = pos.getX() >> 4; + int cz = pos.getZ() >> 4; + return ((cx + cz) & 1) == 0 && pos.getY() > 58 && world.getBlockState(pos.down()).isIn(EndTags.GEN_TERRAIN); } @Override @@ -43,19 +45,19 @@ public class ListFeature extends NBTStructureFeature { protected int getYOffset(Structure structure, StructureWorldAccess world, BlockPos pos, Random random) { return selected.offsetY; } - - @Override - protected boolean adjustSurface(StructureWorldAccess world, BlockPos pos, Random random) { - return selected.adjustTerrain; - } + @Override + protected TerrainMerge getTerrainMerge(StructureWorldAccess world, BlockPos pos, Random random) { + return selected.terrainMerge; + } + public static final class StructureInfo { - public final boolean adjustTerrain; + public final TerrainMerge terrainMerge; public final Structure structure; public final int offsetY; - public StructureInfo(Structure structure, int offsetY, boolean adjustTerrain) { - this.adjustTerrain = adjustTerrain; + public StructureInfo(Structure structure, int offsetY, TerrainMerge terrainMerge) { + this.terrainMerge = terrainMerge; this.structure = structure; this.offsetY = offsetY; } diff --git a/src/main/java/ru/betterend/world/features/NBTStructureFeature.java b/src/main/java/ru/betterend/world/features/NBTStructureFeature.java index eca839fd..0d49d983 100644 --- a/src/main/java/ru/betterend/world/features/NBTStructureFeature.java +++ b/src/main/java/ru/betterend/world/features/NBTStructureFeature.java @@ -40,7 +40,7 @@ public abstract class NBTStructureFeature extends DefaultFeature { protected abstract int getYOffset(Structure structure, StructureWorldAccess world, BlockPos pos, Random random); - protected abstract boolean adjustSurface(StructureWorldAccess world, BlockPos pos, Random random); + protected abstract TerrainMerge getTerrainMerge(StructureWorldAccess world, BlockPos pos, Random random); protected BlockPos getGround(StructureWorldAccess world, BlockPos center) { Biome biome = world.getBiome(center); @@ -87,14 +87,15 @@ public abstract class NBTStructureFeature extends DefaultFeature { BlockRotation rotation = getRotation(world, center, random); BlockMirror mirror = getMirror(world, center, random); BlockPos offset = Structure.transformAround(structure.getSize(), mirror, rotation, BlockPos.ORIGIN); - center = center.add(0, getYOffset(structure, world, center, random), 0); + center = center.add(0, getYOffset(structure, world, center, random) + 0.5, 0); BlockBox bounds = makeBox(center); StructurePlacementData placementData = new StructurePlacementData().setRotation(rotation).setMirror(mirror).setBoundingBox(bounds); - center = center.add(-offset.getX() * 0.5, 1, -offset.getZ() * 0.5); + center = center.add(-offset.getX() * 0.5, 0, -offset.getZ() * 0.5); structure.place(world, center, placementData, random); - if (adjustSurface(world, center, random)) { + TerrainMerge merge = getTerrainMerge(world, center, random); + if (merge != TerrainMerge.NONE) { Mutable mut = new Mutable(); int x1 = center.getX(); int z1 = center.getZ(); @@ -125,15 +126,25 @@ public abstract class NBTStructureFeature extends DefaultFeature { mut.setY(mut.getY() - 1); BlockState stateSt = world.getBlockState(mut); if (!stateSt.isIn(EndTags.GEN_TERRAIN)) { - SurfaceConfig config = world.getBiome(mut).getGenerationSettings().getSurfaceConfig(); - boolean isTop = mut.getY() == surfMax && state.getMaterial().blocksLight(); - BlockState top = isTop ? config.getTopMaterial() : config.getUnderMaterial(); - BlocksHelper.setWithoutUpdate(world, mut, top); + if (merge == TerrainMerge.SURFACE) { + SurfaceConfig config = world.getBiome(mut).getGenerationSettings().getSurfaceConfig(); + boolean isTop = mut.getY() == surfMax && state.getMaterial().blocksLight(); + BlockState top = isTop ? config.getTopMaterial() : config.getUnderMaterial(); + BlocksHelper.setWithoutUpdate(world, mut, top); + } + else { + BlocksHelper.setWithoutUpdate(world, mut, state); + } } else { if (stateSt.isIn(EndTags.END_GROUND) && state.getMaterial().blocksLight()) { - SurfaceConfig config = world.getBiome(mut).getGenerationSettings().getSurfaceConfig(); - BlocksHelper.setWithoutUpdate(world, mut, config.getUnderMaterial()); + if (merge == TerrainMerge.SURFACE) { + SurfaceConfig config = world.getBiome(mut).getGenerationSettings().getSurfaceConfig(); + BlocksHelper.setWithoutUpdate(world, mut, config.getUnderMaterial()); + } + else { + BlocksHelper.setWithoutUpdate(world, mut, state); + } } break; } @@ -177,4 +188,22 @@ public abstract class NBTStructureFeature extends DefaultFeature { return template; } + + public static enum TerrainMerge { + NONE, + SURFACE, + OBJECT; + + public static TerrainMerge getFromString(String type) { + if (type.equals("surface")) { + return SURFACE; + } + else if (type.equals("object")) { + return OBJECT; + } + else { + return NONE; + } + } + } } diff --git a/src/main/resources/data/betterend/structures/biome/shadow_forest/structures.json b/src/main/resources/data/betterend/structures/biome/shadow_forest/structures.json index fbf3ccdf..99a90058 100644 --- a/src/main/resources/data/betterend/structures/biome/shadow_forest/structures.json +++ b/src/main/resources/data/betterend/structures/biome/shadow_forest/structures.json @@ -1,17 +1,17 @@ { "structures": [ - { "nbt": "stump_1", "offsetY": 0, "adjustTerrain": false }, - { "nbt": "stump_2", "offsetY": 0, "adjustTerrain": false }, - { "nbt": "fallen_log_1", "offsetY": 0, "adjustTerrain": false }, - { "nbt": "fallen_log_2", "offsetY": 0, "adjustTerrain": false }, - { "nbt": "ruins_1", "offsetY": 0, "adjustTerrain": true }, - { "nbt": "ruins_2", "offsetY": 0, "adjustTerrain": true }, - { "nbt": "ruins_3", "offsetY": 0, "adjustTerrain": true }, - { "nbt": "ruins_4", "offsetY": 0, "adjustTerrain": true }, - { "nbt": "ruins_5", "offsetY": 0, "adjustTerrain": true }, - { "nbt": "ruins_6", "offsetY": 0, "adjustTerrain": true }, - { "nbt": "ruins_7", "offsetY": 0, "adjustTerrain": true }, - { "nbt": "ruins_8", "offsetY": 0, "adjustTerrain": true }, - { "nbt": "small_mansion", "offsetY": -1, "adjustTerrain": false } + { "nbt": "stump_1", "offsetY": 0, "terrainMerge": "none" }, + { "nbt": "stump_2", "offsetY": 0, "terrainMerge": "none" }, + { "nbt": "fallen_log_1", "offsetY": 0, "terrainMerge": "none" }, + { "nbt": "fallen_log_2", "offsetY": 0, "terrainMerge": "none" }, + { "nbt": "ruins_1", "offsetY": 0, "terrainMerge": "surface" }, + { "nbt": "ruins_2", "offsetY": 0, "terrainMerge": "surface" }, + { "nbt": "ruins_3", "offsetY": 0, "terrainMerge": "surface" }, + { "nbt": "ruins_4", "offsetY": 0, "terrainMerge": "surface" }, + { "nbt": "ruins_5", "offsetY": 0, "terrainMerge": "surface" }, + { "nbt": "ruins_6", "offsetY": 0, "terrainMerge": "surface" }, + { "nbt": "ruins_7", "offsetY": 0, "terrainMerge": "surface" }, + { "nbt": "ruins_8", "offsetY": 0, "terrainMerge": "surface" }, + { "nbt": "small_mansion", "offsetY": -1, "terrainMerge": "object" } ] } \ No newline at end of file