From 3b9280b19c0b8ad25a6959297fe1628f2c95c9f3 Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 2 May 2021 23:00:21 -0700 Subject: [PATCH] start work on state mixins --- .../fabric/mixin/block/BlockEntityMixin.java | 57 +++++++++++++++++++ .../LootableContainerBlockEntityMixin.java | 21 +++++++ .../world/block/state/FabricBlockState.java | 5 +- .../world/block/state/FabricContainer.java | 18 ------ .../src/main/resources/terra.mixins.json | 2 + 5 files changed, 83 insertions(+), 20 deletions(-) create mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/block/BlockEntityMixin.java create mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/block/LootableContainerBlockEntityMixin.java delete mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/state/FabricContainer.java diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/block/BlockEntityMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/block/BlockEntityMixin.java new file mode 100644 index 000000000..e44d4678a --- /dev/null +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/block/BlockEntityMixin.java @@ -0,0 +1,57 @@ +package com.dfsek.terra.fabric.mixin.block; + +import com.dfsek.terra.api.platform.block.Block; +import com.dfsek.terra.api.platform.block.BlockData; +import com.dfsek.terra.api.platform.block.state.BlockState; +import com.dfsek.terra.fabric.world.FabricAdapter; +import com.dfsek.terra.fabric.world.block.FabricBlock; +import net.minecraft.block.entity.BlockEntity; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import org.jetbrains.annotations.Nullable; +import org.spongepowered.asm.mixin.Implements; +import org.spongepowered.asm.mixin.Interface; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +@Mixin(BlockEntity.class) +@Implements(@Interface(iface = BlockState.class, prefix = "terra$")) +public abstract class BlockEntityMixin { + @Shadow + protected BlockPos pos; + @Shadow + @Nullable + protected World world; + + @Shadow + public abstract net.minecraft.block.BlockState getCachedState(); + + public Object terra$getHandle() { + return this; + } + + public Block terra$getBlock() { + return new FabricBlock(pos, world); + } + + public int terra$getX() { + return pos.getX(); + } + + public int terra$getY() { + return pos.getY(); + } + + public int terra$getZ() { + return pos.getZ(); + } + + public BlockData terra$getBlockData() { + return FabricAdapter.adapt(getCachedState()); + } + + public boolean terra$update(boolean applyPhysics) { + world.getChunk(pos).setBlockEntity(pos, (BlockEntity) (Object) this); + return true; + } +} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/block/LootableContainerBlockEntityMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/block/LootableContainerBlockEntityMixin.java new file mode 100644 index 000000000..527f908a8 --- /dev/null +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/block/LootableContainerBlockEntityMixin.java @@ -0,0 +1,21 @@ +package com.dfsek.terra.fabric.mixin.block; + +import com.dfsek.terra.api.platform.block.state.Container; +import com.dfsek.terra.api.platform.inventory.Inventory; +import com.dfsek.terra.fabric.inventory.FabricInventory; +import net.minecraft.block.entity.LootableContainerBlockEntity; +import org.spongepowered.asm.mixin.Implements; +import org.spongepowered.asm.mixin.Interface; +import org.spongepowered.asm.mixin.Mixin; + +@Mixin(LootableContainerBlockEntity.class) +@Implements(@Interface(iface = Container.class, prefix = "terra$")) +public abstract class LootableContainerBlockEntityMixin extends BlockEntityMixin { + public Inventory terra$getInventory() { + return new FabricInventory(((LootableContainerBlockEntity) (Object) this)); + } + + public Object terra$getHandle() { + return this; + } +} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/state/FabricBlockState.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/state/FabricBlockState.java index 1aacb1073..0814e602e 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/state/FabricBlockState.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/state/FabricBlockState.java @@ -3,6 +3,7 @@ package com.dfsek.terra.fabric.world.block.state; import com.dfsek.terra.api.platform.block.Block; import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.platform.block.state.BlockState; +import com.dfsek.terra.api.platform.block.state.Container; import com.dfsek.terra.fabric.world.FabricAdapter; import com.dfsek.terra.fabric.world.block.FabricBlock; import net.minecraft.block.entity.BlockEntity; @@ -20,7 +21,7 @@ public class FabricBlockState implements BlockState { this.worldAccess = worldAccess; } - public static FabricBlockState newInstance(Block block) { + public static BlockState newInstance(Block block) { WorldAccess worldAccess = (WorldAccess) block.getLocation().getWorld(); BlockEntity entity = worldAccess.getBlockEntity(FabricAdapter.adapt(block.getLocation().toVector())); @@ -29,7 +30,7 @@ public class FabricBlockState implements BlockState { } else if(entity instanceof MobSpawnerBlockEntity) { return new FabricMobSpawner((MobSpawnerBlockEntity) entity, worldAccess); } else if(entity instanceof LootableContainerBlockEntity) { - return new FabricContainer((LootableContainerBlockEntity) entity, worldAccess); + return (Container) entity; } return null; } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/state/FabricContainer.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/state/FabricContainer.java deleted file mode 100644 index 743c06d83..000000000 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/state/FabricContainer.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.dfsek.terra.fabric.world.block.state; - -import com.dfsek.terra.api.platform.block.state.Container; -import com.dfsek.terra.api.platform.inventory.Inventory; -import com.dfsek.terra.fabric.inventory.FabricInventory; -import net.minecraft.block.entity.LootableContainerBlockEntity; -import net.minecraft.world.WorldAccess; - -public class FabricContainer extends FabricBlockState implements Container { - public FabricContainer(LootableContainerBlockEntity blockEntity, WorldAccess worldAccess) { - super(blockEntity, worldAccess); - } - - @Override - public Inventory getInventory() { - return new FabricInventory(((LootableContainerBlockEntity) blockEntity)); - } -} diff --git a/platforms/fabric/src/main/resources/terra.mixins.json b/platforms/fabric/src/main/resources/terra.mixins.json index 3e8942b76..f76365c71 100644 --- a/platforms/fabric/src/main/resources/terra.mixins.json +++ b/platforms/fabric/src/main/resources/terra.mixins.json @@ -5,6 +5,8 @@ "compatibilityLevel": "JAVA_8", "mixins": [ "MixinGeneratorOptions", + "block.BlockEntityMixin", + "block.LootableContainerBlockEntityMixin", "entity.EntityMixin", "entity.EntityTypeMixin", "entity.PlayerEntityMixin",