From 089850d633551ea578cd110571d460951ff42799 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zo=C3=AB=20Gidiere?= Date: Sun, 5 Oct 2025 16:58:08 -0600 Subject: [PATCH] Support for SNBT in structures --- .../MinecraftChunkGeneratorWrapper.java | 16 +++- .../mod/handle/MinecraftWorldHandle.java | 21 +++- .../block/state/BlockStateArgumentMixin.java | 96 +++++++++++++++++++ .../terra/chunk/ChunkRegionMixin.java | 45 ++++++++- .../terra/chunk/WorldChunkMixin.java | 22 +++-- .../terra/nbt/NbtCompoundMixin.java | 25 +++++ .../terra/world/ChunkRegionMixin.java | 28 ++++-- .../terra/world/ServerWorldMixin.java | 38 +++++++- .../src/main/resources/terra.accesswidener | 4 +- .../main/resources/terra.common.mixins.json | 2 + 10 files changed, 272 insertions(+), 25 deletions(-) create mode 100644 platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/block/state/BlockStateArgumentMixin.java create mode 100644 platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/nbt/NbtCompoundMixin.java diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/generation/MinecraftChunkGeneratorWrapper.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/generation/MinecraftChunkGeneratorWrapper.java index 75a3d5fbf..9c57712e3 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/generation/MinecraftChunkGeneratorWrapper.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/generation/MinecraftChunkGeneratorWrapper.java @@ -17,9 +17,17 @@ package com.dfsek.terra.mod.generation; +import com.dfsek.seismic.math.coord.CoordFunctions; + +import com.dfsek.terra.api.block.state.BlockStateExtended; + import com.mojang.serialization.MapCodec; +import net.minecraft.block.BlockEntityProvider; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; +import net.minecraft.block.entity.BlockEntity; +import net.minecraft.command.argument.BlockStateArgument; +import net.minecraft.nbt.NbtCompound; import net.minecraft.registry.entry.RegistryEntry; import net.minecraft.util.Util; import net.minecraft.util.math.BlockPos; @@ -183,9 +191,11 @@ public class MinecraftChunkGeneratorWrapper extends net.minecraft.world.gen.chun BiomeProvider biomeProvider = pack.getBiomeProvider(); int min = height.getBottomY(); for(int y = height.getTopYInclusive() - 1; y >= min; y--) { + com.dfsek.terra.api.block.state.BlockState terraBlockState = delegate.getBlock(properties, x, y, z, biomeProvider); + BlockState blockState = (BlockState) (terraBlockState.isExtended() ? ((BlockStateExtended) terraBlockState).getState() : terraBlockState); if(heightmap .getBlockPredicate() - .test((BlockState) delegate.getBlock(properties, x, y, z, biomeProvider))) return y + 1; + .test(blockState)) return y + 1; } return min; } @@ -196,7 +206,9 @@ public class MinecraftChunkGeneratorWrapper extends net.minecraft.world.gen.chun WorldProperties properties = MinecraftAdapter.adapt(height, SeedHack.getSeed(noiseConfig.getMultiNoiseSampler())); BiomeProvider biomeProvider = pack.getBiomeProvider(); for(int y = height.getTopYInclusive() - 1; y >= height.getBottomY(); y--) { - array[y - height.getBottomY()] = (BlockState) delegate.getBlock(properties, x, y, z, biomeProvider); + com.dfsek.terra.api.block.state.BlockState terraBlockState = delegate.getBlock(properties, x, y, z, biomeProvider); + BlockState blockState = (BlockState) (terraBlockState.isExtended() ? ((BlockStateExtended) terraBlockState).getState() : terraBlockState); + array[y - height.getBottomY()] = blockState; } return new VerticalBlockSample(height.getBottomY(), array); } diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/handle/MinecraftWorldHandle.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/handle/MinecraftWorldHandle.java index 183b2e379..8342b8f9b 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/handle/MinecraftWorldHandle.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/handle/MinecraftWorldHandle.java @@ -17,9 +17,14 @@ package com.dfsek.terra.mod.handle; +import com.dfsek.terra.api.block.state.BlockStateExtended; + import com.mojang.brigadier.exceptions.CommandSyntaxException; import net.minecraft.block.Blocks; import net.minecraft.command.argument.BlockArgumentParser; +import net.minecraft.command.argument.BlockArgumentParser.BlockResult; +import net.minecraft.command.argument.BlockStateArgument; +import net.minecraft.nbt.NbtCompound; import net.minecraft.registry.Registries; import net.minecraft.util.Identifier; import org.jetbrains.annotations.NotNull; @@ -41,10 +46,18 @@ public class MinecraftWorldHandle implements WorldHandle { @Override public @NotNull BlockState createBlockState(@NotNull String data) { try { - net.minecraft.block.BlockState state = BlockArgumentParser.block(Registries.BLOCK, data, true) - .blockState(); - if(state == null) throw new IllegalArgumentException("Invalid data: " + data); - return (BlockState) state; + BlockResult blockResult = BlockArgumentParser.block(Registries.BLOCK, data, true); + BlockState blockState; + if (blockResult.nbt() != null) { + net.minecraft.block.BlockState state = blockResult.blockState(); + NbtCompound nbtCompound = blockResult.nbt(); + blockState = (BlockStateExtended) new BlockStateArgument(state, blockResult.properties().keySet(), nbtCompound); + } else { + blockState = (BlockState) blockResult.blockState(); + } + + if(blockState == null) throw new IllegalArgumentException("Invalid data: " + data); + return blockState; } catch(CommandSyntaxException e) { throw new IllegalArgumentException(e); } diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/block/state/BlockStateArgumentMixin.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/block/state/BlockStateArgumentMixin.java new file mode 100644 index 000000000..0fefa2b99 --- /dev/null +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/block/state/BlockStateArgumentMixin.java @@ -0,0 +1,96 @@ +package com.dfsek.terra.mod.mixin.implementations.terra.block.state; + +import com.dfsek.terra.api.block.BlockData; +import com.dfsek.terra.api.block.BlockType; +import com.dfsek.terra.api.block.state.BlockStateExtended; + +import com.dfsek.terra.api.block.state.properties.Property; +import com.dfsek.terra.mod.mixin.access.StateAccessor; + +import net.minecraft.block.AbstractBlock.AbstractBlockState; +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.pattern.CachedBlockPosition; +import net.minecraft.command.argument.BlockStateArgument; +import net.minecraft.nbt.NbtCompound; +import net.minecraft.registry.Registries; +import net.minecraft.state.State; +import org.jetbrains.annotations.Nullable; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Implements; +import org.spongepowered.asm.mixin.Interface; +import org.spongepowered.asm.mixin.Intrinsic; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +import java.util.Set; +import java.util.function.Predicate; +import java.util.stream.Collectors; + + +@Mixin(BlockStateArgument.class) +@Implements(@Interface(iface = BlockStateExtended.class, prefix = "terra$")) +public abstract class BlockStateArgumentMixin implements Predicate { + + @Shadow + public abstract BlockState getBlockState(); + + @Shadow + public abstract Set> getProperties(); + + @Shadow + @Nullable + @Final + private NbtCompound data; + + public boolean terra$matches(com.dfsek.terra.api.block.state.BlockState other) { + return ((com.dfsek.terra.api.block.state.BlockState) getBlockState()).matches(other); + } + + @Intrinsic + public > boolean terra$has(com.dfsek.terra.api.block.state.properties.Property property) { + return ((com.dfsek.terra.api.block.state.BlockState) getBlockState()).has(property); + } + + @Intrinsic + public > T terra$get(com.dfsek.terra.api.block.state.properties.Property property) { + return ((com.dfsek.terra.api.block.state.BlockState) getBlockState()).get(property); + } + + @Intrinsic + public > com.dfsek.terra.api.block.state.BlockState terra$set(Property property, T value) { + return ((com.dfsek.terra.api.block.state.BlockState) getBlockState()).set(property, value); + } + + @Intrinsic + public BlockType terra$getBlockType() { + return ((com.dfsek.terra.api.block.state.BlockState) getBlockState()).getBlockType(); + } + + @Intrinsic + public String terra$getAsString(boolean properties) { + return ((com.dfsek.terra.api.block.state.BlockState) getBlockState()).getAsString(properties); + } + + @Intrinsic + public boolean terra$isAir() { + return ((com.dfsek.terra.api.block.state.BlockState) getBlockState()).isAir(); + } + + @SuppressWarnings({ "ConstantValue", "DataFlowIssue", "EqualsBetweenInconvertibleTypes" }) + @Intrinsic + public BlockStateExtended terra$setData(BlockData data) { + return (BlockStateExtended) new BlockStateArgument(getBlockState(), getProperties(), data.getClass().equals(NbtCompound.class) ? ((NbtCompound) ((Object) data)) : null); + } + + @SuppressWarnings("DataFlowIssue") + @Intrinsic + public BlockData terra$getData() { + return ((BlockData) ((Object) data)); + } + + @Intrinsic + public com.dfsek.terra.api.block.state.BlockState terra$getState() { + return (com.dfsek.terra.api.block.state.BlockState) getBlockState(); + } +} diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/chunk/ChunkRegionMixin.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/chunk/ChunkRegionMixin.java index d3d5d9427..af74cca54 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/chunk/ChunkRegionMixin.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/chunk/ChunkRegionMixin.java @@ -17,8 +17,20 @@ package com.dfsek.terra.mod.mixin.implementations.terra.chunk; +import com.dfsek.seismic.math.coord.CoordFunctions; +import net.minecraft.block.Block; +import net.minecraft.command.argument.BlockStateArgument; +import net.minecraft.fluid.Fluid; +import net.minecraft.server.world.ServerWorld; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.ChunkPos; +import net.minecraft.util.math.random.Random; import net.minecraft.world.ChunkRegion; +import net.minecraft.world.WorldProperties; +import net.minecraft.world.biome.source.BiomeAccess; +import net.minecraft.world.dimension.DimensionType; +import net.minecraft.world.tick.MultiTickScheduler; +import net.minecraft.world.tick.OrderedTick; import org.jetbrains.annotations.NotNull; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Implements; @@ -38,9 +50,36 @@ public abstract class ChunkRegionMixin { @Final private net.minecraft.world.chunk.Chunk centerPos; - public void terraChunk$setBlock(int x, int y, int z, @NotNull BlockState blockState, boolean physics) { - ((ChunkRegion) (Object) this).setBlockState(new BlockPos(x + (centerPos.getPos().x << 4), y, z + (centerPos.getPos().z << 4)), - (net.minecraft.block.BlockState) blockState, 0); + @Shadow + @Final + private ServerWorld world; + + @Shadow + @Final + private MultiTickScheduler blockTickScheduler; + + @Shadow + @Final + private MultiTickScheduler fluidTickScheduler; + + public void terraChunk$setBlock(int x, int y, int z, @NotNull BlockState data, boolean physics) { + ChunkPos pos = centerPos.getPos(); + BlockPos blockPos = new BlockPos(CoordFunctions.chunkAndRelativeToAbsolute(pos.x, x), y, CoordFunctions.chunkAndRelativeToAbsolute(pos.z, z)); + boolean isExtended = data.isExtended() && data.getClass().equals(BlockStateArgument.class); + if (isExtended) { + ((BlockStateArgument) data).setBlockState(world, blockPos, 0); + } else { + ((ChunkRegion) (Object) this).setBlockState(blockPos, (net.minecraft.block.BlockState) data, 0); + } + + if(physics) { + net.minecraft.block.BlockState state = isExtended ? ((BlockStateArgument) data).getBlockState() : ((net.minecraft.block.BlockState) data); + if(state.isLiquid()) { + fluidTickScheduler.scheduleTick(OrderedTick.create(state.getFluidState().getFluid(), blockPos)); + } else { + blockTickScheduler.scheduleTick(OrderedTick.create(state.getBlock(), blockPos)); + } + } } public @NotNull BlockState terraChunk$getBlock(int x, int y, int z) { diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/chunk/WorldChunkMixin.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/chunk/WorldChunkMixin.java index 4e92d76b2..7ff36a78b 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/chunk/WorldChunkMixin.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/chunk/WorldChunkMixin.java @@ -17,8 +17,12 @@ package com.dfsek.terra.mod.mixin.implementations.terra.chunk; +import net.minecraft.command.argument.BlockStateArgument; +import net.minecraft.nbt.NbtCompound; +import net.minecraft.server.command.SetBlockCommand; import net.minecraft.util.math.BlockPos; import net.minecraft.world.chunk.WorldChunk; +import net.minecraft.world.gen.feature.EndGatewayFeature; import net.minecraft.world.tick.OrderedTick; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -48,23 +52,29 @@ public abstract class WorldChunkMixin { @Nullable public abstract net.minecraft.block.BlockState setBlockState(BlockPos pos, net.minecraft.block.BlockState state, int flags); + @SuppressWarnings("ConstantValue") public void terra$setBlock(int x, int y, int z, BlockState data, boolean physics) { BlockPos blockPos = new BlockPos(x, y, z); - setBlockState(blockPos, (net.minecraft.block.BlockState) data, 0); + boolean isExtended = data.isExtended() && data.getClass().equals(BlockStateArgument.class); + if (isExtended) { + ((BlockStateArgument) data).setBlockState((net.minecraft.server.world.ServerWorld) world, blockPos, 0); + } else { + setBlockState(blockPos, (net.minecraft.block.BlockState) data, 0); + } + if(physics) { - net.minecraft.block.BlockState state = ((net.minecraft.block.BlockState) data); + net.minecraft.block.BlockState state = isExtended ? ((BlockStateArgument) data).getBlockState() : ((net.minecraft.block.BlockState) data); if(state.isLiquid()) { world.getFluidTickScheduler().scheduleTick(OrderedTick.create(state.getFluidState().getFluid(), blockPos)); } else { world.getBlockTickScheduler().scheduleTick(OrderedTick.create(state.getBlock(), blockPos)); } - } } - public void terra$setBlock(int x, int y, int z, @NotNull BlockState blockState) { - ((net.minecraft.world.chunk.Chunk) (Object) this).setBlockState(new BlockPos(x, y, z), (net.minecraft.block.BlockState) blockState, - 0); + @SuppressWarnings("ConstantValue") + public void terra$setBlock(int x, int y, int z, @NotNull BlockState data) { + terra$setBlock(x, y, z, data, false); } @Intrinsic diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/nbt/NbtCompoundMixin.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/nbt/NbtCompoundMixin.java new file mode 100644 index 000000000..36634ebcb --- /dev/null +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/nbt/NbtCompoundMixin.java @@ -0,0 +1,25 @@ +package com.dfsek.terra.mod.mixin.implementations.terra.nbt; + +import com.dfsek.terra.api.block.BlockData; +import com.dfsek.terra.api.block.state.BlockStateExtended; + +import net.minecraft.block.pattern.CachedBlockPosition; +import net.minecraft.command.argument.BlockStateArgument; +import net.minecraft.nbt.NbtCompound; +import net.minecraft.nbt.NbtElement; +import org.spongepowered.asm.mixin.Implements; +import org.spongepowered.asm.mixin.Interface; +import org.spongepowered.asm.mixin.Intrinsic; +import org.spongepowered.asm.mixin.Mixin; + +import java.util.function.Predicate; + + +@Mixin(NbtCompound.class) +@Implements(@Interface(iface = BlockData.class, prefix = "terra$")) +public abstract class NbtCompoundMixin implements NbtElement { + @Intrinsic + public String terra$toString() { + return this.toString(); + } +} diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/world/ChunkRegionMixin.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/world/ChunkRegionMixin.java index b0ca554a3..3439ad4be 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/world/ChunkRegionMixin.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/world/ChunkRegionMixin.java @@ -17,7 +17,9 @@ package com.dfsek.terra.mod.mixin.implementations.terra.world; +import net.minecraft.block.Block; import net.minecraft.block.FluidBlock; +import net.minecraft.command.argument.BlockStateArgument; import net.minecraft.entity.SpawnReason; import net.minecraft.fluid.Fluid; import net.minecraft.util.collection.BoundedRegionArray; @@ -73,6 +75,10 @@ public abstract class ChunkRegionMixin { @Final private MultiTickScheduler fluidTickScheduler; + @Shadow + @Final + private MultiTickScheduler blockTickScheduler; + @Inject(at = @At("RETURN"), method = "(Lnet/minecraft/server/world/ServerWorld;Lnet/minecraft/util/collection/BoundedRegionArray;" + @@ -85,12 +91,22 @@ public abstract class ChunkRegionMixin { @Intrinsic(displace = true) public void terraWorld$setBlockState(int x, int y, int z, BlockState data, boolean physics) { - BlockPos pos = new BlockPos(x, y, z); - ((ChunkRegion) (Object) this).setBlockState(pos, (net.minecraft.block.BlockState) data, physics ? 3 : 1042); - if(physics && ((net.minecraft.block.BlockState) data).getBlock() instanceof FluidBlock) { - fluidTickScheduler.scheduleTick( - OrderedTick.create((((FluidBlockInvoker) ((net.minecraft.block.BlockState) data).getBlock())).invokeGetFluidState( - (net.minecraft.block.BlockState) data).getFluid(), pos)); + BlockPos blockPos = new BlockPos(x, y, z); + int flags = physics ? 3 : 1042; + boolean isExtended = data.isExtended() && data.getClass().equals(BlockStateArgument.class); + if (isExtended) { + ((BlockStateArgument) data).setBlockState(world, blockPos, flags); + } else { + ((ChunkRegion) (Object) this).setBlockState(blockPos, (net.minecraft.block.BlockState) data, flags); + } + + if(physics) { + net.minecraft.block.BlockState state = isExtended ? ((BlockStateArgument) data).getBlockState() : ((net.minecraft.block.BlockState) data); + if(state.isLiquid()) { + fluidTickScheduler.scheduleTick(OrderedTick.create(state.getFluidState().getFluid(), blockPos)); + } else { + blockTickScheduler.scheduleTick(OrderedTick.create(state.getBlock(), blockPos)); + } } } diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/world/ServerWorldMixin.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/world/ServerWorldMixin.java index d618ee656..bfee2674b 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/world/ServerWorldMixin.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/world/ServerWorldMixin.java @@ -17,9 +17,20 @@ package com.dfsek.terra.mod.mixin.implementations.terra.world; +import com.dfsek.terra.mod.mixin.invoke.FluidBlockInvoker; + +import net.minecraft.block.Block; +import net.minecraft.block.FluidBlock; +import net.minecraft.command.argument.BlockStateArgument; import net.minecraft.entity.SpawnReason; +import net.minecraft.fluid.Fluid; import net.minecraft.util.math.BlockPos; +import net.minecraft.world.ChunkRegion; import net.minecraft.world.WorldAccess; +import net.minecraft.world.tick.MultiTickScheduler; +import net.minecraft.world.tick.OrderedTick; +import net.minecraft.world.tick.WorldTickScheduler; +import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Implements; import org.spongepowered.asm.mixin.Interface; import org.spongepowered.asm.mixin.Intrinsic; @@ -38,10 +49,18 @@ import com.dfsek.terra.mod.generation.MinecraftChunkGeneratorWrapper; import com.dfsek.terra.mod.generation.TerraBiomeSource; import com.dfsek.terra.mod.util.MinecraftUtil; +import org.spongepowered.asm.mixin.Shadow; + @Mixin(net.minecraft.server.world.ServerWorld.class) @Implements(@Interface(iface = ServerWorld.class, prefix = "terra$")) public abstract class ServerWorldMixin { + @Shadow + public abstract WorldTickScheduler getBlockTickScheduler(); + + @Shadow + public abstract WorldTickScheduler getFluidTickScheduler(); + public Entity terra$spawnEntity(double x, double y, double z, EntityType entityType) { net.minecraft.entity.Entity entity = ((net.minecraft.entity.EntityType) entityType).create(null, SpawnReason.CHUNK_GENERATION); entity.setPos(x, y, z); @@ -50,9 +69,22 @@ public abstract class ServerWorldMixin { } public void terra$setBlockState(int x, int y, int z, BlockState data, boolean physics) { - BlockPos pos = new BlockPos(x, y, z); - ((net.minecraft.server.world.ServerWorld) (Object) this).setBlockState(pos, (net.minecraft.block.BlockState) data, - physics ? 3 : 1042); + BlockPos blockPos = new BlockPos(x, y, z); + int flags = physics ? 3 : 1042; + boolean isExtended = data.isExtended() && data.getClass().equals(BlockStateArgument.class); + if (isExtended) { + ((BlockStateArgument) data).setBlockState(((net.minecraft.server.world.ServerWorld) (Object) this), blockPos, flags); + } else { + ((net.minecraft.server.world.ServerWorld) (Object) this).setBlockState(blockPos, (net.minecraft.block.BlockState) data, flags); + } + if(physics) { + net.minecraft.block.BlockState state = isExtended ? ((BlockStateArgument) data).getBlockState() : ((net.minecraft.block.BlockState) data); + if(state.isLiquid()) { + getFluidTickScheduler().scheduleTick(OrderedTick.create(state.getFluidState().getFluid(), blockPos)); + } else { + getBlockTickScheduler().scheduleTick(OrderedTick.create(state.getBlock(), blockPos)); + } + } } @Intrinsic diff --git a/platforms/mixin-common/src/main/resources/terra.accesswidener b/platforms/mixin-common/src/main/resources/terra.accesswidener index c8bf52150..1d7159070 100644 --- a/platforms/mixin-common/src/main/resources/terra.accesswidener +++ b/platforms/mixin-common/src/main/resources/terra.accesswidener @@ -2,4 +2,6 @@ accessWidener v1 named accessible class net/minecraft/world/biome/Biome$Weather accessible class net/minecraft/world/gen/WorldPresets$Registrar accessible field net/minecraft/world/dimension/DimensionOptionsRegistryHolder VANILLA_KEYS Ljava/util/Set; -accessible class net/minecraft/registry/RegistryLoader$Loader \ No newline at end of file +accessible class net/minecraft/registry/RegistryLoader$Loader +extendable class net/minecraft/nbt/NbtElement +accessible field net/minecraft/block/entity/BlockEntity TYPE_CODEC Lcom/mojang/serialization/Codec; \ No newline at end of file diff --git a/platforms/mixin-common/src/main/resources/terra.common.mixins.json b/platforms/mixin-common/src/main/resources/terra.common.mixins.json index 33e9f4668..43d0476e3 100644 --- a/platforms/mixin-common/src/main/resources/terra.common.mixins.json +++ b/platforms/mixin-common/src/main/resources/terra.common.mixins.json @@ -18,6 +18,7 @@ "implementations.terra.block.entity.LootableContainerBlockEntityMixin", "implementations.terra.block.entity.MobSpawnerBlockEntityMixin", "implementations.terra.block.entity.SignBlockEntityMixin", + "implementations.terra.block.state.BlockStateArgumentMixin", "implementations.terra.block.state.BlockStateMixin", "implementations.terra.block.state.PropertyMixin", "implementations.terra.chunk.ChunkRegionMixin", @@ -33,6 +34,7 @@ "implementations.terra.inventory.meta.EnchantmentMixin", "implementations.terra.inventory.meta.ItemStackDamageableMixin", "implementations.terra.inventory.meta.ItemStackMetaMixin", + "implementations.terra.nbt.NbtCompoundMixin", "implementations.terra.world.ChunkRegionMixin", "implementations.terra.world.ServerWorldMixin", "invoke.BiomeInvoker",