aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/gregtech/mixin
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/gregtech/mixin')
-rw-r--r--src/main/java/gregtech/mixin/LateMixinPlugin.java21
-rw-r--r--src/main/java/gregtech/mixin/Mixin.java233
-rw-r--r--src/main/java/gregtech/mixin/MixinPlugin.java113
-rw-r--r--src/main/java/gregtech/mixin/TargetedMod.java86
-rw-r--r--src/main/java/gregtech/mixin/mixins/early/minecraft/CraftingManagerMixin.java24
-rw-r--r--src/main/java/gregtech/mixin/mixins/early/minecraft/LanguageRegistryMixin.java (renamed from src/main/java/gregtech/mixin/mixins/minecraft/LanguageRegistryMixin.java)2
-rw-r--r--src/main/java/gregtech/mixin/mixins/early/minecraft/LocaleMixin.java (renamed from src/main/java/gregtech/mixin/mixins/minecraft/LocaleMixin.java)2
-rw-r--r--src/main/java/gregtech/mixin/mixins/early/minecraft/StringTranslateMixin.java (renamed from src/main/java/gregtech/mixin/mixins/minecraft/StringTranslateMixin.java)2
-rw-r--r--src/main/java/gregtech/mixin/mixins/early/minecraft/WorldMixin.java (renamed from src/main/java/gregtech/mixin/mixins/minecraft/WorldMixin.java)2
-rw-r--r--src/main/java/gregtech/mixin/mixins/late/thaumcraft/TileWandPedestalMixin.java43
-rw-r--r--src/main/java/gregtech/mixin/mixins/late/xu/ChunkProviderEndOfTimeMixin.java28
-rw-r--r--src/main/java/gregtech/mixin/mixins/late/xu/WorldProviderEndOfTimeMixin.java18
12 files changed, 407 insertions, 167 deletions
diff --git a/src/main/java/gregtech/mixin/LateMixinPlugin.java b/src/main/java/gregtech/mixin/LateMixinPlugin.java
new file mode 100644
index 0000000000..dab8cc5f03
--- /dev/null
+++ b/src/main/java/gregtech/mixin/LateMixinPlugin.java
@@ -0,0 +1,21 @@
+package gregtech.mixin;
+
+import java.util.List;
+import java.util.Set;
+
+import com.gtnewhorizon.gtnhmixins.ILateMixinLoader;
+import com.gtnewhorizon.gtnhmixins.LateMixin;
+
+@LateMixin
+public class LateMixinPlugin implements ILateMixinLoader {
+
+ @Override
+ public String getMixinConfig() {
+ return "mixins.gregtech.late.json";
+ }
+
+ @Override
+ public List<String> getMixins(Set<String> loadedMods) {
+ return Mixin.getLateMixins(loadedMods);
+ }
+}
diff --git a/src/main/java/gregtech/mixin/Mixin.java b/src/main/java/gregtech/mixin/Mixin.java
index 347dec2c5e..6e2b927afe 100644
--- a/src/main/java/gregtech/mixin/Mixin.java
+++ b/src/main/java/gregtech/mixin/Mixin.java
@@ -1,50 +1,237 @@
package gregtech.mixin;
+import static gregtech.mixin.TargetedMod.EXTRA_UTILITIES;
+import static gregtech.mixin.TargetedMod.THAUMCRAFT;
import static gregtech.mixin.TargetedMod.VANILLA;
+import java.util.ArrayList;
import java.util.Arrays;
-import java.util.HashSet;
+import java.util.Collections;
import java.util.List;
+import java.util.Set;
+import java.util.function.Supplier;
+
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+import com.github.bartimaeusnek.bartworks.common.configs.ConfigHandler;
import cpw.mods.fml.relauncher.FMLLaunchHandler;
public enum Mixin {
// Minecraft
- WorldMixin("minecraft.WorldMixin", VANILLA),
- StringTranslateMixin("minecraft.StringTranslateMixin", VANILLA),
- LanguageRegistryMixin("minecraft.LanguageRegistryMixin", VANILLA),
- LocaleMixin("minecraft.LocaleMixin", Side.CLIENT, VANILLA),
+ WorldMixin(new Builder("Block update detection").addMixinClasses("minecraft.WorldMixin")
+ .addTargetedMod(VANILLA)
+ .setApplyIf(() -> true)
+ .setPhase(Phase.EARLY)
+ .setSide(Side.BOTH)),
+ StringTranslateMixin(new Builder("Keep track of currently translating mods")
+ .addMixinClasses("minecraft.StringTranslateMixin", "minecraft.LanguageRegistryMixin")
+ .addTargetedMod(VANILLA)
+ .setApplyIf(() -> true)
+ .setPhase(Phase.EARLY)
+ .setSide(Side.BOTH)),
+ LocaleMixin(new Builder("Keep track of currently translating client mods").addMixinClasses("minecraft.LocaleMixin")
+ .addTargetedMod(VANILLA)
+ .setApplyIf(() -> true)
+ .setPhase(Phase.EARLY)
+ .setSide(Side.CLIENT)),
+ CacheCraftingManagerRecipes(
+ new Builder("Cache CraftingManager recipes").addMixinClasses("minecraft.CraftingManagerMixin")
+ .addTargetedMod(VANILLA)
+ .setApplyIf(() -> ConfigHandler.enabledPatches[3])
+ .setPhase(Phase.EARLY)
+ .setSide(Side.BOTH)),
+ // Extra utilities
+ RemoveLastMilleniumRain(new Builder("Remove rain from the Last Millenium (Extra Utilities)")
+ .addMixinClasses("xu.WorldProviderEndOfTimeMixin")
+ .addTargetedMod(EXTRA_UTILITIES)
+ .setApplyIf(() -> ConfigHandler.enabledPatches[0])
+ .setPhase(Phase.LATE)
+ .setSide(Side.BOTH)),
+ RemoveLastMilleniumCreatures(new Builder("Remove creatures from the Last Millenium (Extra Utilities)")
+ .addMixinClasses("xu.ChunkProviderEndOfTimeMixin")
+ .addTargetedMod(EXTRA_UTILITIES)
+ .setApplyIf(() -> ConfigHandler.enabledPatches[1])
+ .setPhase(Phase.LATE)
+ .setSide(Side.BOTH)),
+ // Thaumcraft
+ PatchWandPedestalVisDuplication(new Builder("Fix wand pedestal vis duplication (Thaumcraft)")
+ .addMixinClasses("thaumcraft.TileWandPedestalMixin")
+ .addTargetedMod(THAUMCRAFT)
+ .setApplyIf(() -> ConfigHandler.enabledPatches[2])
+ .setPhase(Phase.LATE)
+ .setSide(Side.BOTH)),;
- ;
+ public static final Logger LOGGER = LogManager.getLogger("GregTech-Mixin");
- public final String mixinClass;
- public final List<TargetedMod> targetedMods;
+ private final List<String> mixinClasses;
+ private final List<TargetedMod> targetedMods;
+ private final List<TargetedMod> excludedMods;
+ private final Supplier<Boolean> applyIf;
+ private final Phase phase;
private final Side side;
- Mixin(String mixinClass, Side side, TargetedMod... targetedMods) {
- this.mixinClass = mixinClass;
- this.targetedMods = Arrays.asList(targetedMods);
- this.side = side;
+ Mixin(Builder builder) {
+ this.mixinClasses = builder.mixinClasses;
+ this.targetedMods = builder.targetedMods;
+ this.excludedMods = builder.excludedMods;
+ this.applyIf = builder.applyIf;
+ this.phase = builder.phase;
+ this.side = builder.side;
+ if (this.mixinClasses.isEmpty()) {
+ throw new RuntimeException("No mixin class specified for Mixin : " + this.name());
+ }
+ if (this.targetedMods.isEmpty()) {
+ throw new RuntimeException("No targeted mods specified for Mixin : " + this.name());
+ }
+ if (this.applyIf == null) {
+ throw new RuntimeException("No ApplyIf function specified for Mixin : " + this.name());
+ }
+ if (this.phase == null) {
+ throw new RuntimeException("No Phase specified for Mixin : " + this.name());
+ }
+ if (this.side == null) {
+ throw new RuntimeException("No Side function specified for Mixin : " + this.name());
+ }
+ }
+
+ public static List<String> getEarlyMixins(Set<String> loadedCoreMods) {
+ final List<String> mixins = new ArrayList<>();
+ final List<String> notLoading = new ArrayList<>();
+ for (Mixin mixin : Mixin.values()) {
+ if (mixin.phase == Phase.EARLY) {
+ if (mixin.shouldLoad(loadedCoreMods, Collections.emptySet())) {
+ mixins.addAll(mixin.mixinClasses);
+ } else {
+ notLoading.addAll(mixin.mixinClasses);
+ }
+ }
+ }
+ LOGGER.info("Not loading the following EARLY mixins: {}", notLoading.toString());
+ return mixins;
+ }
+
+ public static List<String> getLateMixins(Set<String> loadedMods) {
+ // NOTE: Any targetmod here needs a modid, not a coremod id
+ final List<String> mixins = new ArrayList<>();
+ final List<String> notLoading = new ArrayList<>();
+ for (Mixin mixin : Mixin.values()) {
+ if (mixin.phase == Phase.LATE) {
+ if (mixin.shouldLoad(Collections.emptySet(), loadedMods)) {
+ mixins.addAll(mixin.mixinClasses);
+ } else {
+ notLoading.addAll(mixin.mixinClasses);
+ }
+ }
+ }
+ LOGGER.info("Not loading the following LATE mixins: {}", notLoading.toString());
+ return mixins;
+ }
+
+ private boolean shouldLoadSide() {
+ return side == Side.BOTH || (side == Side.SERVER && FMLLaunchHandler.side()
+ .isServer())
+ || (side == Side.CLIENT && FMLLaunchHandler.side()
+ .isClient());
+ }
+
+ private boolean allModsLoaded(List<TargetedMod> targetedMods, Set<String> loadedCoreMods, Set<String> loadedMods) {
+ if (targetedMods.isEmpty()) return false;
+
+ for (TargetedMod target : targetedMods) {
+ if (target == TargetedMod.VANILLA) continue;
+
+ // Check coremod first
+ if (!loadedCoreMods.isEmpty() && target.coreModClass != null
+ && !loadedCoreMods.contains(target.coreModClass)) return false;
+ else if (!loadedMods.isEmpty() && target.modId != null && !loadedMods.contains(target.modId)) return false;
+ }
+
+ return true;
+ }
+
+ private boolean noModsLoaded(List<TargetedMod> targetedMods, Set<String> loadedCoreMods, Set<String> loadedMods) {
+ if (targetedMods.isEmpty()) return true;
+
+ for (TargetedMod target : targetedMods) {
+ if (target == TargetedMod.VANILLA) continue;
+
+ // Check coremod first
+ if (!loadedCoreMods.isEmpty() && target.coreModClass != null
+ && loadedCoreMods.contains(target.coreModClass)) return false;
+ else if (!loadedMods.isEmpty() && target.modId != null && loadedMods.contains(target.modId)) return false;
+ }
+
+ return true;
}
- Mixin(String mixinClass, TargetedMod... targetedMods) {
- this.mixinClass = mixinClass;
- this.targetedMods = Arrays.asList(targetedMods);
- this.side = Side.BOTH;
+ private boolean shouldLoad(Set<String> loadedCoreMods, Set<String> loadedMods) {
+ return (shouldLoadSide() && applyIf.get()
+ && allModsLoaded(targetedMods, loadedCoreMods, loadedMods)
+ && noModsLoaded(excludedMods, loadedCoreMods, loadedMods));
}
- public boolean shouldLoad(List<TargetedMod> loadedMods) {
- return (side == Side.BOTH || side == Side.SERVER && FMLLaunchHandler.side()
- .isServer()
- || side == Side.CLIENT && FMLLaunchHandler.side()
- .isClient())
- && new HashSet<>(loadedMods).containsAll(targetedMods);
+ private static class Builder {
+
+ private final String name;
+ private final List<String> mixinClasses = new ArrayList<>();
+ private final List<TargetedMod> targetedMods = new ArrayList<>();
+ private final List<TargetedMod> excludedMods = new ArrayList<>();
+ private Supplier<Boolean> applyIf = null;
+ private Phase phase = null;
+ private Side side = null;
+
+ public Builder(String name) {
+ this.name = name;
+ }
+
+ public Builder addMixinClasses(String... mixinClasses) {
+ this.mixinClasses.addAll(Arrays.asList(mixinClasses));
+ return this;
+ }
+
+ public Builder setPhase(Phase phase) {
+ if (this.phase != null) {
+ throw new RuntimeException("Trying to define Phase twice for " + this.name);
+ }
+ this.phase = phase;
+ return this;
+ }
+
+ public Builder setSide(Side side) {
+ if (this.side != null) {
+ throw new RuntimeException("Trying to define Side twice for " + this.name);
+ }
+ this.side = side;
+ return this;
+ }
+
+ public Builder setApplyIf(Supplier<Boolean> applyIf) {
+ this.applyIf = applyIf;
+ return this;
+ }
+
+ public Builder addTargetedMod(TargetedMod mod) {
+ this.targetedMods.add(mod);
+ return this;
+ }
+
+ public Builder addExcludedMod(TargetedMod mod) {
+ this.excludedMods.add(mod);
+ return this;
+ }
}
- enum Side {
+ private enum Side {
BOTH,
CLIENT,
SERVER
}
+
+ private enum Phase {
+ EARLY,
+ LATE,
+ }
}
diff --git a/src/main/java/gregtech/mixin/MixinPlugin.java b/src/main/java/gregtech/mixin/MixinPlugin.java
deleted file mode 100644
index 074eeb81aa..0000000000
--- a/src/main/java/gregtech/mixin/MixinPlugin.java
+++ /dev/null
@@ -1,113 +0,0 @@
-package gregtech.mixin;
-
-import static gregtech.mixin.TargetedMod.VANILLA;
-import static java.nio.file.Files.walk;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.nio.file.Path;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Set;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
-
-import net.minecraft.launchwrapper.Launch;
-
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.Logger;
-import org.spongepowered.asm.lib.tree.ClassNode;
-import org.spongepowered.asm.mixin.extensibility.IMixinConfigPlugin;
-import org.spongepowered.asm.mixin.extensibility.IMixinInfo;
-
-import com.gtnewhorizon.gtnhmixins.MinecraftURLClassPath;
-
-import kubatech.Tags;
-
-public class MixinPlugin implements IMixinConfigPlugin {
-
- private static final Logger LOG = LogManager.getLogger(Tags.MODID + " mixins");
- private static final Path MODS_DIRECTORY_PATH = new File(Launch.minecraftHome, "mods/").toPath();
-
- @Override
- public void onLoad(String mixinPackage) {}
-
- @Override
- public String getRefMapperConfig() {
- return null;
- }
-
- @Override
- public boolean shouldApplyMixin(String targetClassName, String mixinClassName) {
- return false;
- }
-
- @Override
- public void acceptTargets(Set<String> myTargets, Set<String> otherTargets) {}
-
- @Override
- public List<String> getMixins() {
- final boolean isDevelopmentEnvironment = (boolean) Launch.blackboard.get("fml.deobfuscatedEnvironment");
-
- List<TargetedMod> loadedMods = Arrays.stream(TargetedMod.values())
- .filter(mod -> mod == VANILLA || (mod.loadInDevelopment && isDevelopmentEnvironment) || loadJarOf(mod))
- .collect(Collectors.toList());
-
- for (TargetedMod mod : TargetedMod.values()) {
- if (loadedMods.contains(mod)) {
- LOG.info("Found " + mod.modName + "! Integrating now...");
- } else {
- LOG.info("Could not find " + mod.modName + "! Skipping integration....");
- }
- }
-
- List<String> mixins = new ArrayList<>();
- for (Mixin mixin : Mixin.values()) {
- if (mixin.shouldLoad(loadedMods)) {
- mixins.add(mixin.mixinClass);
- LOG.debug("Loading mixin: " + mixin.mixinClass);
- }
- }
- return mixins;
- }
-
- private boolean loadJarOf(final TargetedMod mod) {
- try {
- File jar = findJarOf(mod);
- if (jar == null) {
- LOG.info("Jar not found for " + mod);
- return false;
- }
-
- LOG.info("Attempting to add " + jar + " to the URL Class Path");
- if (!jar.exists()) {
- throw new FileNotFoundException(jar.toString());
- }
- MinecraftURLClassPath.addJar(jar);
- return true;
- } catch (Exception e) {
- e.printStackTrace();
- return false;
- }
- }
-
- public static File findJarOf(final TargetedMod mod) {
- try (Stream<Path> stream = walk(MODS_DIRECTORY_PATH)) {
- return stream.filter(mod::isMatchingJar)
- .map(Path::toFile)
- .findFirst()
- .orElse(null);
- } catch (IOException e) {
- e.printStackTrace();
- return null;
- }
- }
-
- @Override
- public void preApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) {}
-
- @Override
- public void postApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) {}
-}
diff --git a/src/main/java/gregtech/mixin/TargetedMod.java b/src/main/java/gregtech/mixin/TargetedMod.java
index 0f402d1947..d8e1018f17 100644
--- a/src/main/java/gregtech/mixin/TargetedMod.java
+++ b/src/main/java/gregtech/mixin/TargetedMod.java
@@ -1,43 +1,75 @@
package gregtech.mixin;
-import java.nio.file.Path;
-
-import com.google.common.io.Files;
+import cpw.mods.fml.common.Mod;
public enum TargetedMod {
- VANILLA("Minecraft", "unused", true),
-
- ;
+ // NOTE: This doesn't work - late mods need a modid, not a coremod class
+ ADVANCED_SOLAR_PANELS("Advanced Solar Panels", null, "AdvancedSolarPanel"),
+ ANGELICA("Angelica", "com.gtnewhorizons.angelica.loading.AngelicaTweaker", "angelica"),
+ ARCHAICFIX("ArchaicFix", "org.embeddedt.archaicfix.ArchaicCore", "archaicfix"),
+ AUTOMAGY("Automagy", null, "Automagy"),
+ BAUBLES("Baubles", null, "Baubles"),
+ BETTERHUD("Better HUD", null, "hud"),
+ BIBLIOCRAFT("Bibliocraft", null, "BiblioCraft"),
+ BOP("BiomesOPlenty", null, "BiomesOPlenty"),
+ BUGTORCH("BugTorch", "jss.bugtorch.mixinplugin.BugTorchEarlyMixins", "bugtorch"),
+ BUKKIT("Bukkit/Thermos", "Bukkit", null),
+ COFH_CORE("CoFHCore", "cofh.asm.LoadingPlugin", "CoFHCore"),
+ DAMAGE_INDICATORS("Damage Indicators", null, "DamageIndicatorsMod"),
+ EXTRATIC("ExtraTiC", null, "ExtraTiC"),
+ EXTRA_UTILITIES("ExtraUtilities", null, "ExtraUtilities"),
+ FASTCRAFT("FastCraft", "fastcraft.Tweaker"),
+ GALACTICRAFT_CORE("GalacticraftCore", "micdoodle8.mods.galacticraft.core.asm.GCLoadingPlugin", "GalacticraftCore"),
+ GT5U("GregTech5u", null, "gregtech"), // Also matches GT6.
+ GT6("GregTech6", "gregtech.asm.GT_ASM", "gregapi"), // Can be used to exclude GT6 from the GT5U target.
+ GTNHLIB("GTNHLib", "com.gtnewhorizon.gtnhlib.core.GTNHLibCore", "gtnhlib"),
+ HARVESTCRAFT("harvestcraft", null, "harvestcraft"),
+ HARVESTTHENETHER("harvestthenether", null, "harvestthenether"),
+ HUNGER_OVERHAUL("HungerOverhaul", null, "HungerOverhaul"),
+ IC2("IC2", "ic2.core.coremod.IC2core", "IC2"),
+ IMMERSIVE_ENGINENEERING("Immersive Engineering", null, "ImmersiveEngineering"),
+ JOURNEYMAP("JourneyMap", null, "journeymap"),
+ LOTR("The Lord of the rings mod", "lotr.common.coremod.LOTRLoadingPlugin", "lotr"),
+ LWJGL3IFY("lwjgl3ify", "me.eigenraven.lwjgl3ify.core.Lwjgl3ifyCoremod", "lwjgl3ify"),
+ MINECHEM("Minechem", null, "minechem"),
+ MINEFACTORY_RELOADED("MineFactory Reloaded", null, "MineFactoryReloaded"),
+ MRTJPCORE("MrTJPCore", null, "MrTJPCoreMod"),
+ NOTENOUGHITEMS("NotEnoughItems", "codechicken.nei.asm.NEICorePlugin", "NotEnoughItems"),
+ OPTIFINE("Optifine", "optifine.OptiFineForgeTweaker", "Optifine"),
+ PORTAL_GUN("PortalGun", null, "PortalGun"),
+ PROJECTE("ProjectE", null, "ProjectE"),
+ RAILCRAFT("Railcraft", null, "Railcraft"),
+ THAUMCRAFT("Thaumcraft", null, "Thaumcraft"), // "thaumcraft.codechicken.core.launch.DepLoader"
+ THERMALDYNAMICS("Thermal Dynamics", null, "ThermalDynamics"),
+ THERMALEXPANSION("Thermal Expansion", null, "ThermalExpansion"),
+ TINKERSCONSTRUCT("TConstruct", null, "TConstruct"),
+ TRAVELLERSGEAR("TravellersGear", null, "TravellersGear"),
+ VANILLA("Minecraft", null),
+ VOXELMAP("VoxelMap", "com.thevoxelbox.voxelmap.litemod.VoxelMapTransformer", "voxelmap"),
+ WITCHERY("Witchery", null, "witchery"),
+ XAEROWORLDMAP("Xaero's World Map", null, "XaeroWorldMap"),
+ ZTONES("ZTones", null, "Ztones");
+ /** The "name" in the {@link Mod @Mod} annotation */
public final String modName;
- public final String jarNamePrefixLowercase;
- public final boolean loadInDevelopment;
+ /** Class that implements the IFMLLoadingPlugin interface */
+ public final String coreModClass;
+ /** The "modid" in the {@link Mod @Mod} annotation */
+ public final String modId;
- TargetedMod(String modName, String jarNamePrefix, boolean loadInDevelopment) {
- this.modName = modName;
- this.jarNamePrefixLowercase = jarNamePrefix.toLowerCase();
- this.loadInDevelopment = loadInDevelopment;
+ TargetedMod(String modName, String coreModClass) {
+ this(modName, coreModClass, null);
}
- @SuppressWarnings("UnstableApiUsage")
- public boolean isMatchingJar(Path path) {
- final String pathString = path.toString();
- final String nameLowerCase = Files.getNameWithoutExtension(pathString)
- .toLowerCase();
- final String fileExtension = Files.getFileExtension(pathString);
-
- return nameLowerCase.startsWith(jarNamePrefixLowercase) && "jar".equals(fileExtension);
+ TargetedMod(String modName, String coreModClass, String modId) {
+ this.modName = modName;
+ this.coreModClass = coreModClass;
+ this.modId = modId;
}
@Override
public String toString() {
- return "TargetedMod{" + "modName='"
- + modName
- + '\''
- + ", jarNamePrefixLowercase='"
- + jarNamePrefixLowercase
- + '\''
- + '}';
+ return "TargetedMod{modName='" + modName + "', coreModClass='" + coreModClass + "', modId='" + modId + "'}";
}
}
diff --git a/src/main/java/gregtech/mixin/mixins/early/minecraft/CraftingManagerMixin.java b/src/main/java/gregtech/mixin/mixins/early/minecraft/CraftingManagerMixin.java
new file mode 100644
index 0000000000..1a88150128
--- /dev/null
+++ b/src/main/java/gregtech/mixin/mixins/early/minecraft/CraftingManagerMixin.java
@@ -0,0 +1,24 @@
+package gregtech.mixin.mixins.early.minecraft;
+
+import net.minecraft.inventory.InventoryCrafting;
+import net.minecraft.item.ItemStack;
+import net.minecraft.item.crafting.CraftingManager;
+import net.minecraft.world.World;
+
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.Overwrite;
+
+import com.github.bartimaeusnek.bartworks.ASM.BWCoreStaticReplacementMethodes;
+
+@Mixin(CraftingManager.class)
+public abstract class CraftingManagerMixin {
+
+ /**
+ * @author bart
+ * @reason Cache the result of findMatchingRecipe
+ */
+ @Overwrite
+ public ItemStack findMatchingRecipe(InventoryCrafting inventoryCrafting, World world) {
+ return BWCoreStaticReplacementMethodes.findCachedMatchingRecipe(inventoryCrafting, world);
+ }
+}
diff --git a/src/main/java/gregtech/mixin/mixins/minecraft/LanguageRegistryMixin.java b/src/main/java/gregtech/mixin/mixins/early/minecraft/LanguageRegistryMixin.java
index ee98a11f88..f6a0ebeaad 100644
--- a/src/main/java/gregtech/mixin/mixins/minecraft/LanguageRegistryMixin.java
+++ b/src/main/java/gregtech/mixin/mixins/early/minecraft/LanguageRegistryMixin.java
@@ -1,4 +1,4 @@
-package gregtech.mixin.mixins.minecraft;
+package gregtech.mixin.mixins.early.minecraft;
import static gregtech.mixin.MixinsVariablesHelper.currentlyTranslating;
diff --git a/src/main/java/gregtech/mixin/mixins/minecraft/LocaleMixin.java b/src/main/java/gregtech/mixin/mixins/early/minecraft/LocaleMixin.java
index 3a1864534a..e45548765c 100644
--- a/src/main/java/gregtech/mixin/mixins/minecraft/LocaleMixin.java
+++ b/src/main/java/gregtech/mixin/mixins/early/minecraft/LocaleMixin.java
@@ -1,4 +1,4 @@
-package gregtech.mixin.mixins.minecraft;
+package gregtech.mixin.mixins.early.minecraft;
import static gregtech.mixin.MixinsVariablesHelper.currentlyTranslating;
diff --git a/src/main/java/gregtech/mixin/mixins/minecraft/StringTranslateMixin.java b/src/main/java/gregtech/mixin/mixins/early/minecraft/StringTranslateMixin.java
index d9b80a0f52..5fb393def9 100644
--- a/src/main/java/gregtech/mixin/mixins/minecraft/StringTranslateMixin.java
+++ b/src/main/java/gregtech/mixin/mixins/early/minecraft/StringTranslateMixin.java
@@ -1,4 +1,4 @@
-package gregtech.mixin.mixins.minecraft;
+package gregtech.mixin.mixins.early.minecraft;
import static gregtech.mixin.MixinsVariablesHelper.currentlyTranslating;
diff --git a/src/main/java/gregtech/mixin/mixins/minecraft/WorldMixin.java b/src/main/java/gregtech/mixin/mixins/early/minecraft/WorldMixin.java
index 1d99287659..abdb61f55b 100644
--- a/src/main/java/gregtech/mixin/mixins/minecraft/WorldMixin.java
+++ b/src/main/java/gregtech/mixin/mixins/early/minecraft/WorldMixin.java
@@ -1,4 +1,4 @@
-package gregtech.mixin.mixins.minecraft;
+package gregtech.mixin.mixins.early.minecraft;
import net.minecraft.block.Block;
import net.minecraft.world.World;
diff --git a/src/main/java/gregtech/mixin/mixins/late/thaumcraft/TileWandPedestalMixin.java b/src/main/java/gregtech/mixin/mixins/late/thaumcraft/TileWandPedestalMixin.java
new file mode 100644
index 0000000000..bfc79731e4
--- /dev/null
+++ b/src/main/java/gregtech/mixin/mixins/late/thaumcraft/TileWandPedestalMixin.java
@@ -0,0 +1,43 @@
+package gregtech.mixin.mixins.late.thaumcraft;
+
+import net.minecraft.inventory.ISidedInventory;
+import net.minecraft.item.ItemStack;
+
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.injection.At;
+
+import com.llamalad7.mixinextras.injector.v2.WrapWithCondition;
+
+import thaumcraft.api.TileThaumcraft;
+import thaumcraft.api.aspects.Aspect;
+import thaumcraft.api.aspects.IAspectContainer;
+import thaumcraft.common.items.baubles.ItemAmuletVis;
+import thaumcraft.common.items.wands.ItemWandCasting;
+import thaumcraft.common.tiles.TileWandPedestal;
+
+@Mixin(TileWandPedestal.class)
+public abstract class TileWandPedestalMixin extends TileThaumcraft implements ISidedInventory, IAspectContainer {
+
+ @WrapWithCondition(
+ method = "updateEntity",
+ at = @At(
+ value = "INVOKE",
+ target = "Lthaumcraft/common/items/wands/ItemWandCasting;addVis(Lnet/minecraft/item/ItemStack;Lthaumcraft/api/aspects/Aspect;IZ)I",
+ remap = false))
+ boolean gregtech$checkWandServerWorld(ItemWandCasting instance, ItemStack is, Aspect aspect, int amount,
+ boolean doit) {
+ return !this.worldObj.isRemote;
+ }
+
+ @WrapWithCondition(
+ method = "updateEntity",
+ at = @At(
+ value = "INVOKE",
+ target = "Lthaumcraft/common/items/baubles/ItemAmuletVis;addVis(Lnet/minecraft/item/ItemStack;Lthaumcraft/api/aspects/Aspect;IZ)I",
+ remap = false))
+ boolean gregtech$checkAmuletServerWorld(ItemAmuletVis instance, ItemStack is, Aspect aspect, int amount,
+ boolean doit) {
+ return !this.worldObj.isRemote;
+ }
+
+}
diff --git a/src/main/java/gregtech/mixin/mixins/late/xu/ChunkProviderEndOfTimeMixin.java b/src/main/java/gregtech/mixin/mixins/late/xu/ChunkProviderEndOfTimeMixin.java
new file mode 100644
index 0000000000..2565e309f2
--- /dev/null
+++ b/src/main/java/gregtech/mixin/mixins/late/xu/ChunkProviderEndOfTimeMixin.java
@@ -0,0 +1,28 @@
+package gregtech.mixin.mixins.late.xu;
+
+import java.util.Collections;
+import java.util.List;
+
+import net.minecraft.entity.EnumCreatureType;
+import net.minecraft.world.biome.BiomeGenBase;
+import net.minecraft.world.chunk.IChunkProvider;
+
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.Overwrite;
+
+import com.rwtema.extrautils.worldgen.endoftime.ChunkProviderEndOfTime;
+
+@Mixin(ChunkProviderEndOfTime.class)
+@SuppressWarnings("unused")
+public abstract class ChunkProviderEndOfTimeMixin implements IChunkProvider {
+
+ /**
+ * @author bart
+ * @reason Disable creature spawning in the Last Millenium entirely
+ */
+ @Overwrite
+ public List<BiomeGenBase.SpawnListEntry> getPossibleCreatures(EnumCreatureType p_73155_1_, int p_73155_2_,
+ int p_73155_3_, int p_73155_4_) {
+ return Collections.emptyList();
+ }
+}
diff --git a/src/main/java/gregtech/mixin/mixins/late/xu/WorldProviderEndOfTimeMixin.java b/src/main/java/gregtech/mixin/mixins/late/xu/WorldProviderEndOfTimeMixin.java
new file mode 100644
index 0000000000..3a063dc283
--- /dev/null
+++ b/src/main/java/gregtech/mixin/mixins/late/xu/WorldProviderEndOfTimeMixin.java
@@ -0,0 +1,18 @@
+package gregtech.mixin.mixins.late.xu;
+
+import net.minecraft.world.WorldProvider;
+import net.minecraft.world.chunk.Chunk;
+
+import org.spongepowered.asm.mixin.Mixin;
+
+import com.rwtema.extrautils.worldgen.endoftime.WorldProviderEndOfTime;
+
+@Mixin(WorldProviderEndOfTime.class)
+@SuppressWarnings("unused")
+public abstract class WorldProviderEndOfTimeMixin extends WorldProvider {
+
+ @Override
+ public boolean canDoRainSnowIce(Chunk chunk) {
+ return false;
+ }
+}