diff --git a/src/main/java/ru/betterend/blocks/basis/EndAnvilBlock.java b/src/main/java/ru/betterend/blocks/basis/EndAnvilBlock.java index de929c81..bc095ed7 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndAnvilBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndAnvilBlock.java @@ -100,6 +100,6 @@ public class EndAnvilBlock extends AnvilBlock implements BlockModelProvider { String modelId = "block/" + resourceLocation.getPath() + "_top_" + destruction; ResourceLocation modelLocation = new ResourceLocation(modId, modelId); registerBlockModel(resourceLocation, modelLocation, blockState, modelCache); - return ModelsHelper.createFacingModel(modelLocation, blockState.getValue(FACING).getOpposite()); + return ModelsHelper.createFacingModel(modelLocation, blockState.getValue(FACING), false, false); } } diff --git a/src/main/java/ru/betterend/blocks/basis/EndBarrelBlock.java b/src/main/java/ru/betterend/blocks/basis/EndBarrelBlock.java index b7f63288..5cffa4c5 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndBarrelBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndBarrelBlock.java @@ -7,8 +7,10 @@ import java.util.Random; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.client.renderer.block.model.BlockModel; +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; @@ -125,6 +127,15 @@ public class EndBarrelBlock extends BarrelBlock implements BlockModelProvider { ResourceLocation modelId = new ResourceLocation(resourceLocation.getNamespace(), "block/" + resourceLocation.getPath() + open); registerBlockModel(resourceLocation, modelId, blockState, modelCache); - return ModelsHelper.createFacingModel(modelId, blockState.getValue(FACING)); + Direction facing = blockState.getValue(FACING); + BlockModelRotation rotation = BlockModelRotation.X0_Y0; + switch (facing) { + case NORTH: rotation = BlockModelRotation.X90_Y0; break; + case EAST: rotation = BlockModelRotation.X90_Y90; break; + case SOUTH: rotation = BlockModelRotation.X90_Y180; break; + case WEST: rotation = BlockModelRotation.X90_Y270; break; + case DOWN: rotation = BlockModelRotation.X180_Y0; break; + } + return ModelsHelper.createMultiVariant(modelId, rotation.getRotation(), false); } } diff --git a/src/main/java/ru/betterend/blocks/basis/EndDoorBlock.java b/src/main/java/ru/betterend/blocks/basis/EndDoorBlock.java index 5c97e7df..2c450820 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndDoorBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndDoorBlock.java @@ -24,6 +24,7 @@ import net.minecraft.world.level.block.state.properties.DoorHingeSide; import net.minecraft.world.level.block.state.properties.DoubleBlockHalf; import net.minecraft.world.level.storage.loot.LootContext; import org.jetbrains.annotations.Nullable; +import ru.betterend.client.models.ModelsHelper; import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IRenderTypeable; import ru.betterend.client.models.BlockModelProvider; @@ -133,8 +134,7 @@ public class EndDoorBlock extends DoorBlock implements IRenderTypeable, BlockMod ResourceLocation modelId = new ResourceLocation(resourceLocation.getNamespace(), "block/" + resourceLocation.getPath() + "_" + doorType); registerBlockModel(resourceLocation, modelId, blockState, modelCache); - Variant variant = new Variant(modelId, rotation.getRotation(), false, 1); - return new MultiVariant(Lists.newArrayList(variant)); + return ModelsHelper.createMultiVariant(modelId, rotation.getRotation(), false); } protected DoorType getDoorType(BlockState blockState) { diff --git a/src/main/java/ru/betterend/blocks/basis/EndFenceBlock.java b/src/main/java/ru/betterend/blocks/basis/EndFenceBlock.java index dd095fa2..9ab9c658 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndFenceBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndFenceBlock.java @@ -1,19 +1,7 @@ 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.Lists; -import com.mojang.math.Transformation; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; 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.renderer.block.model.multipart.Condition; -import net.minecraft.client.renderer.block.model.multipart.MultiPart; -import net.minecraft.client.renderer.block.model.multipart.Selector; import net.minecraft.client.resources.model.BlockModelRotation; import net.minecraft.client.resources.model.UnbakedModel; import net.minecraft.core.Registry; @@ -22,14 +10,16 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.FenceBlock; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.state.StateDefinition; import net.minecraft.world.level.storage.loot.LootContext; import org.jetbrains.annotations.Nullable; -import ru.betterend.BetterEnd; import ru.betterend.client.models.BlockModelProvider; +import ru.betterend.client.models.ModelsHelper.MultiPartBuilder; import ru.betterend.client.models.Patterns; -import static net.minecraft.client.resources.model.ModelBakery.MISSING_MODEL_LOCATION; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Optional; public class EndFenceBlock extends FenceBlock implements BlockModelProvider { private final Block parent; @@ -92,23 +82,16 @@ public class EndFenceBlock extends FenceBlock implements BlockModelProvider { registerBlockModel(postId, postId, blockState, modelCache); registerBlockModel(sideId, sideId, blockState, modelCache); - MultiVariant postVariant = new MultiVariant(Lists.newArrayList( - new Variant(postId, Transformation.identity(), false, 1))); - MultiVariant sideNorth = new MultiVariant(Lists.newArrayList( - new Variant(sideId, Transformation.identity(), true, 1))); - MultiVariant sideEast = new MultiVariant(Lists.newArrayList( - new Variant(sideId, BlockModelRotation.X0_Y90.getRotation(), true, 1))); - MultiVariant sideSouth = new MultiVariant(Lists.newArrayList( - new Variant(sideId, BlockModelRotation.X0_Y180.getRotation(), true, 1))); - MultiVariant sideWest = new MultiVariant(Lists.newArrayList( - new Variant(sideId, BlockModelRotation.X0_Y270.getRotation(), true, 1))); - StateDefinition blockStateDefinition = getStateDefinition(); - return new MultiPart(blockStateDefinition, Lists.newArrayList( - new Selector(Condition.TRUE, postVariant), - new Selector(stateDefinition -> state -> state.getValue(NORTH), sideNorth), - new Selector(stateDefinition -> state -> state.getValue(EAST), sideEast), - new Selector(stateDefinition -> state -> state.getValue(SOUTH), sideSouth), - new Selector(stateDefinition -> state -> state.getValue(WEST), sideWest) - )); + MultiPartBuilder builder = MultiPartBuilder.create(stateDefinition); + builder.part(sideId).setCondition(state -> state.getValue(NORTH)).setUVLock(true).save(); + builder.part(sideId).setCondition(state -> state.getValue(EAST)) + .setTransformation(BlockModelRotation.X0_Y90.getRotation()).setUVLock(true).save(); + builder.part(sideId).setCondition(state -> state.getValue(SOUTH)) + .setTransformation(BlockModelRotation.X0_Y180.getRotation()).setUVLock(true).save(); + builder.part(sideId).setCondition(state -> state.getValue(WEST)) + .setTransformation(BlockModelRotation.X0_Y270.getRotation()).setUVLock(true).save(); + builder.part(postId).save(); + + return builder.build(); } } diff --git a/src/main/java/ru/betterend/blocks/basis/EndFurnaceBlock.java b/src/main/java/ru/betterend/blocks/basis/EndFurnaceBlock.java index 202d4bc8..bfef1c09 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndFurnaceBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndFurnaceBlock.java @@ -98,7 +98,7 @@ public class EndFurnaceBlock extends FurnaceBlock implements BlockModelProvider, ResourceLocation modelId = new ResourceLocation(resourceLocation.getNamespace(), "block/" + resourceLocation.getPath() + lit); registerBlockModel(resourceLocation, modelId, blockState, modelCache); - return ModelsHelper.createFacingModel(modelId, blockState.getValue(FACING)); + return ModelsHelper.createFacingModel(modelId, blockState.getValue(FACING), false, true); } @Override diff --git a/src/main/java/ru/betterend/blocks/basis/EndGateBlock.java b/src/main/java/ru/betterend/blocks/basis/EndGateBlock.java index 78107fc2..e9a5c901 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndGateBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndGateBlock.java @@ -2,9 +2,12 @@ package ru.betterend.blocks.basis; import java.util.Collections; import java.util.List; +import java.util.Map; import java.util.Optional; 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.Registry; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.ItemStack; @@ -12,7 +15,9 @@ import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.FenceGateBlock; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.storage.loot.LootContext; +import org.jetbrains.annotations.Nullable; import ru.betterend.client.models.BlockModelProvider; +import ru.betterend.client.models.ModelsHelper; import ru.betterend.client.models.Patterns; public class EndGateBlock extends FenceGateBlock implements BlockModelProvider { @@ -45,4 +50,30 @@ public class EndGateBlock extends FenceGateBlock implements BlockModelProvider { return Patterns.createJson(Patterns.BLOCK_GATE_CLOSED, parentId.getPath(), blockId.getPath()); } + @Override + public @Nullable UnbakedModel getBlockModel(ResourceLocation blockId, BlockState blockState) { + boolean inWall = blockState.getValue(IN_WALL); + boolean isOpen = blockState.getValue(OPEN); + ResourceLocation parentId = Registry.BLOCK.getKey(parent); + Optional pattern; + if (inWall) { + pattern = isOpen ? Patterns.createJson(Patterns.BLOCK_GATE_OPEN_WALL, parentId.getPath(), blockId.getPath()) : + Patterns.createJson(Patterns.BLOCK_GATE_CLOSED_WALL, parentId.getPath(), blockId.getPath()); + } else { + pattern = isOpen ? Patterns.createJson(Patterns.BLOCK_GATE_OPEN, parentId.getPath(), blockId.getPath()) : + Patterns.createJson(Patterns.BLOCK_GATE_CLOSED, parentId.getPath(), blockId.getPath()); + } + return pattern.map(BlockModel::fromString).orElse(null); + } + + @Override + public UnbakedModel getModelVariant(ResourceLocation resourceLocation, BlockState blockState, Map modelCache) { + boolean inWall = blockState.getValue(IN_WALL); + boolean isOpen = blockState.getValue(OPEN); + String state = "" + (inWall ? "_wall" : "") + (isOpen ? "_open" : "_closed"); + ResourceLocation modelId = new ResourceLocation(resourceLocation.getNamespace(), + "block/" + resourceLocation.getPath() + state); + registerBlockModel(resourceLocation, modelId, blockState, modelCache); + return ModelsHelper.createFacingModel(modelId, blockState.getValue(FACING), true, false); + } } \ No newline at end of file diff --git a/src/main/java/ru/betterend/blocks/basis/EndSlabBlock.java b/src/main/java/ru/betterend/blocks/basis/EndSlabBlock.java index da2e1de9..97d1afe5 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndSlabBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndSlabBlock.java @@ -59,9 +59,7 @@ public class EndSlabBlock extends SlabBlock implements BlockModelProvider { "block/" + resourceLocation.getPath() + "_" + type); registerBlockModel(resourceLocation, modelId, blockState, modelCache); if (type == SlabType.TOP) { - BlockModelRotation rotation = BlockModelRotation.by(180, 0); - Variant variant = new Variant(modelId, rotation.getRotation(), true, 1); - return new MultiVariant(Lists.newArrayList(variant)); + return ModelsHelper.createMultiVariant(modelId, BlockModelRotation.X180_Y0.getRotation(), true); } return ModelsHelper.createBlockSimple(modelId); } diff --git a/src/main/java/ru/betterend/client/models/ModelsHelper.java b/src/main/java/ru/betterend/client/models/ModelsHelper.java index 785c6882..af202346 100644 --- a/src/main/java/ru/betterend/client/models/ModelsHelper.java +++ b/src/main/java/ru/betterend/client/models/ModelsHelper.java @@ -19,6 +19,7 @@ import net.minecraft.world.level.block.state.StateDefinition; import java.util.List; import java.util.Optional; +import java.util.function.Function; @Environment(EnvType.CLIENT) public class ModelsHelper { @@ -32,86 +33,65 @@ public class ModelsHelper { return pattern.map(BlockModel::fromString).orElse(null); } - public static MultiVariant createBlockSimple(ResourceLocation resourceLocation) { - Variant variant = new Variant(resourceLocation, Transformation.identity(), false, 1); + public static MultiVariant createMultiVariant(ResourceLocation resourceLocation, Transformation transform, boolean uvLock) { + Variant variant = new Variant(resourceLocation, transform, uvLock, 1); return new MultiVariant(Lists.newArrayList(variant)); } - public static MultiVariant createFacingModel(ResourceLocation resourceLocation, Direction facing) { - BlockModelRotation rotation = BlockModelRotation.by(0, (int) facing.getOpposite().toYRot()); - Variant variant = new Variant(resourceLocation, rotation.getRotation(), false, 1); - return new MultiVariant(Lists.newArrayList(variant)); + public static MultiVariant createBlockSimple(ResourceLocation resourceLocation) { + return createMultiVariant(resourceLocation, Transformation.identity(), false); + } + + public static MultiVariant createFacingModel(ResourceLocation resourceLocation, Direction facing, boolean uvLock, boolean inverted) { + if (inverted) { + facing = facing.getOpposite(); + } + BlockModelRotation rotation = BlockModelRotation.by(0, (int) facing.toYRot()); + return createMultiVariant(resourceLocation, rotation.getRotation(), uvLock); } public static MultiVariant createRotatedModel(ResourceLocation resourceLocation, Direction.Axis axis) { BlockModelRotation rotation = BlockModelRotation.X0_Y0; switch (axis) { - case X: { - rotation = BlockModelRotation.by(90, 90); - break; - } - case Z: { - rotation = BlockModelRotation.by(90, 0); - break; - } + case X: rotation = BlockModelRotation.X90_Y90; break; + case Z: rotation = BlockModelRotation.X90_Y0; break; } - Variant variant = new Variant(resourceLocation, rotation.getRotation(), false, 1); - return new MultiVariant(Lists.newArrayList(variant)); + return createMultiVariant(resourceLocation, rotation.getRotation(), false); } public static class MultiPartBuilder { - private final List modelParts = Lists.newArrayList(); + private final static MultiPartBuilder BUILDER = new MultiPartBuilder(); + public static MultiPartBuilder create(StateDefinition stateDefinition) { + BUILDER.stateDefinition = stateDefinition; + BUILDER.modelParts.clear(); + return BUILDER; + } + + private final List modelParts = Lists.newArrayList(); private StateDefinition stateDefinition; - private ModelPart activePart; private MultiPartBuilder() {} - public MultiPartBuilder create(StateDefinition stateDefinition) { - this.stateDefinition = stateDefinition; - return this; - } - - public MultiPartBuilder createPart(ResourceLocation modelId) { - activePart = new ModelPart(modelId); - return this; - } - - public MultiPartBuilder setCondition(Condition condition) { - activePart.condition = condition; - return this; - } - - public MultiPartBuilder setTransformation(Transformation transform) { - activePart.transform = transform; - return this; - } - - public MultiPartBuilder setUVLock(boolean value) { - activePart.uvLock = value; - return this; - } - - public MultiPartBuilder savePart() { - if (activePart != null) { - modelParts.add(activePart); - } - return this; + public ModelPart part(ResourceLocation modelId) { + return new ModelPart(modelId); } public MultiPart build() { - List selectors = Lists.newArrayList(); - modelParts.forEach(modelPart -> { - MultiVariant variant = new MultiVariant(Lists.newArrayList( - new Variant(modelPart.modelId, modelPart.transform, modelPart.uvLock, 1))); - selectors.add(new Selector(modelPart.condition, variant)); - }); - modelParts.clear(); - return new MultiPart(stateDefinition, selectors); + if (modelParts.size() > 0) { + List selectors = Lists.newArrayList(); + modelParts.forEach(modelPart -> { + MultiVariant variant = createMultiVariant(modelPart.modelId, modelPart.transform, modelPart.uvLock); + selectors.add(new Selector(modelPart.condition, variant)); + }); + modelParts.clear(); + return new MultiPart(stateDefinition, selectors); + } + throw new IllegalStateException("At least one model part need to be created."); } - private static class ModelPart { + public class ModelPart { private final ResourceLocation modelId; private Transformation transform = Transformation.identity(); private Condition condition = Condition.TRUE; @@ -120,6 +100,25 @@ public class ModelsHelper { private ModelPart(ResourceLocation modelId) { this.modelId = modelId; } + + public ModelPart setCondition(Function condition) { + this.condition = stateDefinition -> condition::apply; + return this; + } + + public ModelPart setTransformation(Transformation transform) { + this.transform = transform; + return this; + } + + public ModelPart setUVLock(boolean value) { + this.uvLock = value; + return this; + } + + public void save() { + modelParts.add(this); + } } } }