diff --git a/dependencies.gradle b/dependencies.gradle index 50ec935..2aefa8f 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -10,7 +10,7 @@ dependencies { transitive = false } compileOnly "curse.maven:chunkpregen-267193:3756388" - compileOnly('com.github.GTNewHorizons:NotEnoughItems:2.6.1-GTNH:dev') + compileOnly('com.github.GTNewHorizons:NotEnoughItems:2.7.64-GTNH:dev') compileOnly("com.gregoriust.gregtech:gregtech_1.7.10:6.15.01:dev") { transitive = false } @@ -19,7 +19,7 @@ dependencies { compileOnly("curse.maven:thermalexpansion-69163:2388759") compileOnly("curse.maven:matteroverdrive-229694:2331162") compileOnly("curse.maven:projecte-226410:2340786") - compileOnly('com.github.GTNewHorizons:Botania:1.11.3-GTNH:dev') { + compileOnly('com.github.GTNewHorizons:Botania:1.12.16-GTNH:dev') { transitive = false } compileOnly("org.projectlombok:lombok:1.18.22") { @@ -46,6 +46,6 @@ dependencies { compileOnly(deobfMaven(curseMaven, "curse.maven:applied-energistics-2-223794:2296430")) // Provides deobf support like in FG2 - runtimeOnlyNonPublishable('com.github.GTNewHorizons:CodeChickenLib:1.2.1:dev') - runtimeOnlyNonPublishable('com.github.GTNewHorizons:CodeChickenCore:1.2.1:dev') + runtimeOnlyNonPublishable('com.github.GTNewHorizons:CodeChickenLib:1.3.0:dev') + runtimeOnlyNonPublishable('com.github.GTNewHorizons:CodeChickenCore:1.4.3:dev') } diff --git a/gradle.properties b/gradle.properties index 369f8d4..cc52de1 100644 --- a/gradle.properties +++ b/gradle.properties @@ -151,7 +151,7 @@ modrinthProjectId = xTJanN3v # type can be one of [project, version], # and the name is the Modrinth project or version slug/id of the other mod. # Example: required-project:fplib;optional-project:gasstation;incompatible-project:gregtech -# Note: GTNH Mixins is automatically set as a required dependency if usesMixins = true +# Note: UniMixins is automatically set as a required dependency if usesMixins = true. modrinthRelations = # Publishing to CurseForge requires you to set the CURSEFORGE_TOKEN environment variable to one of your CurseForge API tokens. diff --git a/settings.gradle b/settings.gradle index 017908f..7bc6413 100644 --- a/settings.gradle +++ b/settings.gradle @@ -33,7 +33,7 @@ pluginManagement { } plugins { - id 'com.gtnewhorizons.gtnhsettingsconvention' version '1.0.38' + id 'com.gtnewhorizons.gtnhsettingsconvention' version '1.0.41' } diff --git a/src/main/java/org/embeddedt/archaicfix/ArchaicCore.java b/src/main/java/org/embeddedt/archaicfix/ArchaicCore.java index 75621a7..6a68f97 100644 --- a/src/main/java/org/embeddedt/archaicfix/ArchaicCore.java +++ b/src/main/java/org/embeddedt/archaicfix/ArchaicCore.java @@ -1,38 +1,41 @@ package org.embeddedt.archaicfix; -import com.google.common.collect.ImmutableMap; import com.gtnewhorizon.gtnhmixins.IEarlyMixinLoader; +import com.gtnewhorizon.gtnhmixins.builders.IMixins; import cpw.mods.fml.relauncher.IFMLLoadingPlugin; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.embeddedt.archaicfix.asm.Mixin; -import org.embeddedt.archaicfix.asm.TargetedMod; import org.embeddedt.archaicfix.asm.transformer.VampirismTransformer; import org.embeddedt.archaicfix.config.ArchaicConfig; import org.embeddedt.archaicfix.config.ConfigException; import org.embeddedt.archaicfix.config.ConfigurationManager; import org.embeddedt.archaicfix.helpers.LetsEncryptHelper; -import java.util.*; -import java.util.stream.Collectors; +import java.util.List; +import java.util.Map; +import java.util.Set; @IFMLLoadingPlugin.Name("ArchaicCore") @IFMLLoadingPlugin.MCVersion("1.7.10") public class ArchaicCore implements IFMLLoadingPlugin, IEarlyMixinLoader { + public static final Logger LOGGER = LogManager.getLogger("ArchaicCore"); + static { VampirismTransformer.init(); try { ConfigurationManager.registerConfig(ArchaicConfig.class); - } catch(ConfigException e) { + } catch (ConfigException e) { throw new RuntimeException(e); } LetsEncryptHelper.replaceSSLContext(); } + @Override public String[] getASMTransformerClass() { - return new String[] { - "org.embeddedt.archaicfix.asm.ArchaicTransformer" + return new String[]{ + "org.embeddedt.archaicfix.asm.ArchaicTransformer" }; } @@ -61,38 +64,8 @@ public String getMixinConfig() { return "mixins.archaicfix.early.json"; } - public static Set coreMods = new HashSet<>(); - - private static final ImmutableMap MODS_BY_CLASS = ImmutableMap.builder() - .put("optifine.OptiFineForgeTweaker", TargetedMod.OPTIFINE) - .put("fastcraft.Tweaker", TargetedMod.FASTCRAFT) - .put("cofh.asm.LoadingPlugin", TargetedMod.COFHCORE) - .put("com.mitchej123.hodgepodge.core.HodgepodgeCore", TargetedMod.HODGEPODGE) - .build(); - - private static void detectCoreMods(Set loadedCoreMods) { - MODS_BY_CLASS.forEach((key, value) -> { - if (loadedCoreMods.contains(key)) - coreMods.add(value); - }); - } - @Override public List getMixins(Set loadedCoreMods) { - List mixins = new ArrayList<>(); - detectCoreMods(loadedCoreMods); - LOGGER.info("Detected coremods: [{}]", coreMods.stream().map(TargetedMod::name).collect(Collectors.joining(", "))); - final List notLoading = new ArrayList<>(); - - for (Mixin mixin : Mixin.values()) { - if (mixin.getPhase() == Mixin.Phase.EARLY && mixin.shouldLoadSide() && mixin.getFilter().test(coreMods)) { - mixins.add(mixin.getMixin()); - } else { - notLoading.add(mixin.getMixin()); - } - } - - LOGGER.info("Not loading the following early mixins: [{}]", String.join(", ", notLoading)); - return mixins; + return IMixins.getEarlyMixins(Mixin.class, loadedCoreMods); } } diff --git a/src/main/java/org/embeddedt/archaicfix/asm/LateMixinPlugin.java b/src/main/java/org/embeddedt/archaicfix/asm/LateMixinPlugin.java index bf3790a..81cf951 100644 --- a/src/main/java/org/embeddedt/archaicfix/asm/LateMixinPlugin.java +++ b/src/main/java/org/embeddedt/archaicfix/asm/LateMixinPlugin.java @@ -2,16 +2,14 @@ import com.gtnewhorizon.gtnhmixins.ILateMixinLoader; import com.gtnewhorizon.gtnhmixins.LateMixin; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; -import org.embeddedt.archaicfix.ArchaicCore; +import com.gtnewhorizon.gtnhmixins.builders.IMixins; -import java.util.*; -import java.util.stream.Collectors; +import java.util.List; +import java.util.Set; @LateMixin public class LateMixinPlugin implements ILateMixinLoader { - private static final Logger LOGGER = LogManager.getLogger(); + @Override public String getMixinConfig() { return "mixins.archaicfix.late.json"; @@ -19,23 +17,6 @@ public String getMixinConfig() { @Override public List getMixins(Set loadedMods) { - List mixins = new ArrayList<>(); - Set validMods = new HashSet<>(ArchaicCore.coreMods); - HashMap modById = new HashMap<>(); - for(TargetedMod t : TargetedMod.values()) { - if(t.getModId() != null) - modById.put(t.getModId(), t); - } - for(String modId : loadedMods) { - TargetedMod t = modById.get(modId); - if(t != null) - validMods.add(t); - } - LOGGER.info("Detected mods: [" + validMods.stream().map(TargetedMod::name).collect(Collectors.joining(", ")) + "]"); - for(Mixin mixin : Mixin.values()) { - if(mixin.getPhase() == Mixin.Phase.LATE && mixin.shouldLoadSide() && mixin.getFilter().test(validMods)) - mixins.add(mixin.getMixin()); - } - return mixins; + return IMixins.getLateMixins(Mixin.class, loadedMods); } } diff --git a/src/main/java/org/embeddedt/archaicfix/asm/Mixin.java b/src/main/java/org/embeddedt/archaicfix/asm/Mixin.java index 8468d45..aba00a2 100644 --- a/src/main/java/org/embeddedt/archaicfix/asm/Mixin.java +++ b/src/main/java/org/embeddedt/archaicfix/asm/Mixin.java @@ -1,188 +1,288 @@ package org.embeddedt.archaicfix.asm; -import cpw.mods.fml.relauncher.FMLLaunchHandler; +import com.gtnewhorizon.gtnhmixins.builders.IMixins; +import com.gtnewhorizon.gtnhmixins.builders.MixinBuilder; import lombok.Getter; import lombok.RequiredArgsConstructor; import org.embeddedt.archaicfix.config.ArchaicConfig; import org.embeddedt.archaicfix.helpers.DragonAPIHelper; -import java.util.Collection; -import java.util.Locale; -import java.util.function.Predicate; +import javax.annotation.Nonnull; +@Getter @RequiredArgsConstructor -public enum Mixin { - // COMMON MIXINS - common_chickenchunks_MixinPlayerChunkViewerManager(Side.COMMON, Phase.EARLY, require(TargetedMod.CHICKENCHUNKS), "chickenchunks.MixinPlayerChunkViewerManager"), - common_core_AccessorEntityLiving(Side.COMMON, Phase.EARLY, always(), "core.AccessorEntityLiving"), - common_core_MixinEntityPlayerMP(Side.COMMON, Phase.EARLY, always(), "core.MixinEntityPlayerMP"), - common_core_MixinWorldServer(Side.COMMON, Phase.EARLY, always(), "core.MixinWorldServer"), - common_core_MixinMapGenStructure(Side.COMMON, Phase.EARLY, always(), "core.MixinMapGenStructure"), - common_core_MixinEntityVillager(Side.COMMON, Phase.EARLY, always(), "core.MixinEntityVillager"), - common_core_MixinMerchantRecipe(Side.COMMON, Phase.EARLY, always(), "core.MixinMerchantRecipe"), - common_core_MixinAxisAlignedBB(Side.COMMON, Phase.EARLY, always(), "core.MixinAxisAlignedBB"), - common_core_MixinMaterialLiquid(Side.COMMON, Phase.EARLY, always(), "core.MixinMaterialLiquid"), - common_core_MixinChunkProviderServer(Side.COMMON, Phase.EARLY, always(), "core.MixinChunkProviderServer"), - common_core_MixinChunkIOProvider(Side.COMMON, Phase.EARLY, always(), "core.MixinChunkIOProvider"), - common_core_MixinCraftingManager(Side.COMMON, Phase.EARLY, always(), "core.MixinCraftingManager"), - common_core_MixinSpawnerAnimals(Side.COMMON, Phase.EARLY, always(), "core.MixinSpawnerAnimals"), - common_core_MixinShapedOreRecipe(Side.COMMON, Phase.EARLY, always(), "core.MixinShapedOreRecipe"), - common_core_MixinLongHashMap(Side.COMMON, Phase.EARLY, always(), "core.MixinLongHashMap"), - common_core_MixinBlock(Side.COMMON, Phase.EARLY, always(), "core.MixinBlock"), - common_core_MixinBlock_Late(Side.COMMON, Phase.EARLY, always(), "core.MixinBlock_Late"), - common_core_MixinEnchantmentHelper(Side.COMMON, Phase.EARLY, always(), "core.MixinEnchantmentHelper"), - common_core_MixinWorldChunkManager(Side.COMMON, Phase.EARLY, always(), "core.MixinWorldChunkManager"), - common_core_MixinShapedRecipes(Side.COMMON, Phase.EARLY, always(), "core.MixinShapedRecipes"), - common_core_MixinShapelessOreRecipe(Side.COMMON, Phase.EARLY, always(), "core.MixinShapelessOreRecipe"), - common_core_MixinShapelessRecipes(Side.COMMON, Phase.EARLY, always(), "core.MixinShapelessRecipes"), - common_core_MixinEntityLiving(Side.COMMON, Phase.EARLY, always(), "core.MixinEntityLiving"), - common_core_MixinEntityLivingBase_EarlyXpDrop(Side.COMMON, Phase.EARLY, m -> ArchaicConfig.dropXpImmediatelyOnDeath, "core.MixinEntityLivingBase_EarlyXpDrop"), - common_core_MixinWorld(Side.COMMON, Phase.EARLY, always(), "core.MixinWorld"), - common_core_MixinWorld_UpdateEntities(Side.COMMON, Phase.EARLY, avoid(TargetedMod.HODGEPODGE), "core.MixinWorld_UpdateEntities"), - common_core_MixinEntityTrackerEntry(Side.COMMON, Phase.EARLY, always(), "core.MixinEntityTrackerEntry"), - common_core_MixinEntityXPOrb(Side.COMMON, Phase.EARLY, always(), "core.MixinEntityXPOrb"), - common_core_MixinEntityItem(Side.COMMON, Phase.EARLY, avoid(TargetedMod.SHIPSMOD).and(m -> ArchaicConfig.itemLagReduction), "core.MixinEntityItem"), - common_core_MixinEntity(Side.COMMON, Phase.EARLY, always(), "core.MixinEntity"), - common_core_MixinForgeChunkManager(Side.COMMON, Phase.EARLY, always(), "core.MixinForgeChunkManager"), - common_core_MixinChunk(Side.COMMON, Phase.EARLY, always(), "core.MixinChunk"), - common_core_MixinStructureStart(Side.COMMON, Phase.EARLY, always(), "core.MixinStructureStart"), - common_core_MixinOreDictionary(Side.COMMON, Phase.EARLY, always(), "core.MixinOreDictionary"), - common_core_MixinChunkProviderHell(Side.COMMON, Phase.EARLY, always(), "core.MixinChunkProviderHell"), - common_core_MixinASMData(Side.COMMON, Phase.EARLY, always(), "core.MixinASMData"), - common_core_MixinModCandidate(Side.COMMON, Phase.EARLY, avoid(TargetedMod.COFHCORE), "core.MixinModCandidate"), - common_core_MixinNetworkDispatcher(Side.COMMON, Phase.EARLY, m -> ArchaicConfig.fixLoginRaceCondition, "core.MixinNetworkDispatcher"), - common_core_MixinNetworkManager(Side.COMMON, Phase.EARLY, m -> ArchaicConfig.fixLoginRaceCondition, "core.MixinNetworkManager"), - common_core_MixinEmbeddedChannel(Side.COMMON, Phase.EARLY, m -> ArchaicConfig.fixLoginRaceCondition, "core.MixinEmbeddedChannel"), - common_core_MixinNetHandlerPlayServer(Side.COMMON, Phase.EARLY, always(), "core.MixinNetHandlerPlayServer"), - common_core_MixinSwampHut(Side.COMMON, Phase.EARLY, m -> ArchaicConfig.fixEntityStructurePersistence, "core.MixinSwampHut"), - common_gt6_MixinAdvancedCraftingXToY(Side.COMMON, Phase.LATE, require(TargetedMod.GREGTECH6), "gt6.MixinAdvancedCraftingXToY"), - common_gt6_MixinGT6_Main(Side.COMMON, Phase.LATE, require(TargetedMod.GREGTECH6), "gt6.MixinGT6_Main"), - common_gt6_MixinCR(Side.COMMON, Phase.LATE, require(TargetedMod.GREGTECH6), "gt6.MixinCR"), - common_lighting_MixinAnvilChunkLoader(Side.COMMON, Phase.EARLY, phosphor(), "lighting.MixinAnvilChunkLoader"), - common_lighting_MixinChunk(Side.COMMON, Phase.EARLY, phosphor(), "lighting.MixinChunk"), - common_lighting_MixinChunkProviderServer(Side.COMMON, Phase.EARLY, phosphor(), "lighting.MixinChunkProviderServer"), - common_lighting_MixinChunkVanilla(Side.COMMON, Phase.EARLY, phosphor(), "lighting.MixinChunkVanilla"), - common_lighting_MixinExtendedBlockStorage(Side.COMMON, Phase.EARLY, phosphor(), "lighting.MixinExtendedBlockStorage"), - common_lighting_MixinSPacketChunkData(Side.COMMON, Phase.EARLY, phosphor(), "lighting.MixinSPacketChunkData"), - common_lighting_MixinWorld(Side.COMMON, Phase.EARLY, phosphor(), "lighting.MixinWorld_Lighting"), - common_mo_MixinMatterRegistry(Side.COMMON, Phase.LATE, require(TargetedMod.MATTEROVERDRIVE), "mo.MixinMatterRegistry"), - common_mo_MixinMatterRegistrationHandler(Side.COMMON, Phase.LATE, require(TargetedMod.MATTEROVERDRIVE), "mo.MixinMatterRegistrationHandler"), - common_mo_MixinVersionCheckHandler(Side.COMMON, Phase.LATE, require(TargetedMod.MATTEROVERDRIVE), "mo.MixinVersionCheckHandler"), - common_mrtjp_MixinBlockUpdateHandler(Side.COMMON, Phase.LATE, require(TargetedMod.MRTJPCORE), "mrtjp.MixinBlockUpdateHandler"), - common_pregen_MixinChunkProcessor(Side.COMMON, Phase.LATE, require(TargetedMod.CHUNK_PREGENERATOR), "pregen.MixinChunkProcessor"), - common_pregen_MixinChunkHelper(Side.COMMON, Phase.LATE, require(TargetedMod.CHUNK_PREGENERATOR), "pregen.MixinChunkHelper"), - common_projecte_MixinRecipeShapelessHidden(Side.COMMON, Phase.LATE, require(TargetedMod.PROJECTE), "projecte.MixinRecipeShapelessHidden"), - common_tc4tweaks_MixinGenerateItemHash(Side.COMMON, Phase.LATE, require(TargetedMod.TC4TWEAKS).and(m -> ArchaicConfig.betterThaumcraftHashing), "tc4tweaks.MixinGenerateItemHash"), - common_tc4tweaks_MixinMappingThread(Side.COMMON, Phase.LATE, require(TargetedMod.TC4TWEAKS).and(m -> ArchaicConfig.betterThaumcraftHashing), "tc4tweaks.MixinMappingThread"), - common_thermal_MixinTECraftingHandler(Side.COMMON, Phase.LATE, require(TargetedMod.THERMALEXPANSION), "thermal.MixinTECraftingHandler"), - // CLIENT MIXINS - client_core_MixinThreadDownloadImageData(Side.CLIENT, Phase.EARLY, always(), "core.MixinThreadDownloadImageData"), - client_core_MixinBlockFence(Side.CLIENT, Phase.EARLY, always(), "core.MixinBlockFence"), - client_core_MixinEntityRenderer(Side.CLIENT, Phase.EARLY, always(), "core.MixinEntityRenderer"), - client_core_MixinGuiBeaconButton(Side.CLIENT, Phase.EARLY, always(), "core.MixinGuiBeaconButton"), - client_core_MixinGuiButton(Side.CLIENT, Phase.EARLY, always(), "core.MixinGuiButton"), - client_core_MixinGuiContainerCreative(Side.CLIENT, Phase.EARLY, always(), "core.MixinGuiContainerCreative"), - client_core_MixinIntegratedServer(Side.CLIENT, Phase.EARLY, always(), "core.MixinIntegratedServer"), - client_core_MixinSkinManager(Side.CLIENT, Phase.EARLY, m -> ArchaicConfig.fixSkinMemoryLeak, "core.MixinSkinManager"), - client_core_MixinChunkProviderClient(Side.CLIENT, Phase.EARLY, always(), "core.MixinChunkProviderClient"), - client_core_MixinWorldRenderer(Side.CLIENT, Phase.EARLY, m -> !Boolean.valueOf(System.getProperty("archaicFix.disableMC129", "false")), "core.MixinWorldRenderer"), - client_core_MixinMinecraft(Side.CLIENT, Phase.EARLY, always(), "core.MixinMinecraft"), - client_core_MixinNetHandlerPlayClient(Side.CLIENT, Phase.EARLY, always(), "core.MixinNetHandlerPlayClient"), - client_core_MixinGuiCreateWorld(Side.CLIENT, Phase.EARLY, always(), "core.MixinGuiCreateWorld"), - client_core_MixinGuiIngameForge(Side.CLIENT, Phase.EARLY, always(), "core.MixinGuiIngameForge"), - client_core_MixinFMLClientHandler(Side.CLIENT, Phase.EARLY, always(), "core.MixinFMLClientHandler"), - client_core_MixinNetHandlerLoginClient(Side.CLIENT, Phase.EARLY, m -> ArchaicConfig.fixLoginRaceCondition, "core.MixinNetHandlerLoginClient"), - client_core_MixinSplashProgress(Side.CLIENT, Phase.EARLY, always(), "core.MixinSplashProgress"), - client_core_AccessorSplashProgress(Side.CLIENT, Phase.EARLY, always(), "core.AccessorSplashProgress"), - client_core_MixinRenderItem(Side.CLIENT, Phase.EARLY, m -> ArchaicConfig.forceFancyItems, "core.MixinRenderItem"), - client_divinerpg_MixinEntitySparkler(Side.CLIENT, Phase.LATE, require(TargetedMod.DIVINERPG), "divinerpg.MixinEntitySparkler"), - client_gt6_MixinGT_API_Proxy_Client(Side.CLIENT, Phase.LATE, require(TargetedMod.GREGTECH6), "gt6.MixinGT_API_Proxy_Client"), - client_lighting_MixinMinecraft(Side.CLIENT, Phase.EARLY, phosphor(), "lighting.MixinMinecraft"), - client_lighting_MixinWorld(Side.CLIENT, Phase.EARLY, phosphor(), "lighting.MixinWorld"), - client_lighting_MixinChunkCache(Side.CLIENT, Phase.EARLY, phosphor(), "lighting.MixinChunkCache"), - - client_optifine_MixinVersionCheckThread(Side.CLIENT, Phase.EARLY, require(TargetedMod.OPTIFINE).and(m -> ArchaicConfig.disableOFVersionCheck), "optifine.MixinVersionCheckThread"), - - client_renderdistance_MixinGameSettings(Side.CLIENT, Phase.EARLY, avoid(TargetedMod.OPTIFINE).and(avoid(TargetedMod.FASTCRAFT)).and(m -> ArchaicConfig.raiseMaxRenderDistance), "renderdistance.MixinGameSettings"), - client_renderdistance_MixinRenderGlobal(Side.CLIENT, Phase.EARLY, avoid(TargetedMod.OPTIFINE).and(avoid(TargetedMod.FASTCRAFT)).and(m -> ArchaicConfig.raiseMaxRenderDistance), "renderdistance.MixinRenderGlobal"), - common_renderdistance_MixinPlayerManager(Side.COMMON, Phase.EARLY, avoid(TargetedMod.OPTIFINE).and(avoid(TargetedMod.FASTCRAFT)).and(m -> ArchaicConfig.raiseMaxRenderDistance), "renderdistance.MixinPlayerManager"), +public enum Mixin implements IMixins { - // MOD-FILTERED MIXINS - common_lighting_fastcraft_MixinChunk(Side.COMMON, Phase.EARLY, require(TargetedMod.FASTCRAFT).and(phosphor()), "lighting.fastcraft.MixinChunk"), - common_lighting_fastcraft_MixinChunkProviderServer(Side.COMMON, Phase.EARLY, require(TargetedMod.FASTCRAFT).and(phosphor()), "lighting.fastcraft.MixinChunkProviderServer"), - common_lighting_fastcraft_MixinWorld(Side.COMMON, Phase.EARLY, require(TargetedMod.FASTCRAFT).and(phosphor()), "lighting.fastcraft.MixinWorld"), - - common_mekanism_MixinGenHandler(Side.COMMON, Phase.LATE, require(TargetedMod.MEKANISM), "mekanism.MixinGenHandler"), - - common_thermal_MixinBlockOre(Side.COMMON, Phase.LATE, require(TargetedMod.THERMALFOUNDATION), "thermal.MixinBlockOre"), - - common_botania_MixinBlockSpecialFlower(Side.COMMON, Phase.LATE, require(TargetedMod.BOTANIA), "botania.MixinBlockSpecialFlower"), + MINECRAFT(new ArchaicBuilder() + .setPhase(Phase.EARLY) + .addCommonMixins( + "core.AccessorEntityLiving", + "core.MixinEntityPlayerMP", + "core.MixinWorldServer", + "core.MixinMapGenStructure", + "core.MixinEntityVillager", + "core.MixinMerchantRecipe", + "core.MixinAxisAlignedBB", + "core.MixinMaterialLiquid", + "core.MixinChunkProviderServer", + "core.MixinChunkIOProvider", + "core.MixinCraftingManager", + "core.MixinSpawnerAnimals", + "core.MixinShapedOreRecipe", + "core.MixinLongHashMap", + "core.MixinBlock", + "core.MixinBlock_Late", + "core.MixinEnchantmentHelper", + "core.MixinWorldChunkManager", + "core.MixinShapedRecipes", + "core.MixinShapelessOreRecipe", + "core.MixinShapelessRecipes", + "core.MixinEntityLiving", + "core.MixinWorld", + "core.MixinEntityTrackerEntry", + "core.MixinEntityXPOrb", + "core.MixinEntity", + "core.MixinForgeChunkManager", + "core.MixinChunk", + "core.MixinStructureStart", + "core.MixinOreDictionary", + "core.MixinChunkProviderHell", + "core.MixinASMData", + "core.MixinNetHandlerPlayServer") + .addClientMixins( + "core.MixinThreadDownloadImageData", + "core.MixinBlockFence", + "core.MixinEntityRenderer", + "core.MixinGuiBeaconButton", + "core.MixinGuiButton", + "core.MixinGuiContainerCreative", + "core.MixinIntegratedServer", + "core.MixinChunkProviderClient", + "core.MixinMinecraft", + "core.MixinNetHandlerPlayClient", + "core.MixinGuiCreateWorld", + "core.MixinGuiIngameForge", + "core.MixinFMLClientHandler", + "core.MixinSplashProgress", + "core.AccessorSplashProgress")), + PHOSPHOR(new ArchaicBuilder() + .setPhase(Phase.EARLY) + .setApplyIf(() -> ArchaicConfig.enablePhosphor) + .addCommonMixins( + "lighting.MixinAnvilChunkLoader", + "lighting.MixinChunk", + "lighting.MixinChunkProviderServer", + "lighting.MixinChunkVanilla", + "lighting.MixinExtendedBlockStorage", + "lighting.MixinSPacketChunkData", + "lighting.MixinWorld_Lighting") + .addClientMixins( + "lighting.MixinMinecraft", + "lighting.MixinWorld", + "lighting.MixinChunkCache")), + PHOSPHOR_FASTCRAFT(new ArchaicBuilder() + .setPhase(Phase.EARLY) + .setApplyIf(() -> ArchaicConfig.enablePhosphor) + .addRequiredMod(TargetedMod.FASTCRAFT) + .addCommonMixins( + "lighting.fastcraft.MixinChunk", + "lighting.fastcraft.MixinChunkProviderServer", + "lighting.fastcraft.MixinWorld")), - common_extrautils_MixinEventHandlerSiege(Side.COMMON, Phase.LATE, require(TargetedMod.EXTRAUTILS), "extrautils.MixinEventHandlerSiege"), - common_extrautils_MixinEventHandlerServer(Side.COMMON, Phase.LATE, require(TargetedMod.EXTRAUTILS), "extrautils.MixinEventHandlerServer"), - common_extrautils_MixinItemDivisionSigil(Side.COMMON, Phase.LATE, require(TargetedMod.EXTRAUTILS), "extrautils.MixinItemDivisionSigil"), - common_extrautils_MixinTileEntityTrashCan(Side.COMMON, Phase.LATE, require(TargetedMod.EXTRAUTILS), "extrautils.MixinTileEntityTrashCan"), + GREGTECH6(new ArchaicBuilder() + .setPhase(Phase.LATE) + .addRequiredMod(TargetedMod.GREGTECH6) + .addCommonMixins( + "gt6.MixinAdvancedCraftingXToY", + "gt6.MixinGT6_Main", + "gt6.MixinCR") + .addClientMixins("gt6.MixinGT_API_Proxy_Client")), - client_journeymap_MixinTileDrawStep(Side.CLIENT, Phase.LATE, require(TargetedMod.JOURNEYMAP).and(m -> ArchaicConfig.removeJourneymapDebug), "journeymap.MixinTileDrawStep"), + RACE_CONDITION_LOGGING(new ArchaicBuilder() + .setPhase(Phase.EARLY) + .setApplyIf(() -> ArchaicConfig.fixLoginRaceCondition) + .addCommonMixins( + "core.MixinNetworkDispatcher", + "core.MixinNetworkManager", + "core.MixinEmbeddedChannel") + .addClientMixins("core.MixinNetHandlerLoginClient")), - client_aoa_MixinProjectileEntities(Side.CLIENT, Phase.LATE, require(TargetedMod.AOA), "aoa.MixinProjectileEntities"), + MATTER_OVERDRIVE(new ArchaicBuilder() + .setPhase(Phase.LATE) + .addRequiredMod(TargetedMod.MATTER_OVERDRIVE) + .addCommonMixins( + "mo.MixinMatterRegistry", + "mo.MixinMatterRegistrationHandler", + "mo.MixinVersionCheckHandler")), - common_am2_MixinPlayerTracker(Side.COMMON, Phase.LATE, require(TargetedMod.AM2), "am2.MixinPlayerTracker"), + CHUNK_PREGENERATOR(new ArchaicBuilder() + .setPhase(Phase.LATE) + .addRequiredMod(TargetedMod.CHUNK_PREGENERATOR) + .addCommonMixins( + "pregen.MixinChunkProcessor", + "pregen.MixinChunkHelper")), - common_foodplus_MixinUpdater(Side.COMMON, Phase.LATE, require(TargetedMod.FOODPLUS).and(m -> ArchaicConfig.disableFoodPlusUpdates), "foodplus.MixinUpdater"), + THAUMCRAFT_HASHING(new ArchaicBuilder() + .setPhase(Phase.LATE) + .addRequiredMod(TargetedMod.TC4TWEAKS) + .setApplyIf(() -> ArchaicConfig.betterThaumcraftHashing) + .addCommonMixins( + "tc4tweaks.MixinGenerateItemHash", + "tc4tweaks.MixinMappingThread")), - common_waystones_MixinItemWarpStone(Side.COMMON, Phase.LATE, require(TargetedMod.WAYSTONES), "waystones.MixinItemWarpStone"), + MAX_RENDER_DISTANCE(new ArchaicBuilder() + .setPhase(Phase.EARLY) + .setApplyIf(() -> ArchaicConfig.raiseMaxRenderDistance) + .addExcludedMod(TargetedMod.OPTIFINE) + .addExcludedMod(TargetedMod.FASTCRAFT) + .addCommonMixins("renderdistance.MixinPlayerManager") + .addClientMixins( + "renderdistance.MixinGameSettings", + "renderdistance.MixinRenderGlobal")), - client_ae2_MixinNEIItemRender(Side.CLIENT, Phase.LATE, require(TargetedMod.AE2).and(m -> ArchaicConfig.disableAE2NEIItemRendering), "ae2.MixinNEIItemRender"), + EXTRA_UTILS(new ArchaicBuilder() + .setPhase(Phase.LATE) + .addRequiredMod(TargetedMod.EXTRAUTILS) + .addCommonMixins( + "extrautils.MixinEventHandlerSiege", + "extrautils.MixinEventHandlerServer", + "extrautils.MixinItemDivisionSigil", + "extrautils.MixinTileEntityTrashCan")), - /** This mixin will ostensibly be unnecessary after DragonAPI V31b */ - common_dragonapi_MixinReikaWorldHelper(Side.COMMON, Phase.LATE, m -> DragonAPIHelper.isVersionInInclusiveRange(0, 'a', 31, 'b') && !Boolean.valueOf(System.getProperty("archaicFix.disableFastReikaWorldHelper", "false")), "dragonapi.MixinReikaWorldHelper"), - - common_diversity_MixinServerHandler(Side.COMMON, Phase.LATE, require(TargetedMod.DIVERSITY), "diversity.MixinServerHandler") + WORLD_UPDATE_ENTITIES(new ArchaicBuilder() + .setPhase(Phase.EARLY) + .addExcludedMod(TargetedMod.HODGEPODGE) + .addCommonMixins("core.MixinWorld_UpdateEntities")), - // The modFilter argument is a predicate, so you can also use the .and(), .or(), and .negate() methods to mix and match multiple predicates. - ; + ITEM_LAG_REDUCTION(new ArchaicBuilder() + .setPhase(Phase.EARLY) + .addExcludedMod(TargetedMod.SHIPSMOD) + .setApplyIf(() -> ArchaicConfig.itemLagReduction) + .addCommonMixins("core.MixinEntityItem")), - @Getter - public final Side side; - @Getter - public final Phase phase; - @Getter - public final Predicate> filter; - private final String mixin; - - static Predicate> phosphor() { - return m -> ArchaicConfig.enablePhosphor; - } + MIXINMODCANDIDATE(new ArchaicBuilder() + .setPhase(Phase.EARLY) + .addExcludedMod(TargetedMod.COFHCORE) + .addCommonMixins("core.MixinModCandidate")), - static Predicate> require(TargetedMod in) { - return modList -> modList.contains(in); - } + chickenchunks_MixinPlayerChunkViewerManager(new ArchaicBuilder() + .addCommonMixins("chickenchunks.MixinPlayerChunkViewerManager") + .setPhase(Phase.LATE) + .addRequiredMod(TargetedMod.CHICKENCHUNKS)), + core_MixinEntityLivingBase_EarlyXpDrop(new ArchaicBuilder() + .addCommonMixins("core.MixinEntityLivingBase_EarlyXpDrop") + .setPhase(Phase.EARLY) + .setApplyIf(() -> ArchaicConfig.dropXpImmediatelyOnDeath)), + core_MixinSwampHut(new ArchaicBuilder() + .addCommonMixins("core.MixinSwampHut") + .setPhase(Phase.EARLY) + .setApplyIf(() -> ArchaicConfig.fixEntityStructurePersistence)), + mrtjp_MixinBlockUpdateHandler(new ArchaicBuilder() + .addCommonMixins("mrtjp.MixinBlockUpdateHandler") + .setPhase(Phase.LATE) + .addRequiredMod(TargetedMod.MRTJPCORE)), + projecte_MixinRecipeShapelessHidden(new ArchaicBuilder() + .addCommonMixins("projecte.MixinRecipeShapelessHidden") + .setPhase(Phase.LATE) + .addRequiredMod(TargetedMod.PROJECTE)), + thermal_MixinTECraftingHandler(new ArchaicBuilder() + .addCommonMixins("thermal.MixinTECraftingHandler") + .setPhase(Phase.LATE) + .addRequiredMod(TargetedMod.THERMALEXPANSION)), - static Predicate> avoid(TargetedMod in) { - return modList -> !modList.contains(in); - } + // CLIENT MIXINS, + core_MixinSkinManager(new ArchaicBuilder() + .addClientMixins("core.MixinSkinManager") + .setPhase(Phase.EARLY) + .setApplyIf(() -> ArchaicConfig.fixSkinMemoryLeak)), + core_MixinWorldRenderer(new ArchaicBuilder() + .addClientMixins("core.MixinWorldRenderer") + .setPhase(Phase.EARLY) + .setApplyIf(() -> !Boolean.parseBoolean(System.getProperty("archaicFix.disableMC129", "false")))), + core_MixinRenderItem(new ArchaicBuilder() + .addClientMixins("core.MixinRenderItem") + .setPhase(Phase.EARLY) + .setApplyIf(() -> ArchaicConfig.forceFancyItems)), + divinerpg_MixinEntitySparkler(new ArchaicBuilder() + .addClientMixins("divinerpg.MixinEntitySparkler") + .setPhase(Phase.LATE) + .addRequiredMod(TargetedMod.DIVINERPG)), + optifine_MixinVersionCheckThread(new ArchaicBuilder() + .addClientMixins("optifine.MixinVersionCheckThread") + .setPhase(Phase.EARLY) + .addRequiredMod(TargetedMod.OPTIFINE) + .setApplyIf(() -> ArchaicConfig.disableOFVersionCheck)), - static Predicate> always() { - return m -> true; - } + // MOD-FILTERED MIXINS + mekanism_MixinGenHandler(new ArchaicBuilder() + .addCommonMixins("mekanism.MixinGenHandler") + .setPhase(Phase.LATE) + .addRequiredMod(TargetedMod.MEKANISM)), + thermal_MixinBlockOre(new ArchaicBuilder() + .addCommonMixins("thermal.MixinBlockOre") + .setPhase(Phase.LATE) + .addRequiredMod(TargetedMod.THERMALFOUNDATION)), + botania_MixinBlockSpecialFlower(new ArchaicBuilder() + .addCommonMixins("botania.MixinBlockSpecialFlower") + .setPhase(Phase.LATE) + .addRequiredMod(TargetedMod.BOTANIA)), + journeymap_MixinTileDrawStep(new ArchaicBuilder() + .addClientMixins("journeymap.MixinTileDrawStep") + .setPhase(Phase.LATE) + .addRequiredMod(TargetedMod.JOURNEYMAP) + .setApplyIf(() -> ArchaicConfig.removeJourneymapDebug)), + aoa_MixinProjectileEntities(new ArchaicBuilder() + .addClientMixins("aoa.MixinProjectileEntities") + .setPhase(Phase.LATE) + .addRequiredMod(TargetedMod.ADVENT_OF_ASCENSION)), + am2_MixinPlayerTracker(new ArchaicBuilder() + .addCommonMixins("am2.MixinPlayerTracker") + .setPhase(Phase.LATE) + .addRequiredMod(TargetedMod.ARS_MAGICA_2)), + foodplus_MixinUpdater(new ArchaicBuilder() + .addCommonMixins("foodplus.MixinUpdater") + .setPhase(Phase.LATE) + .addRequiredMod(TargetedMod.FOODPLUS) + .setApplyIf(() -> ArchaicConfig.disableFoodPlusUpdates)), + waystones_MixinItemWarpStone(new ArchaicBuilder() + .addCommonMixins("waystones.MixinItemWarpStone") + .setPhase(Phase.LATE) + .addRequiredMod(TargetedMod.WAYSTONES)), + ae2_MixinNEIItemRender(new ArchaicBuilder() + .addClientMixins("ae2.MixinNEIItemRender") + .setPhase(Phase.LATE) + .addRequiredMod(TargetedMod.AE2) + .setApplyIf(() -> ArchaicConfig.disableAE2NEIItemRendering)), + /** This mixin will ostensibly be unnecessary after DragonAPI V31b */ + dragonapi_MixinReikaWorldHelper(new ArchaicBuilder() + .addCommonMixins("dragonapi.MixinReikaWorldHelper") + .setPhase(Phase.LATE) + .setApplyIf(() -> DragonAPIHelper.isVersionInInclusiveRange(0, 'a', 31, 'b') && !Boolean.parseBoolean(System.getProperty("archaicFix.disableFastReikaWorldHelper", "false")))), + diversity_MixinServerHandler(new ArchaicBuilder() + .addCommonMixins("diversity.MixinServerHandler") + .setPhase(Phase.LATE) + .addRequiredMod(TargetedMod.DIVERSITY)); - enum Side { - COMMON, - CLIENT - } + private final MixinBuilder builder; - public enum Phase { - EARLY, - LATE - } + static class ArchaicBuilder extends MixinBuilder { + @Override + public MixinBuilder addCommonMixins(@Nonnull String... mixins) { + for (int i = 0; i < mixins.length; i++) mixins[i] = "common." + mixins[i]; + return super.addCommonMixins(mixins); + } - public boolean shouldLoadSide() { - return (side == Side.COMMON - || (side == Side.CLIENT && FMLLaunchHandler.side().isClient())); - } + @Override + public MixinBuilder addClientMixins(@Nonnull String... mixins) { + for (int i = 0; i < mixins.length; i++) mixins[i] = "client." + mixins[i]; + return super.addClientMixins(mixins); + } - public String getMixin() { - return side.name().toLowerCase(Locale.ROOT) + "." + mixin; + @Override + public MixinBuilder addSidedMixins(@Nonnull Side side, @Nonnull String... mixins) { + if (side == Side.COMMON) return this.addCommonMixins(mixins); + if (side == Side.CLIENT) return this.addClientMixins(mixins); + return super.addSidedMixins(side, mixins); + } } } diff --git a/src/main/java/org/embeddedt/archaicfix/asm/TargetedMod.java b/src/main/java/org/embeddedt/archaicfix/asm/TargetedMod.java index 6110203..2fbc16a 100644 --- a/src/main/java/org/embeddedt/archaicfix/asm/TargetedMod.java +++ b/src/main/java/org/embeddedt/archaicfix/asm/TargetedMod.java @@ -1,40 +1,46 @@ package org.embeddedt.archaicfix.asm; +import com.gtnewhorizon.gtnhmixins.builders.ITargetMod; +import com.gtnewhorizon.gtnhmixins.builders.TargetModBuilder; import lombok.Getter; -import lombok.RequiredArgsConstructor; -@RequiredArgsConstructor -public enum TargetedMod { - CHICKENCHUNKS("ChickenChunks", "ChickenChunks"), - MRTJPCORE("MrTJPCore", "MrTJPCoreMod"), - CHUNK_PREGENERATOR("ChunkPregenerator", "chunkpregenerator"), - THERMALEXPANSION("ThermalExpansion", "ThermalExpansion"), - THERMALFOUNDATION("ThermalFoundation", "ThermalFoundation"), - GREGTECH6("GregTech", "gregapi"), - MATTEROVERDRIVE("MatterOverdrive", "mo"), - PROJECTE("ProjectE", "ProjectE"), - TC4TWEAKS("TC4Tweaks", "tc4tweak"), - FASTCRAFT("FastCraft", null), - OPTIFINE("OptiFine", null), - MEKANISM("Mekanism", "Mekanism"), - BOTANIA("Botania", "Botania"), - COFHCORE("CoFHCore", "CoFHCore"), - EXTRAUTILS("ExtraUtilities", "ExtraUtilities"), - DIVINERPG("DivineRPG", "divinerpg"), - SHIPSMOD("ShipsMod", "cuchaz.ships"), - JOURNEYMAP("JourneyMap", "journeymap"), - AM2("ArsMagica2", "arsmagica2"), - FOODPLUS("FoodPlus", "FoodPlus"), - DIVERSITY("Diversity", "diversity"), - WAYSTONES("Waystones", "waystones"), - AE2("AppliedEnergistics2", "appliedenergistics2"), - AOA("AdventOfAscension", "nevermine"), - HODGEPODGE("Hodgepodge", "hodgepodge") - ; +@Getter +public enum TargetedMod implements ITargetMod { - @Getter - private final String modName; - @Getter - private final String modId; + ADVENT_OF_ASCENSION("nevermine"), + AE2("appliedenergistics2"), + ARS_MAGICA_2("arsmagica2"), + BOTANIA("Botania"), + CHICKENCHUNKS("ChickenChunks"), + CHUNK_PREGENERATOR("chunkpregenerator"), + COFHCORE("cofh.asm.LoadingPlugin", "CoFHCore"), + DIVERSITY("diversity"), + DIVINERPG("divinerpg"), + EXTRAUTILS("ExtraUtilities"), + FASTCRAFT("fastcraft.Tweaker", null), + FOODPLUS("FoodPlus"), + GREGTECH6("gregapi"), + HODGEPODGE("com.mitchej123.hodgepodge.core.HodgepodgeCore", "hodgepodge"), + JOURNEYMAP("journeymap"), + MATTER_OVERDRIVE("mo"), + MEKANISM("Mekanism"), + MRTJPCORE("MrTJPCoreMod"), + OPTIFINE("optifine.OptiFineForgeTweaker", null), + PROJECTE("ProjectE"), + SHIPSMOD("cuchaz.ships.core.CoreModPlugin","cuchaz.ships"), + TC4TWEAKS("tc4tweak"), + THERMALEXPANSION("ThermalExpansion"), + THERMALFOUNDATION("ThermalFoundation"), + WAYSTONES("waystones"); + + private final TargetModBuilder builder; + + TargetedMod(String modId) { + this(null, modId); + } + + TargetedMod(String coremodClass, String modId) { + this.builder = new TargetModBuilder().setCoreModClass(coremodClass).setModId(modId); + } }