diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/functions/FunctionBuilder.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/functions/FunctionBuilder.java index f8a06006a..466644851 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/functions/FunctionBuilder.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/lang/functions/FunctionBuilder.java @@ -7,11 +7,11 @@ package com.dfsek.terra.addons.terrascript.parser.lang.functions; -import java.util.List; - import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.tokenizer.Position; +import java.util.List; + public interface FunctionBuilder> { T build(List> argumentList, Position position); diff --git a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/util/PaperUtil.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/util/PaperUtil.java index c687fb000..8cac9aef8 100644 --- a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/util/PaperUtil.java +++ b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/util/PaperUtil.java @@ -17,12 +17,12 @@ package com.dfsek.terra.bukkit.util; +import com.dfsek.terra.bukkit.TerraBukkitPlugin; + import io.papermc.lib.PaperLib; import java.util.concurrent.TimeUnit; -import com.dfsek.terra.bukkit.TerraBukkitPlugin; - import static io.papermc.lib.PaperLib.suggestPaper; diff --git a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/biome/MinestomBiomeLoader.java b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/biome/MinestomBiomeLoader.java index 21e4645b4..3f25c9c75 100644 --- a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/biome/MinestomBiomeLoader.java +++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/biome/MinestomBiomeLoader.java @@ -4,6 +4,9 @@ import com.dfsek.tectonic.api.depth.DepthTracker; import com.dfsek.tectonic.api.exception.LoadException; import com.dfsek.tectonic.api.loader.ConfigLoader; import com.dfsek.tectonic.api.loader.type.TypeLoader; + +import com.dfsek.terra.api.world.biome.PlatformBiome; + import net.kyori.adventure.key.Key; import net.minestom.server.registry.RegistryKey; import org.intellij.lang.annotations.Subst; @@ -11,8 +14,6 @@ import org.jetbrains.annotations.NotNull; import java.lang.reflect.AnnotatedType; -import com.dfsek.terra.api.world.biome.PlatformBiome; - public class MinestomBiomeLoader implements TypeLoader { @Override diff --git a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/entity/DefaultEntityFactory.java b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/entity/DefaultEntityFactory.java index c25e86cf5..23226fc99 100644 --- a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/entity/DefaultEntityFactory.java +++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/entity/DefaultEntityFactory.java @@ -1,10 +1,10 @@ package com.dfsek.terra.minestom.entity; +import com.dfsek.terra.minestom.api.EntityFactory; + import net.minestom.server.entity.Entity; import net.minestom.server.entity.EntityType; -import com.dfsek.terra.minestom.api.EntityFactory; - public class DefaultEntityFactory implements EntityFactory { @Override 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 605a64dbb..b42b866e7 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 @@ -34,14 +34,12 @@ import net.minecraft.registry.entry.RegistryEntry.Reference; import net.minecraft.util.Identifier; import net.minecraft.util.math.BlockPos; import org.jetbrains.annotations.NotNull; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import com.dfsek.terra.api.block.state.BlockState; import com.dfsek.terra.api.block.state.BlockStateExtended; import com.dfsek.terra.api.entity.EntityType; import com.dfsek.terra.api.handle.WorldHandle; -import com.dfsek.terra.mod.implmentation.FabricEntityTypeExtended; +import com.dfsek.terra.mod.implmentation.MinecraftEntityTypeExtended; import static net.minecraft.command.argument.BlockArgumentParser.INVALID_BLOCK_ID_EXCEPTION; @@ -51,8 +49,6 @@ public class MinecraftWorldHandle implements WorldHandle { private static final BlockState AIR = (BlockState) Blocks.AIR.getDefaultState(); - private static final Logger logger = LoggerFactory.getLogger(MinecraftWorldHandle.class); - @SuppressWarnings("DataFlowIssue") @Override public @NotNull BlockState createBlockState(@NotNull String data) { @@ -117,7 +113,7 @@ public class MinecraftWorldHandle implements WorldHandle { EntityType entityType; if(nbtData != null) { - entityType = new FabricEntityTypeExtended(entity, nbtData); + entityType = new MinecraftEntityTypeExtended(entity, nbtData); } else { entityType = (EntityType) entity; } diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/implmentation/FabricEntityTypeExtended.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/implmentation/MinecraftEntityTypeExtended.java similarity index 72% rename from platforms/mixin-common/src/main/java/com/dfsek/terra/mod/implmentation/FabricEntityTypeExtended.java rename to platforms/mixin-common/src/main/java/com/dfsek/terra/mod/implmentation/MinecraftEntityTypeExtended.java index 6500668ab..7d06b15b5 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/implmentation/FabricEntityTypeExtended.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/implmentation/MinecraftEntityTypeExtended.java @@ -7,7 +7,7 @@ import com.dfsek.terra.api.entity.EntityType; import com.dfsek.terra.api.entity.EntityTypeExtended; -public record FabricEntityTypeExtended(net.minecraft.entity.EntityType entityType, NbtCompound nbtCompound) +public record MinecraftEntityTypeExtended(net.minecraft.entity.EntityType entityType, NbtCompound nbtCompound) implements EntityTypeExtended { @SuppressWarnings("DataFlowIssue") @Override @@ -18,7 +18,8 @@ public record FabricEntityTypeExtended(net.minecraft.entity.EntityType entity @SuppressWarnings("DataFlowIssue") @Override public EntityTypeExtended setData(ExtendedData data) { - return new FabricEntityTypeExtended(entityType, data.getClass().equals(NbtCompound.class) ? ((NbtCompound) ((Object) data)) : null); + return new MinecraftEntityTypeExtended(entityType, + data.getClass().equals(NbtCompound.class) ? ((NbtCompound) ((Object) data)) : null); } @Override diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/access/WorldChunkAccessor.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/access/WorldChunkAccessor.java new file mode 100644 index 000000000..72defb826 --- /dev/null +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/access/WorldChunkAccessor.java @@ -0,0 +1,15 @@ +package com.dfsek.terra.mod.mixin.access; + +import net.minecraft.block.entity.BlockEntity; +import net.minecraft.nbt.NbtCompound; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.chunk.WorldChunk; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Invoker; + + +@Mixin(WorldChunk.class) +public interface WorldChunkAccessor { + @Invoker("loadBlockEntity") + public BlockEntity invokeLoadBlockEntity(BlockPos pos, NbtCompound nbt); +} diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/block/entity/MobSpawnerBlockEntityMixin.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/block/entity/MobSpawnerBlockEntityMixin.java index 7ca93489d..4335f67ce 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/block/entity/MobSpawnerBlockEntityMixin.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/block/entity/MobSpawnerBlockEntityMixin.java @@ -36,7 +36,7 @@ import com.dfsek.terra.api.block.entity.MobSpawner; import com.dfsek.terra.api.block.entity.SerialState; import com.dfsek.terra.api.entity.EntityType; import com.dfsek.terra.mod.CommonPlatform; -import com.dfsek.terra.mod.implmentation.FabricEntityTypeExtended; +import com.dfsek.terra.mod.implmentation.MinecraftEntityTypeExtended; import com.dfsek.terra.mod.mixin.access.MobSpawnerLogicAccessor; @@ -69,7 +69,7 @@ public abstract class MobSpawnerBlockEntityMixin extends BlockEntity { } net.minecraft.entity.EntityType entityType = (((net.minecraft.entity.EntityType) (creatureType.isExtended() && creatureType.getClass().equals( - FabricEntityTypeExtended.class) ? ((FabricEntityTypeExtended) creatureType).getType() : creatureType))); + MinecraftEntityTypeExtended.class) ? ((MinecraftEntityTypeExtended) creatureType).getType() : creatureType))); setEntityType(entityType, rand); } 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 6af6d7289..c0d7f6f0e 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 @@ -19,8 +19,6 @@ package com.dfsek.terra.mod.mixin.implementations.terra.chunk; import com.dfsek.seismic.math.coord.CoordFunctions; import net.minecraft.block.Block; -import net.minecraft.block.BlockEntityProvider; -import net.minecraft.block.entity.BlockEntity; import net.minecraft.command.argument.BlockStateArgument; import net.minecraft.fluid.Fluid; import net.minecraft.nbt.NbtCompound; @@ -30,7 +28,6 @@ import net.minecraft.util.math.ChunkPos; import net.minecraft.world.ChunkRegion; import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.tick.MultiTickScheduler; -import net.minecraft.world.tick.OrderedTick; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.spongepowered.asm.mixin.Final; @@ -42,6 +39,7 @@ import org.spongepowered.asm.mixin.Shadow; import com.dfsek.terra.api.block.state.BlockState; import com.dfsek.terra.api.block.state.BlockStateExtended; import com.dfsek.terra.api.world.chunk.Chunk; +import com.dfsek.terra.mod.util.MinecraftUtil; @Mixin(ChunkRegion.class) @@ -76,40 +74,24 @@ public abstract class ChunkRegionMixin implements StructureWorldAccess { 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); + net.minecraft.block.BlockState state; + + boolean isExtended = MinecraftUtil.isCompatibleBlockStateExtended(data); + if(isExtended) { BlockStateArgument arg = ((BlockStateArgument) data); - net.minecraft.block.BlockState state = arg.getBlockState(); + state = arg.getBlockState(); setBlockState(blockPos, state, 0, 512); net.minecraft.world.chunk.Chunk chunk = getChunk(blockPos); - BlockEntity blockEntity; NbtCompound nbt = ((NbtCompound) (Object) ((BlockStateExtended) data).getData()); - if("DUMMY".equals(nbt.getString("id", ""))) { - if(state.hasBlockEntity()) { - blockEntity = ((BlockEntityProvider) state.getBlock()).createBlockEntity(blockPos, state); - } else { - blockEntity = null; - } - } else { - blockEntity = BlockEntity.createFromNbt(blockPos, state, nbt, this.world.getRegistryManager()); - } - - if(blockEntity != null) { - blockEntity.setWorld(this.world); - chunk.setBlockEntity(blockEntity); - } + MinecraftUtil.loadBlockEntity(chunk, world, blockPos, state, nbt); } else { - setBlockState(blockPos, (net.minecraft.block.BlockState) data, 0, 512); + state = (net.minecraft.block.BlockState) data; + setBlockState(blockPos, state, 0, 512); } 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)); - } + MinecraftUtil.schedulePhysics(state, blockPos, getFluidTickScheduler(), getBlockTickScheduler()); } } 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 8ae33fa15..1df0ba60e 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 @@ -22,7 +22,6 @@ import net.minecraft.command.argument.BlockStateArgument; import net.minecraft.nbt.NbtCompound; import net.minecraft.util.math.BlockPos; import net.minecraft.world.chunk.WorldChunk; -import net.minecraft.world.tick.OrderedTick; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.spongepowered.asm.mixin.Final; @@ -36,6 +35,7 @@ import com.dfsek.terra.api.block.state.BlockState; import com.dfsek.terra.api.block.state.BlockStateExtended; import com.dfsek.terra.api.world.ServerWorld; import com.dfsek.terra.api.world.chunk.Chunk; +import com.dfsek.terra.mod.util.MinecraftUtil; @Mixin(WorldChunk.class) @@ -58,24 +58,22 @@ public abstract class WorldChunkMixin { @SuppressWarnings("ConstantValue") public void terra$setBlock(int x, int y, int z, BlockState data, boolean physics) { BlockPos blockPos = new BlockPos(x, y, z); - boolean isExtended = data.isExtended() && data.getClass().equals(BlockStateArgument.class); + net.minecraft.block.BlockState state; + + boolean isExtended = MinecraftUtil.isCompatibleBlockStateExtended(data); + if(isExtended) { BlockStateArgument arg = ((BlockStateArgument) data); - net.minecraft.block.BlockState state = arg.getBlockState(); + state = arg.getBlockState(); setBlockState(blockPos, state, 0); loadBlockEntity(blockPos, ((NbtCompound) (Object) ((BlockStateExtended) data).getData())); } else { - setBlockState(blockPos, (net.minecraft.block.BlockState) data, 0); + state = (net.minecraft.block.BlockState) data; + setBlockState(blockPos, state, 0); } if(physics) { - 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)); - } + MinecraftUtil.schedulePhysics(state, blockPos, world.getFluidTickScheduler(), world.getBlockTickScheduler()); } } 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 2bafebd56..1c34c6a4d 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 @@ -18,7 +18,6 @@ package com.dfsek.terra.mod.mixin.implementations.terra.world; import net.minecraft.block.Block; -import net.minecraft.block.BlockEntityProvider; import net.minecraft.command.argument.BlockStateArgument; import net.minecraft.entity.SpawnReason; import net.minecraft.fluid.Fluid; @@ -30,7 +29,6 @@ import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.chunk.Chunk; import net.minecraft.world.chunk.ChunkGenerationStep; import net.minecraft.world.tick.MultiTickScheduler; -import net.minecraft.world.tick.OrderedTick; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Implements; import org.spongepowered.asm.mixin.Interface; @@ -52,7 +50,7 @@ import com.dfsek.terra.api.world.biome.generation.BiomeProvider; import com.dfsek.terra.api.world.chunk.generation.ChunkGenerator; import com.dfsek.terra.api.world.chunk.generation.ProtoWorld; import com.dfsek.terra.mod.generation.MinecraftChunkGeneratorWrapper; -import com.dfsek.terra.mod.implmentation.FabricEntityTypeExtended; +import com.dfsek.terra.mod.implmentation.MinecraftEntityTypeExtended; import com.dfsek.terra.mod.util.MinecraftUtil; @@ -94,41 +92,25 @@ public abstract class ChunkRegionMixin implements StructureWorldAccess { @Intrinsic(displace = true) public void terraWorld$setBlockState(int x, int y, int z, BlockState data, boolean physics) { BlockPos blockPos = new BlockPos(x, y, z); + net.minecraft.block.BlockState state; + int flags = physics ? 3 : 1042; - boolean isExtended = data.isExtended() && data.getClass().equals(BlockStateArgument.class); + boolean isExtended = MinecraftUtil.isCompatibleBlockStateExtended(data); + if(isExtended) { BlockStateArgument arg = ((BlockStateArgument) data); - net.minecraft.block.BlockState state = arg.getBlockState(); + state = arg.getBlockState(); setBlockState(blockPos, state, flags); net.minecraft.world.chunk.Chunk chunk = getChunk(blockPos); - net.minecraft.block.entity.BlockEntity blockEntity; NbtCompound nbt = ((NbtCompound) (Object) ((BlockStateExtended) data).getData()); - if("DUMMY".equals(nbt.getString("id", ""))) { - if(state.hasBlockEntity()) { - blockEntity = ((BlockEntityProvider) state.getBlock()).createBlockEntity(blockPos, state); - } else { - blockEntity = null; - } - } else { - blockEntity = net.minecraft.block.entity.BlockEntity.createFromNbt(blockPos, state, nbt, getRegistryManager()); - } - - if(blockEntity != null) { - blockEntity.setWorld(world); - chunk.setBlockEntity(blockEntity); - } + MinecraftUtil.loadBlockEntity(chunk, world, blockPos, state, nbt); } else { - setBlockState(blockPos, (net.minecraft.block.BlockState) data, flags); + state = (net.minecraft.block.BlockState) data; + setBlockState(blockPos, state, 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)); - } + MinecraftUtil.schedulePhysics(state, blockPos, getFluidTickScheduler(), getBlockTickScheduler()); } } @@ -148,7 +130,7 @@ public abstract class ChunkRegionMixin implements StructureWorldAccess { } public BlockEntity terraWorld$getBlockEntity(int x, int y, int z) { - return MinecraftUtil.createState(this, new BlockPos(x, y, z)); + return MinecraftUtil.createBlockEntity(this, new BlockPos(x, y, z)); } public int terraWorld$getMinHeight() { @@ -165,10 +147,10 @@ public abstract class ChunkRegionMixin implements StructureWorldAccess { @SuppressWarnings("DataFlowIssue") public Entity terraWorld$spawnEntity(double x, double y, double z, EntityType data) { - boolean isExtended = data.isExtended() && data.getClass().equals(FabricEntityTypeExtended.class); + boolean isExtended = MinecraftUtil.isCompatibleEntityTypeExtended(data); net.minecraft.entity.Entity entity; if(isExtended) { - FabricEntityTypeExtended type = ((FabricEntityTypeExtended) data); + MinecraftEntityTypeExtended type = ((MinecraftEntityTypeExtended) data); NbtCompound nbt = (NbtCompound) ((Object) type.getData()); entity = net.minecraft.entity.EntityType.loadEntityWithPassengers(nbt, world, SpawnReason.CHUNK_GENERATION, (entityx) -> { entityx.refreshPositionAndAngles(x, y, z, entityx.getYaw(), entityx.getPitch()); 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 7e7f762d3..fdba31a50 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 @@ -18,7 +18,6 @@ package com.dfsek.terra.mod.mixin.implementations.terra.world; import net.minecraft.block.Block; -import net.minecraft.block.BlockEntityProvider; import net.minecraft.command.argument.BlockStateArgument; import net.minecraft.entity.SpawnReason; import net.minecraft.fluid.Fluid; @@ -30,7 +29,6 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.world.MutableWorldProperties; import net.minecraft.world.World; import net.minecraft.world.dimension.DimensionType; -import net.minecraft.world.tick.OrderedTick; import net.minecraft.world.tick.WorldTickScheduler; import org.spongepowered.asm.mixin.Implements; import org.spongepowered.asm.mixin.Interface; @@ -50,7 +48,8 @@ import com.dfsek.terra.api.world.chunk.Chunk; import com.dfsek.terra.api.world.chunk.generation.ChunkGenerator; import com.dfsek.terra.mod.generation.MinecraftChunkGeneratorWrapper; import com.dfsek.terra.mod.generation.TerraBiomeSource; -import com.dfsek.terra.mod.implmentation.FabricEntityTypeExtended; +import com.dfsek.terra.mod.implmentation.MinecraftEntityTypeExtended; +import com.dfsek.terra.mod.mixin.access.WorldChunkAccessor; import com.dfsek.terra.mod.util.MinecraftUtil; @@ -71,10 +70,10 @@ public abstract class ServerWorldMixin extends World { public Entity terra$spawnEntity(double x, double y, double z, EntityType data) { - boolean isExtended = data.isExtended() && data.getClass().equals(FabricEntityTypeExtended.class); + boolean isExtended = MinecraftUtil.isCompatibleEntityTypeExtended(data); net.minecraft.entity.Entity entity; if(isExtended) { - FabricEntityTypeExtended type = ((FabricEntityTypeExtended) data); + MinecraftEntityTypeExtended type = ((MinecraftEntityTypeExtended) data); NbtCompound nbt = (NbtCompound) ((Object) type.getData()); entity = net.minecraft.entity.EntityType.loadEntityWithPassengers(nbt, this, SpawnReason.CHUNK_GENERATION, (entityx) -> { entityx.refreshPositionAndAngles(x, y, z, entityx.getYaw(), entityx.getPitch()); @@ -92,44 +91,28 @@ public abstract class ServerWorldMixin extends World { public void terra$setBlockState(int x, int y, int z, BlockState data, boolean physics) { BlockPos blockPos = new BlockPos(x, y, z); + net.minecraft.block.BlockState state; + int flags = physics ? 3 : 1042; - boolean isExtended = data.isExtended() && data.getClass().equals(BlockStateArgument.class); + boolean isExtended = MinecraftUtil.isCompatibleBlockStateExtended(data); + if(isExtended) { BlockStateArgument arg = ((BlockStateArgument) data); - net.minecraft.block.BlockState state = arg.getBlockState(); + state = arg.getBlockState(); setBlockState(blockPos, state, flags); - net.minecraft.world.chunk.Chunk chunk = getChunk(blockPos); - net.minecraft.block.entity.BlockEntity blockEntity; - NbtCompound nbt = ((NbtCompound) (Object) ((BlockStateExtended) data).getData()); - if("DUMMY".equals(nbt.getString("id", ""))) { - if(state.hasBlockEntity()) { - blockEntity = ((BlockEntityProvider) state.getBlock()).createBlockEntity(blockPos, state); - } else { - blockEntity = null; - } - } else { - blockEntity = net.minecraft.block.entity.BlockEntity.createFromNbt(blockPos, state, nbt, getRegistryManager()); - } - - if(blockEntity != null) { - blockEntity.setWorld(this); - chunk.setBlockEntity(blockEntity); - } + net.minecraft.world.chunk.Chunk chunk = getWorldChunk(blockPos); + ((WorldChunkAccessor) chunk).invokeLoadBlockEntity(blockPos, ((NbtCompound) (Object) ((BlockStateExtended) data).getData())); } else { - setBlockState(blockPos, (net.minecraft.block.BlockState) data, flags); + state = (net.minecraft.block.BlockState) data; + setBlockState(blockPos, state, 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)); - } + MinecraftUtil.schedulePhysics(state, blockPos, this.getFluidTickScheduler(), this.getBlockTickScheduler()); } } + @Intrinsic public long terra$getSeed() { return ((net.minecraft.server.world.ServerWorld) (Object) this).getSeed(); @@ -149,7 +132,7 @@ public abstract class ServerWorldMixin extends World { } public BlockEntity terra$getBlockEntity(int x, int y, int z) { - return MinecraftUtil.createState(this, new BlockPos(x, y, z)); + return MinecraftUtil.createBlockEntity(this, new BlockPos(x, y, z)); } public int terra$getMinHeight() { diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/util/MinecraftUtil.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/util/MinecraftUtil.java index 822e7cd89..076745ce8 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/util/MinecraftUtil.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/util/MinecraftUtil.java @@ -1,8 +1,14 @@ package com.dfsek.terra.mod.util; +import net.minecraft.block.Block; +import net.minecraft.block.BlockEntityProvider; +import net.minecraft.block.BlockState; import net.minecraft.block.entity.LootableContainerBlockEntity; import net.minecraft.block.entity.MobSpawnerBlockEntity; import net.minecraft.block.entity.SignBlockEntity; +import net.minecraft.command.argument.BlockStateArgument; +import net.minecraft.fluid.Fluid; +import net.minecraft.nbt.NbtCompound; import net.minecraft.registry.Registry; import net.minecraft.registry.RegistryKey; import net.minecraft.registry.RegistryKeys; @@ -10,10 +16,14 @@ import net.minecraft.registry.entry.RegistryEntry; import net.minecraft.util.Identifier; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.intprovider.IntProviderType; +import net.minecraft.world.World; import net.minecraft.world.WorldAccess; import net.minecraft.world.biome.Biome; +import net.minecraft.world.chunk.Chunk; import net.minecraft.world.dimension.DimensionType; import net.minecraft.world.gen.feature.ConfiguredFeature; +import net.minecraft.world.tick.OrderedTick; +import net.minecraft.world.tick.TickScheduler; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -25,11 +35,13 @@ import com.dfsek.terra.api.block.entity.Container; import com.dfsek.terra.api.block.entity.MobSpawner; import com.dfsek.terra.api.block.entity.Sign; import com.dfsek.terra.api.config.ConfigPack; +import com.dfsek.terra.api.entity.EntityType; import com.dfsek.terra.api.util.range.ConstantRange; import com.dfsek.terra.mod.CommonPlatform; import com.dfsek.terra.mod.config.PreLoadCompatibilityOptions; import com.dfsek.terra.mod.config.ProtoPlatformBiome; import com.dfsek.terra.mod.data.Codecs; +import com.dfsek.terra.mod.implmentation.MinecraftEntityTypeExtended; import com.dfsek.terra.mod.implmentation.TerraIntProvider; import com.dfsek.terra.mod.mixin_ifaces.FloraFeatureHolder; @@ -46,7 +58,7 @@ public final class MinecraftUtil { .flatMap(id -> Optional.ofNullable(registry.getEntry(id))); } - public static BlockEntity createState(WorldAccess worldAccess, BlockPos pos) { + public static BlockEntity createBlockEntity(WorldAccess worldAccess, BlockPos pos) { net.minecraft.block.entity.BlockEntity entity = worldAccess.getBlockEntity(pos); if(entity instanceof SignBlockEntity) { return (Sign) entity; @@ -58,6 +70,42 @@ public final class MinecraftUtil { return null; } + public static void schedulePhysics(BlockState blockState, BlockPos blockPos, TickScheduler fluidScheduler, + TickScheduler blockScheduler) { + if(blockState.isLiquid()) { + fluidScheduler.scheduleTick(OrderedTick.create(blockState.getFluidState().getFluid(), blockPos)); + } else { + blockScheduler.scheduleTick(OrderedTick.create(blockState.getBlock(), blockPos)); + } + } + + public static boolean isCompatibleBlockStateExtended(com.dfsek.terra.api.block.state.BlockState blockState) { + return blockState.isExtended() && BlockStateArgument.class.isAssignableFrom(blockState.getClass()); + } + + //[Vanilla Copy] + public static void loadBlockEntity(Chunk chunk, World world, BlockPos blockPos, BlockState state, NbtCompound nbt) { + net.minecraft.block.entity.BlockEntity blockEntity; + if("DUMMY".equals(nbt.getString("id", ""))) { + if(state.hasBlockEntity()) { + blockEntity = ((BlockEntityProvider) state.getBlock()).createBlockEntity(blockPos, state); + } else { + blockEntity = null; + } + } else { + blockEntity = net.minecraft.block.entity.BlockEntity.createFromNbt(blockPos, state, nbt, world.getRegistryManager()); + } + + if(blockEntity != null) { + blockEntity.setWorld(world); + chunk.setBlockEntity(blockEntity); + } + } + + public static boolean isCompatibleEntityTypeExtended(EntityType entityType) { + return entityType.isExtended() && MinecraftEntityTypeExtended.class.isAssignableFrom(entityType.getClass()); + } + public static void registerIntProviderTypes() { IntProviderType CONSTANT = IntProviderType.register("terra:constant_range", Codecs.TERRA_CONSTANT_RANGE_INT_PROVIDER_TYPE); 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 43d0476e3..f1d2c5a3f 100644 --- a/platforms/mixin-common/src/main/resources/terra.common.mixins.json +++ b/platforms/mixin-common/src/main/resources/terra.common.mixins.json @@ -9,6 +9,7 @@ "access.StateAccessor", "access.StructureAccessorAccessor", "access.VillagerTypeAccessor", + "access.WorldChunkAccessor", "generalize.ServerWorldMixin", "implementations.compat.GenerationSettingsFloraFeaturesMixin", "implementations.terra.BiomeMixin",