diff --git a/README.md b/README.md index 8986ce6b7..0b0eb8b93 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ to your specifications, with no knowledge of Java required. * Paper+ servers (Paper, Tuinity, Purpur, etc): [SpigotMC](https://www.spigotmc.org/resources/85151/) * Fabric: [Modrinth](https://modrinth.com/mod/terra) / [CurseForge](https://www.curseforge.com/minecraft/mc-mods/terra-world-generator) -* Forge: [Modrinth](https://modrinth.com/mod/terra) / [CurseForge](https://www.curseforge.com/minecraft/mc-mods/terra-world-generator) +* Forge **(ALPHA - NOT PRODUCTION-READY)**: [Modrinth](https://modrinth.com/mod/terra) / [CurseForge](https://www.curseforge.com/minecraft/mc-mods/terra-world-generator) ## Building and Running Terra @@ -32,15 +32,15 @@ To run Minecraft with Terra in the IDE (for testing) use the following tasks: * `runPaper` - Run the Paper test server with Terra (`installPaper` must have been run previously). * `runPurpur` - Run the Purpur test server with Terra (`installPurpur` must have been run previously). * Fabric - * `runClient` - Run a Minecraft client with Terra installed. - * `runServer` - Run a Minecraft server with Terra installed. + * `runClient` - Run a Minecraft Fabric client with Terra installed. + * `runServer` - Run a Minecraft Fabric server with Terra installed. * Forge - * `runClient` - Run a Minecraft client with Terra installed. - * `runServer` - Run a Minecraft server with Terra installed. + * `runClient` - Run a Minecraft Forge client with Terra installed. + * `runServer` - Run a Minecraft Forge server with Terra installed. ## Contributing Contributions are welcome! If you want to see a feature in Terra, please, open an issue, or implement it yourself and submit a PR! Join the discord [here](https://discord.gg/PXUEbbF) if you would like to talk more about the project! ## Beta -Terra is still in beta! While it is stable, it is not feature-complete. There is a lot to be added! \ No newline at end of file +Terra is still in beta! While it is stable, it is not feature-complete. There is a lot to be added! diff --git a/build.gradle.kts b/build.gradle.kts index 3f6b6d2e0..db0ed685b 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,6 +1,6 @@ import com.dfsek.terra.getGitHash -val versionObj = Version("5", "3", "0", true) +val versionObj = Version("5", "3", "2", true) allprojects { version = versionObj diff --git a/common/src/main/resources/config.yml b/common/src/main/resources/config.yml index adb7d8522..e7572c935 100644 --- a/common/src/main/resources/config.yml +++ b/common/src/main/resources/config.yml @@ -7,7 +7,6 @@ cache: carver: 512 structure: 32 sampler: 128 -master-disable: - caves: false + biome-provider: 32 script: max-recursion: 1000 \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index 94dc0b5ce..048aff2f8 100644 --- a/gradle.properties +++ b/gradle.properties @@ -7,4 +7,3 @@ org.gradle.parallel=true org.gradle.caching=true org.gradle.warning.mode=all #org.gradle.logging.level=info -#org.gradle.configureondemand=true diff --git a/platforms/fabric/build.gradle.kts b/platforms/fabric/build.gradle.kts index 38aafb791..fbdf2b8ac 100644 --- a/platforms/fabric/build.gradle.kts +++ b/platforms/fabric/build.gradle.kts @@ -28,6 +28,14 @@ dependencies { "modImplementation"("net.fabricmc:fabric-loader:0.11.2") "modImplementation"("net.fabricmc.fabric-api:fabric-api:0.31.0+1.16") + + "modCompileOnly"("com.sk89q.worldedit:worldedit-fabric-mc1.16:7.2.0-SNAPSHOT") { + exclude(group = "com.google.guava", module = "guava") + exclude(group = "com.google.code.gson", module = "gson") + exclude(group = "it.unimi.dsi", module = "fastutil") + exclude(group = "org.apache.logging.log4j", module = "log4j-api") + exclude(group = "org.apache.logging.log4j", module = "log4j-core") + } } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java index ca1ab5347..f53c0fc7a 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java @@ -37,13 +37,13 @@ import com.dfsek.terra.config.lang.LangUtil; import com.dfsek.terra.config.lang.Language; import com.dfsek.terra.config.pack.ConfigPack; import com.dfsek.terra.config.templates.BiomeTemplate; +import com.dfsek.terra.fabric.generation.FabricChunkGeneratorWrapper; +import com.dfsek.terra.fabric.generation.PopulatorFeature; +import com.dfsek.terra.fabric.generation.TerraBiomeSource; import com.dfsek.terra.fabric.handle.FabricItemHandle; import com.dfsek.terra.fabric.handle.FabricWorldHandle; import com.dfsek.terra.fabric.mixin.access.BiomeEffectsAccessor; import com.dfsek.terra.fabric.mixin.access.GeneratorTypeAccessor; -import com.dfsek.terra.fabric.generation.TerraBiomeSource; -import com.dfsek.terra.fabric.generation.PopulatorFeature; -import com.dfsek.terra.fabric.generation.FabricChunkGeneratorWrapper; import com.dfsek.terra.profiler.Profiler; import com.dfsek.terra.profiler.ProfilerImpl; import com.dfsek.terra.registry.exception.DuplicateEntryException; @@ -292,32 +292,11 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { .build(); } - @Override - public void onInitialize() { - instance = this; - - this.dataFolder = new File(FabricLoader.getInstance().getConfigDir().toFile(), "Terra"); - saveDefaultConfig(); - config.load(this); - LangUtil.load(config.getLanguage(), this); - logger.info("Initializing Terra..."); - - if(!addonRegistry.loadAll()) { - throw new IllegalStateException("Failed to load addons. Please correct addon installations to continue."); - } - logger.info("Loaded addons."); - + public void packInit() { + logger.info("Loading config packs..."); registry.loadAll(this); - logger.info("Loaded packs."); - - Registry.register(Registry.FEATURE, new Identifier("terra", "flora_populator"), POPULATOR_FEATURE); - RegistryKey> floraKey = RegistryKey.of(Registry.CONFIGURED_FEATURE_WORLDGEN, new Identifier("terra", "flora_populator")); - Registry.register(BuiltinRegistries.CONFIGURED_FEATURE, floraKey.getValue(), POPULATOR_CONFIGURED_FEATURE); - registry.forEach(pack -> pack.getBiomeRegistry().forEach((id, biome) -> Registry.register(BuiltinRegistries.BIOME, new Identifier("terra", createBiomeID(pack, id)), createBiome(biome)))); // Register all Terra biomes. - Registry.register(Registry.CHUNK_GENERATOR, new Identifier("terra:terra"), FabricChunkGeneratorWrapper.CODEC); - Registry.register(Registry.BIOME_SOURCE, new Identifier("terra:terra"), TerraBiomeSource.CODEC); if(FabricLoader.getInstance().getEnvironmentType() == EnvType.CLIENT) { registry.forEach(pack -> { @@ -333,6 +312,33 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { }); } + logger.info("Loaded packs."); + } + + @Override + public void onInitialize() { + instance = this; + + this.dataFolder = new File(FabricLoader.getInstance().getConfigDir().toFile(), "Terra"); + saveDefaultConfig(); + config.load(this); + LangUtil.load(config.getLanguage(), this); + logger.info("Initializing Terra..."); + + if(!addonRegistry.loadAll()) { + throw new IllegalStateException("Failed to load addons. Please correct addon installations to continue."); + } + logger.info("Loaded addons."); + + + + Registry.register(Registry.FEATURE, new Identifier("terra", "flora_populator"), POPULATOR_FEATURE); + RegistryKey> floraKey = RegistryKey.of(Registry.CONFIGURED_FEATURE_WORLDGEN, new Identifier("terra", "flora_populator")); + Registry.register(BuiltinRegistries.CONFIGURED_FEATURE, floraKey.getValue(), POPULATOR_CONFIGURED_FEATURE); + + Registry.register(Registry.CHUNK_GENERATOR, new Identifier("terra:terra"), FabricChunkGeneratorWrapper.CODEC); + Registry.register(Registry.BIOME_SOURCE, new Identifier("terra:terra"), TerraBiomeSource.CODEC); + CommandManager manager = new TerraCommandManager(this); try { CommandUtil.registerAll(manager); @@ -340,7 +346,6 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { e.printStackTrace(); // TODO do something here even though this should literally never happen } - CommandRegistrationCallback.EVENT.register((dispatcher, dedicated) -> { int max = manager.getMaxArgumentDepth(); RequiredArgumentBuilder arg = argument("arg" + (max - 1), StringArgumentType.word()); @@ -355,7 +360,7 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { //dispatcher.register(literal("te").redirect(root)); } ); - + logger.info("Finished initialization."); } private RequiredArgumentBuilder assemble(RequiredArgumentBuilder in, CommandManager manager) { diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/block/FabricBlock.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/block/FabricBlock.java index b53bff68f..78c1211b5 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/block/FabricBlock.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/block/FabricBlock.java @@ -7,7 +7,7 @@ import com.dfsek.terra.api.platform.block.BlockFace; import com.dfsek.terra.api.platform.block.BlockType; import com.dfsek.terra.api.platform.block.state.BlockState; import com.dfsek.terra.api.platform.world.World; -import com.dfsek.terra.fabric.FabricAdapter; +import com.dfsek.terra.fabric.util.FabricAdapter; import net.minecraft.block.FluidBlock; import net.minecraft.util.math.BlockPos; import net.minecraft.world.WorldAccess; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/block/data/FabricDirectional.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/block/data/FabricDirectional.java index 4d15d1c16..be4eb316b 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/block/data/FabricDirectional.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/block/data/FabricDirectional.java @@ -2,8 +2,8 @@ package com.dfsek.terra.fabric.block.data; import com.dfsek.terra.api.platform.block.BlockFace; import com.dfsek.terra.api.platform.block.data.Directional; -import com.dfsek.terra.fabric.FabricAdapter; import com.dfsek.terra.fabric.block.FabricBlockData; +import com.dfsek.terra.fabric.util.FabricAdapter; import net.minecraft.block.BlockState; import net.minecraft.state.property.DirectionProperty; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/block/data/FabricOrientable.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/block/data/FabricOrientable.java index 1633df9ab..d8e88d566 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/block/data/FabricOrientable.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/block/data/FabricOrientable.java @@ -2,8 +2,8 @@ package com.dfsek.terra.fabric.block.data; import com.dfsek.terra.api.platform.block.Axis; import com.dfsek.terra.api.platform.block.data.Orientable; -import com.dfsek.terra.fabric.FabricAdapter; import com.dfsek.terra.fabric.block.FabricBlockData; +import com.dfsek.terra.fabric.util.FabricAdapter; import net.minecraft.block.BlockState; import net.minecraft.state.property.EnumProperty; import net.minecraft.util.math.Direction; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/block/data/FabricSlab.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/block/data/FabricSlab.java index 390702582..cf0d0c277 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/block/data/FabricSlab.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/block/data/FabricSlab.java @@ -1,7 +1,7 @@ package com.dfsek.terra.fabric.block.data; import com.dfsek.terra.api.platform.block.data.Slab; -import com.dfsek.terra.fabric.FabricAdapter; +import com.dfsek.terra.fabric.util.FabricAdapter; import net.minecraft.block.BlockState; import net.minecraft.state.property.Properties; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/block/data/FabricStairs.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/block/data/FabricStairs.java index 098cd75d6..d18ec13da 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/block/data/FabricStairs.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/block/data/FabricStairs.java @@ -2,7 +2,7 @@ package com.dfsek.terra.fabric.block.data; import com.dfsek.terra.api.platform.block.BlockFace; import com.dfsek.terra.api.platform.block.data.Stairs; -import com.dfsek.terra.fabric.FabricAdapter; +import com.dfsek.terra.fabric.util.FabricAdapter; import net.minecraft.block.BlockState; import net.minecraft.state.property.Properties; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/FabricChunkGeneratorWrapper.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/FabricChunkGeneratorWrapper.java index 7998a1484..b4efa496e 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/FabricChunkGeneratorWrapper.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/FabricChunkGeneratorWrapper.java @@ -7,8 +7,8 @@ import com.dfsek.terra.api.util.FastRandom; import com.dfsek.terra.api.world.generation.TerraChunkGenerator; import com.dfsek.terra.api.world.locate.AsyncStructureFinder; import com.dfsek.terra.config.pack.ConfigPack; -import com.dfsek.terra.fabric.FabricAdapter; import com.dfsek.terra.fabric.TerraFabricPlugin; +import com.dfsek.terra.fabric.util.FabricAdapter; import com.dfsek.terra.world.TerraWorld; import com.dfsek.terra.world.generation.generators.DefaultChunkGenerator3D; import com.dfsek.terra.world.generation.math.samplers.Sampler; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/PopulatorFeature.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/PopulatorFeature.java index c58fad225..5b009ae1f 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/PopulatorFeature.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/PopulatorFeature.java @@ -2,7 +2,6 @@ package com.dfsek.terra.fabric.generation; import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.platform.world.World; -import com.dfsek.terra.fabric.generation.FabricChunkGeneratorWrapper; import com.mojang.serialization.Codec; import net.minecraft.util.math.BlockPos; import net.minecraft.world.StructureWorldAccess; @@ -22,6 +21,7 @@ public class PopulatorFeature extends Feature { @Override public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { + if(!(chunkGenerator instanceof FabricChunkGeneratorWrapper)) return true; FabricChunkGeneratorWrapper gen = (FabricChunkGeneratorWrapper) chunkGenerator; gen.getHandle().getPopulators().forEach(populator -> populator.populate((World) world, (Chunk) world)); return true; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/handle/FabricWorldHandle.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/handle/FabricWorldHandle.java index 219968106..1f801f1d0 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/handle/FabricWorldHandle.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/handle/FabricWorldHandle.java @@ -1,9 +1,13 @@ package com.dfsek.terra.fabric.handle; +import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.platform.entity.EntityType; +import com.dfsek.terra.api.platform.entity.Player; import com.dfsek.terra.api.platform.handle.WorldHandle; -import com.dfsek.terra.fabric.FabricAdapter; +import com.dfsek.terra.api.util.generic.pair.Pair; import com.dfsek.terra.fabric.block.FabricBlockData; +import com.dfsek.terra.fabric.util.FabricAdapter; +import com.dfsek.terra.fabric.util.WorldEditUtil; import com.mojang.brigadier.StringReader; import com.mojang.brigadier.exceptions.CommandSyntaxException; import net.minecraft.block.BlockState; @@ -33,4 +37,14 @@ public class FabricWorldHandle implements WorldHandle { if(identifier == null) identifier = Identifier.tryParse("minecraft:" + id.toLowerCase(Locale.ROOT)); return (EntityType) Registry.ENTITY_TYPE.get(identifier); } + + @Override + public Pair getSelectedLocation(Player player) { + try { + Class.forName("com.sk89q.worldedit.WorldEdit"); + } catch(ClassNotFoundException e) { + throw new IllegalStateException("WorldEdit is not installed."); + } + return WorldEditUtil.getSelection(player); + } } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/BiomeMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/BiomeMixin.java index ab3bff88a..4a928cbb6 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/BiomeMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/BiomeMixin.java @@ -3,11 +3,13 @@ package com.dfsek.terra.fabric.mixin.implementations; import net.minecraft.world.biome.Biome; import org.spongepowered.asm.mixin.Implements; import org.spongepowered.asm.mixin.Interface; +import org.spongepowered.asm.mixin.Intrinsic; import org.spongepowered.asm.mixin.Mixin; @Mixin(Biome.class) @Implements(@Interface(iface = com.dfsek.terra.api.platform.world.Biome.class, prefix = "terra$", remap = Interface.Remap.NONE)) public abstract class BiomeMixin { + @Intrinsic public Object terra$getHandle() { return this; } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/ChunkGeneratorMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/ChunkGeneratorMixin.java index b766f4692..cc7b82e80 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/ChunkGeneratorMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/ChunkGeneratorMixin.java @@ -3,11 +3,13 @@ package com.dfsek.terra.fabric.mixin.implementations; import net.minecraft.world.gen.chunk.ChunkGenerator; import org.spongepowered.asm.mixin.Implements; import org.spongepowered.asm.mixin.Interface; +import org.spongepowered.asm.mixin.Intrinsic; import org.spongepowered.asm.mixin.Mixin; @Mixin(ChunkGenerator.class) @Implements(@Interface(iface = com.dfsek.terra.api.platform.world.generator.ChunkGenerator.class, prefix = "terra$", remap = Interface.Remap.NONE)) public abstract class ChunkGeneratorMixin { + @Intrinsic public Object terra$getHandle() { return this; } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/block/BlockEntityMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/block/BlockEntityMixin.java index 8672f444d..74c5ccd23 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/block/BlockEntityMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/block/BlockEntityMixin.java @@ -3,14 +3,15 @@ package com.dfsek.terra.fabric.mixin.implementations.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.FabricAdapter; import com.dfsek.terra.fabric.block.FabricBlock; +import com.dfsek.terra.fabric.util.FabricAdapter; 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.Intrinsic; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -29,6 +30,7 @@ public abstract class BlockEntityMixin { @Shadow public abstract boolean hasWorld(); + @Intrinsic public Object terra$getHandle() { return this; } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/block/BlockMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/block/BlockMixin.java index 0875cab40..579b404f8 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/block/BlockMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/block/BlockMixin.java @@ -2,12 +2,13 @@ package com.dfsek.terra.fabric.mixin.implementations.block; import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.platform.block.BlockType; -import com.dfsek.terra.fabric.FabricAdapter; +import com.dfsek.terra.fabric.util.FabricAdapter; import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; 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; @@ -17,6 +18,7 @@ public abstract class BlockMixin { @Shadow private BlockState defaultState; + @Intrinsic public Object terra$getHandle() { return this; } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/block/state/LootableContainerBlockEntityMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/block/state/LootableContainerBlockEntityMixin.java index 9bb319856..f72957753 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/block/state/LootableContainerBlockEntityMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/block/state/LootableContainerBlockEntityMixin.java @@ -6,6 +6,7 @@ import com.dfsek.terra.fabric.mixin.implementations.block.BlockEntityMixin; import net.minecraft.block.entity.LootableContainerBlockEntity; import org.spongepowered.asm.mixin.Implements; import org.spongepowered.asm.mixin.Interface; +import org.spongepowered.asm.mixin.Intrinsic; import org.spongepowered.asm.mixin.Mixin; @Mixin(LootableContainerBlockEntity.class) @@ -15,6 +16,7 @@ public abstract class LootableContainerBlockEntityMixin extends BlockEntityMixin return (Inventory) this; } + @Intrinsic public Object terra$getHandle() { return this; } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/chunk/ChunkRegionMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/chunk/ChunkRegionMixin.java index 55ebe0576..7b12e34d9 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/chunk/ChunkRegionMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/chunk/ChunkRegionMixin.java @@ -51,7 +51,5 @@ public abstract class ChunkRegionMixin { ((ChunkRegion) (Object) this).setBlockState(new BlockPos(x + (centerChunkX << 4), y, z + (centerChunkZ << 4)), ((FabricBlockData) blockData).getHandle(), 0); } - public Object terra$getHandle() { - return this; - } + // getHandle already added in world/ChunkRegionMixin. } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/chunk/WorldChunkMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/chunk/WorldChunkMixin.java index c09e52dc3..56681d0ab 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/chunk/WorldChunkMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/chunk/WorldChunkMixin.java @@ -12,6 +12,7 @@ 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.Intrinsic; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -47,6 +48,7 @@ public abstract class WorldChunkMixin { ((net.minecraft.world.chunk.Chunk) this).setBlockState(new BlockPos(x, y, z), ((FabricBlockData) blockData).getHandle(), false); } + @Intrinsic public Object terra$getHandle() { return this; } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/chunk/data/ProtoChunkMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/chunk/data/ProtoChunkMixin.java index 15a862bed..2b2b87eb4 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/chunk/data/ProtoChunkMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/chunk/data/ProtoChunkMixin.java @@ -9,6 +9,7 @@ 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.Intrinsic; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -26,6 +27,7 @@ public abstract class ProtoChunkMixin { ((net.minecraft.world.chunk.Chunk) this).setBlockState(new BlockPos(x, y, z), ((FabricBlockData) blockData).getHandle(), false); } + @Intrinsic public Object terra$getHandle() { return this; } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/entity/EntityMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/entity/EntityMixin.java index 88d6bfbb6..d829f7fe3 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/entity/EntityMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/entity/EntityMixin.java @@ -2,13 +2,14 @@ package com.dfsek.terra.fabric.mixin.implementations.entity; import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.platform.world.World; -import com.dfsek.terra.fabric.FabricAdapter; +import com.dfsek.terra.fabric.util.FabricAdapter; import net.minecraft.entity.Entity; import net.minecraft.text.LiteralText; import net.minecraft.text.Text; import net.minecraft.util.math.BlockPos; 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; @@ -29,6 +30,7 @@ public abstract class EntityMixin { @Shadow public abstract void sendSystemMessage(Text message, UUID senderUuid); + @Intrinsic public Object terra$getHandle() { return this; } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/entity/EntityTypeMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/entity/EntityTypeMixin.java index ee0cbc0cf..85ffb4c25 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/entity/EntityTypeMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/entity/EntityTypeMixin.java @@ -3,11 +3,13 @@ package com.dfsek.terra.fabric.mixin.implementations.entity; import net.minecraft.entity.EntityType; import org.spongepowered.asm.mixin.Implements; import org.spongepowered.asm.mixin.Interface; +import org.spongepowered.asm.mixin.Intrinsic; import org.spongepowered.asm.mixin.Mixin; @Mixin(EntityType.class) @Implements(@Interface(iface = com.dfsek.terra.api.platform.entity.EntityType.class, prefix = "terra$", remap = Interface.Remap.NONE)) public abstract class EntityTypeMixin { + @Intrinsic public Object terra$getHandle() { return this; } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/entity/ServerCommandSourceMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/entity/ServerCommandSourceMixin.java index caf9b91f1..9b0593521 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/entity/ServerCommandSourceMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/entity/ServerCommandSourceMixin.java @@ -6,6 +6,7 @@ import net.minecraft.text.LiteralText; import net.minecraft.text.Text; 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; @@ -19,6 +20,7 @@ public abstract class ServerCommandSourceMixin { sendFeedback(new LiteralText(message), true); } + @Intrinsic public Object terra$getHandle() { return this; } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/inventory/LockableContainerBlockEntityMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/inventory/LockableContainerBlockEntityMixin.java index 1c14e2ab5..cff0892bb 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/inventory/LockableContainerBlockEntityMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/inventory/LockableContainerBlockEntityMixin.java @@ -6,11 +6,13 @@ import net.minecraft.block.entity.LockableContainerBlockEntity; import net.minecraft.item.Items; import org.spongepowered.asm.mixin.Implements; import org.spongepowered.asm.mixin.Interface; +import org.spongepowered.asm.mixin.Intrinsic; import org.spongepowered.asm.mixin.Mixin; @Mixin(LockableContainerBlockEntity.class) @Implements(@Interface(iface = Inventory.class, prefix = "terra$", remap = Interface.Remap.NONE)) public class LockableContainerBlockEntityMixin { + @Intrinsic public Object terra$getHandle() { return this; } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/inventory/item/ItemMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/inventory/item/ItemMixin.java index b8f7a9be1..b14939c1c 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/inventory/item/ItemMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/inventory/item/ItemMixin.java @@ -4,6 +4,7 @@ import com.dfsek.terra.api.platform.inventory.ItemStack; import net.minecraft.item.Item; 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; @@ -13,6 +14,7 @@ public abstract class ItemMixin { @Shadow public abstract int getMaxDamage(); + @Intrinsic public Object terra$getHandle() { return this; } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/inventory/item/ItemStackMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/inventory/item/ItemStackMixin.java index 55fe05f26..2ae18cdbd 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/inventory/item/ItemStackMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/inventory/item/ItemStackMixin.java @@ -50,6 +50,7 @@ public abstract class ItemStackMixin { setTag(((ItemStack) (Object) meta).getTag()); } + @Intrinsic public Object terra$getHandle() { return this; } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/inventory/meta/EnchantmentMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/inventory/meta/EnchantmentMixin.java index 5fd30638d..eb47a6498 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/inventory/meta/EnchantmentMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/inventory/meta/EnchantmentMixin.java @@ -5,6 +5,7 @@ import net.minecraft.enchantment.Enchantment; import net.minecraft.util.registry.Registry; 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; @@ -19,6 +20,7 @@ public abstract class EnchantmentMixin { @Shadow public abstract boolean canCombine(Enchantment other); + @Intrinsic public Object terra$getHandle() { return this; } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/inventory/meta/ItemStackMetaMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/inventory/meta/ItemStackMetaMixin.java index 56efedc53..23950f944 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/inventory/meta/ItemStackMetaMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/inventory/meta/ItemStackMetaMixin.java @@ -28,6 +28,7 @@ public abstract class ItemStackMetaMixin { @Shadow public abstract void addEnchantment(net.minecraft.enchantment.Enchantment enchantment, int level); + @Intrinsic public Object terra$getHandle() { return this; } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/world/ChunkRegionMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/world/ChunkRegionMixin.java index d87799f57..427a7ae85 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/world/ChunkRegionMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/world/ChunkRegionMixin.java @@ -67,6 +67,7 @@ public abstract class ChunkRegionMixin { return 0; } + @Intrinsic public Object terra$getHandle() { return this; } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/world/ServerWorldMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/world/ServerWorldMixin.java index 15a5c8138..ee5b7755e 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/world/ServerWorldMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/implementations/world/ServerWorldMixin.java @@ -58,6 +58,7 @@ public abstract class ServerWorldMixin { return 0; } + @Intrinsic public Object terra$getHandle() { return this; } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/init/MinecraftClientMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/init/MinecraftClientMixin.java new file mode 100644 index 000000000..4da836a97 --- /dev/null +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/init/MinecraftClientMixin.java @@ -0,0 +1,19 @@ +package com.dfsek.terra.fabric.mixin.init; + +import com.dfsek.terra.fabric.TerraFabricPlugin; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.RunArgs; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(MinecraftClient.class) +public class MinecraftClientMixin { + @Inject(method = "", at = @At(value = "INVOKE", + target = "Lnet/minecraft/client/util/WindowProvider;createWindow(Lnet/minecraft/client/WindowSettings;Ljava/lang/String;Ljava/lang/String;)Lnet/minecraft/client/util/Window;", // sorta arbitrary position, after mod init, before window opens + shift = At.Shift.BEFORE)) + public void injectConstructor(RunArgs args, CallbackInfo callbackInfo) { + TerraFabricPlugin.getInstance().packInit(); // Load during MinecraftClient construction, after other mods have registered blocks and stuff + } +} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/init/ServerMainMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/init/ServerMainMixin.java new file mode 100644 index 000000000..99cc5cfcb --- /dev/null +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/init/ServerMainMixin.java @@ -0,0 +1,16 @@ +package com.dfsek.terra.fabric.mixin.init; + +import com.dfsek.terra.fabric.TerraFabricPlugin; +import net.minecraft.server.Main; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(Main.class) +public class ServerMainMixin { + @Inject(method = "main([Ljava/lang/String;)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/util/registry/DynamicRegistryManager;create()Lnet/minecraft/util/registry/DynamicRegistryManager$Impl;")) + private static void injectConstructor(String[] args, CallbackInfo ci) { + TerraFabricPlugin.getInstance().packInit(); // Load during MinecraftServer construction, after other mods have registered blocks and stuff + } +} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/FabricAdapter.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/util/FabricAdapter.java similarity index 99% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/FabricAdapter.java rename to platforms/fabric/src/main/java/com/dfsek/terra/fabric/util/FabricAdapter.java index 62037173c..8c197d573 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/FabricAdapter.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/util/FabricAdapter.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.fabric; +package com.dfsek.terra.fabric.util; import com.dfsek.terra.api.math.vector.Vector3; import com.dfsek.terra.api.platform.block.Axis; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/util/WorldEditUtil.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/util/WorldEditUtil.java new file mode 100644 index 000000000..159e4fbc8 --- /dev/null +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/util/WorldEditUtil.java @@ -0,0 +1,29 @@ +package com.dfsek.terra.fabric.util; + +import com.dfsek.terra.api.math.vector.Location; +import com.dfsek.terra.api.platform.entity.Player; +import com.dfsek.terra.api.util.generic.pair.Pair; +import com.sk89q.worldedit.IncompleteRegionException; +import com.sk89q.worldedit.WorldEdit; +import com.sk89q.worldedit.math.BlockVector3; +import com.sk89q.worldedit.regions.Region; +import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.world.World; + +public final class WorldEditUtil { + public static Pair getSelection(Player player) { + WorldEdit worldEdit = WorldEdit.getInstance(); + try { + Region selection = worldEdit.getSessionManager() + .get(com.sk89q.worldedit.fabric.FabricAdapter.adaptPlayer((ServerPlayerEntity) player)) + .getSelection(com.sk89q.worldedit.fabric.FabricAdapter.adapt((World) player.getWorld())); + BlockVector3 min = selection.getMinimumPoint(); + BlockVector3 max = selection.getMaximumPoint(); + Location l1 = new Location(player.getWorld(), min.getBlockX(), min.getBlockY(), min.getBlockZ()); + Location l2 = new Location(player.getWorld(), max.getBlockX(), max.getBlockY(), max.getBlockZ()); + return Pair.of(l1, l2); + } catch(IncompleteRegionException e) { + throw new IllegalStateException("No selection has been made", e); + } + } +} diff --git a/platforms/fabric/src/main/resources/terra.mixins.json b/platforms/fabric/src/main/resources/terra.mixins.json index 394dd3742..f87894d87 100644 --- a/platforms/fabric/src/main/resources/terra.mixins.json +++ b/platforms/fabric/src/main/resources/terra.mixins.json @@ -33,9 +33,12 @@ "implementations.world.ServerWorldMixin" ], "client": [ - "access.GeneratorTypeAccessor" + "access.GeneratorTypeAccessor", + "init.MinecraftClientMixin" + ], + "server": [ + "init.ServerMainMixin" ], - "server": [], "injectors": { "defaultRequire": 1 },