From 7c177d568b04be8ea3656a0f91bfc59e601788a8 Mon Sep 17 00:00:00 2001 From: dfsek Date: Thu, 25 Feb 2021 01:33:10 -0700 Subject: [PATCH] implement FabricRotatable --- .../terra/fabric/world/FabricAdapter.java | 3 + .../world/block/data/FabricRotatable.java | 111 ++++++++++++++++++ 2 files changed, 114 insertions(+) create mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricRotatable.java diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricAdapter.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricAdapter.java index ba20cdf97..3c7035f88 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricAdapter.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricAdapter.java @@ -11,6 +11,7 @@ import com.dfsek.terra.fabric.world.block.FabricBlockData; import com.dfsek.terra.fabric.world.block.FabricBlockType; import com.dfsek.terra.fabric.world.block.data.FabricMultipleFacing; import com.dfsek.terra.fabric.world.block.data.FabricOrientable; +import com.dfsek.terra.fabric.world.block.data.FabricRotatable; import com.dfsek.terra.fabric.world.block.data.FabricSlab; import com.dfsek.terra.fabric.world.block.data.FabricStairs; import com.dfsek.terra.fabric.world.block.data.FabricWaterlogged; @@ -43,6 +44,8 @@ public final class FabricAdapter { if(state.contains(Properties.AXIS)) return new FabricOrientable(state); + if(state.contains(Properties.ROTATION)) return new FabricRotatable(state); + if(state.getProperties().containsAll(Arrays.asList(Properties.NORTH, Properties.SOUTH, Properties.EAST, Properties.WEST))) return new FabricMultipleFacing(state); if(state.contains(Properties.WATERLOGGED)) return new FabricWaterlogged(state); diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricRotatable.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricRotatable.java new file mode 100644 index 000000000..a238f21e1 --- /dev/null +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricRotatable.java @@ -0,0 +1,111 @@ +package com.dfsek.terra.fabric.world.block.data; + +import com.dfsek.terra.api.platform.block.BlockFace; +import com.dfsek.terra.api.platform.block.data.Rotatable; +import com.dfsek.terra.fabric.world.block.FabricBlockData; +import net.minecraft.block.BlockState; +import net.minecraft.state.property.Properties; + +public class FabricRotatable extends FabricBlockData implements Rotatable { + public FabricRotatable(BlockState delegate) { + super(delegate); + } + + @Override + public BlockFace getRotation() { + int r = delegate.get(Properties.ROTATION); + switch(r) { + case 0: + return BlockFace.SOUTH; + case 1: + return BlockFace.SOUTH_SOUTH_WEST; + case 2: + return BlockFace.SOUTH_WEST; + case 3: + return BlockFace.WEST_SOUTH_WEST; + case 4: + return BlockFace.WEST; + case 5: + return BlockFace.WEST_NORTH_WEST; + case 6: + return BlockFace.NORTH_WEST; + case 7: + return BlockFace.NORTH_NORTH_WEST; + case 8: + return BlockFace.NORTH; + case 9: + return BlockFace.NORTH_NORTH_EAST; + case 10: + return BlockFace.NORTH_EAST; + case 11: + return BlockFace.EAST_NORTH_EAST; + case 12: + return BlockFace.EAST; + case 13: + return BlockFace.EAST_SOUTH_EAST; + case 14: + return BlockFace.SOUTH_EAST; + case 15: + return BlockFace.SOUTH_SOUTH_EAST; + default: + throw new IllegalArgumentException("Unknown rotation " + r); + } + } + + @Override + public void setRotation(BlockFace face) { + switch(face) { + case UP: + case DOWN: + throw new IllegalArgumentException("Illegal rotation " + face); + case SOUTH: + delegate = delegate.with(Properties.ROTATION, 0); + return; + case SOUTH_SOUTH_WEST: + delegate = delegate.with(Properties.ROTATION, 1); + return; + case SOUTH_WEST: + delegate = delegate.with(Properties.ROTATION, 2); + return; + case WEST_SOUTH_WEST: + delegate = delegate.with(Properties.ROTATION, 3); + return; + case WEST: + delegate = delegate.with(Properties.ROTATION, 4); + return; + case WEST_NORTH_WEST: + delegate = delegate.with(Properties.ROTATION, 5); + return; + case NORTH_WEST: + delegate = delegate.with(Properties.ROTATION, 6); + return; + case NORTH_NORTH_WEST: + delegate = delegate.with(Properties.ROTATION, 7); + return; + case NORTH: + delegate = delegate.with(Properties.ROTATION, 8); + return; + case NORTH_NORTH_EAST: + delegate = delegate.with(Properties.ROTATION, 9); + return; + case NORTH_EAST: + delegate = delegate.with(Properties.ROTATION, 10); + return; + case EAST_NORTH_EAST: + delegate = delegate.with(Properties.ROTATION, 11); + return; + case EAST: + delegate = delegate.with(Properties.ROTATION, 12); + return; + case EAST_SOUTH_EAST: + delegate = delegate.with(Properties.ROTATION, 13); + return; + case SOUTH_EAST: + delegate = delegate.with(Properties.ROTATION, 14); + return; + case SOUTH_SOUTH_EAST: + delegate = delegate.with(Properties.ROTATION, 15); + return; + } + } +}