From f87e4a5ce2c14cfff489d1fcc167a7d91401e713 Mon Sep 17 00:00:00 2001 From: Martin Prokoph Date: Mon, 29 Jul 2024 18:56:44 +0200 Subject: [PATCH] Smooth slidin' - Sliding doors now work with Polymer! - Stone paths now work on Polymer --- .../decorative/block/SlidingDoor.java | 14 +++++ .../motschen/decorative/block/StonePath.java | 18 +++++- .../decorative/polymer/PolymerSupport.java | 2 + .../model/ItemDisplaySlidingDoorModel.java | 62 +++++++++++++++++++ .../polymer/model/VariedItemDisplayModel.java | 38 ++++++++++++ 5 files changed, 133 insertions(+), 1 deletion(-) create mode 100644 src/main/java/eu/midnightdust/motschen/decorative/polymer/model/ItemDisplaySlidingDoorModel.java create mode 100644 src/main/java/eu/midnightdust/motschen/decorative/polymer/model/VariedItemDisplayModel.java diff --git a/src/main/java/eu/midnightdust/motschen/decorative/block/SlidingDoor.java b/src/main/java/eu/midnightdust/motschen/decorative/block/SlidingDoor.java index ee435e3..cf6c31c 100755 --- a/src/main/java/eu/midnightdust/motschen/decorative/block/SlidingDoor.java +++ b/src/main/java/eu/midnightdust/motschen/decorative/block/SlidingDoor.java @@ -1,6 +1,8 @@ package eu.midnightdust.motschen.decorative.block; +import eu.midnightdust.motschen.decorative.polymer.model.ItemDisplaySlidingDoorModel; import eu.pb4.factorytools.api.block.FactoryBlock; +import eu.pb4.polymer.virtualentity.api.ElementHolder; import net.minecraft.block.AbstractBlock; import net.minecraft.block.BlockSetType; import net.minecraft.block.BlockState; @@ -9,6 +11,8 @@ import net.minecraft.block.DoorBlock; import net.minecraft.block.ShapeContext; import net.minecraft.block.enums.DoorHinge; import net.minecraft.entity.player.PlayerEntity; +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; @@ -20,6 +24,7 @@ import net.minecraft.util.shape.VoxelShape; import net.minecraft.util.shape.VoxelShapes; import net.minecraft.world.BlockView; import net.minecraft.world.World; +import org.jetbrains.annotations.Nullable; public class SlidingDoor extends DoorBlock implements FactoryBlock { @@ -86,4 +91,13 @@ public class SlidingDoor extends DoorBlock implements FactoryBlock { public BlockState getPolymerBlockState(BlockState state) { return state.get(OPEN) ? Blocks.STRUCTURE_VOID.getDefaultState() : Blocks.BARRIER.getDefaultState(); } + @Override + public BlockState getPolymerBreakEventBlockState(BlockState state, ServerPlayerEntity player) { + return Blocks.WHITE_CONCRETE.getDefaultState(); + } + + @Override + public @Nullable ElementHolder createElementHolder(ServerWorld world, BlockPos pos, BlockState initialBlockState) { + return new ItemDisplaySlidingDoorModel(initialBlockState); + } } \ No newline at end of file diff --git a/src/main/java/eu/midnightdust/motschen/decorative/block/StonePath.java b/src/main/java/eu/midnightdust/motschen/decorative/block/StonePath.java index 68560df..03770a9 100755 --- a/src/main/java/eu/midnightdust/motschen/decorative/block/StonePath.java +++ b/src/main/java/eu/midnightdust/motschen/decorative/block/StonePath.java @@ -1,17 +1,24 @@ package eu.midnightdust.motschen.decorative.block; +import eu.midnightdust.motschen.decorative.polymer.model.VariedItemDisplayModel; 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; import net.minecraft.block.Blocks; import net.minecraft.block.ShapeContext; +import net.minecraft.block.enums.BlockFace; +import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.server.world.ServerWorld; import net.minecraft.sound.BlockSoundGroup; +import net.minecraft.state.property.Properties; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; import net.minecraft.util.shape.VoxelShape; import net.minecraft.world.BlockView; import net.minecraft.world.WorldView; +import org.jetbrains.annotations.Nullable; public class StonePath extends Block implements FactoryBlock { private static final VoxelShape SHAPE; @@ -35,6 +42,15 @@ public class StonePath extends Block implements FactoryBlock { // Polymer @Override public BlockState getPolymerBlockState(BlockState state) { - return Blocks.BARRIER.getDefaultState(); + return Blocks.STRUCTURE_VOID.getDefaultState(); + } + @Override + public BlockState getPolymerBreakEventBlockState(BlockState state, ServerPlayerEntity player) { + return Blocks.STONE_BUTTON.getDefaultState().with(Properties.BLOCK_FACE, BlockFace.FLOOR); + } + + @Override + public @Nullable ElementHolder createElementHolder(ServerWorld world, BlockPos pos, BlockState initialBlockState) { + return new VariedItemDisplayModel(initialBlockState, pos); } } 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 8168ac0..2c77cb2 100644 --- a/src/main/java/eu/midnightdust/motschen/decorative/polymer/PolymerSupport.java +++ b/src/main/java/eu/midnightdust/motschen/decorative/polymer/PolymerSupport.java @@ -6,6 +6,7 @@ public class PolymerSupport { public static void init() { DirectionalItemDisplayModel.initModels(); SimpleItemDisplayModel.initModels(); + VariedItemDisplayModel.initModels(); ItemDisplayBirdBathModel.initModels(); ItemDisplayCeilingFanModel.initModels(); ItemDisplayChristmasLightsModel.initModels(); @@ -14,5 +15,6 @@ public class PolymerSupport { ItemDisplayDoubleLampModel.initModels(); ItemDisplayLampModel.initModels(); ItemDisplayPoolWallModel.initModels(); + ItemDisplaySlidingDoorModel.initModels(); } } diff --git a/src/main/java/eu/midnightdust/motschen/decorative/polymer/model/ItemDisplaySlidingDoorModel.java b/src/main/java/eu/midnightdust/motschen/decorative/polymer/model/ItemDisplaySlidingDoorModel.java new file mode 100644 index 0000000..47d9171 --- /dev/null +++ b/src/main/java/eu/midnightdust/motschen/decorative/polymer/model/ItemDisplaySlidingDoorModel.java @@ -0,0 +1,62 @@ +package eu.midnightdust.motschen.decorative.polymer.model; + +import eu.midnightdust.motschen.decorative.block.SlidingDoor; +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.block.enums.DoorHinge; +import net.minecraft.block.enums.DoubleBlockHalf; +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 ItemDisplaySlidingDoorModel extends BlockModel { + private final ItemDisplayElement main; + private static ItemStack DOOR_BOTTOM; + private static ItemStack DOOR_TOP; + private static ItemStack DOOR_BOTTOM_OPEN; + private static ItemStack DOOR_TOP_OPEN; + + public static void initModels() { + DOOR_BOTTOM = BaseItemProvider.requestModel(id("block/sliding_door_bottom")); + DOOR_TOP = BaseItemProvider.requestModel(id("block/sliding_door_top")); + DOOR_BOTTOM_OPEN = BaseItemProvider.requestModel(id("block/sliding_door_bottom_open")); + DOOR_TOP_OPEN = BaseItemProvider.requestModel(id("block/sliding_door_top_open")); + } + + public ItemDisplaySlidingDoorModel(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.setItem(getModel(state)); + this.main.setRightRotation(RotationAxis.POSITIVE_Y.rotationDegrees(getRotation(state))); + + this.tick(); + } + } + public ItemStack getModel(BlockState state) { + if (state.get(SlidingDoor.HALF) == DoubleBlockHalf.LOWER) return state.get(SlidingDoor.OPEN) ? DOOR_BOTTOM_OPEN : DOOR_BOTTOM; + else return state.get(SlidingDoor.OPEN) ? DOOR_TOP_OPEN : DOOR_TOP; + } + public float getRotation(BlockState state) { + return state.get(SlidingDoor.FACING).getHorizontal() * -90 + (state.get(SlidingDoor.HINGE) == DoorHinge.RIGHT ? 90 : -90); + } + +} + diff --git a/src/main/java/eu/midnightdust/motschen/decorative/polymer/model/VariedItemDisplayModel.java b/src/main/java/eu/midnightdust/motschen/decorative/polymer/model/VariedItemDisplayModel.java new file mode 100644 index 0000000..5ee0bb4 --- /dev/null +++ b/src/main/java/eu/midnightdust/motschen/decorative/polymer/model/VariedItemDisplayModel.java @@ -0,0 +1,38 @@ +package eu.midnightdust.motschen.decorative.polymer.model; + +import eu.midnightdust.motschen.decorative.block.StonePath; +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.elements.ItemDisplayElement; +import net.minecraft.block.BlockState; +import net.minecraft.item.ItemStack; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.RotationAxis; +import org.joml.Vector3f; + +import static eu.midnightdust.motschen.decorative.DecorativeMain.id; + +public class VariedItemDisplayModel extends BlockModel { + public static ItemStack STONE_PATH; + + public static void initModels() { + STONE_PATH = BaseItemProvider.requestModel(id("block/stone_path")); + } + + public VariedItemDisplayModel(BlockState state, BlockPos pos) { + ItemDisplayElement main = ItemDisplayElementUtil.createSimple(getModel(state)); + main.setDisplaySize(1, 1); + main.setScale(new Vector3f(2)); + main.setRightRotation(RotationAxis.POSITIVE_Y.rotationDegrees(90 * (pos.hashCode() % 4))); + main.setViewRange(DecorativeConfig.viewDistance / 100f); + this.addElement(main); + } + + public ItemStack getModel(BlockState state) { + if (state.getBlock() instanceof StonePath) return STONE_PATH; + else return null; + } +} +