diff --git a/src/main/java/org/betterx/bclib/api/v2/PostInitAPI.java b/src/main/java/org/betterx/bclib/api/v2/PostInitAPI.java index 6f317376..a22dc656 100644 --- a/src/main/java/org/betterx/bclib/api/v2/PostInitAPI.java +++ b/src/main/java/org/betterx/bclib/api/v2/PostInitAPI.java @@ -8,7 +8,6 @@ import org.betterx.bclib.blocks.BaseFurnaceBlock; import org.betterx.bclib.blocks.BaseSignBlock; import org.betterx.bclib.client.render.BCLRenderLayer; import org.betterx.bclib.client.render.BaseChestBlockEntityRenderer; -import org.betterx.bclib.client.render.BaseSignBlockEntityRenderer; import org.betterx.bclib.config.Configs; import org.betterx.bclib.interfaces.Fuel; import org.betterx.bclib.interfaces.PostInitable; @@ -90,8 +89,6 @@ public class PostInitAPI { } if (block instanceof BaseChestBlock) { BaseChestBlockEntityRenderer.registerRenderLayer(block); - } else if (block instanceof BaseSignBlock) { - BaseSignBlockEntityRenderer.registerRenderLayer(block); } } diff --git a/src/main/java/org/betterx/bclib/blockentities/BaseSignBlockEntity.java b/src/main/java/org/betterx/bclib/blockentities/BaseSignBlockEntity.java deleted file mode 100644 index e91c936b..00000000 --- a/src/main/java/org/betterx/bclib/blockentities/BaseSignBlockEntity.java +++ /dev/null @@ -1,19 +0,0 @@ -package org.betterx.bclib.blockentities; - -import org.betterx.bclib.registry.BaseBlockEntities; - -import net.minecraft.core.BlockPos; -import net.minecraft.world.level.block.entity.BlockEntityType; -import net.minecraft.world.level.block.entity.SignBlockEntity; -import net.minecraft.world.level.block.state.BlockState; - -public class BaseSignBlockEntity extends SignBlockEntity { - public BaseSignBlockEntity(BlockPos blockPos, BlockState blockState) { - super(blockPos, blockState); - } - - @Override - public BlockEntityType getType() { - return BaseBlockEntities.SIGN; - } -} \ No newline at end of file diff --git a/src/main/java/org/betterx/bclib/blocks/BaseSignBlock.java b/src/main/java/org/betterx/bclib/blocks/BaseSignBlock.java index 869bf034..846bde64 100644 --- a/src/main/java/org/betterx/bclib/blocks/BaseSignBlock.java +++ b/src/main/java/org/betterx/bclib/blocks/BaseSignBlock.java @@ -1,201 +1,46 @@ package org.betterx.bclib.blocks; -import org.betterx.bclib.blockentities.BaseSignBlockEntity; -import org.betterx.bclib.client.models.ModelsHelper; +import org.betterx.bclib.complexmaterials.BCLWoodTypeWrapper; +import org.betterx.bclib.complexmaterials.BehaviourBuilders; import org.betterx.bclib.interfaces.BlockModelProvider; import org.betterx.bclib.interfaces.CustomItemProvider; -import org.betterx.bclib.util.BlocksHelper; -import net.minecraft.client.renderer.block.model.BlockModel; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.core.registries.BuiltInRegistries; -import net.minecraft.network.protocol.game.ClientboundOpenSignEditorPacket; import net.minecraft.resources.ResourceLocation; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.util.Mth; -import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.Item; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.context.BlockPlaceContext; -import net.minecraft.world.level.BlockGetter; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.LevelAccessor; -import net.minecraft.world.level.LevelReader; -import net.minecraft.world.level.block.*; -import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.item.SignItem; +import net.minecraft.world.level.block.StandingSignBlock; +import net.minecraft.world.level.block.WallSignBlock; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.state.StateDefinition; -import net.minecraft.world.level.block.state.properties.*; -import net.minecraft.world.level.material.Fluid; -import net.minecraft.world.level.material.FluidState; -import net.minecraft.world.level.material.Fluids; -import net.minecraft.world.level.storage.loot.LootParams; -import net.minecraft.world.phys.shapes.CollisionContext; -import net.minecraft.world.phys.shapes.VoxelShape; - -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; - -import java.util.Collections; -import java.util.List; -import org.jetbrains.annotations.Nullable; +import net.minecraft.world.level.block.state.properties.RotationSegment; +import net.minecraft.world.level.block.state.properties.WoodType; +import net.minecraft.world.level.material.MapColor; @SuppressWarnings("deprecation") -public class BaseSignBlock extends SignBlock implements BlockModelProvider, CustomItemProvider { - public static final IntegerProperty ROTATION = BlockStateProperties.ROTATION_16; - public static final BooleanProperty FLOOR = BooleanProperty.create("floor"); - private static final VoxelShape[] WALL_SHAPES = new VoxelShape[]{ - Block.box(0.0D, 4.5D, 14.0D, 16.0D, 12.5D, 16.0D), - Block.box(0.0D, 4.5D, 0.0D, 2.0D, 12.5D, 16.0D), - Block.box(0.0D, 4.5D, 0.0D, 16.0D, 12.5D, 2.0D), - Block.box(14.0D, 4.5D, 0.0D, 16.0D, 12.5D, 16.0D) - }; +public class BaseSignBlock extends StandingSignBlock implements BlockModelProvider, CustomItemProvider { + public final WallSignBlock wallSign; - private final Block parent; - - public BaseSignBlock(Block source) { - super(Properties.copy(source).strength(1.0F, 1.0F).noCollission().noOcclusion(), WoodType.OAK); - this.registerDefaultState(this.stateDefinition.any() - .setValue(ROTATION, 0) - .setValue(FLOOR, false) - .setValue(WATERLOGGED, false)); - this.parent = source; + public BaseSignBlock(WoodType type) { + this(type, MapColor.WOOD); } - @Override - protected void createBlockStateDefinition(StateDefinition.Builder builder) { - builder.add(ROTATION, FLOOR, WATERLOGGED); + public BaseSignBlock(BCLWoodTypeWrapper type) { + this(type.type, type.color); } - @Override - public VoxelShape getShape(BlockState state, BlockGetter view, BlockPos pos, CollisionContext ePos) { - return state.getValue(FLOOR) ? SHAPE : WALL_SHAPES[state.getValue(ROTATION) >> 2]; + public BaseSignBlock(WoodType type, MapColor color) { + super(BehaviourBuilders.createSign(color), type); + this.wallSign = new BaseWallSignBlock(BehaviourBuilders.createWallSign(color, this), type); } - @Override - public BlockEntity newBlockEntity(BlockPos blockPos, BlockState blockState) { - return new BaseSignBlockEntity(blockPos, blockState); - } @Override public float getYRotationDegrees(BlockState blockState) { - return RotationSegment.convertToDegrees(blockState.getValue(ROTATION)); - } - - @Override - public void setPlacedBy(Level world, BlockPos pos, BlockState state, LivingEntity placer, ItemStack itemStack) { - if (placer instanceof Player) { - BaseSignBlockEntity sign = (BaseSignBlockEntity) world.getBlockEntity(pos); - if (sign != null) { - if (!world.isClientSide) { - sign.setAllowedPlayerEditor(placer.getUUID()); - ((ServerPlayer) placer).connection.send(new ClientboundOpenSignEditorPacket(pos, true)); - } else { - //sign.setEditable(true); - } - } - } - } - - @Override - public BlockState updateShape( - BlockState state, - Direction facing, - BlockState neighborState, - LevelAccessor world, - BlockPos pos, - BlockPos neighborPos - ) { - if (state.getValue(WATERLOGGED)) { - world.scheduleTick(pos, Fluids.WATER, Fluids.WATER.getTickDelay(world)); - } - if (!canSurvive(state, world, pos)) { - return state.getValue(WATERLOGGED) - ? state.getFluidState().createLegacyBlock() - : Blocks.AIR.defaultBlockState(); - } - return super.updateShape(state, facing, neighborState, world, pos, neighborPos); - } - - @Override - public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { - if (!state.getValue(FLOOR)) { - int index = (((state.getValue(ROTATION) >> 2) + 2)) & 3; - return world.getBlockState(pos.relative(BlocksHelper.HORIZONTAL[index])).isSolid(); - } else { - return world.getBlockState(pos.below()).isSolid(); - } - } - - @Override - public BlockState getStateForPlacement(BlockPlaceContext ctx) { - if (ctx.getClickedFace() == Direction.UP) { - FluidState fluidState = ctx.getLevel().getFluidState(ctx.getClickedPos()); - return this - .defaultBlockState() - .setValue(FLOOR, true) - .setValue(ROTATION, Mth.floor((180.0 + ctx.getRotation() * 16.0 / 360.0) + 0.5 - 12) & 15) - .setValue(WATERLOGGED, fluidState.getType() == Fluids.WATER); - } else if (ctx.getClickedFace() != Direction.DOWN) { - BlockState blockState = this.defaultBlockState(); - FluidState fluidState = ctx.getLevel().getFluidState(ctx.getClickedPos()); - LevelReader worldView = ctx.getLevel(); - BlockPos blockPos = ctx.getClickedPos(); - Direction[] directions = ctx.getNearestLookingDirections(); - - for (Direction direction : directions) { - if (direction.getAxis().isHorizontal()) { - Direction dir = direction.getOpposite(); - int rot = Mth.floor((180.0 + dir.toYRot() * 16.0 / 360.0) + 0.5 + 4) & 15; - blockState = blockState.setValue(ROTATION, rot); - if (blockState.canSurvive(worldView, blockPos)) { - return blockState.setValue(FLOOR, false) - .setValue(WATERLOGGED, fluidState.getType() == Fluids.WATER); - } - } - } - } - - return null; - } - - @Override - @Environment(EnvType.CLIENT) - public @Nullable BlockModel getBlockModel(ResourceLocation resourceLocation, BlockState blockState) { - ResourceLocation parentId = BuiltInRegistries.BLOCK.getKey(parent); - return ModelsHelper.createBlockEmpty(parentId); - } - - @Override - public BlockState rotate(BlockState state, Rotation rotation) { - return state.setValue(ROTATION, rotation.rotate(state.getValue(ROTATION), 16)); - } - - @Override - public BlockState mirror(BlockState state, Mirror mirror) { - return state.setValue(ROTATION, mirror.mirror(state.getValue(ROTATION), 16)); - } - - @Override - public List getDrops(BlockState state, LootParams.Builder builder) { - return Collections.singletonList(new ItemStack(this)); - } - - @Override - public boolean canPlaceLiquid(BlockGetter world, BlockPos pos, BlockState state, Fluid fluid) { - return super.canPlaceLiquid(world, pos, state, fluid); - } - - @Override - public boolean placeLiquid(LevelAccessor world, BlockPos pos, BlockState state, FluidState fluidState) { - return super.placeLiquid(world, pos, state, fluidState); + return RotationSegment.convertToDegrees(blockState.getValue(StandingSignBlock.ROTATION)); } @Override public BlockItem getCustomItem(ResourceLocation blockID, Item.Properties settings) { - return new BlockItem(this, settings.stacksTo(16)); + return new SignItem(settings.stacksTo(16), this, wallSign); } } \ No newline at end of file diff --git a/src/main/java/org/betterx/bclib/blocks/BaseWallSignBlock.java b/src/main/java/org/betterx/bclib/blocks/BaseWallSignBlock.java new file mode 100644 index 00000000..01b206dc --- /dev/null +++ b/src/main/java/org/betterx/bclib/blocks/BaseWallSignBlock.java @@ -0,0 +1,10 @@ +package org.betterx.bclib.blocks; + +import net.minecraft.world.level.block.WallSignBlock; +import net.minecraft.world.level.block.state.properties.WoodType; + +public class BaseWallSignBlock extends WallSignBlock { + public BaseWallSignBlock(Properties properties, WoodType woodType) { + super(properties, woodType); + } +} diff --git a/src/main/java/org/betterx/bclib/client/render/BaseSignBlockEntityRenderer.java b/src/main/java/org/betterx/bclib/client/render/BaseSignBlockEntityRenderer.java deleted file mode 100644 index dc5d9b47..00000000 --- a/src/main/java/org/betterx/bclib/client/render/BaseSignBlockEntityRenderer.java +++ /dev/null @@ -1,198 +0,0 @@ -package org.betterx.bclib.client.render; - -import org.betterx.bclib.blockentities.BaseSignBlockEntity; -import org.betterx.bclib.blocks.BaseSignBlock; - -import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.blaze3d.vertex.VertexConsumer; -import com.mojang.math.Axis; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.Font; -import net.minecraft.client.model.geom.ModelLayers; -import net.minecraft.client.player.LocalPlayer; -import net.minecraft.client.renderer.MultiBufferSource; -import net.minecraft.client.renderer.RenderType; -import net.minecraft.client.renderer.Sheets; -import net.minecraft.client.renderer.blockentity.BlockEntityRenderer; -import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; -import net.minecraft.client.renderer.blockentity.SignRenderer; -import net.minecraft.client.resources.model.Material; -import net.minecraft.core.registries.BuiltInRegistries; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.util.FastColor; -import net.minecraft.util.FormattedCharSequence; -import net.minecraft.util.Mth; -import net.minecraft.world.entity.Entity; -import net.minecraft.world.item.DyeColor; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.SignBlock; -import net.minecraft.world.level.block.StandingSignBlock; -import net.minecraft.world.level.block.entity.SignText; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.state.properties.WoodType; -import net.minecraft.world.phys.Vec3; - -import com.google.common.collect.Maps; - -import java.util.HashMap; -import java.util.List; - -public class BaseSignBlockEntityRenderer implements BlockEntityRenderer { - private static final HashMap RENDER_TYPES = Maps.newHashMap(); - private static final int OUTLINE_RENDER_DISTANCE = Mth.square(16); - private static final RenderType RENDER_TYPE; - private final SignRenderer.SignModel model; - private final Font font; - - - public BaseSignBlockEntityRenderer(BlockEntityRendererProvider.Context ctx) { - super(); - this.font = ctx.getFont(); - model = new SignRenderer.SignModel(ctx.bakeLayer(ModelLayers.createSignModelName(WoodType.OAK))); - } - - public void render( - BaseSignBlockEntity signBlockEntity, - float tickDelta, - PoseStack matrixStack, - MultiBufferSource provider, - int light, - int overlay - ) { - final SignText frontText = signBlockEntity.getFrontText(); - BlockState state = signBlockEntity.getBlockState(); - - matrixStack.pushPose(); - - - matrixStack.translate(0.5D, 0.5D, 0.5D); - float angle = -((float) (state.getValue(StandingSignBlock.ROTATION) * 360) / 16.0F); - - BlockState blockState = signBlockEntity.getBlockState(); - if (blockState.getValue(BaseSignBlock.FLOOR)) { - matrixStack.mulPose(Axis.YP.rotationDegrees(angle)); - model.stick.visible = true; - } else { - matrixStack.mulPose(Axis.YP.rotationDegrees(angle + 180)); - matrixStack.translate(0.0D, -0.3125D, -0.4375D); - model.stick.visible = false; - } - - matrixStack.pushPose(); - matrixStack.scale(0.6666667F, -0.6666667F, -0.6666667F); - VertexConsumer vertexConsumer = getConsumer(provider, state.getBlock()); - - model.root.render(matrixStack, vertexConsumer, light, overlay); - matrixStack.popPose(); - matrixStack.translate(0.0D, 0.3333333432674408D, 0.046666666865348816D); - matrixStack.scale(0.010416667F, -0.010416667F, 0.010416667F); - int m = frontText.getColor().getTextColor(); - int n = (int) (FastColor.ARGB32.red(m) * 0.4D); - int o = (int) (FastColor.ARGB32.green(m) * 0.4D); - int p = (int) (FastColor.ARGB32.blue(m) * 0.4D); - int q = FastColor.ARGB32.color(0, p, o, n); - - FormattedCharSequence[] formattedCharSequences = frontText.getRenderMessages( - Minecraft.getInstance() - .isTextFilteringEnabled(), - (component) -> { - List list = this.font.split(component, 90); - return list.isEmpty() ? FormattedCharSequence.EMPTY : list.get(0); - } - ); - int drawColor; - boolean drawOutlined; - int drawLight; - if (frontText.hasGlowingText()) { - drawColor = frontText.getColor().getTextColor(); - drawOutlined = isOutlineVisible(signBlockEntity, drawColor); - drawLight = 15728880; - } else { - drawColor = m; - drawOutlined = false; - drawLight = light; - } - - for (int s = 0; s < 4; ++s) { - FormattedCharSequence formattedCharSequence = formattedCharSequences[s]; - float t = (float) (-this.font.width(formattedCharSequence) / 2); - int marginHeight = 4 * signBlockEntity.getTextLineHeight() / 2; - if (drawOutlined) { - this.font.drawInBatch8xOutline( - formattedCharSequence, - t, - (float) (s * signBlockEntity.getTextLineHeight() - marginHeight), - drawColor, - m, - matrixStack.last().pose(), - provider, - drawLight - ); - } else { - this.font.drawInBatch( - formattedCharSequence, - t, - (float) (s * signBlockEntity.getTextLineHeight() - marginHeight), - drawColor, - false, - matrixStack.last().pose(), - provider, - Font.DisplayMode.NORMAL, - 0, - drawLight - ); - } - } - - - matrixStack.popPose(); - } - - - private static boolean isOutlineVisible(BaseSignBlockEntity signBlockEntity, int i) { - if (i == DyeColor.BLACK.getTextColor()) { - return true; - } else { - Minecraft minecraft = Minecraft.getInstance(); - LocalPlayer localPlayer = minecraft.player; - if (localPlayer != null && minecraft.options.getCameraType().isFirstPerson() && localPlayer.isScoping()) { - return true; - } else { - Entity entity = minecraft.getCameraEntity(); - return entity != null && entity.distanceToSqr(Vec3.atCenterOf(signBlockEntity.getBlockPos())) < (double) OUTLINE_RENDER_DISTANCE; - } - } - } - - public static WoodType getSignType(Block block) { - WoodType signType2; - if (block instanceof SignBlock) { - signType2 = ((SignBlock) block).type(); - } else { - signType2 = WoodType.OAK; - } - - return signType2; - } - - public static Material getModelTexture(Block block) { - return Sheets.getSignMaterial(getSignType(block)); - } - - public static VertexConsumer getConsumer(MultiBufferSource provider, Block block) { - return provider.getBuffer(RENDER_TYPES.getOrDefault(block, RENDER_TYPE)); - } - - public static void registerRenderLayer(Block block) { - ResourceLocation blockId = BuiltInRegistries.BLOCK.getKey(block); - RenderType layer = RenderType.entitySolid(new ResourceLocation( - blockId.getNamespace(), - "textures/entity/sign/" + blockId.getPath() + ".png" - )); - RENDER_TYPES.put(block, layer); - } - - static { - RENDER_TYPE = RenderType.entitySolid(new ResourceLocation("textures/entity/signs/oak.png")); - } -} diff --git a/src/main/java/org/betterx/bclib/complexmaterials/BCLWoodType.java b/src/main/java/org/betterx/bclib/complexmaterials/BCLWoodType.java deleted file mode 100644 index 0712b4ad..00000000 --- a/src/main/java/org/betterx/bclib/complexmaterials/BCLWoodType.java +++ /dev/null @@ -1,33 +0,0 @@ -package org.betterx.bclib.complexmaterials; - -import net.minecraft.sounds.SoundEvent; -import net.minecraft.world.level.block.SoundType; -import net.minecraft.world.level.block.state.properties.BlockSetType; -import net.minecraft.world.level.block.state.properties.WoodType; - -public class BCLWoodType extends WoodType { - private String modID; - - protected BCLWoodType(String modID, String string) { - super(string, new BlockSetType(modID + "_" + string)); - this.modID = modID; - } - - protected BCLWoodType(String modID, String string, BlockSetType setType) { - super(string, setType); - this.modID = modID; - } - - protected BCLWoodType( - String modID, - String string, - BlockSetType setType, - SoundType soundType, - SoundType hangingSignSoundType, - SoundEvent fenceGateClose, - SoundEvent fenceGateOpen - ) { - super(string, setType, soundType, hangingSignSoundType, fenceGateClose, fenceGateOpen); - this.modID = modID; - } -} diff --git a/src/main/java/org/betterx/bclib/complexmaterials/BCLWoodTypeWrapper.java b/src/main/java/org/betterx/bclib/complexmaterials/BCLWoodTypeWrapper.java new file mode 100644 index 00000000..bd5b85e9 --- /dev/null +++ b/src/main/java/org/betterx/bclib/complexmaterials/BCLWoodTypeWrapper.java @@ -0,0 +1,99 @@ +package org.betterx.bclib.complexmaterials; + +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.block.state.properties.BlockSetType; +import net.minecraft.world.level.block.state.properties.WoodType; +import net.minecraft.world.level.material.MapColor; + +import net.fabricmc.fabric.api.object.builder.v1.block.type.BlockSetTypeRegistry; +import net.fabricmc.fabric.api.object.builder.v1.block.type.WoodTypeRegistry; + +import java.util.Objects; + +public final class BCLWoodTypeWrapper { + public final ResourceLocation id; + public final WoodType type; + public final MapColor color; + + protected BCLWoodTypeWrapper(ResourceLocation id, WoodType type, MapColor color) { + this.id = id; + this.type = type; + this.color = color; + } + + public static Builder create(String modID, String string) { + return new Builder(new ResourceLocation(modID, string)); + } + + public static Builder create(ResourceLocation id) { + return new Builder(id); + } + + public BlockSetType setType() { + return type.setType(); + } + + public ResourceLocation id() { + return id; + } + + public WoodType type() { + return type; + } + + public MapColor color() { + return color; + } + + @Override + public boolean equals(Object obj) { + if (obj == this) return true; + if (obj == null || obj.getClass() != this.getClass()) return false; + var that = (BCLWoodTypeWrapper) obj; + return Objects.equals(this.id, that.id) && + Objects.equals(this.type, that.type) && + Objects.equals(this.color, that.color); + } + + @Override + public int hashCode() { + return Objects.hash(id, type, color); + } + + @Override + public String toString() { + return "BCLWoodTypeWrapper[" + + "id=" + id + ", " + + "type=" + type + ", " + + "color=" + color + ']'; + } + + + public static class Builder { + private final ResourceLocation id; + private BlockSetType setType; + private MapColor color; + + public Builder(ResourceLocation id) { + this.id = id; + this.color = MapColor.WOOD; + } + + public Builder setBlockSetType(BlockSetType setType) { + this.setType = setType; + return this; + } + + public Builder setColor(MapColor color) { + this.color = color; + return this; + } + + public BCLWoodTypeWrapper build() { + if (setType == null) setType = BlockSetTypeRegistry.registerWood(id); + + final WoodType type = WoodTypeRegistry.register(id, setType); + return new BCLWoodTypeWrapper(id, type, color); + } + } +} diff --git a/src/main/java/org/betterx/bclib/complexmaterials/WoodenComplexMaterial.java b/src/main/java/org/betterx/bclib/complexmaterials/WoodenComplexMaterial.java index ba01a335..c1d81433 100644 --- a/src/main/java/org/betterx/bclib/complexmaterials/WoodenComplexMaterial.java +++ b/src/main/java/org/betterx/bclib/complexmaterials/WoodenComplexMaterial.java @@ -20,7 +20,6 @@ import net.minecraft.world.item.Items; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockBehaviour; -import net.minecraft.world.level.block.state.properties.WoodType; import net.minecraft.world.level.material.MapColor; import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings; @@ -47,6 +46,7 @@ public class WoodenComplexMaterial extends ComplexMaterial { public static final String BLOCK_DOOR = "door"; public static final String BLOCK_GATE = "gate"; public static final String BLOCK_SIGN = "sign"; + public static final String BLOCK_WALL_SIGN = "wall_sign"; public static final String BLOCK_SLAB = "slab"; public static final String BLOCK_LOG = "log"; @@ -55,7 +55,7 @@ public class WoodenComplexMaterial extends ComplexMaterial { public final MapColor planksColor; public final MapColor woodColor; - public final WoodType woodType; + public final BCLWoodTypeWrapper woodType; public WoodenComplexMaterial( String modID, @@ -67,7 +67,7 @@ public class WoodenComplexMaterial extends ComplexMaterial { super(modID, baseName, receipGroupPrefix); this.planksColor = planksColor; this.woodColor = woodColor; - this.woodType = WoodType.register(new BCLWoodType(modID, baseName)); + this.woodType = BCLWoodTypeWrapper.create(modID, baseName).setColor(planksColor).build(); } @Override @@ -158,7 +158,7 @@ public class WoodenComplexMaterial extends ComplexMaterial { addBlockEntry(new BlockEntry( BLOCK_GATE, - (complexMaterial, settings) -> new BaseGateBlock(getBlock(BLOCK_PLANKS), this.woodType) + (complexMaterial, settings) -> new BaseGateBlock(getBlock(BLOCK_PLANKS), this.woodType.type()) ) .setBlockTags(BlockTags.FENCE_GATES)); @@ -204,10 +204,22 @@ public class WoodenComplexMaterial extends ComplexMaterial { addBlockEntry(new BlockEntry( BLOCK_SIGN, - (complexMaterial, settings) -> new BaseSignBlock(getBlock(BLOCK_PLANKS)) + (complexMaterial, settings) -> new BaseSignBlock(woodType) ) .setBlockTags(BlockTags.SIGNS) .setItemTags(ItemTags.SIGNS)); + + addBlockEntry(new BlockEntry( + BLOCK_WALL_SIGN, + false, + (complexMaterial, settings) -> { + if (getBlock(BLOCK_SIGN) instanceof BaseSignBlock sign) { + return sign.wallSign; + } + return null; + } + ) + .setBlockTags(BlockTags.WALL_SIGNS)); } final protected void initStorage(BlockBehaviour.Properties blockSettings, Item.Properties itemSettings) { @@ -442,4 +454,5 @@ public class WoodenComplexMaterial extends ComplexMaterial { .build(); })); } + } \ No newline at end of file diff --git a/src/main/java/org/betterx/bclib/complexmaterials/entry/BlockEntry.java b/src/main/java/org/betterx/bclib/complexmaterials/entry/BlockEntry.java index bf5ccb41..56a33c8a 100644 --- a/src/main/java/org/betterx/bclib/complexmaterials/entry/BlockEntry.java +++ b/src/main/java/org/betterx/bclib/complexmaterials/entry/BlockEntry.java @@ -48,6 +48,7 @@ public class BlockEntry extends ComplexMaterialEntry { public Block init(ComplexMaterial material, BlockBehaviour.Properties blockSettings, BlockRegistry registry) { ResourceLocation location = getLocation(material.getModID(), material.getBaseName()); Block block = initFunction.apply(material, blockSettings); + if (block == null) return null; if (hasItem) { registry.register(location, block); if (itemTags != null) { diff --git a/src/main/java/org/betterx/bclib/mixin/client/SignEditScreenMixin.java b/src/main/java/org/betterx/bclib/mixin/client/SignEditScreenMixin.java deleted file mode 100644 index 1c41ba28..00000000 --- a/src/main/java/org/betterx/bclib/mixin/client/SignEditScreenMixin.java +++ /dev/null @@ -1,64 +0,0 @@ -package org.betterx.bclib.mixin.client; - -import org.betterx.bclib.blocks.BaseSignBlock; -import org.betterx.bclib.client.render.BaseSignBlockEntityRenderer; - -import com.mojang.blaze3d.vertex.VertexConsumer; -import net.minecraft.client.gui.GuiGraphics; -import net.minecraft.client.gui.screens.inventory.AbstractSignEditScreen; -import net.minecraft.client.gui.screens.inventory.SignEditScreen; -import net.minecraft.client.renderer.MultiBufferSource; -import net.minecraft.client.renderer.blockentity.SignRenderer; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.entity.SignBlockEntity; -import net.minecraft.world.level.block.state.BlockState; - -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.Unique; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.ModifyArg; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -@Mixin(SignEditScreen.class) -public abstract class SignEditScreenMixin extends AbstractSignEditScreen { - @Final - private final SignBlockEntity sign; - - @Shadow - private SignRenderer.SignModel signModel; - @Unique - private boolean bclib_renderStick; - @Unique - private boolean bclib_isSign; - - public SignEditScreenMixin(SignBlockEntity signBlockEntity, boolean bl, boolean bl2) { - super(signBlockEntity, bl, bl2); - this.sign = signBlockEntity; - } - - - @Inject(method = "offsetSign", at = @At("TAIL")) - private void bclib_offsetSign(GuiGraphics guiGraphics, BlockState blockState, CallbackInfo ci) { - bclib_isSign = blockState.getBlock() instanceof BaseSignBlock; - if (bclib_isSign) { - bclib_renderStick = blockState.getValue(BaseSignBlock.FLOOR); - if (bclib_renderStick) { - guiGraphics.pose().translate(0.0, 0.3125, 0.0); - } - } - } - - @ModifyArg(method = "renderSignBackground", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/model/geom/ModelPart;render(Lcom/mojang/blaze3d/vertex/PoseStack;Lcom/mojang/blaze3d/vertex/VertexConsumer;II)V"), index = 1) - private VertexConsumer bclib_renderSignBackground(VertexConsumer consumer) { - if (bclib_isSign) { - signModel.stick.visible = bclib_renderStick; - Block block = this.sign.getBlockState().getBlock(); - MultiBufferSource.BufferSource bufferSource = this.minecraft.renderBuffers().bufferSource(); - return BaseSignBlockEntityRenderer.getConsumer(bufferSource, block); - } - return consumer; - } -} diff --git a/src/main/java/org/betterx/bclib/mixin/common/signs/BlockEntityTypeMixin.java b/src/main/java/org/betterx/bclib/mixin/common/signs/BlockEntityTypeMixin.java new file mode 100644 index 00000000..335cbb99 --- /dev/null +++ b/src/main/java/org/betterx/bclib/mixin/common/signs/BlockEntityTypeMixin.java @@ -0,0 +1,27 @@ +package org.betterx.bclib.mixin.common.signs; + +import org.betterx.bclib.blocks.BaseSignBlock; +import org.betterx.bclib.blocks.BaseWallSignBlock; + +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +@Mixin(BlockEntityType.class) +public class BlockEntityTypeMixin { + @Inject(method = "isValid", at = @At("HEAD"), cancellable = true) + void bcl_isValid(BlockState blockState, CallbackInfoReturnable cir) { + final BlockEntityType self = (BlockEntityType) (Object) this; + if (self == BlockEntityType.SIGN) { + final Block block = blockState.getBlock(); + if ((block instanceof BaseSignBlock) || (block instanceof BaseWallSignBlock)) { + cir.setReturnValue(true); + } + } + } +} diff --git a/src/main/java/org/betterx/bclib/registry/BaseBlockEntities.java b/src/main/java/org/betterx/bclib/registry/BaseBlockEntities.java index 0a5b24d3..e81ef96f 100644 --- a/src/main/java/org/betterx/bclib/registry/BaseBlockEntities.java +++ b/src/main/java/org/betterx/bclib/registry/BaseBlockEntities.java @@ -1,7 +1,10 @@ package org.betterx.bclib.registry; import org.betterx.bclib.BCLib; -import org.betterx.bclib.blockentities.*; +import org.betterx.bclib.blockentities.BaseBarrelBlockEntity; +import org.betterx.bclib.blockentities.BaseChestBlockEntity; +import org.betterx.bclib.blockentities.BaseFurnaceBlockEntity; +import org.betterx.bclib.blockentities.DynamicBlockEntityType; import org.betterx.bclib.blockentities.DynamicBlockEntityType.BlockEntitySupplier; import org.betterx.bclib.blocks.BaseBarrelBlock; import org.betterx.bclib.blocks.BaseChestBlock; @@ -13,15 +16,16 @@ import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.SignBlockEntity; public class BaseBlockEntities { public static final DynamicBlockEntityType CHEST = registerBlockEntityType(BCLib.makeID( "chest"), BaseChestBlockEntity::new); public static final DynamicBlockEntityType BARREL = registerBlockEntityType(BCLib.makeID( "barrel"), BaseBarrelBlockEntity::new); - public static final DynamicBlockEntityType SIGN = registerBlockEntityType( + public static final DynamicBlockEntityType SIGN = registerBlockEntityType( BCLib.makeID("sign"), - BaseSignBlockEntity::new + SignBlockEntity::new ); public static final DynamicBlockEntityType FURNACE = registerBlockEntityType(BCLib.makeID( "furnace"), BaseFurnaceBlockEntity::new); diff --git a/src/main/java/org/betterx/bclib/registry/BaseBlockEntityRenders.java b/src/main/java/org/betterx/bclib/registry/BaseBlockEntityRenders.java index 89faed81..c55dd28c 100644 --- a/src/main/java/org/betterx/bclib/registry/BaseBlockEntityRenders.java +++ b/src/main/java/org/betterx/bclib/registry/BaseBlockEntityRenders.java @@ -1,7 +1,8 @@ package org.betterx.bclib.registry; import org.betterx.bclib.client.render.BaseChestBlockEntityRenderer; -import org.betterx.bclib.client.render.BaseSignBlockEntityRenderer; + +import net.minecraft.client.renderer.blockentity.SignRenderer; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; @@ -11,6 +12,8 @@ import net.fabricmc.fabric.api.client.rendering.v1.BlockEntityRendererRegistry; public class BaseBlockEntityRenders { public static void register() { BlockEntityRendererRegistry.register(BaseBlockEntities.CHEST, BaseChestBlockEntityRenderer::new); - BlockEntityRendererRegistry.register(BaseBlockEntities.SIGN, BaseSignBlockEntityRenderer::new); + + //make sure we can lod signs from older worlds. Can be removed in the future + BlockEntityRendererRegistry.register(BaseBlockEntities.SIGN, SignRenderer::new); } } diff --git a/src/main/resources/bclib.mixins.client.json b/src/main/resources/bclib.mixins.client.json index a541aade..1927ae61 100644 --- a/src/main/resources/bclib.mixins.client.json +++ b/src/main/resources/bclib.mixins.client.json @@ -13,7 +13,6 @@ "MinecraftMixin", "ModelManagerMixin", "PresetEditorMixin", - "SignEditScreenMixin", "boat.BoatRendererMixin" ], "injectors": { diff --git a/src/main/resources/bclib.mixins.common.json b/src/main/resources/bclib.mixins.common.json index c5591e04..156fa086 100644 --- a/src/main/resources/bclib.mixins.common.json +++ b/src/main/resources/bclib.mixins.common.json @@ -45,7 +45,8 @@ "shears.PumpkinBlockMixin", "shears.SheepMixin", "shears.SnowGolemMixin", - "shears.TripWireBlockMixin" + "shears.TripWireBlockMixin", + "signs.BlockEntityTypeMixin" ], "injectors": { "defaultRequire": 1