Smooth slidin'

- Sliding doors now work with Polymer!
- Stone paths now work on Polymer
This commit is contained in:
Martin Prokoph
2024-07-29 18:56:44 +02:00
parent 5149924bab
commit f87e4a5ce2
5 changed files with 133 additions and 1 deletions

View File

@@ -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);
}
}

View File

@@ -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);
}
}

View File

@@ -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();
}
}

View File

@@ -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);
}
}

View File

@@ -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;
}
}