diff options
Diffstat (limited to 'src/main/java/gregtech/mixin')
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; + } +} |