From 2c546e0038431373d7add077542be238ee0e6d11 Mon Sep 17 00:00:00 2001 From: Aleksey Date: Sat, 22 May 2021 23:22:02 +0300 Subject: [PATCH] Changing models loading (WIP) --- .../ru/betterend/blocks/BlockProperties.java | 12 +- .../ru/betterend/blocks/ShadowGrassBlock.java | 1 + .../blocks/{ => basis}/EndPathBlock.java | 156 +++++++----- .../blocks/{ => basis}/EndTerrainBlock.java | 233 ++++++++++-------- .../blocks/basis/TripleTerrainBlock.java | 105 +++++--- .../betterend/client/models/ModelsHelper.java | 9 + .../java/ru/betterend/registry/EndBlocks.java | 18 +- .../java/ru/betterend/registry/EndTags.java | 2 +- 8 files changed, 315 insertions(+), 221 deletions(-) rename src/main/java/ru/betterend/blocks/{ => basis}/EndPathBlock.java (66%) rename src/main/java/ru/betterend/blocks/{ => basis}/EndTerrainBlock.java (75%) diff --git a/src/main/java/ru/betterend/blocks/BlockProperties.java b/src/main/java/ru/betterend/blocks/BlockProperties.java index 3c0cbb0d..12bc9343 100644 --- a/src/main/java/ru/betterend/blocks/BlockProperties.java +++ b/src/main/java/ru/betterend/blocks/BlockProperties.java @@ -30,7 +30,7 @@ public class BlockProperties { public static final IntegerProperty SIZE = IntegerProperty.create("size", 0, 7); public static final IntegerProperty AGE = IntegerProperty.create("age", 0, 3); - public static enum TripleShape implements StringRepresentable { + public enum TripleShape implements StringRepresentable { TOP("top", 0), MIDDLE("middle", 1), BOTTOM("bottom", 2); @@ -62,7 +62,7 @@ public class BlockProperties { } } - public static enum PedestalState implements StringRepresentable { + public enum PedestalState implements StringRepresentable { PEDESTAL_TOP("pedestal_top"), COLUMN_TOP("column_top"), BOTTOM("bottom"), @@ -87,7 +87,7 @@ public class BlockProperties { } } - public static enum HydraluxShape implements StringRepresentable { + public enum HydraluxShape implements StringRepresentable { FLOWER_BIG_BOTTOM("flower_big_bottom", true), FLOWER_BIG_TOP("flower_big_top", true), FLOWER_SMALL_BOTTOM("flower_small_bottom", true), @@ -118,7 +118,7 @@ public class BlockProperties { } } - public static enum PentaShape implements StringRepresentable { + public enum PentaShape implements StringRepresentable { BOTTOM("bottom"), PRE_BOTTOM("pre_bottom"), MIDDLE("middle"), @@ -142,7 +142,7 @@ public class BlockProperties { } } - public static enum LumecornShape implements StringRepresentable { + public enum LumecornShape implements StringRepresentable { LIGHT_TOP("light_top", 15), LIGHT_TOP_MIDDLE("light_top_middle", 15), LIGHT_MIDDLE("light_middle", 15), @@ -174,7 +174,7 @@ public class BlockProperties { } } - public static enum CactusBottom implements StringRepresentable { + public enum CactusBottom implements StringRepresentable { EMPTY("empty"), SAND("sand"), MOSS("moss"); diff --git a/src/main/java/ru/betterend/blocks/ShadowGrassBlock.java b/src/main/java/ru/betterend/blocks/ShadowGrassBlock.java index 955c4688..99740b04 100644 --- a/src/main/java/ru/betterend/blocks/ShadowGrassBlock.java +++ b/src/main/java/ru/betterend/blocks/ShadowGrassBlock.java @@ -8,6 +8,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.material.MaterialColor; +import ru.betterend.blocks.basis.EndTerrainBlock; import ru.betterend.registry.EndParticles; public class ShadowGrassBlock extends EndTerrainBlock { diff --git a/src/main/java/ru/betterend/blocks/EndPathBlock.java b/src/main/java/ru/betterend/blocks/basis/EndPathBlock.java similarity index 66% rename from src/main/java/ru/betterend/blocks/EndPathBlock.java rename to src/main/java/ru/betterend/blocks/basis/EndPathBlock.java index b59c75db..d37ff3dd 100644 --- a/src/main/java/ru/betterend/blocks/EndPathBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndPathBlock.java @@ -1,66 +1,90 @@ -package ru.betterend.blocks; - -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.Optional; - -import com.google.common.collect.Maps; - -import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Registry; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.enchantment.EnchantmentHelper; -import net.minecraft.world.item.enchantment.Enchantments; -import net.minecraft.world.level.BlockGetter; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.storage.loot.LootContext; -import net.minecraft.world.level.storage.loot.parameters.LootContextParams; -import net.minecraft.world.phys.shapes.CollisionContext; -import net.minecraft.world.phys.shapes.VoxelShape; -import ru.betterend.blocks.basis.BlockBaseNotFull; -import ru.betterend.client.models.Patterns; - -public class EndPathBlock extends BlockBaseNotFull { - private static final VoxelShape SHAPE = Block.box(0, 0, 0, 16, 15, 16); - - public EndPathBlock(Block source) { - super(FabricBlockSettings.copyOf(source).isValidSpawn((state, world, pos, type) -> { return false; })); - if (source instanceof EndTerrainBlock) { - EndTerrainBlock terrain = (EndTerrainBlock) source; - terrain.setPathBlock(this); - } - } - - @Override - public List getDrops(BlockState state, LootContext.Builder builder) { - ItemStack tool = builder.getParameter(LootContextParams.TOOL); - if (tool != null && EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) > 0) { - return Collections.singletonList(new ItemStack(this)); - } - return Collections.singletonList(new ItemStack(Blocks.END_STONE)); - } - - @Override - public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { - return SHAPE; - } - - @Override - public VoxelShape getCollisionShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { - return SHAPE; - } - - @Override - public Optional getModelString(String block) { - String name = Registry.BLOCK.getKey(this).getPath(); - Map map = Maps.newHashMap(); - map.put("%top%", name + "_top"); - map.put("%side%", name.replace("_path", "") + "_side"); - return Patterns.createJson(Patterns.BLOCK_PATH, map); - } - -} +package ru.betterend.blocks.basis; + +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Optional; + +import com.google.common.collect.Maps; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.minecraft.client.renderer.block.model.BlockModel; +import net.minecraft.client.resources.model.UnbakedModel; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.item.enchantment.Enchantments; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; +import org.jetbrains.annotations.Nullable; +import ru.betterend.client.models.ModelsHelper; +import ru.betterend.client.models.Patterns; + +public class EndPathBlock extends BlockBaseNotFull { + private static final VoxelShape SHAPE = Block.box(0, 0, 0, 16, 15, 16); + + public EndPathBlock(Block source) { + super(FabricBlockSettings.copyOf(source).isValidSpawn((state, world, pos, type) -> { return false; })); + if (source instanceof EndTerrainBlock) { + EndTerrainBlock terrain = (EndTerrainBlock) source; + terrain.setPathBlock(this); + } + } + + @Override + public List getDrops(BlockState state, LootContext.Builder builder) { + ItemStack tool = builder.getParameter(LootContextParams.TOOL); + if (tool != null && EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) > 0) { + return Collections.singletonList(new ItemStack(this)); + } + return Collections.singletonList(new ItemStack(Blocks.END_STONE)); + } + + @Override + public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { + return SHAPE; + } + + @Override + public VoxelShape getCollisionShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { + return SHAPE; + } + + @Override + public Optional getModelString(String block) { + String name = Registry.BLOCK.getKey(this).getPath(); + Map map = Maps.newHashMap(); + map.put("%top%", name + "_top"); + map.put("%side%", name.replace("_path", "") + "_side"); + return Patterns.createJson(Patterns.BLOCK_PATH, map); + } + + @Override + public BlockModel getModel(ResourceLocation blockId) { + return getBlockModel(blockId, defaultBlockState()); + } + + @Override + public @Nullable BlockModel getBlockModel(ResourceLocation resourceLocation, BlockState blockState) { + String name = resourceLocation.getPath(); + Map textures = Maps.newHashMap(); + textures.put("%top%", name + "_top"); + textures.put("%side%", name.replace("_path", "") + "_side"); + Optional pattern = Patterns.createJson(Patterns.BLOCK_PATH, textures); + return ModelsHelper.fromPattern(pattern); + } + + @Override + public UnbakedModel getModelVariant(ResourceLocation resourceLocation, BlockState blockState, Map modelCache) { + ResourceLocation modelId = new ResourceLocation(resourceLocation.getNamespace(), "block/" + resourceLocation.getPath()); + return ModelsHelper.createRandomTopModel(modelId); + } +} diff --git a/src/main/java/ru/betterend/blocks/EndTerrainBlock.java b/src/main/java/ru/betterend/blocks/basis/EndTerrainBlock.java similarity index 75% rename from src/main/java/ru/betterend/blocks/EndTerrainBlock.java rename to src/main/java/ru/betterend/blocks/basis/EndTerrainBlock.java index 3161d84f..74c5bb7c 100644 --- a/src/main/java/ru/betterend/blocks/EndTerrainBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndTerrainBlock.java @@ -1,103 +1,130 @@ -package ru.betterend.blocks; - -import java.util.*; - -import com.google.common.collect.Maps; - -import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.core.Registry; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.sounds.SoundEvents; -import net.minecraft.sounds.SoundSource; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.InteractionResult; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.enchantment.EnchantmentHelper; -import net.minecraft.world.item.enchantment.Enchantments; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.LevelReader; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.SnowLayerBlock; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.lighting.LayerLightEngine; -import net.minecraft.world.level.material.MaterialColor; -import net.minecraft.world.level.storage.loot.LootContext; -import net.minecraft.world.level.storage.loot.parameters.LootContextParams; -import net.minecraft.world.phys.BlockHitResult; -import ru.betterend.blocks.basis.BlockBase; -import ru.betterend.client.models.Patterns; - -public class EndTerrainBlock extends BlockBase { - private Block pathBlock; - - public EndTerrainBlock(MaterialColor color) { - super(FabricBlockSettings.copyOf(Blocks.END_STONE).materialColor(color).sound(BlockSounds.TERRAIN_SOUND).randomTicks()); - } - - public void setPathBlock(Block roadBlock) { - this.pathBlock = roadBlock; - } - - @Override - public InteractionResult use(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) { - if (pathBlock != null && player.getMainHandItem().getItem().is(FabricToolTags.SHOVELS)) { - world.playSound(player, pos, SoundEvents.SHOVEL_FLATTEN, SoundSource.BLOCKS, 1.0F, 1.0F); - if (!world.isClientSide) { - world.setBlockAndUpdate(pos, pathBlock.defaultBlockState()); - if (!player.isCreative()) { - player.getMainHandItem().hurt(1, world.random, (ServerPlayer) player); - } - } - return InteractionResult.SUCCESS; - } - return InteractionResult.FAIL; - } - - @Override - public List getDrops(BlockState state, LootContext.Builder builder) { - ItemStack tool = builder.getParameter(LootContextParams.TOOL); - if (tool != null && EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) > 0) { - return Collections.singletonList(new ItemStack(this)); - } - return Collections.singletonList(new ItemStack(Blocks.END_STONE)); - } - - @Override - public void randomTick(BlockState state, ServerLevel world, BlockPos pos, Random random) { - if (random.nextInt(16) == 0 && !canStay(state, world, pos)) { - world.setBlockAndUpdate(pos, Blocks.END_STONE.defaultBlockState()); - } - } - - public boolean canStay(BlockState state, LevelReader worldView, BlockPos pos) { - BlockPos blockPos = pos.above(); - BlockState blockState = worldView.getBlockState(blockPos); - if (blockState.is(Blocks.SNOW) && (Integer) blockState.getValue(SnowLayerBlock.LAYERS) == 1) { - return true; - } - else if (blockState.getFluidState().getAmount() == 8) { - return false; - } - else { - int i = LayerLightEngine.getLightBlockInto(worldView, state, pos, blockState, blockPos, Direction.UP, blockState.getLightBlock(worldView, blockPos)); - return i < 5; - } - } - - @Override - public Optional getModelString(String block) { - String name = Registry.BLOCK.getKey(this).getPath(); - Map map = Maps.newHashMap(); - map.put("%top%", "betterend:block/" + name + "_top"); - map.put("%side%", "betterend:block/" + name + "_side"); - map.put("%bottom%", "minecraft:block/end_stone"); - return Patterns.createJson(Patterns.BLOCK_TOP_SIDE_BOTTOM, map); - } - -} +package ru.betterend.blocks.basis; + +import java.util.*; + +import com.google.common.collect.Maps; + +import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; +import net.fabricmc.fabric.api.tool.attribute.v1.FabricToolTags; +import net.minecraft.client.renderer.block.model.BlockModel; +import net.minecraft.client.resources.model.UnbakedModel; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.item.enchantment.Enchantments; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.SnowLayerBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.lighting.LayerLightEngine; +import net.minecraft.world.level.material.MaterialColor; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; +import net.minecraft.world.phys.BlockHitResult; +import org.jetbrains.annotations.Nullable; +import ru.betterend.blocks.BlockSounds; +import ru.betterend.blocks.basis.BlockBase; +import ru.betterend.client.models.ModelsHelper; +import ru.betterend.client.models.Patterns; + +public class EndTerrainBlock extends BlockBase { + private Block pathBlock; + + public EndTerrainBlock(MaterialColor color) { + super(FabricBlockSettings.copyOf(Blocks.END_STONE).materialColor(color).sound(BlockSounds.TERRAIN_SOUND).randomTicks()); + } + + public void setPathBlock(Block roadBlock) { + this.pathBlock = roadBlock; + } + + @Override + public InteractionResult use(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) { + if (pathBlock != null && player.getMainHandItem().getItem().is(FabricToolTags.SHOVELS)) { + world.playSound(player, pos, SoundEvents.SHOVEL_FLATTEN, SoundSource.BLOCKS, 1.0F, 1.0F); + if (!world.isClientSide) { + world.setBlockAndUpdate(pos, pathBlock.defaultBlockState()); + if (!player.isCreative()) { + player.getMainHandItem().hurt(1, world.random, (ServerPlayer) player); + } + } + return InteractionResult.SUCCESS; + } + return InteractionResult.FAIL; + } + + @Override + public List getDrops(BlockState state, LootContext.Builder builder) { + ItemStack tool = builder.getParameter(LootContextParams.TOOL); + if (tool != null && EnchantmentHelper.getItemEnchantmentLevel(Enchantments.SILK_TOUCH, tool) > 0) { + return Collections.singletonList(new ItemStack(this)); + } + return Collections.singletonList(new ItemStack(Blocks.END_STONE)); + } + + @Override + public void randomTick(BlockState state, ServerLevel world, BlockPos pos, Random random) { + if (random.nextInt(16) == 0 && !canStay(state, world, pos)) { + world.setBlockAndUpdate(pos, Blocks.END_STONE.defaultBlockState()); + } + } + + public boolean canStay(BlockState state, LevelReader worldView, BlockPos pos) { + BlockPos blockPos = pos.above(); + BlockState blockState = worldView.getBlockState(blockPos); + if (blockState.is(Blocks.SNOW) && (Integer) blockState.getValue(SnowLayerBlock.LAYERS) == 1) { + return true; + } + else if (blockState.getFluidState().getAmount() == 8) { + return false; + } + else { + int i = LayerLightEngine.getLightBlockInto(worldView, state, pos, blockState, blockPos, Direction.UP, blockState.getLightBlock(worldView, blockPos)); + return i < 5; + } + } + + @Override + public Optional getModelString(String block) { + String name = Registry.BLOCK.getKey(this).getPath(); + Map map = Maps.newHashMap(); + map.put("%top%", "betterend:block/" + name + "_top"); + map.put("%side%", "betterend:block/" + name + "_side"); + map.put("%bottom%", "minecraft:block/end_stone"); + return Patterns.createJson(Patterns.BLOCK_TOP_SIDE_BOTTOM, map); + } + + @Override + public BlockModel getModel(ResourceLocation blockId) { + return getBlockModel(blockId, defaultBlockState()); + } + + @Override + public @Nullable BlockModel getBlockModel(ResourceLocation resourceLocation, BlockState blockState) { + String name = resourceLocation.getPath(); + Map textures = Maps.newHashMap(); + textures.put("%top%", "betterend:block/" + name + "_top"); + textures.put("%side%", "betterend:block/" + name + "_side"); + textures.put("%bottom%", "minecraft:block/end_stone"); + Optional pattern = Patterns.createJson(Patterns.BLOCK_PATH, textures); + return ModelsHelper.fromPattern(pattern); + } + + @Override + public UnbakedModel getModelVariant(ResourceLocation resourceLocation, BlockState blockState, Map modelCache) { + ResourceLocation modelId = new ResourceLocation(resourceLocation.getNamespace(), "block/" + resourceLocation.getPath()); + return ModelsHelper.createRandomTopModel(modelId); + } +} diff --git a/src/main/java/ru/betterend/blocks/basis/TripleTerrainBlock.java b/src/main/java/ru/betterend/blocks/basis/TripleTerrainBlock.java index a08444ec..a7bba04f 100644 --- a/src/main/java/ru/betterend/blocks/basis/TripleTerrainBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/TripleTerrainBlock.java @@ -1,14 +1,23 @@ package ru.betterend.blocks.basis; +import java.util.List; import java.util.Map; import java.util.Optional; import java.util.Random; +import com.google.common.collect.Lists; import com.google.common.collect.Maps; +import com.mojang.math.Transformation; +import net.minecraft.client.renderer.block.model.BlockModel; +import net.minecraft.client.renderer.block.model.MultiVariant; +import net.minecraft.client.renderer.block.model.Variant; +import net.minecraft.client.resources.model.BlockModelRotation; +import net.minecraft.client.resources.model.UnbakedModel; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; @@ -23,9 +32,10 @@ import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.world.level.block.state.properties.EnumProperty; import net.minecraft.world.level.material.MaterialColor; import net.minecraft.world.phys.BlockHitResult; +import org.jetbrains.annotations.Nullable; import ru.betterend.blocks.BlockProperties; import ru.betterend.blocks.BlockProperties.TripleShape; -import ru.betterend.blocks.EndTerrainBlock; +import ru.betterend.client.models.ModelsHelper; import ru.betterend.client.models.Patterns; public class TripleTerrainBlock extends EndTerrainBlock { @@ -47,19 +57,6 @@ public class TripleTerrainBlock extends EndTerrainBlock { TripleShape shape = dir == Direction.UP ? TripleShape.BOTTOM : dir == Direction.DOWN ? TripleShape.TOP : TripleShape.MIDDLE; return this.defaultBlockState().setValue(SHAPE, shape); } - - @Override - public Optional getModelString(String block) { - String name = Registry.BLOCK.getKey(this).getPath(); - if (block.endsWith("_middle")) { - return Patterns.createJson(Patterns.BLOCK_BASE, name + "_top", name + "_top"); - } - Map map = Maps.newHashMap(); - map.put("%top%", "betterend:block/" + name + "_top"); - map.put("%side%", "betterend:block/" + name + "_side"); - map.put("%bottom%", "minecraft:block/end_stone"); - return Patterns.createJson(Patterns.BLOCK_TOP_SIDE_BOTTOM, map); - } @Override public InteractionResult use(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) { @@ -75,9 +72,7 @@ public class TripleTerrainBlock extends EndTerrainBlock { TripleShape shape = state.getValue(SHAPE); if (shape == TripleShape.BOTTOM) { super.randomTick(state, world, pos, random); - return; - } - else if (random.nextInt(16) == 0) { + } else if (random.nextInt(16) == 0) { boolean bottom = canStayBottom(world, pos); if (shape == TripleShape.TOP) { if (!bottom) { @@ -88,11 +83,9 @@ public class TripleTerrainBlock extends EndTerrainBlock { boolean top = canStay(state, world, pos) || isMiddle(world.getBlockState(pos.above())); if (!top && !bottom) { world.setBlockAndUpdate(pos, Blocks.END_STONE.defaultBlockState()); - } - else if (top && !bottom) { + } else if (top && !bottom) { world.setBlockAndUpdate(pos, state.setValue(SHAPE, TripleShape.BOTTOM)); - } - else if (!top && bottom) { + } else if (!top) { world.setBlockAndUpdate(pos, state.setValue(SHAPE, TripleShape.TOP)); } } @@ -104,16 +97,72 @@ public class TripleTerrainBlock extends EndTerrainBlock { BlockState blockState = world.getBlockState(blockPos); if (isMiddle(blockState)) { return true; - } - else if (blockState.getFluidState().getAmount() == 8) { + } else if (blockState.getFluidState().getAmount() == 8) { return false; - } - else { + } else { return !blockState.isFaceSturdy(world, blockPos, Direction.UP); } } - - protected boolean isMiddle(BlockState state) { - return state.is(this) && state.getValue(SHAPE) == TripleShape.MIDDLE; + + @Override + public Optional getModelString(String block) { + String name = Registry.BLOCK.getKey(this).getPath(); + if (block.endsWith("_middle")) { + return Patterns.createJson(Patterns.BLOCK_BASE, name + "_top", name + "_top"); + } + Map map = Maps.newHashMap(); + map.put("%top%", "betterend:block/" + name + "_top"); + map.put("%side%", "betterend:block/" + name + "_side"); + map.put("%bottom%", "minecraft:block/end_stone"); + return Patterns.createJson(Patterns.BLOCK_TOP_SIDE_BOTTOM, map); + } + + @Override + public BlockModel getModel(ResourceLocation blockId) { + return getBlockModel(blockId, defaultBlockState()); + } + + @Override + public @Nullable BlockModel getBlockModel(ResourceLocation resourceLocation, BlockState blockState) { + String name = resourceLocation.getPath(); + Optional pattern; + if (isMiddle(blockState)) { + pattern = Patterns.createBlockSimple(name + "_top"); + } else { + Map textures = Maps.newHashMap(); + textures.put("%top%", "betterend:block/" + name + "_top"); + textures.put("%side%", "betterend:block/" + name + "_side"); + textures.put("%bottom%", "minecraft:block/end_stone"); + pattern = Patterns.createJson(Patterns.BLOCK_TOP_SIDE_BOTTOM, textures); + } + return ModelsHelper.fromPattern(pattern); + } + + @Override + public UnbakedModel getModelVariant(ResourceLocation resourceLocation, BlockState blockState, Map modelCache) { + boolean isMiddle = isMiddle(blockState); + String middle = isMiddle ? "_middle" : ""; + ResourceLocation modelId = new ResourceLocation(resourceLocation.getNamespace(), + "block/" + resourceLocation.getPath() + middle); + registerBlockModel(resourceLocation, modelId, blockState, modelCache); + if (isMiddle) { + List variants = Lists.newArrayList(); + for (BlockModelRotation rotation : BlockModelRotation.values()) { + variants.add(new Variant(modelId, rotation.getRotation(), false, 1)); + } + return new MultiVariant(variants); + } else if (blockState.getValue(SHAPE) == TripleShape.TOP) { + return new MultiVariant(Lists.newArrayList( + new Variant(modelId, BlockModelRotation.X180_Y0.getRotation(), false, 1), + new Variant(modelId, BlockModelRotation.X180_Y90.getRotation(), false, 1), + new Variant(modelId, BlockModelRotation.X180_Y180.getRotation(), false, 1), + new Variant(modelId, BlockModelRotation.X180_Y270.getRotation(), false, 1) + )); + } + return ModelsHelper.createRandomTopModel(modelId); + } + + protected boolean isMiddle(BlockState blockState) { + return blockState.is(this) && blockState.getValue(SHAPE) == TripleShape.MIDDLE; } } diff --git a/src/main/java/ru/betterend/client/models/ModelsHelper.java b/src/main/java/ru/betterend/client/models/ModelsHelper.java index 0e1658a5..7ac0fda3 100644 --- a/src/main/java/ru/betterend/client/models/ModelsHelper.java +++ b/src/main/java/ru/betterend/client/models/ModelsHelper.java @@ -69,6 +69,15 @@ public class ModelsHelper { return createMultiVariant(resourceLocation, rotation.getRotation(), false); } + public static MultiVariant createRandomTopModel(ResourceLocation resourceLocation) { + return new MultiVariant(Lists.newArrayList( + new Variant(resourceLocation, Transformation.identity(), false, 1), + new Variant(resourceLocation, BlockModelRotation.X0_Y90.getRotation(), false, 1), + new Variant(resourceLocation, BlockModelRotation.X0_Y180.getRotation(), false, 1), + new Variant(resourceLocation, BlockModelRotation.X0_Y270.getRotation(), false, 1) + )); + } + public static class MultiPartBuilder { private final static MultiPartBuilder BUILDER = new MultiPartBuilder(); diff --git a/src/main/java/ru/betterend/registry/EndBlocks.java b/src/main/java/ru/betterend/registry/EndBlocks.java index 48ae11b0..c4b9586f 100644 --- a/src/main/java/ru/betterend/registry/EndBlocks.java +++ b/src/main/java/ru/betterend/registry/EndBlocks.java @@ -11,23 +11,7 @@ import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.material.MaterialColor; import ru.betterend.BetterEnd; import ru.betterend.blocks.*; -import ru.betterend.blocks.basis.EndAnvilBlock; -import ru.betterend.blocks.basis.EndCropBlock; -import ru.betterend.blocks.basis.EndFurnaceBlock; -import ru.betterend.blocks.basis.EndLeavesBlock; -import ru.betterend.blocks.basis.EndOreBlock; -import ru.betterend.blocks.basis.EndPillarBlock; -import ru.betterend.blocks.basis.EndSlabBlock; -import ru.betterend.blocks.basis.EndStairsBlock; -import ru.betterend.blocks.basis.EndUnderwaterWallPlantBlock; -import ru.betterend.blocks.basis.EndWallPlantBlock; -import ru.betterend.blocks.basis.FurBlock; -import ru.betterend.blocks.basis.SimpleLeavesBlock; -import ru.betterend.blocks.basis.StalactiteBlock; -import ru.betterend.blocks.basis.StoneLanternBlock; -import ru.betterend.blocks.basis.TripleTerrainBlock; -import ru.betterend.blocks.basis.VineBlock; -import ru.betterend.blocks.basis.WallMushroomBlock; +import ru.betterend.blocks.basis.*; import ru.betterend.blocks.complex.ColoredMaterial; import ru.betterend.blocks.complex.CrystalSubblocksMaterial; import ru.betterend.blocks.complex.MetalMaterial; diff --git a/src/main/java/ru/betterend/registry/EndTags.java b/src/main/java/ru/betterend/registry/EndTags.java index a429015b..0dfaaeea 100644 --- a/src/main/java/ru/betterend/registry/EndTags.java +++ b/src/main/java/ru/betterend/registry/EndTags.java @@ -27,7 +27,7 @@ import net.minecraft.world.level.block.LeavesBlock; import net.minecraft.world.level.levelgen.surfacebuilders.SurfaceBuilderConfiguration; import net.minecraft.world.level.material.Material; import ru.betterend.BetterEnd; -import ru.betterend.blocks.EndTerrainBlock; +import ru.betterend.blocks.basis.EndTerrainBlock; import ru.betterend.blocks.basis.PedestalBlock; import ru.betterend.blocks.basis.SimpleLeavesBlock; import ru.betterend.blocks.basis.VineBlock;