diff --git a/platforms/sponge/build.gradle.kts b/platforms/sponge/build.gradle.kts index 8173e9dff..bd9b57d8f 100644 --- a/platforms/sponge/build.gradle.kts +++ b/platforms/sponge/build.gradle.kts @@ -17,6 +17,10 @@ repositories { dependencies { "compileOnly"("org.spongepowered:spongeapi:8.0.0-SNAPSHOT") + + "annotationProcessor"("org.spongepowered:mixin:0.8.2:processor") + + "compileOnly"("org.spongepowered:mixin:0.8.2") "shadedApi"(project(":common")) "shadedImplementation"("org.yaml:snakeyaml:1.27") "shadedImplementation"("com.googlecode.json-simple:json-simple:1.1.1") @@ -34,4 +38,12 @@ minecraft { server() client() } +} + +tasks.named("jar") { + manifest { + attributes( + mapOf("MixinConfigs" to "terra.mixins.json") + ) + } } \ No newline at end of file diff --git a/platforms/sponge/src/main/java/com/dfsek/terra/sponge/TerraSpongePlugin.java b/platforms/sponge/src/main/java/com/dfsek/terra/sponge/TerraSpongePlugin.java index 4b4c5138d..953076eb4 100644 --- a/platforms/sponge/src/main/java/com/dfsek/terra/sponge/TerraSpongePlugin.java +++ b/platforms/sponge/src/main/java/com/dfsek/terra/sponge/TerraSpongePlugin.java @@ -192,6 +192,10 @@ public class TerraSpongePlugin implements TerraPlugin { return profiler; } + public Map> getWorldMap() { + return worldMap; + } + @Addon("Terra-Sponge") @Author("Terra") @Version("1.0.0") diff --git a/platforms/sponge/src/main/java/com/dfsek/terra/sponge/handle/SpongeWorldHandle.java b/platforms/sponge/src/main/java/com/dfsek/terra/sponge/handle/SpongeWorldHandle.java index 86682b8b2..1a2debacd 100644 --- a/platforms/sponge/src/main/java/com/dfsek/terra/sponge/handle/SpongeWorldHandle.java +++ b/platforms/sponge/src/main/java/com/dfsek/terra/sponge/handle/SpongeWorldHandle.java @@ -3,7 +3,7 @@ package com.dfsek.terra.sponge.handle; import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.platform.entity.EntityType; import com.dfsek.terra.api.platform.handle.WorldHandle; -import com.dfsek.terra.sponge.SpongeAdapter; +import com.dfsek.terra.sponge.intern.util.SpongeAdapter; import org.spongepowered.api.Sponge; import org.spongepowered.api.block.BlockState; diff --git a/platforms/sponge/src/main/java/com/dfsek/terra/sponge/intern/mixin/ServerLevelMixin.java b/platforms/sponge/src/main/java/com/dfsek/terra/sponge/intern/mixin/ServerLevelMixin.java new file mode 100644 index 000000000..e5b05e310 --- /dev/null +++ b/platforms/sponge/src/main/java/com/dfsek/terra/sponge/intern/mixin/ServerLevelMixin.java @@ -0,0 +1,35 @@ +package com.dfsek.terra.sponge.intern.mixin; + +import com.dfsek.terra.api.util.generic.pair.Pair; +import com.dfsek.terra.sponge.TerraSpongePlugin; +import com.dfsek.terra.sponge.intern.SpongeChunkGeneratorWrapper; +import com.dfsek.terra.world.TerraWorld; +import net.minecraft.server.level.ServerChunkCache; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.dimension.DimensionType; +import org.spongepowered.api.world.server.ServerWorld; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +@Mixin(ServerLevel.class) +public abstract class ServerLevelMixin { + @Shadow + @Final + private ServerChunkCache chunkSource; + + @Redirect(method = "", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/Level;updateSkyBrightness()V")) + public void injectConstructor(Level level) { + if(chunkSource.getGenerator() instanceof SpongeChunkGeneratorWrapper) { + SpongeChunkGeneratorWrapper chunkGeneratorWrapper = (SpongeChunkGeneratorWrapper) chunkSource.getGenerator(); + DimensionType dimensionType = ((Level) (Object) this).dimensionType(); + TerraSpongePlugin.getInstance().getWorldMap().put(dimensionType, Pair.of((ServerWorld) this, new TerraWorld((com.dfsek.terra.api.platform.world.World) this, chunkGeneratorWrapper.getPack(), TerraSpongePlugin.getInstance()))); + chunkGeneratorWrapper.setDimensionType(dimensionType); + TerraSpongePlugin.getInstance().logger().info("Registered world " + this + " to dimension type " + dimensionType); + } + ((Level) (Object) this).updateSkyBrightness(); + } +} diff --git a/platforms/sponge/src/main/java/com/dfsek/terra/sponge/intern/util/SpongeAdapter.java b/platforms/sponge/src/main/java/com/dfsek/terra/sponge/intern/util/SpongeAdapter.java index a9c892933..edbb200d5 100644 --- a/platforms/sponge/src/main/java/com/dfsek/terra/sponge/intern/util/SpongeAdapter.java +++ b/platforms/sponge/src/main/java/com/dfsek/terra/sponge/intern/util/SpongeAdapter.java @@ -1,7 +1,10 @@ package com.dfsek.terra.sponge.intern.util; import com.dfsek.terra.api.math.vector.Vector3; +import com.dfsek.terra.api.platform.block.BlockData; +import com.dfsek.terra.sponge.world.block.data.SpongeBlockData; import net.minecraft.core.BlockPos; +import org.spongepowered.api.block.BlockState; public final class SpongeAdapter { public static Vector3 adapt(BlockPos pos) { @@ -11,4 +14,8 @@ public final class SpongeAdapter { public static BlockPos adapt(Vector3 vec) { return new BlockPos(vec.getBlockX(), vec.getBlockY(), vec.getBlockZ()); } + + public static BlockData adapt(BlockState state) { + return new SpongeBlockData(state); + } } diff --git a/platforms/sponge/src/main/resources/META-INF/MANIFEST.MF b/platforms/sponge/src/main/resources/META-INF/MANIFEST.MF new file mode 100644 index 000000000..0bb1be492 --- /dev/null +++ b/platforms/sponge/src/main/resources/META-INF/MANIFEST.MF @@ -0,0 +1 @@ +MixinConfigs: terra.mixins.json diff --git a/platforms/sponge/src/main/resources/terra.mixins.json b/platforms/sponge/src/main/resources/terra.mixins.json new file mode 100644 index 000000000..b6f6ce0ac --- /dev/null +++ b/platforms/sponge/src/main/resources/terra.mixins.json @@ -0,0 +1,17 @@ +{ + "required": true, + "package": "com.dfsek.terra.sponge.intern.mixin", + "compatibilityLevel": "JAVA_8", + "refmap": "terra-refmap.json", + "mixins": [ + "ServerLevelMixin" + ], + "client": [ + ], + "server": [ + ], + "injectors": { + "defaultRequire": 1 + }, + "minVersion": "0.8" +} \ No newline at end of file