From a9fae64412cc5c62de8feee20c197149ec224fd4 Mon Sep 17 00:00:00 2001 From: Martin Prokoph Date: Mon, 29 Jul 2024 13:14:19 +0200 Subject: [PATCH] Safety first - Fire Hydrants and Guardrails are now working on Polymer! --- .../decorative/block/FireHydrant.java | 14 +++++ .../motschen/decorative/block/Guardrail.java | 14 +++++ .../decorative/polymer/PolymerSupport.java | 2 + .../model/ItemDisplayDirectionalModel.java | 56 +++++++++++++++++++ 4 files changed, 86 insertions(+) create mode 100644 src/main/java/eu/midnightdust/motschen/decorative/polymer/model/ItemDisplayDirectionalModel.java diff --git a/src/main/java/eu/midnightdust/motschen/decorative/block/FireHydrant.java b/src/main/java/eu/midnightdust/motschen/decorative/block/FireHydrant.java index 00fb9b8..cfc300a 100755 --- a/src/main/java/eu/midnightdust/motschen/decorative/block/FireHydrant.java +++ b/src/main/java/eu/midnightdust/motschen/decorative/block/FireHydrant.java @@ -1,7 +1,9 @@ package eu.midnightdust.motschen.decorative.block; import com.mojang.serialization.MapCodec; +import eu.midnightdust.motschen.decorative.polymer.model.ItemDisplayDirectionalModel; import eu.pb4.factorytools.api.block.FactoryBlock; +import eu.pb4.polymer.virtualentity.api.ElementHolder; import net.minecraft.block.AbstractBlock; import net.minecraft.block.Block; import net.minecraft.block.BlockState; @@ -13,6 +15,8 @@ import net.minecraft.item.ItemPlacementContext; import net.minecraft.item.ItemStack; import net.minecraft.item.ItemUsage; import net.minecraft.item.Items; +import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.server.world.ServerWorld; import net.minecraft.sound.BlockSoundGroup; import net.minecraft.sound.SoundCategory; import net.minecraft.sound.SoundEvents; @@ -27,6 +31,7 @@ import net.minecraft.util.shape.VoxelShapes; import net.minecraft.world.BlockView; import net.minecraft.world.World; import net.minecraft.world.WorldView; +import org.jetbrains.annotations.Nullable; public class FireHydrant extends HorizontalFacingBlock implements FactoryBlock { private static final VoxelShape NORTH_SHAPE; @@ -104,4 +109,13 @@ public class FireHydrant extends HorizontalFacingBlock implements FactoryBlock { public BlockState getPolymerBlockState(BlockState state) { return Blocks.BARRIER.getDefaultState(); } + @Override + public BlockState getPolymerBreakEventBlockState(BlockState state, ServerPlayerEntity player) { + return Blocks.RED_TERRACOTTA.getDefaultState(); + } + + @Override + public @Nullable ElementHolder createElementHolder(ServerWorld world, BlockPos pos, BlockState initialBlockState) { + return new ItemDisplayDirectionalModel(initialBlockState); + } } diff --git a/src/main/java/eu/midnightdust/motschen/decorative/block/Guardrail.java b/src/main/java/eu/midnightdust/motschen/decorative/block/Guardrail.java index 66b1b3c..60dbc5c 100755 --- a/src/main/java/eu/midnightdust/motschen/decorative/block/Guardrail.java +++ b/src/main/java/eu/midnightdust/motschen/decorative/block/Guardrail.java @@ -1,7 +1,9 @@ package eu.midnightdust.motschen.decorative.block; import com.mojang.serialization.MapCodec; +import eu.midnightdust.motschen.decorative.polymer.model.ItemDisplayDirectionalModel; import eu.pb4.factorytools.api.block.FactoryBlock; +import eu.pb4.polymer.virtualentity.api.ElementHolder; import net.minecraft.block.AbstractBlock; import net.minecraft.block.Block; import net.minecraft.block.BlockState; @@ -9,6 +11,8 @@ import net.minecraft.block.Blocks; import net.minecraft.block.HorizontalFacingBlock; import net.minecraft.block.ShapeContext; import net.minecraft.item.ItemPlacementContext; +import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.server.world.ServerWorld; import net.minecraft.sound.BlockSoundGroup; import net.minecraft.state.StateManager; import net.minecraft.util.math.BlockPos; @@ -17,6 +21,7 @@ import net.minecraft.util.shape.VoxelShape; import net.minecraft.util.shape.VoxelShapes; import net.minecraft.world.BlockView; import net.minecraft.world.WorldView; +import org.jetbrains.annotations.Nullable; public class Guardrail extends HorizontalFacingBlock implements FactoryBlock { private static final VoxelShape NORTH_SHAPE; @@ -83,4 +88,13 @@ public class Guardrail extends HorizontalFacingBlock implements FactoryBlock { public BlockState getPolymerBlockState(BlockState state) { return Blocks.BARRIER.getDefaultState(); } + @Override + public BlockState getPolymerBreakEventBlockState(BlockState state, ServerPlayerEntity player) { + return Blocks.IRON_BLOCK.getDefaultState(); + } + + @Override + public @Nullable ElementHolder createElementHolder(ServerWorld world, BlockPos pos, BlockState initialBlockState) { + return new ItemDisplayDirectionalModel(initialBlockState); + } } diff --git a/src/main/java/eu/midnightdust/motschen/decorative/polymer/PolymerSupport.java b/src/main/java/eu/midnightdust/motschen/decorative/polymer/PolymerSupport.java index 9e24df5..c8cf87b 100644 --- a/src/main/java/eu/midnightdust/motschen/decorative/polymer/PolymerSupport.java +++ b/src/main/java/eu/midnightdust/motschen/decorative/polymer/PolymerSupport.java @@ -5,6 +5,7 @@ import eu.midnightdust.motschen.decorative.polymer.model.ItemDisplayCeilingFanMo import eu.midnightdust.motschen.decorative.polymer.model.ItemDisplayChristmasLightsModel; import eu.midnightdust.motschen.decorative.polymer.model.ItemDisplayChristmasTreeModel; import eu.midnightdust.motschen.decorative.polymer.model.ItemDisplayDigitalClockModel; +import eu.midnightdust.motschen.decorative.polymer.model.ItemDisplayDirectionalModel; import eu.midnightdust.motschen.decorative.polymer.model.ItemDisplayDoubleLampModel; import eu.midnightdust.motschen.decorative.polymer.model.ItemDisplayLampModel; @@ -17,5 +18,6 @@ public class PolymerSupport { ItemDisplayDigitalClockModel.initModels(); ItemDisplayDoubleLampModel.initModels(); ItemDisplayLampModel.initModels(); + ItemDisplayDirectionalModel.initModels(); } } diff --git a/src/main/java/eu/midnightdust/motschen/decorative/polymer/model/ItemDisplayDirectionalModel.java b/src/main/java/eu/midnightdust/motschen/decorative/polymer/model/ItemDisplayDirectionalModel.java new file mode 100644 index 0000000..0a99108 --- /dev/null +++ b/src/main/java/eu/midnightdust/motschen/decorative/polymer/model/ItemDisplayDirectionalModel.java @@ -0,0 +1,56 @@ +package eu.midnightdust.motschen.decorative.polymer.model; + +import eu.midnightdust.motschen.decorative.block.FireHydrant; +import eu.midnightdust.motschen.decorative.block.Guardrail; +import eu.midnightdust.motschen.decorative.config.DecorativeConfig; +import eu.pb4.factorytools.api.resourcepack.BaseItemProvider; +import eu.pb4.factorytools.api.virtualentity.BlockModel; +import eu.pb4.factorytools.api.virtualentity.ItemDisplayElementUtil; +import eu.pb4.polymer.virtualentity.api.attachment.BlockAwareAttachment; +import eu.pb4.polymer.virtualentity.api.attachment.HolderAttachment; +import eu.pb4.polymer.virtualentity.api.elements.ItemDisplayElement; +import net.minecraft.block.BlockState; +import net.minecraft.item.ItemStack; +import net.minecraft.util.math.RotationAxis; +import org.joml.Vector3f; + +import static eu.midnightdust.motschen.decorative.DecorativeMain.id; + +public class ItemDisplayDirectionalModel extends BlockModel { + private final ItemDisplayElement main; + public static ItemStack FIRE_HYDRANT; + public static ItemStack GUARDRAIL; + + public static void initModels() { + FIRE_HYDRANT = BaseItemProvider.requestModel(id("block/fire_hydrant")); + GUARDRAIL = BaseItemProvider.requestModel(id("block/guardrail")); + } + + public ItemDisplayDirectionalModel(BlockState state) { + this.main = ItemDisplayElementUtil.createSimple(getModel(state)); + this.main.setDisplaySize(1, 1); + this.main.setScale(new Vector3f(2)); + this.main.setRightRotation(RotationAxis.POSITIVE_Y.rotationDegrees(getRotation(state))); + this.main.setViewRange((DecorativeConfig.viewDistance / 100f)); + this.addElement(this.main); + } + + @Override + public void notifyUpdate(HolderAttachment.UpdateType updateType) { + if (updateType == BlockAwareAttachment.BLOCK_STATE_UPDATE) { + var state = this.blockState(); + this.main.setRightRotation(RotationAxis.POSITIVE_Y.rotationDegrees(getRotation(state))); + + this.tick(); + } + } + public ItemStack getModel(BlockState state) { + if (state.getBlock() instanceof FireHydrant) return FIRE_HYDRANT; + else return GUARDRAIL; + } + public float getRotation(BlockState state) { + if (state.getBlock() instanceof FireHydrant) return state.get(FireHydrant.FACING).getHorizontal() * -90; + else return state.get(Guardrail.FACING).getHorizontal() * -90; + } +} +