From b294e80f2fb78a82586c101c96d67f68ad212774 Mon Sep 17 00:00:00 2001 From: Runemoro Date: Sun, 15 Jul 2018 11:38:20 -0400 Subject: [PATCH] Add mod support for WorldEdit, Advanced Rocketry, Mystcraft, Journeymap, ClimateControl, and Creeping Nether Fixes #11 Fixes #5 Fixes #3 Fixes #19 --- build.gradle | 8 ++- .../core/{ => client}/MixinRenderGlobal.java | 2 +- .../jeid/mixin/modsupport/MixinBaseBlock.java | 24 +++++++++ .../mixin/modsupport/MixinBiomeHandler.java | 52 +++++++++++++++++++ .../mixin/modsupport/MixinBiomeReplacer.java | 34 ++++++++++++ .../jeid/mixin/modsupport/MixinChunkMD.java | 24 +++++++++ .../modsupport/MixinDimensionManager.java | 25 +++++++++ .../mixin/modsupport/MixinEntityPortal.java | 26 ++++++++++ src/main/resources/mixins.jeid.core.json | 6 +-- .../resources/mixins.jeid.modsupport.json | 8 ++- 10 files changed, 203 insertions(+), 6 deletions(-) rename src/main/java/org/dimdev/jeid/mixin/core/{ => client}/MixinRenderGlobal.java (97%) create mode 100644 src/main/java/org/dimdev/jeid/mixin/modsupport/MixinBaseBlock.java create mode 100644 src/main/java/org/dimdev/jeid/mixin/modsupport/MixinBiomeHandler.java create mode 100644 src/main/java/org/dimdev/jeid/mixin/modsupport/MixinBiomeReplacer.java create mode 100644 src/main/java/org/dimdev/jeid/mixin/modsupport/MixinChunkMD.java create mode 100644 src/main/java/org/dimdev/jeid/mixin/modsupport/MixinDimensionManager.java create mode 100644 src/main/java/org/dimdev/jeid/mixin/modsupport/MixinEntityPortal.java diff --git a/build.gradle b/build.gradle index 09ab032..9c409f4 100644 --- a/build.gradle +++ b/build.gradle @@ -39,12 +39,18 @@ dependencies { compileOnly "2561:393:twilightforest-1.12.2-3.7.424-universal@jar" compileOnly "2569:273:Thaumcraft-1.12.2-6.1.BETA16@jar" compileOnly "2572:684:AbyssalCraft-1.12.2-1.9.4.10@jar" + compileOnly "2509:208:Creeping+Nether-2.0@jar" + compileOnly "2497:541:GeographiCraft-1.12-0.8.9b@jar" + compileOnly "2581:550:mystcraft-1.12.2-0.13.4.05@jar" + compileOnly "2575:801:AdvancedRocketry-1.12.2-1.4.0-88-universal@jar" + compileOnly "2460:570:worldedit-forge-mc1.12-6.1.8-dist@jar" + compileOnly "2498:312:journeymap-1.12.2-5.5.2@jar" } def travisBuildNumber = System.getenv("TRAVIS_BUILD_NUMBER") def versionSuffix = travisBuildNumber != null ? travisBuildNumber : "SNAPSHOT" -version "1.0.0-$versionSuffix" +version "1.0.1-$versionSuffix" group "org.dimdev.jeid" archivesBaseName = "JustEnoughIDs" diff --git a/src/main/java/org/dimdev/jeid/mixin/core/MixinRenderGlobal.java b/src/main/java/org/dimdev/jeid/mixin/core/client/MixinRenderGlobal.java similarity index 97% rename from src/main/java/org/dimdev/jeid/mixin/core/MixinRenderGlobal.java rename to src/main/java/org/dimdev/jeid/mixin/core/client/MixinRenderGlobal.java index 27f0dc4..94f8455 100644 --- a/src/main/java/org/dimdev/jeid/mixin/core/MixinRenderGlobal.java +++ b/src/main/java/org/dimdev/jeid/mixin/core/client/MixinRenderGlobal.java @@ -1,4 +1,4 @@ -package org.dimdev.jeid.mixin.core; +package org.dimdev.jeid.mixin.core.client; import net.minecraft.block.Block; import net.minecraft.block.SoundType; diff --git a/src/main/java/org/dimdev/jeid/mixin/modsupport/MixinBaseBlock.java b/src/main/java/org/dimdev/jeid/mixin/modsupport/MixinBaseBlock.java new file mode 100644 index 0000000..bfd534b --- /dev/null +++ b/src/main/java/org/dimdev/jeid/mixin/modsupport/MixinBaseBlock.java @@ -0,0 +1,24 @@ +package org.dimdev.jeid.mixin.modsupport; + +import com.sk89q.worldedit.blocks.BaseBlock; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Overwrite; +import org.spongepowered.asm.mixin.Pseudo; +import org.spongepowered.asm.mixin.Shadow; + +@Pseudo +@Mixin(BaseBlock.class) +public class MixinBaseBlock { + @Shadow private short id; + + @Overwrite(remap = false) + protected final void internalSetId(int id) { + if (id > Short.MAX_VALUE) { + throw new IllegalArgumentException("Can't have a block ID above 32767 (" + id + " given)"); + } else if (id < 0) { + throw new IllegalArgumentException("Can't have a block ID below 0"); + } else { + this.id = (short)id; + } + } +} diff --git a/src/main/java/org/dimdev/jeid/mixin/modsupport/MixinBiomeHandler.java b/src/main/java/org/dimdev/jeid/mixin/modsupport/MixinBiomeHandler.java new file mode 100644 index 0000000..a89394e --- /dev/null +++ b/src/main/java/org/dimdev/jeid/mixin/modsupport/MixinBiomeHandler.java @@ -0,0 +1,52 @@ +package org.dimdev.jeid.mixin.modsupport; + +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import net.minecraft.world.biome.Biome; +import net.minecraft.world.chunk.Chunk; +import net.minecraftforge.fml.common.network.NetworkRegistry; +import org.dimdev.jeid.INewChunk; +import org.dimdev.jeid.network.BiomeChangeMessage; +import org.dimdev.jeid.network.MessageManager; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Overwrite; +import org.spongepowered.asm.mixin.Pseudo; +import zmaster587.advancedRocketry.util.BiomeHandler; + +@Pseudo +@Mixin(BiomeHandler.class) +public class MixinBiomeHandler { + @Overwrite(remap = false) + public static void changeBiome(World world, int biomeId, BlockPos pos) { + changeBiome(world, biomeId, world.getChunkFromBlockCoords(pos), pos); + } + + @Overwrite(remap = false) + public static void changeBiome(World world, int biomeId, Chunk chunk, BlockPos pos) { + Biome biome = world.getBiome(pos); + Biome biomeTo = Biome.getBiome(biomeId); + + if (biome == biomeTo) { + return; + } + + int x = pos.getX(); + int z = pos.getZ(); + + if (biome.topBlock != biomeTo.topBlock) { + int topBlockY = chunk.getHeightValue(x & 15, z & 15) - 1; + + while (!world.getBlockState(new BlockPos(x, topBlockY, z)).isOpaqueCube() && topBlockY > 0) topBlockY--; + if (topBlockY == 0) return; + + if (chunk.getBlockState(x & 15, topBlockY, z & 15) == biome.topBlock) { + chunk.setBlockState(new BlockPos(x & 15, topBlockY, z & 15), biomeTo.topBlock); + } + } + + ((INewChunk) chunk).getIntBiomeArray()[(pos.getZ() & 15) << 4 | pos.getX() & 15] = biomeId; + + NetworkRegistry.TargetPoint point = new NetworkRegistry.TargetPoint(world.provider.getDimension(), pos.getX(), pos.getY(), pos.getZ(), 300); + MessageManager.CHANNEL.sendToAllAround(new BiomeChangeMessage(pos.getX(), pos.getY(), biomeId), point); + } +} diff --git a/src/main/java/org/dimdev/jeid/mixin/modsupport/MixinBiomeReplacer.java b/src/main/java/org/dimdev/jeid/mixin/modsupport/MixinBiomeReplacer.java new file mode 100644 index 0000000..eca2175 --- /dev/null +++ b/src/main/java/org/dimdev/jeid/mixin/modsupport/MixinBiomeReplacer.java @@ -0,0 +1,34 @@ +package org.dimdev.jeid.mixin.modsupport; + +import com.xcompwiz.mystcraft.symbol.symbols.SymbolFloatingIslands; +import net.minecraft.world.biome.Biome; +import net.minecraft.world.chunk.Chunk; +import org.dimdev.jeid.INewChunk; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Overwrite; +import org.spongepowered.asm.mixin.Shadow; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; + +@Mixin(SymbolFloatingIslands.BiomeReplacer.class) +public class MixinBiomeReplacer { + @Shadow private HashMap, boolean[]> chunks; + @Shadow private Biome biome; + + @Overwrite(remap = false) + public void finalizeChunk(Chunk chunk, int chunkX, int chunkZ) { + boolean[] modified = chunks.remove(Arrays.asList(chunkX, chunkZ)); + + if (modified != null) { + int[] biomes = ((INewChunk) chunk).getIntBiomeArray(); + + for(int coords = 0; coords < modified.length; ++coords) { + if (modified[coords]) { + biomes[coords] = Biome.getIdForBiome(biome) & 255; + } + } + } + } +} diff --git a/src/main/java/org/dimdev/jeid/mixin/modsupport/MixinChunkMD.java b/src/main/java/org/dimdev/jeid/mixin/modsupport/MixinChunkMD.java new file mode 100644 index 0000000..b1dee62 --- /dev/null +++ b/src/main/java/org/dimdev/jeid/mixin/modsupport/MixinChunkMD.java @@ -0,0 +1,24 @@ +package org.dimdev.jeid.mixin.modsupport; + +import journeymap.client.model.ChunkMD; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import net.minecraft.world.biome.Biome; +import net.minecraft.world.chunk.Chunk; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Overwrite; +import org.spongepowered.asm.mixin.Shadow; + +import javax.annotation.Nullable; + +@Mixin(ChunkMD.class) +public abstract class MixinChunkMD { + @Shadow public abstract World getWorld(); + @Shadow public abstract Chunk getChunk(); + + @Overwrite(remap = false) + @Nullable + public Biome getBiome(final BlockPos pos) { + return getChunk().getBiome(pos, getWorld().getBiomeProvider()); + } +} diff --git a/src/main/java/org/dimdev/jeid/mixin/modsupport/MixinDimensionManager.java b/src/main/java/org/dimdev/jeid/mixin/modsupport/MixinDimensionManager.java new file mode 100644 index 0000000..b4d90da --- /dev/null +++ b/src/main/java/org/dimdev/jeid/mixin/modsupport/MixinDimensionManager.java @@ -0,0 +1,25 @@ +package org.dimdev.jeid.mixin.modsupport; + +import climateControl.DimensionManager; +import net.minecraft.init.Biomes; +import net.minecraft.world.biome.Biome; +import net.minecraft.world.chunk.Chunk; +import org.dimdev.jeid.INewChunk; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Overwrite; +import org.spongepowered.asm.mixin.Pseudo; + +@Pseudo +@Mixin(DimensionManager.class) +public class MixinDimensionManager { + @Overwrite(remap = false) + private boolean hasOnlySea(Chunk tested) { + for (int biome : ((INewChunk) tested).getIntBiomeArray()) { + if (biome != 0 && biome != Biome.getIdForBiome(Biomes.DEEP_OCEAN)) { + return false; + } + } + + return true; + } +} diff --git a/src/main/java/org/dimdev/jeid/mixin/modsupport/MixinEntityPortal.java b/src/main/java/org/dimdev/jeid/mixin/modsupport/MixinEntityPortal.java new file mode 100644 index 0000000..ba4d8a1 --- /dev/null +++ b/src/main/java/org/dimdev/jeid/mixin/modsupport/MixinEntityPortal.java @@ -0,0 +1,26 @@ +package org.dimdev.jeid.mixin.modsupport; + +import com.cutievirus.creepingnether.entity.EntityPortal; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import net.minecraft.world.biome.Biome; +import net.minecraft.world.chunk.Chunk; +import org.dimdev.jeid.INewChunk; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Overwrite; +import org.spongepowered.asm.mixin.Pseudo; +import org.spongepowered.asm.mixin.Shadow; + +@Pseudo +@Mixin(EntityPortal.class) +public class MixinEntityPortal { + @Shadow private static Biome toBiome; + + @Overwrite(remap = false) + public static void corruptBiome(World world, BlockPos pos) { + if (world.isBlockLoaded(pos)) { + Chunk chunk = world.getChunkFromBlockCoords(pos); + ((INewChunk) chunk).getIntBiomeArray()[(pos.getZ() & 15) << 4 | pos.getX() & 15] = Biome.getIdForBiome(toBiome); + } + } +} diff --git a/src/main/resources/mixins.jeid.core.json b/src/main/resources/mixins.jeid.core.json index f326627..bbd881a 100644 --- a/src/main/resources/mixins.jeid.core.json +++ b/src/main/resources/mixins.jeid.core.json @@ -15,11 +15,11 @@ "MixinSPacketChunkData", "MixinGenLayerVoronoiZoom", "MixinChunkPrimer", - "MixinChunkProviderServer", - "MixinRenderGlobal" + "MixinChunkProviderServer" ], "client": [ - "client.MixinChunk" + "client.MixinChunk", + "client.MixinRenderGlobal" ], "injectors": { "maxShiftBy": 10 diff --git a/src/main/resources/mixins.jeid.modsupport.json b/src/main/resources/mixins.jeid.modsupport.json index 00e4be5..8a0ddf4 100644 --- a/src/main/resources/mixins.jeid.modsupport.json +++ b/src/main/resources/mixins.jeid.modsupport.json @@ -11,7 +11,13 @@ "MixinBOPCommand", "MixinBlockTFMagicLogSpecial", "MixinUtils", - "MixinCleansingRitualMessage" + "MixinCleansingRitualMessage", + "MixinEntityPortal", + "MixinDimensionManager", + "MixinBiomeReplacer", + "MixinBiomeHandler", + "MixinBaseBlock", + "MixinChunkMD" ], "injectors": { "maxShiftBy": 10