diff --git a/src/main/java/ru/betterend/blocks/AeterniumAnvil.java b/src/main/java/ru/betterend/blocks/AeterniumAnvil.java index 77124a7f..45373910 100644 --- a/src/main/java/ru/betterend/blocks/AeterniumAnvil.java +++ b/src/main/java/ru/betterend/blocks/AeterniumAnvil.java @@ -1,10 +1,21 @@ package ru.betterend.blocks; +import com.google.common.collect.Maps; +import net.minecraft.client.renderer.block.model.BlockModel; +import net.minecraft.client.resources.model.UnbakedModel; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.properties.IntegerProperty; +import org.jetbrains.annotations.Nullable; import ru.betterend.blocks.basis.EndAnvilBlock; +import ru.betterend.client.models.ModelsHelper; +import ru.betterend.client.models.Patterns; import ru.betterend.item.material.EndToolMaterial; import ru.betterend.registry.EndBlocks; +import java.util.Map; +import java.util.Optional; + public class AeterniumAnvil extends EndAnvilBlock { private static final IntegerProperty DESTRUCTION_LONG = BlockProperties.DESTRUCTION_LONG; @@ -17,4 +28,30 @@ public class AeterniumAnvil extends EndAnvilBlock { return DESTRUCTION_LONG; } + @Override + public @Nullable BlockModel getBlockModel(ResourceLocation blockId, BlockState blockState) { + String name = blockId.getPath(); + int damage = getDamageState(blockState); + Map textures = Maps.newHashMap(); + textures.put("%anvil%", name); + textures.put("%top%", name + "_top_" + damage); + Optional pattern = Patterns.createJson(Patterns.BLOCK_ANVIL, textures); + return ModelsHelper.fromPattern(pattern); + } + + @Override + public UnbakedModel getModelVariant(ResourceLocation resourceLocation, BlockState blockState, Map modelCache) { + int damage = getDamageState(blockState); + String modId = resourceLocation.getNamespace(); + String modelId = "block/" + resourceLocation.getPath() + "_top_" + damage; + ResourceLocation modelLocation = new ResourceLocation(modId, modelId); + registerBlockModel(resourceLocation, modelLocation, blockState, modelCache); + return ModelsHelper.createFacingModel(modelLocation, blockState.getValue(FACING), false, false); + } + + private int getDamageState(BlockState blockState) { + IntegerProperty destructionProperty = getDestructionProperty(); + int damage = blockState.getValue(destructionProperty); + return damage < 3 ? 0 : damage < 6 ? 1 : 2; + } } diff --git a/src/main/java/ru/betterend/blocks/BulbVineLanternBlock.java b/src/main/java/ru/betterend/blocks/BulbVineLanternBlock.java index 45cbc0a9..a62476e2 100644 --- a/src/main/java/ru/betterend/blocks/BulbVineLanternBlock.java +++ b/src/main/java/ru/betterend/blocks/BulbVineLanternBlock.java @@ -8,7 +8,6 @@ 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.Registry; import net.minecraft.resources.ResourceLocation; @@ -22,6 +21,7 @@ import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.VoxelShape; import org.jetbrains.annotations.Nullable; import ru.betterend.blocks.basis.EndLanternBlock; +import ru.betterend.client.models.ModelsHelper; import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IRenderTypeable; import ru.betterend.client.models.BlockModelProvider; @@ -71,14 +71,14 @@ public class BulbVineLanternBlock extends EndLanternBlock implements IRenderType } @Override - public @Nullable UnbakedModel getBlockModel(ResourceLocation resourceLocation, BlockState blockState) { + public @Nullable BlockModel getBlockModel(ResourceLocation resourceLocation, BlockState blockState) { Map textures = Maps.newHashMap(); textures.put("%glow%", getGlowTexture()); textures.put("%metal%", getMetalTexture(resourceLocation)); Optional pattern = blockState.getValue(IS_FLOOR) ? Patterns.createJson(Patterns.BLOCK_BULB_LANTERN_FLOOR, textures) : Patterns.createJson(Patterns.BLOCK_BULB_LANTERN_CEIL, textures); - return pattern.map(BlockModel::fromString).orElse(null); + return ModelsHelper.fromPattern(pattern); } protected String getMetalTexture(ResourceLocation blockId) { diff --git a/src/main/java/ru/betterend/blocks/basis/BlockBase.java b/src/main/java/ru/betterend/blocks/basis/BlockBase.java index fb7945b5..94d55f51 100644 --- a/src/main/java/ru/betterend/blocks/basis/BlockBase.java +++ b/src/main/java/ru/betterend/blocks/basis/BlockBase.java @@ -32,6 +32,6 @@ public class BlockBase extends Block implements BlockModelProvider { @Override public BlockModel getModel(ResourceLocation blockId) { - return (BlockModel) getBlockModel(blockId, defaultBlockState()); + return getBlockModel(blockId, defaultBlockState()); } } \ No newline at end of file diff --git a/src/main/java/ru/betterend/blocks/basis/EndAnvilBlock.java b/src/main/java/ru/betterend/blocks/basis/EndAnvilBlock.java index bc095ed7..0f64ba91 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndAnvilBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndAnvilBlock.java @@ -77,11 +77,11 @@ public class EndAnvilBlock extends AnvilBlock implements BlockModelProvider { @Override public BlockModel getModel(ResourceLocation blockId) { - return (BlockModel) getBlockModel(blockId, defaultBlockState()); + return getBlockModel(blockId, defaultBlockState()); } @Override - public @Nullable UnbakedModel getBlockModel(ResourceLocation blockId, BlockState blockState) { + public @Nullable BlockModel getBlockModel(ResourceLocation blockId, BlockState blockState) { IntegerProperty destructionProperty = getDestructionProperty(); int destruction = blockState.getValue(destructionProperty); String name = blockId.getPath(); @@ -89,7 +89,7 @@ public class EndAnvilBlock extends AnvilBlock implements BlockModelProvider { textures.put("%anvil%", name); textures.put("%top%", name + "_top_" + destruction); Optional pattern = Patterns.createJson(Patterns.BLOCK_ANVIL, textures); - return pattern.map(BlockModel::fromString).orElse(null); + return ModelsHelper.fromPattern(pattern); } @Override diff --git a/src/main/java/ru/betterend/blocks/basis/EndBarrelBlock.java b/src/main/java/ru/betterend/blocks/basis/EndBarrelBlock.java index 5cffa4c5..39bf6386 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndBarrelBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndBarrelBlock.java @@ -106,11 +106,11 @@ public class EndBarrelBlock extends BarrelBlock implements BlockModelProvider { @Override public BlockModel getModel(ResourceLocation blockId) { - return (BlockModel) getBlockModel(blockId, defaultBlockState()); + return getBlockModel(blockId, defaultBlockState()); } @Override - public @Nullable UnbakedModel getBlockModel(ResourceLocation blockId, BlockState blockState) { + public @Nullable BlockModel getBlockModel(ResourceLocation blockId, BlockState blockState) { String texture = blockId.getPath(); Optional pattern; if (blockState.getValue(OPEN)) { @@ -118,7 +118,7 @@ public class EndBarrelBlock extends BarrelBlock implements BlockModelProvider { } else { pattern = Patterns.createJson(Patterns.BLOCK_BOTTOM_TOP, texture, texture); } - return pattern.map(BlockModel::fromString).orElse(null); + return ModelsHelper.fromPattern(pattern); } @Override diff --git a/src/main/java/ru/betterend/blocks/basis/EndBookshelfBlock.java b/src/main/java/ru/betterend/blocks/basis/EndBookshelfBlock.java index 81cbea49..503f9de1 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndBookshelfBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndBookshelfBlock.java @@ -6,7 +6,6 @@ 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; @@ -18,6 +17,7 @@ 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 org.jetbrains.annotations.Nullable; +import ru.betterend.client.models.ModelsHelper; import ru.betterend.client.models.Patterns; public class EndBookshelfBlock extends BlockBase { @@ -44,10 +44,10 @@ public class EndBookshelfBlock extends BlockBase { } @Override - public @Nullable UnbakedModel getBlockModel(ResourceLocation blockId, BlockState blockState) { + public @Nullable BlockModel getBlockModel(ResourceLocation blockId, BlockState blockState) { Optional pattern = Patterns.createJson(Patterns.BLOCK_BOOKSHELF, getName(blockId), blockId.getPath()); - return pattern.map(BlockModel::fromString).orElse(null); + return ModelsHelper.fromPattern(pattern); } private String getName(ResourceLocation blockId) { diff --git a/src/main/java/ru/betterend/blocks/basis/EndButtonBlock.java b/src/main/java/ru/betterend/blocks/basis/EndButtonBlock.java new file mode 100644 index 00000000..6d47f6f4 --- /dev/null +++ b/src/main/java/ru/betterend/blocks/basis/EndButtonBlock.java @@ -0,0 +1,90 @@ +package ru.betterend.blocks.basis; + +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.Registry; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.ButtonBlock; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.AttachFace; +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; + +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Optional; + +public abstract class EndButtonBlock extends ButtonBlock implements BlockModelProvider { + + private final Block parent; + + protected EndButtonBlock(Block parent, Properties properties, boolean sensitive) { + super(sensitive, properties); + this.parent = parent; + } + + @Override + public List getDrops(BlockState state, LootContext.Builder builder) { + return Collections.singletonList(new ItemStack(this)); + } + + @Override + public Optional getModelString(String block) { + ResourceLocation blockId = Registry.BLOCK.getKey(this); + ResourceLocation parentId = Registry.BLOCK.getKey(parent); + if (block.contains("item")) { + return Patterns.createJson(Patterns.ITEM_BUTTON, parentId.getPath(), blockId.getPath()); + } + if (block.contains("pressed")) { + return Patterns.createJson(Patterns.BLOCK_BUTTON_PRESSED, parentId.getPath(), blockId.getPath()); + } + return Patterns.createJson(Patterns.BLOCK_BUTTON, parentId.getPath(), blockId.getPath()); + } + + @Override + public BlockModel getModel(ResourceLocation blockId) { + ResourceLocation parentId = Registry.BLOCK.getKey(parent); + Optional pattern = Patterns.createJson(Patterns.ITEM_BUTTON, parentId.getPath(), blockId.getPath()); + return ModelsHelper.fromPattern(pattern); + } + + @Override + public @Nullable BlockModel getBlockModel(ResourceLocation resourceLocation, BlockState blockState) { + ResourceLocation blockId = Registry.BLOCK.getKey(this); + ResourceLocation parentId = Registry.BLOCK.getKey(parent); + Optional pattern = blockState.getValue(POWERED) ? + Patterns.createJson(Patterns.BLOCK_BUTTON_PRESSED, parentId.getPath(), blockId.getPath()) : + Patterns.createJson(Patterns.BLOCK_BUTTON, parentId.getPath(), blockId.getPath()); + return ModelsHelper.fromPattern(pattern); + } + + @Override + public UnbakedModel getModelVariant(ResourceLocation resourceLocation, BlockState blockState, Map modelCache) { + String powered = blockState.getValue(POWERED) ? "_powered" : ""; + ResourceLocation modelId = new ResourceLocation(resourceLocation.getNamespace(), + "block/" + resourceLocation.getPath() + powered); + registerBlockModel(resourceLocation, modelId, blockState, modelCache); + AttachFace face = blockState.getValue(FACE); + boolean isCeiling = face == AttachFace.CEILING; + int x = 0, y = 0; + switch (face) { + case CEILING: x = 180; break; + case WALL: x = 90; break; + } + switch (blockState.getValue(FACING)) { + case NORTH: if (isCeiling) { y = 180; } break; + case EAST: y = isCeiling ? 270 : 90; break; + case SOUTH: if(!isCeiling) { y = 180; } break; + case WEST: y = isCeiling ? 90 : 270; break; + } + BlockModelRotation rotation = BlockModelRotation.by(x, y); + return ModelsHelper.createMultiVariant(modelId, rotation.getRotation(), face == AttachFace.WALL); + } +} diff --git a/src/main/java/ru/betterend/blocks/basis/EndChainBlock.java b/src/main/java/ru/betterend/blocks/basis/EndChainBlock.java index 8f1ee248..dd00c923 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndChainBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndChainBlock.java @@ -22,7 +22,6 @@ import ru.betterend.client.models.ModelsHelper; import ru.betterend.client.render.ERenderLayer; import ru.betterend.interfaces.IRenderTypeable; import ru.betterend.client.models.BlockModelProvider; -import ru.betterend.client.models.ModelProvider; import ru.betterend.client.models.Patterns; public class EndChainBlock extends ChainBlock implements BlockModelProvider, IRenderTypeable { @@ -46,14 +45,14 @@ public class EndChainBlock extends ChainBlock implements BlockModelProvider, IRe @Override public BlockModel getModel(ResourceLocation blockId) { - return ModelProvider.createItemModel(blockId.getPath()); + return ModelsHelper.createItemModel(blockId.getPath()); } @Override - public @Nullable UnbakedModel getBlockModel(ResourceLocation blockId, BlockState blockState) { + public @Nullable BlockModel getBlockModel(ResourceLocation blockId, BlockState blockState) { String name = blockId.getPath(); Optional pattern = Patterns.createJson(Patterns.BLOCK_CHAIN, name, name); - return pattern.map(BlockModel::fromString).orElse(null); + return ModelsHelper.fromPattern(pattern); } @Override diff --git a/src/main/java/ru/betterend/blocks/basis/EndChestBlock.java b/src/main/java/ru/betterend/blocks/basis/EndChestBlock.java index 6f8b8c64..7aa19b97 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndChestBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndChestBlock.java @@ -5,7 +5,6 @@ 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; @@ -56,11 +55,11 @@ public class EndChestBlock extends ChestBlock implements BlockModelProvider { @Override public BlockModel getModel(ResourceLocation blockId) { Optional pattern = Patterns.createJson(Patterns.ITEM_CHEST, blockId.getPath()); - return pattern.map(BlockModel::fromString).orElse(null); + return ModelsHelper.fromPattern(pattern); } @Override - public @Nullable UnbakedModel getBlockModel(ResourceLocation resourceLocation, BlockState blockState) { + public @Nullable BlockModel getBlockModel(ResourceLocation resourceLocation, BlockState blockState) { ResourceLocation parentId = Registry.BLOCK.getKey(parent); return ModelsHelper.createBlockEmpty(parentId); } diff --git a/src/main/java/ru/betterend/blocks/basis/EndComposterBlock.java b/src/main/java/ru/betterend/blocks/basis/EndComposterBlock.java index 96c84161..01b5de47 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndComposterBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndComposterBlock.java @@ -17,6 +17,8 @@ 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.ModelsHelper.MultiPartBuilder; import ru.betterend.client.models.Patterns; public class EndComposterBlock extends ComposterBlock implements BlockModelProvider { @@ -38,16 +40,40 @@ public class EndComposterBlock extends ComposterBlock implements BlockModelProvi @Override public BlockModel getModel(ResourceLocation resourceLocation) { - return (BlockModel) getBlockModel(resourceLocation, defaultBlockState()); + return getBlockModel(resourceLocation, defaultBlockState()); } @Override - public @Nullable UnbakedModel getBlockModel(ResourceLocation blockId, BlockState blockState) { - return null; + public @Nullable BlockModel getBlockModel(ResourceLocation blockId, BlockState blockState) { + Optional pattern = Patterns.createJson(Patterns.BLOCK_COMPOSTER, blockId.getPath()); + return ModelsHelper.fromPattern(pattern); } @Override public UnbakedModel getModelVariant(ResourceLocation resourceLocation, BlockState blockState, Map modelCache) { - return null; + ResourceLocation modelId = new ResourceLocation(resourceLocation.getNamespace(), "block/" + resourceLocation.getPath()); + registerBlockModel(resourceLocation, modelId, blockState, modelCache); + + ResourceLocation content_1 = new ResourceLocation("block/composter_contents1"); + ResourceLocation content_2 = new ResourceLocation("block/composter_contents2"); + ResourceLocation content_3 = new ResourceLocation("block/composter_contents3"); + ResourceLocation content_4 = new ResourceLocation("block/composter_contents4"); + ResourceLocation content_5 = new ResourceLocation("block/composter_contents5"); + ResourceLocation content_6 = new ResourceLocation("block/composter_contents6"); + ResourceLocation content_7 = new ResourceLocation("block/composter_contents7"); + ResourceLocation content_8 = new ResourceLocation("block/composter_contents_ready"); + + MultiPartBuilder builder = MultiPartBuilder.create(stateDefinition); + builder.part(content_1).setCondition(state -> state.getValue(LEVEL) == 1).add(); + builder.part(content_2).setCondition(state -> state.getValue(LEVEL) == 2).add(); + builder.part(content_3).setCondition(state -> state.getValue(LEVEL) == 3).add(); + builder.part(content_4).setCondition(state -> state.getValue(LEVEL) == 4).add(); + builder.part(content_5).setCondition(state -> state.getValue(LEVEL) == 5).add(); + builder.part(content_6).setCondition(state -> state.getValue(LEVEL) == 6).add(); + builder.part(content_7).setCondition(state -> state.getValue(LEVEL) == 7).add(); + builder.part(content_8).setCondition(state -> state.getValue(LEVEL) == 8).add(); + builder.part(modelId).add(); + + return builder.build(); } } diff --git a/src/main/java/ru/betterend/blocks/basis/EndCraftingTableBlock.java b/src/main/java/ru/betterend/blocks/basis/EndCraftingTableBlock.java index 2b6d5eea..3c1b89bf 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndCraftingTableBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndCraftingTableBlock.java @@ -7,7 +7,6 @@ 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; @@ -17,6 +16,7 @@ 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 EndCraftingTableBlock extends CraftingTableBlock implements BlockModelProvider { @@ -49,11 +49,11 @@ public class EndCraftingTableBlock extends CraftingTableBlock implements BlockMo @Override public BlockModel getModel(ResourceLocation resourceLocation) { - return (BlockModel) getBlockModel(resourceLocation, defaultBlockState()); + return getBlockModel(resourceLocation, defaultBlockState()); } @Override - public @Nullable UnbakedModel getBlockModel(ResourceLocation blockId, BlockState blockState) { + public @Nullable BlockModel getBlockModel(ResourceLocation blockId, BlockState blockState) { String blockName = blockId.getPath(); Optional pattern = Patterns.createJson(Patterns.BLOCK_SIDED, new HashMap() { private static final long serialVersionUID = 1L; @@ -67,6 +67,6 @@ public class EndCraftingTableBlock extends CraftingTableBlock implements BlockMo put("%east%", blockName + "_side"); } }); - return pattern.map(BlockModel::fromString).orElse(null); + return ModelsHelper.fromPattern(pattern); } } diff --git a/src/main/java/ru/betterend/blocks/basis/EndDoorBlock.java b/src/main/java/ru/betterend/blocks/basis/EndDoorBlock.java index 2c450820..74ed1e08 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndDoorBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndDoorBlock.java @@ -5,11 +5,8 @@ import java.util.List; import java.util.Map; import java.util.Optional; -import com.google.common.collect.Lists; 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.resources.model.BlockModelRotation; import net.minecraft.client.resources.model.UnbakedModel; import net.minecraft.core.Direction; @@ -67,7 +64,7 @@ public class EndDoorBlock extends DoorBlock implements IRenderTypeable, BlockMod } @Override - public @Nullable UnbakedModel getBlockModel(ResourceLocation resourceLocation, BlockState blockState) { + public @Nullable BlockModel getBlockModel(ResourceLocation resourceLocation, BlockState blockState) { String blockName = resourceLocation.getPath(); DoorType doorType = getDoorType(blockState); Optional pattern = Patterns.createJson(Patterns.BLOCK_DOOR_BOTTOM, blockName, blockName); @@ -85,7 +82,7 @@ public class EndDoorBlock extends DoorBlock implements IRenderTypeable, BlockMod break; } } - return pattern.map(BlockModel::fromString).orElse(null); + return ModelsHelper.fromPattern(pattern); } @Override diff --git a/src/main/java/ru/betterend/blocks/basis/EndFenceBlock.java b/src/main/java/ru/betterend/blocks/basis/EndFenceBlock.java index 9ab9c658..d2a8c7ae 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndFenceBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndFenceBlock.java @@ -13,6 +13,7 @@ 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.ModelsHelper.MultiPartBuilder; import ru.betterend.client.models.Patterns; @@ -51,11 +52,11 @@ public class EndFenceBlock extends FenceBlock implements BlockModelProvider { public BlockModel getModel(ResourceLocation blockId) { ResourceLocation parentId = Registry.BLOCK.getKey(parent); Optional pattern = Patterns.createJson(Patterns.ITEM_FENCE, parentId.getPath(), blockId.getPath()); - return pattern.map(BlockModel::fromString).orElse(null); + return ModelsHelper.fromPattern(pattern); } @Override - public @Nullable UnbakedModel getBlockModel(ResourceLocation blockId, BlockState blockState) { + public @Nullable BlockModel getBlockModel(ResourceLocation blockId, BlockState blockState) { ResourceLocation thisId = Registry.BLOCK.getKey(this); ResourceLocation parentId = Registry.BLOCK.getKey(parent); ResourceLocation postId = new ResourceLocation(thisId.getNamespace(), @@ -64,11 +65,11 @@ public class EndFenceBlock extends FenceBlock implements BlockModelProvider { "block/" + thisId.getPath() + "_side"); if (blockId.equals(postId)) { Optional pattern = Patterns.createJson(Patterns.BLOCK_FENCE_POST, parentId.getPath(), blockId.getPath()); - return pattern.map(BlockModel::fromString).orElse(null); + return ModelsHelper.fromPattern(pattern); } if (blockId.equals(sideId)) { Optional pattern = Patterns.createJson(Patterns.BLOCK_FENCE_SIDE, parentId.getPath(), blockId.getPath()); - return pattern.map(BlockModel::fromString).orElse(null); + return ModelsHelper.fromPattern(pattern); } return null; } @@ -83,14 +84,14 @@ public class EndFenceBlock extends FenceBlock implements BlockModelProvider { registerBlockModel(sideId, sideId, blockState, modelCache); MultiPartBuilder builder = MultiPartBuilder.create(stateDefinition); - builder.part(sideId).setCondition(state -> state.getValue(NORTH)).setUVLock(true).save(); + builder.part(sideId).setCondition(state -> state.getValue(NORTH)).setUVLock(true).add(); builder.part(sideId).setCondition(state -> state.getValue(EAST)) - .setTransformation(BlockModelRotation.X0_Y90.getRotation()).setUVLock(true).save(); + .setTransformation(BlockModelRotation.X0_Y90.getRotation()).setUVLock(true).add(); builder.part(sideId).setCondition(state -> state.getValue(SOUTH)) - .setTransformation(BlockModelRotation.X0_Y180.getRotation()).setUVLock(true).save(); + .setTransformation(BlockModelRotation.X0_Y180.getRotation()).setUVLock(true).add(); builder.part(sideId).setCondition(state -> state.getValue(WEST)) - .setTransformation(BlockModelRotation.X0_Y270.getRotation()).setUVLock(true).save(); - builder.part(postId).save(); + .setTransformation(BlockModelRotation.X0_Y270.getRotation()).setUVLock(true).add(); + builder.part(postId).add(); 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 bfef1c09..6b55b25b 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndFurnaceBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndFurnaceBlock.java @@ -70,7 +70,7 @@ public class EndFurnaceBlock extends FurnaceBlock implements BlockModelProvider, } @Override - public @Nullable UnbakedModel getBlockModel(ResourceLocation blockId, BlockState blockState) { + public @Nullable BlockModel getBlockModel(ResourceLocation blockId, BlockState blockState) { String blockName = blockId.getPath(); Map textures = Maps.newHashMap(); textures.put("%top%", blockName + "_top"); @@ -84,12 +84,12 @@ public class EndFurnaceBlock extends FurnaceBlock implements BlockModelProvider, textures.put("%front%", blockName + "_front"); pattern = Patterns.createJson(Patterns.BLOCK_FURNACE, textures); } - return pattern.map(BlockModel::fromString).orElse(null); + return ModelsHelper.fromPattern(pattern); } @Override public BlockModel getModel(ResourceLocation resourceLocation) { - return (BlockModel) getBlockModel(resourceLocation, defaultBlockState()); + return getBlockModel(resourceLocation, defaultBlockState()); } @Override diff --git a/src/main/java/ru/betterend/blocks/basis/EndGateBlock.java b/src/main/java/ru/betterend/blocks/basis/EndGateBlock.java index e9a5c901..d9e7fdd9 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndGateBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndGateBlock.java @@ -51,7 +51,7 @@ public class EndGateBlock extends FenceGateBlock implements BlockModelProvider { } @Override - public @Nullable UnbakedModel getBlockModel(ResourceLocation blockId, BlockState blockState) { + public @Nullable BlockModel getBlockModel(ResourceLocation blockId, BlockState blockState) { boolean inWall = blockState.getValue(IN_WALL); boolean isOpen = blockState.getValue(OPEN); ResourceLocation parentId = Registry.BLOCK.getKey(parent); @@ -63,7 +63,7 @@ public class EndGateBlock extends FenceGateBlock implements BlockModelProvider { 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); + return ModelsHelper.fromPattern(pattern); } @Override diff --git a/src/main/java/ru/betterend/blocks/basis/EndLadderBlock.java b/src/main/java/ru/betterend/blocks/basis/EndLadderBlock.java index 6eb45684..1ae4a09a 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndLadderBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndLadderBlock.java @@ -1,8 +1,11 @@ package ru.betterend.blocks.basis; +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.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Registry; @@ -25,6 +28,8 @@ import net.minecraft.world.level.material.FluidState; import net.minecraft.world.level.material.Fluids; 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.render.ERenderLayer; import ru.betterend.interfaces.IRenderTypeable; import ru.betterend.client.models.BlockModelProvider; @@ -146,4 +151,21 @@ public class EndLadderBlock extends BlockBaseNotFull implements IRenderTypeable, return Patterns.createJson(Patterns.BLOCK_LADDER, blockId.getPath()); } + @Override + public BlockModel getModel(ResourceLocation blockId) { + return ModelsHelper.createBlockItem(blockId); + } + + @Override + public @Nullable BlockModel getBlockModel(ResourceLocation blockId, BlockState blockState) { + Optional pattern = Patterns.createJson(Patterns.BLOCK_LADDER, blockId.getPath()); + return ModelsHelper.fromPattern(pattern); + } + + @Override + public UnbakedModel getModelVariant(ResourceLocation resourceLocation, BlockState blockState, Map modelCache) { + ResourceLocation modelId = new ResourceLocation(resourceLocation.getNamespace(), "block/" + resourceLocation.getPath()); + registerBlockModel(resourceLocation, modelId, blockState, modelCache); + return ModelsHelper.createFacingModel(modelId, blockState.getValue(FACING), false, true); + } } diff --git a/src/main/java/ru/betterend/blocks/basis/EndPillarBlock.java b/src/main/java/ru/betterend/blocks/basis/EndPillarBlock.java index 3befc688..7a9570e6 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndPillarBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndPillarBlock.java @@ -36,7 +36,7 @@ public class EndPillarBlock extends RotatedPillarBlock implements BlockModelProv @Override public BlockModel getModel(ResourceLocation blockId) { - return (BlockModel) getBlockModel(blockId, defaultBlockState()); + return getBlockModel(blockId, defaultBlockState()); } @Override @@ -46,9 +46,9 @@ public class EndPillarBlock extends RotatedPillarBlock implements BlockModelProv } @Override - public @Nullable UnbakedModel getBlockModel(ResourceLocation blockId, BlockState blockState) { + public @Nullable BlockModel getBlockModel(ResourceLocation blockId, BlockState blockState) { Optional pattern = createBlockPattern(blockId); - return pattern.map(BlockModel::fromString).orElse(null); + return ModelsHelper.fromPattern(pattern); } @Override diff --git a/src/main/java/ru/betterend/blocks/basis/EndSignBlock.java b/src/main/java/ru/betterend/blocks/basis/EndSignBlock.java index c15d4719..45880bd4 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndSignBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndSignBlock.java @@ -5,7 +5,7 @@ import java.util.List; import java.util.Optional; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; -import net.minecraft.client.resources.model.UnbakedModel; +import net.minecraft.client.renderer.block.model.BlockModel; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Registry; @@ -157,7 +157,7 @@ public class EndSignBlock extends SignBlock implements BlockModelProvider, ISpet } @Override - public @Nullable UnbakedModel getBlockModel(ResourceLocation resourceLocation, BlockState blockState) { + public @Nullable BlockModel getBlockModel(ResourceLocation resourceLocation, BlockState blockState) { ResourceLocation parentId = Registry.BLOCK.getKey(parent); return ModelsHelper.createBlockEmpty(parentId); } diff --git a/src/main/java/ru/betterend/blocks/basis/EndSlabBlock.java b/src/main/java/ru/betterend/blocks/basis/EndSlabBlock.java index 97d1afe5..438a693a 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndSlabBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndSlabBlock.java @@ -5,11 +5,8 @@ import java.util.List; import java.util.Map; import java.util.Optional; -import com.google.common.collect.Lists; 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.resources.model.BlockModelRotation; import net.minecraft.client.resources.model.UnbakedModel; import net.minecraft.core.Registry; @@ -46,10 +43,10 @@ public class EndSlabBlock extends SlabBlock implements BlockModelProvider { } @Override - public @Nullable UnbakedModel getBlockModel(ResourceLocation blockId, BlockState blockState) { + public @Nullable BlockModel getBlockModel(ResourceLocation blockId, BlockState blockState) { ResourceLocation parentId = Registry.BLOCK.getKey(parent); Optional pattern = Patterns.createJson(Patterns.BLOCK_SLAB, parentId.getPath(), blockId.getPath()); - return pattern.map(BlockModel::fromString).orElse(null); + return ModelsHelper.fromPattern(pattern); } @Override diff --git a/src/main/java/ru/betterend/blocks/basis/EndStairsBlock.java b/src/main/java/ru/betterend/blocks/basis/EndStairsBlock.java index 3caa6969..28441402 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndStairsBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndStairsBlock.java @@ -2,17 +2,25 @@ 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.BlockModelRotation; +import net.minecraft.client.resources.model.UnbakedModel; import net.minecraft.core.Registry; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.StairBlock; import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.Half; +import net.minecraft.world.level.block.state.properties.StairsShape; 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 EndStairsBlock extends StairBlock implements BlockModelProvider { @@ -43,4 +51,84 @@ public class EndStairsBlock extends StairBlock implements BlockModelProvider { return pattern; } + @Override + public BlockModel getModel(ResourceLocation resourceLocation) { + return getBlockModel(resourceLocation, defaultBlockState()); + } + + @Override + public @Nullable BlockModel getBlockModel(ResourceLocation blockId, BlockState blockState) { + ResourceLocation parentId = Registry.BLOCK.getKey(parent); + Optional pattern = Optional.empty(); + switch (blockState.getValue(SHAPE)) { + case STRAIGHT: + pattern = Patterns.createJson(Patterns.BLOCK_STAIR, parentId.getPath(), blockId.getPath()); + break; + case INNER_LEFT: + case INNER_RIGHT: + pattern = Patterns.createJson(Patterns.BLOCK_STAIR_INNER, parentId.getPath(), blockId.getPath()); + break; + case OUTER_LEFT: + case OUTER_RIGHT: + pattern = Patterns.createJson(Patterns.BLOCK_STAIR_OUTER, parentId.getPath(), blockId.getPath()); + break; + } + return ModelsHelper.fromPattern(pattern); + } + + @Override + public UnbakedModel getModelVariant(ResourceLocation stateId, BlockState blockState, Map modelCache) { + String state = ""; + switch (blockState.getValue(SHAPE)) { + case INNER_LEFT: + case INNER_RIGHT: + state = "_inner"; break; + case OUTER_LEFT: + case OUTER_RIGHT: + state = "_outer"; break; + } + ResourceLocation modelId = new ResourceLocation(stateId.getNamespace(), "block/" + stateId.getPath() + state); + registerBlockModel(stateId, modelId, blockState, modelCache); + + StairsShape shape = blockState.getValue(SHAPE); + boolean isTop = blockState.getValue(HALF) == Half.TOP; + boolean isLeft = shape == StairsShape.INNER_LEFT || + shape == StairsShape.OUTER_LEFT; + boolean isRight = shape == StairsShape.INNER_RIGHT || + shape == StairsShape.OUTER_RIGHT; + int y = 0; + int x = isTop ? 180 : 0; + switch (blockState.getValue(FACING)) { + case NORTH: + if (isTop) { + if (!isRight) y = 270; + } else { + y = (isLeft) ? 180 : 270; + } + break; + case EAST: + if (isTop) { + if (isRight) y = 90; + } else { + if (isLeft) y = 270; + } + break; + case SOUTH: + if (isTop) { + y = (isRight) ? 180 : 90; + } else { + if (!isLeft) y = 90; + } + break; + case WEST: + if (isTop) { + y = isRight ? 270 : 180; + } else { + y = isLeft ? 90 : 180; + } + break; + } + BlockModelRotation rotation = BlockModelRotation.by(x, y); + return ModelsHelper.createMultiVariant(modelId, rotation.getRotation(), true); + } } diff --git a/src/main/java/ru/betterend/blocks/basis/EndStoneButtonBlock.java b/src/main/java/ru/betterend/blocks/basis/EndStoneButtonBlock.java index 11bb74c3..30f4cbae 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndStoneButtonBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndStoneButtonBlock.java @@ -5,40 +5,29 @@ import java.util.List; 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.sounds.SoundEvent; +import net.minecraft.sounds.SoundEvents; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.StoneButtonBlock; 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.Patterns; -public class EndStoneButtonBlock extends StoneButtonBlock implements BlockModelProvider { - private final Block parent; - +public class EndStoneButtonBlock extends EndButtonBlock { + public EndStoneButtonBlock(Block source) { - super(FabricBlockSettings.copyOf(source).noOcclusion()); - this.parent = source; + super(source, FabricBlockSettings.copyOf(source).noOcclusion(), false); } @Override - public List getDrops(BlockState state, LootContext.Builder builder) { - return Collections.singletonList(new ItemStack(this)); + protected SoundEvent getSound(boolean clicked) { + return clicked ? SoundEvents.STONE_BUTTON_CLICK_ON : SoundEvents.STONE_BUTTON_CLICK_OFF; } - - @Override - public Optional getModelString(String block) { - ResourceLocation blockId = Registry.BLOCK.getKey(this); - ResourceLocation parentId = Registry.BLOCK.getKey(parent); - if (block.contains("item")) { - return Patterns.createJson(Patterns.ITEM_BUTTON, parentId.getPath(), blockId.getPath()); - } - if (block.contains("pressed")) { - return Patterns.createJson(Patterns.BLOCK_BUTTON_PRESSED, parentId.getPath(), blockId.getPath()); - } - return Patterns.createJson(Patterns.BLOCK_BUTTON, parentId.getPath(), blockId.getPath()); - } - } diff --git a/src/main/java/ru/betterend/blocks/basis/EndWallBlock.java b/src/main/java/ru/betterend/blocks/basis/EndWallBlock.java index a5895bc0..8a0f569e 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndWallBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndWallBlock.java @@ -2,17 +2,24 @@ 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.BlockModelRotation; +import net.minecraft.client.resources.model.UnbakedModel; import net.minecraft.core.Registry; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.WallBlock; import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.WallSide; 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 EndWallBlock extends WallBlock implements BlockModelProvider { @@ -45,4 +52,65 @@ public class EndWallBlock extends WallBlock implements BlockModelProvider { return Patterns.createJson(Patterns.BLOCK_WALL_POST, parentId.getPath(), blockId.getPath()); } + @Override + public BlockModel getModel(ResourceLocation blockId) { + ResourceLocation parentId = Registry.BLOCK.getKey(parent); + Optional pattern = Patterns.createJson(Patterns.ITEM_WALL, parentId.getPath(), blockId.getPath()); + return ModelsHelper.fromPattern(pattern); + } + + @Override + public @Nullable BlockModel getBlockModel(ResourceLocation blockId, BlockState blockState) { + ResourceLocation thisId = Registry.BLOCK.getKey(this); + ResourceLocation parentId = Registry.BLOCK.getKey(parent); + ResourceLocation postId = new ResourceLocation(thisId.getNamespace(), + "block/" + thisId.getPath() + "_post"); + ResourceLocation sideId = new ResourceLocation(thisId.getNamespace(), + "block/" + thisId.getPath() + "_side"); + ResourceLocation sideTallId = new ResourceLocation(thisId.getNamespace(), + "block/" + thisId.getPath() + "_side_tall"); + Optional pattern = Optional.empty(); + if (blockId.equals(postId)) { + pattern = Patterns.createJson(Patterns.BLOCK_WALL_POST, parentId.getPath(), blockId.getPath()); + } + if (blockId.equals(sideId)) { + pattern = Patterns.createJson(Patterns.BLOCK_WALL_SIDE, parentId.getPath(), blockId.getPath()); + } + if (blockId.equals(sideTallId)) { + pattern = Patterns.createJson(Patterns.BLOCK_WALL_SIDE_TALL, parentId.getPath(), blockId.getPath()); + } + return ModelsHelper.fromPattern(pattern); + } + + @Override + public UnbakedModel getModelVariant(ResourceLocation blockId, BlockState blockState, Map modelCache) { + ResourceLocation postId = new ResourceLocation(blockId.getNamespace(), + "block/" + blockId.getPath() + "_post"); + ResourceLocation sideId = new ResourceLocation(blockId.getNamespace(), + "block/" + blockId.getPath() + "_side"); + ResourceLocation sideTallId = new ResourceLocation(blockId.getNamespace(), + "block/" + blockId.getPath() + "_side_tall"); + registerBlockModel(postId, postId, blockState, modelCache); + registerBlockModel(sideId, sideId, blockState, modelCache); + registerBlockModel(sideTallId, sideTallId, blockState, modelCache); + + ModelsHelper.MultiPartBuilder builder = ModelsHelper.MultiPartBuilder.create(stateDefinition); + builder.part(sideId).setCondition(state -> state.getValue(NORTH_WALL) == WallSide.LOW).setUVLock(true).add(); + builder.part(sideId).setCondition(state -> state.getValue(EAST_WALL) == WallSide.LOW) + .setTransformation(BlockModelRotation.X0_Y90.getRotation()).setUVLock(true).add(); + builder.part(sideId).setCondition(state -> state.getValue(SOUTH_WALL) == WallSide.LOW) + .setTransformation(BlockModelRotation.X0_Y180.getRotation()).setUVLock(true).add(); + builder.part(sideId).setCondition(state -> state.getValue(WEST_WALL) == WallSide.LOW) + .setTransformation(BlockModelRotation.X0_Y270.getRotation()).setUVLock(true).add(); + builder.part(sideTallId).setCondition(state -> state.getValue(NORTH_WALL) == WallSide.TALL).setUVLock(true).add(); + builder.part(sideTallId).setCondition(state -> state.getValue(EAST_WALL) == WallSide.TALL) + .setTransformation(BlockModelRotation.X0_Y90.getRotation()).setUVLock(true).add(); + builder.part(sideTallId).setCondition(state -> state.getValue(SOUTH_WALL) == WallSide.TALL) + .setTransformation(BlockModelRotation.X0_Y180.getRotation()).setUVLock(true).add(); + builder.part(sideTallId).setCondition(state -> state.getValue(WEST_WALL) == WallSide.TALL) + .setTransformation(BlockModelRotation.X0_Y270.getRotation()).setUVLock(true).add(); + builder.part(postId).setCondition(state -> state.getValue(UP)).add(); + + return builder.build(); + } } diff --git a/src/main/java/ru/betterend/blocks/basis/EndWoodenButtonBlock.java b/src/main/java/ru/betterend/blocks/basis/EndWoodenButtonBlock.java index c5115d11..f89dc22a 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndWoodenButtonBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndWoodenButtonBlock.java @@ -7,6 +7,8 @@ import java.util.Optional; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.core.Registry; import net.minecraft.resources.ResourceLocation; +import net.minecraft.sounds.SoundEvent; +import net.minecraft.sounds.SoundEvents; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.WoodButtonBlock; @@ -15,30 +17,14 @@ import net.minecraft.world.level.storage.loot.LootContext; import ru.betterend.client.models.BlockModelProvider; import ru.betterend.client.models.Patterns; -public class EndWoodenButtonBlock extends WoodButtonBlock implements BlockModelProvider { - private final Block parent; - +public class EndWoodenButtonBlock extends EndButtonBlock { + public EndWoodenButtonBlock(Block source) { - super(FabricBlockSettings.copyOf(source).strength(0.5F, 0.5F).noOcclusion()); - this.parent = source; + super(source, FabricBlockSettings.copyOf(source).strength(0.5F, 0.5F).noOcclusion(), true); } @Override - public List getDrops(BlockState state, LootContext.Builder builder) { - return Collections.singletonList(new ItemStack(this)); + protected SoundEvent getSound(boolean clicked) { + return clicked ? SoundEvents.WOODEN_BUTTON_CLICK_ON : SoundEvents.WOODEN_BUTTON_CLICK_OFF; } - - @Override - public Optional getModelString(String block) { - ResourceLocation blockId = Registry.BLOCK.getKey(this); - ResourceLocation parentId = Registry.BLOCK.getKey(parent); - if (block.contains("item")) { - return Patterns.createJson(Patterns.ITEM_BUTTON, parentId.getPath(), blockId.getPath()); - } - if (block.contains("pressed")) { - return Patterns.createJson(Patterns.BLOCK_BUTTON_PRESSED, parentId.getPath(), blockId.getPath()); - } - return Patterns.createJson(Patterns.BLOCK_BUTTON, parentId.getPath(), blockId.getPath()); - } - } diff --git a/src/main/java/ru/betterend/blocks/basis/FeatureSaplingBlock.java b/src/main/java/ru/betterend/blocks/basis/FeatureSaplingBlock.java index 8de086ee..259bc2f8 100644 --- a/src/main/java/ru/betterend/blocks/basis/FeatureSaplingBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/FeatureSaplingBlock.java @@ -7,7 +7,6 @@ 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.UnbakedModel; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.resources.ResourceLocation; @@ -125,8 +124,8 @@ public abstract class FeatureSaplingBlock extends SaplingBlock implements IRende } @Override - public @Nullable UnbakedModel getBlockModel(ResourceLocation resourceLocation, BlockState blockState) { + public @Nullable BlockModel getBlockModel(ResourceLocation resourceLocation, BlockState blockState) { Optional pattern = Patterns.createJson(Patterns.BLOCK_CROSS, resourceLocation.getPath()); - return pattern.map(BlockModel::fromString).orElse(null); + return ModelsHelper.fromPattern(pattern); } } diff --git a/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java b/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java index 8d6c982d..b7677c29 100644 --- a/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java @@ -356,11 +356,11 @@ public class PedestalBlock extends BlockBaseNotFull implements EntityBlock { @Override public BlockModel getModel(ResourceLocation blockId) { - return (BlockModel) getBlockModel(blockId, defaultBlockState()); + return getBlockModel(blockId, defaultBlockState()); } @Override - public @Nullable UnbakedModel getBlockModel(ResourceLocation resourceLocation, BlockState blockState) { + public @Nullable BlockModel getBlockModel(ResourceLocation resourceLocation, BlockState blockState) { Map textures = createTexturesMap(); PedestalState state = blockState.getValue(STATE); Optional pattern = Patterns.createJson(Patterns.BLOCK_PEDESTAL_DEFAULT, textures); @@ -386,7 +386,7 @@ public class PedestalBlock extends BlockBaseNotFull implements EntityBlock { break; } } - return pattern.map(BlockModel::fromString).orElse(null); + return ModelsHelper.fromPattern(pattern); } @Override diff --git a/src/main/java/ru/betterend/blocks/basis/StoneLanternBlock.java b/src/main/java/ru/betterend/blocks/basis/StoneLanternBlock.java index b37a53db..85edaa96 100644 --- a/src/main/java/ru/betterend/blocks/basis/StoneLanternBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/StoneLanternBlock.java @@ -6,7 +6,6 @@ import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; import net.minecraft.client.color.block.BlockColor; import net.minecraft.client.color.item.ItemColor; 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.core.Vec3i; @@ -19,6 +18,7 @@ import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.VoxelShape; import org.jetbrains.annotations.Nullable; import ru.betterend.blocks.AuroraCrystalBlock; +import ru.betterend.client.models.ModelsHelper; import ru.betterend.interfaces.IColorProvider; import ru.betterend.client.models.Patterns; import ru.betterend.util.MHelper; @@ -75,11 +75,11 @@ public class StoneLanternBlock extends EndLanternBlock implements IColorProvider } @Override - public @Nullable UnbakedModel getBlockModel(ResourceLocation resourceLocation, BlockState blockState) { + public @Nullable BlockModel getBlockModel(ResourceLocation resourceLocation, BlockState blockState) { String blockName = resourceLocation.getPath(); Optional pattern = blockState.getValue(IS_FLOOR) ? Patterns.createJson(Patterns.BLOCK_STONE_LANTERN_FLOOR, blockName, blockName) : Patterns.createJson(Patterns.BLOCK_STONE_LANTERN_CEIL, blockName, blockName); - return pattern.map(BlockModel::fromString).orElse(null); + return ModelsHelper.fromPattern(pattern); } } diff --git a/src/main/java/ru/betterend/client/models/BlockModelProvider.java b/src/main/java/ru/betterend/client/models/BlockModelProvider.java index 76b2f63e..ce9ccfeb 100644 --- a/src/main/java/ru/betterend/client/models/BlockModelProvider.java +++ b/src/main/java/ru/betterend/client/models/BlockModelProvider.java @@ -13,9 +13,9 @@ import ru.betterend.BetterEnd; import static net.minecraft.client.resources.model.ModelBakery.MISSING_MODEL_LOCATION; public interface BlockModelProvider extends ModelProvider { - default @Nullable UnbakedModel getBlockModel(ResourceLocation resourceLocation, BlockState blockState) { + default @Nullable BlockModel getBlockModel(ResourceLocation resourceLocation, BlockState blockState) { Optional pattern = Patterns.createBlockSimple(resourceLocation.getPath()); - return pattern.map(BlockModel::fromString).orElse(null); + return ModelsHelper.fromPattern(pattern); } default UnbakedModel getModelVariant(ResourceLocation resourceLocation, BlockState blockState, Map modelCache) { diff --git a/src/main/java/ru/betterend/client/models/ModelProvider.java b/src/main/java/ru/betterend/client/models/ModelProvider.java index 52bb634f..6af59923 100644 --- a/src/main/java/ru/betterend/client/models/ModelProvider.java +++ b/src/main/java/ru/betterend/client/models/ModelProvider.java @@ -9,11 +9,6 @@ public interface ModelProvider { Optional getModelString(String name); default BlockModel getModel(ResourceLocation resourceLocation) { - return createItemModel(resourceLocation.getPath()); - } - - static BlockModel createItemModel(String name) { - Optional pattern = Patterns.createItemGenerated("item/" + name); - return pattern.map(BlockModel::fromString).orElse(null); + return ModelsHelper.createItemModel(resourceLocation.getPath()); } } \ No newline at end of file diff --git a/src/main/java/ru/betterend/client/models/ModelsHelper.java b/src/main/java/ru/betterend/client/models/ModelsHelper.java index af202346..0e1658a5 100644 --- a/src/main/java/ru/betterend/client/models/ModelsHelper.java +++ b/src/main/java/ru/betterend/client/models/ModelsHelper.java @@ -23,14 +23,24 @@ import java.util.function.Function; @Environment(EnvType.CLIENT) public class ModelsHelper { + @SuppressWarnings("OptionalUsedAsFieldOrParameterType") + public static BlockModel fromPattern(Optional pattern) { + return pattern.map(BlockModel::fromString).orElse(null); + } + + public static BlockModel createItemModel(String name) { + Optional pattern = Patterns.createItemGenerated("item/" + name); + return fromPattern(pattern); + } + public static BlockModel createBlockItem(ResourceLocation resourceLocation) { Optional pattern = Patterns.createJson(Patterns.ITEM_BLOCK, resourceLocation.getPath()); - return pattern.map(BlockModel::fromString).orElse(null); + return fromPattern(pattern); } public static BlockModel createBlockEmpty(ResourceLocation resourceLocation) { Optional pattern = Patterns.createJson(Patterns.BLOCK_EMPTY, resourceLocation.getPath()); - return pattern.map(BlockModel::fromString).orElse(null); + return fromPattern(pattern); } public static MultiVariant createMultiVariant(ResourceLocation resourceLocation, Transformation transform, boolean uvLock) { @@ -116,7 +126,7 @@ public class ModelsHelper { return this; } - public void save() { + public void add() { modelParts.add(this); } } diff --git a/src/main/java/ru/betterend/item/EnchantedPetalItem.java b/src/main/java/ru/betterend/item/EnchantedPetalItem.java index 80d85a76..be3ab6ea 100644 --- a/src/main/java/ru/betterend/item/EnchantedPetalItem.java +++ b/src/main/java/ru/betterend/item/EnchantedPetalItem.java @@ -4,7 +4,7 @@ import net.minecraft.client.renderer.block.model.BlockModel; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Rarity; -import ru.betterend.client.models.ModelProvider; +import ru.betterend.client.models.ModelsHelper; import ru.betterend.client.models.Patterns; import ru.betterend.registry.EndItems; @@ -27,6 +27,6 @@ public class EnchantedPetalItem extends ModelProviderItem { @Override public BlockModel getModel(ResourceLocation resourceLocation) { - return ModelProvider.createItemModel("hydralux_petal"); + return ModelsHelper.createItemModel("hydralux_petal"); } } diff --git a/src/main/java/ru/betterend/item/EndSpawnEggItem.java b/src/main/java/ru/betterend/item/EndSpawnEggItem.java index 5490086d..f36a327b 100644 --- a/src/main/java/ru/betterend/item/EndSpawnEggItem.java +++ b/src/main/java/ru/betterend/item/EndSpawnEggItem.java @@ -5,6 +5,7 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.EntityType; import net.minecraft.world.item.SpawnEggItem; import ru.betterend.client.models.ModelProvider; +import ru.betterend.client.models.ModelsHelper; import ru.betterend.client.models.Patterns; import java.util.Optional; @@ -22,6 +23,6 @@ public class EndSpawnEggItem extends SpawnEggItem implements ModelProvider { @Override public BlockModel getModel(ResourceLocation resourceLocation) { Optional pattern = Patterns.createJson(Patterns.ITEM_SPAWN_EGG, resourceLocation.getPath()); - return pattern.map(BlockModel::fromString).orElse(null); + return ModelsHelper.fromPattern(pattern); } } diff --git a/src/main/java/ru/betterend/item/ModelProviderItem.java b/src/main/java/ru/betterend/item/ModelProviderItem.java index 6581096a..ea866dfe 100644 --- a/src/main/java/ru/betterend/item/ModelProviderItem.java +++ b/src/main/java/ru/betterend/item/ModelProviderItem.java @@ -4,6 +4,7 @@ import net.minecraft.client.renderer.block.model.BlockModel; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.Item; import ru.betterend.client.models.ModelProvider; +import ru.betterend.client.models.ModelsHelper; import ru.betterend.client.models.Patterns; import java.util.Optional; @@ -20,6 +21,6 @@ public class ModelProviderItem extends Item implements ModelProvider { @Override public BlockModel getModel(ResourceLocation resourceLocation) { - return ModelProvider.createItemModel(resourceLocation.getPath()); + return ModelsHelper.createItemModel(resourceLocation.getPath()); } } diff --git a/src/main/java/ru/betterend/mixin/client/ModelLoaderMixin.java b/src/main/java/ru/betterend/mixin/client/ModelLoaderMixin.java index 344f8e8b..1f609766 100644 --- a/src/main/java/ru/betterend/mixin/client/ModelLoaderMixin.java +++ b/src/main/java/ru/betterend/mixin/client/ModelLoaderMixin.java @@ -28,6 +28,7 @@ import ru.betterend.world.generator.GeneratorOptions; import java.io.FileNotFoundException; import java.io.IOException; +import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Optional; @@ -54,7 +55,7 @@ public abstract class ModelLoaderMixin { String path = resourceLocation.getPath(); ResourceLocation clearLoc = new ResourceLocation(modId, path); ModelResourceLocation modelId = (ModelResourceLocation) resourceLocation; - if (Objects.equals(modelId.getVariant(), "inventory")) { + if ("inventory".equals(modelId.getVariant())) { ResourceLocation itemLoc = new ResourceLocation(modId, "item/" + path); ResourceLocation itemModelLoc = new ResourceLocation(modId, "models/" + itemLoc.getPath() + ".json"); if (!resourceManager.hasResource(itemModelLoc)) { @@ -76,14 +77,15 @@ public abstract class ModelLoaderMixin { if (!resourceManager.hasResource(stateLoc)) { Block block = Registry.BLOCK.get(clearLoc); if (block instanceof BlockModelProvider) { - Optional stateOptional = block.getStateDefinition().getPossibleStates().stream() + List possibleStates = block.getStateDefinition().getPossibleStates(); + Optional possibleState = possibleStates.stream() .filter(state -> modelId.equals(BlockModelShaper.stateToModelLocation(clearLoc, state))) .findFirst(); - if (stateOptional.isPresent()) { - UnbakedModel modelVariant = ((BlockModelProvider) block).getModelVariant(modelId, stateOptional.get(), unbakedCache); + if (possibleState.isPresent()) { + UnbakedModel modelVariant = ((BlockModelProvider) block).getModelVariant(modelId, possibleState.get(), unbakedCache); if (modelVariant != null) { if (modelVariant instanceof MultiPart) { - block.getStateDefinition().getPossibleStates().forEach(state -> { + possibleStates.forEach(state -> { ResourceLocation stateId = BlockModelShaper.stateToModelLocation(clearLoc, state); cacheAndQueueDependencies(stateId, modelVariant); });