diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/ChunkRegionMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/ChunkRegionMixin.java index a8badff2b..b34bbb397 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/ChunkRegionMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/ChunkRegionMixin.java @@ -54,6 +54,6 @@ public abstract class ChunkRegionMixin { } public Object vw$getHandle() { - return (ChunkRegion) (Object) this; + return this; } } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/ProtoChunkMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/ProtoChunkMixin.java new file mode 100644 index 000000000..1a2cf1593 --- /dev/null +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/ProtoChunkMixin.java @@ -0,0 +1,36 @@ +package com.dfsek.terra.fabric.mixin.world; + +import com.dfsek.terra.api.platform.block.BlockData; +import com.dfsek.terra.api.platform.world.generator.ChunkData; +import com.dfsek.terra.fabric.world.block.FabricBlockData; +import net.minecraft.block.BlockState; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.chunk.ProtoChunk; +import org.jetbrains.annotations.NotNull; +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(ProtoChunk.class) +@Implements(@Interface(iface = ChunkData.class, prefix = "vw$")) +public abstract class ProtoChunkMixin { + @Shadow + public abstract BlockState getBlockState(BlockPos pos); + + public @NotNull BlockData vw$getBlockData(int x, int y, int z) { + return new FabricBlockData(getBlockState(new BlockPos(x, y, z))); + } + + public void vw$setBlock(int x, int y, int z, @NotNull BlockData blockData) { + ((net.minecraft.world.chunk.Chunk) this).setBlockState(new BlockPos(x, y, z), ((FabricBlockData) blockData).getHandle(), false); + } + + public Object vw$getHandle() { + return this; + } + + public int vw$getMaxHeight() { + return 255; // TODO: 1.17 - Implement dynamic height. + } +} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/WorldChunkMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/WorldChunkMixin.java new file mode 100644 index 000000000..1878963c5 --- /dev/null +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/world/WorldChunkMixin.java @@ -0,0 +1,58 @@ +package com.dfsek.terra.fabric.mixin.world; + +import com.dfsek.terra.api.platform.block.Block; +import com.dfsek.terra.api.platform.block.BlockData; +import com.dfsek.terra.api.platform.world.Chunk; +import com.dfsek.terra.api.platform.world.World; +import com.dfsek.terra.fabric.world.block.FabricBlock; +import com.dfsek.terra.fabric.world.block.FabricBlockData; +import com.dfsek.terra.fabric.world.generator.FabricChunkGenerator; +import com.dfsek.terra.fabric.world.handles.FabricWorld; +import com.dfsek.terra.fabric.world.handles.world.FabricWorldAccess; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.ChunkRegion; +import net.minecraft.world.chunk.WorldChunk; +import org.jetbrains.annotations.NotNull; +import org.spongepowered.asm.mixin.Final; +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(WorldChunk.class) +@Implements(@Interface(iface = Chunk.class, prefix = "vw$")) +public abstract class WorldChunkMixin { + @Final + @Shadow + private net.minecraft.world.World world; + + public int vw$getX() { + return ((net.minecraft.world.chunk.Chunk) this).getPos().x; + } + + public int vw$getZ() { + return ((net.minecraft.world.chunk.Chunk) this).getPos().z; + } + + public World vw$getWorld() { + return new FabricWorld((ServerWorld) world, new FabricChunkGenerator(((ServerWorld) world).getChunkManager().getChunkGenerator())); + } + + public Block vw$getBlock(int x, int y, int z) { + BlockPos pos = new BlockPos(x + (vw$getX() << 4), y, z + (vw$getZ() << 4)); + return new FabricBlock(pos, world); + } + + public @NotNull BlockData vw$getBlockData(int x, int y, int z) { + return vw$getBlock(x, y, z).getBlockData(); + } + + public void vw$setBlock(int x, int y, int z, @NotNull BlockData blockData) { + ((net.minecraft.world.chunk.Chunk) this).setBlockState(new BlockPos(x, y, z), ((FabricBlockData) blockData).getHandle(), false); + } + + public Object vw$getHandle() { + return this; + } +} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGeneratorWrapper.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGeneratorWrapper.java index afe8ceb19..d85f0a319 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGeneratorWrapper.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGeneratorWrapper.java @@ -1,5 +1,6 @@ package com.dfsek.terra.fabric.world.generator; +import com.dfsek.terra.api.platform.world.generator.ChunkData; import com.dfsek.terra.api.platform.world.generator.GeneratorWrapper; import com.dfsek.terra.api.util.FastRandom; import com.dfsek.terra.api.world.generation.TerraChunkGenerator; @@ -88,7 +89,7 @@ public class FabricChunkGeneratorWrapper extends ChunkGenerator implements Gener @Override public void populateNoise(WorldAccess world, StructureAccessor accessor, Chunk chunk) { FabricSeededWorldAccess worldAccess = new FabricSeededWorldAccess(world, seed, this); - delegate.generateChunkData(worldAccess, new FastRandom(), chunk.getPos().x, chunk.getPos().z, new FabricChunkData(chunk)); + delegate.generateChunkData(worldAccess, new FastRandom(), chunk.getPos().x, chunk.getPos().z, (ChunkData) chunk); } @Override diff --git a/platforms/fabric/src/main/resources/terra.mixins.json b/platforms/fabric/src/main/resources/terra.mixins.json index f526d6ae8..f43fb8ea5 100644 --- a/platforms/fabric/src/main/resources/terra.mixins.json +++ b/platforms/fabric/src/main/resources/terra.mixins.json @@ -5,7 +5,9 @@ "compatibilityLevel": "JAVA_8", "mixins": [ "MixinGeneratorOptions", - "world.ChunkRegionMixin" + "world.ChunkRegionMixin", + "world.ProtoChunkMixin", + "world.WorldChunkMixin" ], "client": [ "GeneratorTypeAccessor"