diff --git a/dependencies.gradle b/dependencies.gradle index ebd61cf9..e66e745a 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -57,6 +57,7 @@ final def mod_dependencies = [ 'curse.maven:actuallyaditions-228404:2844115' : [debug_actually_additions], 'curse.maven:advent-of-ascension-311054:3054253' : [debug_advent_of_ascension], 'curse.maven:aether-255308:6316434' : [debug_aether_legacy], + 'curse.maven:ae2-extended-life-570458:5378163' : [debug_ae2uel], 'curse.maven:agricraft-225635:3317747' : [debug_agricraft], 'curse.maven:applecore-224472:2969118' : [debug_the_spice_of_life], 'curse.maven:arcanearchives-311357:3057332' : [debug_arcane_archives], @@ -99,6 +100,7 @@ final def mod_dependencies = [ 'curse.maven:epic-siege-mod-229449:3356157' : [debug_epic_siege_mod], 'curse.maven:evilcraft-74610:2811267' : [debug_evilcraft], 'curse.maven:extrautilities-225561:2678374' : [debug_extra_utilities_2], + 'curse.maven:extreme-reactors-250277:3194746' : [debug_extreme_reactors], 'curse.maven:forestry-59751:2918418' : [debug_forestry, debug_binnies_mods], 'curse.maven:forge-backpacks-59143:2554237' : [debug_backpack], 'curse.maven:forgemultipartcbe-258426:2755790' : [debug_forgemultipartcbe, debug_project_red], @@ -116,7 +118,7 @@ final def mod_dependencies = [ 'curse.maven:item-favorites-358194:3177845' : [debug_itemfavorites], 'curse.maven:jurassic-reborn-359537:4574634' : [debug_jurassic_reborn], 'curse.maven:mantle-74924:2713386' : [debug_tinkers_construct, debug_moartinkers], - 'curse.maven:mcjtylib-233105:2745846' : [debug_rftools], + 'curse.maven:mcjtylib-233105:2745846' : [debug_rftools, debug_xnet], 'curse.maven:mekanism-268560:2835175' : [debug_mekanism], 'curse.maven:moartinkers-263624:2579934' : [debug_moartinkers], 'curse.maven:modtweaker-220954:3840577' : [debug_crafttweaker], @@ -170,8 +172,10 @@ final def mod_dependencies = [ 'curse.maven:tinkerscomplement-272671:2843439' : [debug_tinkers_construct], 'curse.maven:tinyprogressions-250850:2721018' : [debug_tiny_progressions], 'curse.maven:wanionlib-253043:4623135' : [debug_avaritiaaddons], + 'curse.maven:xnet-260912:2745852' : [debug_xnet], 'curse.maven:tomb-many-graves-2-262823:2619249' : [debug_tomb_many_graves], 'curse.maven:woot-244049:2712670' : [debug_woot], + 'curse.maven:zerocore-247921:3194743' : [debug_extreme_reactors], 'maven.modrinth:industrial-foregoing:1.12.13-237' : [debug_industrial_foregoing], 'net.darkhax.bookshelf:Bookshelf-1.12.2:2.3.590' : [debug_stages, debug_bookshelf], 'net.darkhax.gamestages:GameStages-1.12.2:2.0.120' : [debug_stages], diff --git a/gradle.properties b/gradle.properties index da8816c2..0df0aa11 100644 --- a/gradle.properties +++ b/gradle.properties @@ -10,6 +10,7 @@ debug_abyssalcraft = false debug_actually_additions = false debug_advent_of_ascension = false debug_aether_legacy = false +debug_ae2uel = false debug_agricraft = false debug_arcane_archives = false debug_astral_sorcery = false @@ -48,6 +49,7 @@ debug_epic_siege_mod = false debug_erebus = false debug_evilcraft = false debug_extra_utilities_2 = false +debug_extreme_reactors = false debug_forestry = false debug_forgemultipartcbe = false debug_fps_reducer = false @@ -96,6 +98,7 @@ debug_tinkers_construct = false debug_tiny_progressions = false debug_tomb_many_graves = false debug_woot = false +debug_xnet = false # Gradle Settings # Effectively applies the '--stacktrace' flag by default diff --git a/src/main/java/mod/acgaming/universaltweaks/config/UTConfigMods.java b/src/main/java/mod/acgaming/universaltweaks/config/UTConfigMods.java index f4c936ae..484f3d66 100644 --- a/src/main/java/mod/acgaming/universaltweaks/config/UTConfigMods.java +++ b/src/main/java/mod/acgaming/universaltweaks/config/UTConfigMods.java @@ -23,6 +23,10 @@ public class UTConfigMods @Config.Name("Actually Additions") public static final ActuallyAdditionsCategory ACTUALLY_ADDITIONS = new ActuallyAdditionsCategory(); + @Config.LangKey("cfg.universaltweaks.modintegration.ae2uel") + @Config.Name("Applied Energistics 2 Unofficial Extended Life") + public static final AE2UELCategory AE2UEL = new AE2UELCategory(); + @Config.LangKey("cfg.universaltweaks.modintegration.aether_legacy") @Config.Name("Aether Legacy") public static final AetherLegacyCategory AETHER_LEGACY = new AetherLegacyCategory(); @@ -167,6 +171,10 @@ public class UTConfigMods @Config.Name("Extra Utilities 2") public static final ExtraUtilitiesCategory EXTRA_UTILITIES = new ExtraUtilitiesCategory(); + @Config.LangKey("cfg.universaltweaks.modintegration.extreme_reactors") + @Config.Name("Extreme Reactors") + public static final ExtremeReactorsCategory EXTREME_REACTORS = new ExtremeReactorsCategory(); + @Config.LangKey("cfg.universaltweaks.modintegration.forestry") @Config.Name("Forestry") public static final ForestryCategory FORESTRY = new ForestryCategory(); @@ -283,6 +291,10 @@ public class UTConfigMods @Config.Name("Requious Frakto") public static final RequiousFraktoCategory REQUIOUS_FRAKTO = new RequiousFraktoCategory(); + @Config.LangKey("cfg.universaltweaks.modintegration.rftools") + @Config.Name("RFTools") + public static final RFToolsCategory RFTOOLS = new RFToolsCategory(); + @Config.LangKey("cfg.universaltweaks.modintegration.rftoolsdimensions") @Config.Name("RFTools Dimensions") public static final RFToolsDimensionsCategory RFTOOLS_DIMENSIONS = new RFToolsDimensionsCategory(); @@ -351,6 +363,10 @@ public class UTConfigMods @Config.Name("Woot") public static final WootCategory WOOT = new WootCategory(); + @Config.LangKey("cfg.universaltweaks.modintegration.xnet") + @Config.Name("XNet") + public static final XNetCategory XNET = new XNetCategory(); + public static class AbyssalCraftCategory { @Config.Name("Disable Plague Potion Clouds") @@ -383,6 +399,14 @@ public static class ActuallyAdditionsCategory public int utItemLaserParticlesGraphics = -1; } + public static class AE2UELCategory + { + @Config.RequiresMcRestart + @Config.Name("Mitigate Storage Bus Crashes") + @Config.Comment("Mitigates crashes caused by misbehaving IItemHandlers.") + public boolean utItemHandlerCrash = true; + } + public static class AetherLegacyCategory { @Config.RequiresMcRestart @@ -937,6 +961,14 @@ public static class ExtraUtilitiesCategory public boolean utDowngradePotionLogging = true; } + public static class ExtremeReactorsCategory + { + @Config.RequiresMcRestart + @Config.Name("Mitigate Steam Reactor Crash") + @Config.Comment("Mitigates NPE in updateServer by no-oping fluid transfers when the direction is null.") + public boolean utSteamReactorCrash = true; + } + public static class ForestryCategory { @Config.RequiresMcRestart @@ -1000,6 +1032,11 @@ public static class InControlCategory @Config.Name("Spawn Rule Stats Fix") @Config.Comment("Fixes onJoin spawn rules repeatedly modifying mob attack/health/speed") public boolean utStatsFixToggle = true; + + @Config.RequiresMcRestart + @Config.Name("Fix ForgeEventHandler Crash") + @Config.Comment("Prevents the client thread from modifying a server-only static field.") + public boolean utClientCrash = true; } public static class IndustrialCraftCategory @@ -1257,6 +1294,14 @@ public static class RequiousFraktoCategory public boolean utParticleFixesToggle = true; } + public static class RFToolsCategory + { + @Config.RequiresMcRestart + @Config.Name("Fix RF Tools + XNet Crash") + @Config.Comment("Fixes a sporadic crash when using a rftools.storage xnet channel") + public boolean utRFToolsStorageCrash = true; + } + public static class RFToolsDimensionsCategory { @Config.RequiresMcRestart @@ -1596,6 +1641,14 @@ public static class WootCategory public boolean utCleanupSimulatedKillsToggle = true; } + public static class XNetCategory + { + @Config.RequiresMcRestart + @Config.Name("Fix Various Controller Crashes") + @Config.Comment("Patches several ArrayIndexOutOfBoundsExceptions in the controller logic") + public boolean utControllerCrashes = true; + } + static { ConfigAnytime.register(UTConfigMods.class); diff --git a/src/main/java/mod/acgaming/universaltweaks/core/UTMixinLoader.java b/src/main/java/mod/acgaming/universaltweaks/core/UTMixinLoader.java index 83f9d47f..c197c823 100644 --- a/src/main/java/mod/acgaming/universaltweaks/core/UTMixinLoader.java +++ b/src/main/java/mod/acgaming/universaltweaks/core/UTMixinLoader.java @@ -68,6 +68,7 @@ public class UTMixinLoader implements ILateMixinLoader put("mixins/mods/mixins.actuallyadditions.dupes.json", c -> c.isModPresent("actuallyadditions") && UTConfigMods.ACTUALLY_ADDITIONS.utDuplicationFixesToggle); put("mixins/mods/mixins.actuallyadditions.relayupgrade.json", c -> c.isModPresent("actuallyadditions") && UTConfigMods.ACTUALLY_ADDITIONS.utLaserUpgradeVoid); put("mixins/mods/mixins.aetherlegacy.eventdrops.json", c -> c.isModPresent("aether_legacy") && UTConfigMods.AETHER_LEGACY.utCaptureAccessoryDrops); + put("mixins/mods/mixins.ae2uel.handler_crash.json", c -> c.isModPresent("appliedenergistics2") && UTConfigMods.AE2UEL.utItemHandlerCrash); put("mixins/mods/mixins.agricraft.json", c -> c.isModPresent("agricraft") && UTConfigMods.AGRICRAFT.utEnderIOPluginFixToggle); put("mixins/mods/mixins.aoa3.json", c -> c.isModPresent("aoa3") && UTConfigMods.AOA.utImprovedPlayerTickToggle); put("mixins/mods/mixins.arcanearchives.dupes.json", c -> c.isModPresent("arcanearchives") && UTConfigMods.ARCANE_ARCHIVES.utDuplicationFixesToggle); @@ -133,11 +134,13 @@ public class UTMixinLoader implements ILateMixinLoader put("mixins/mods/mixins.extrautilities.potionlogging.json", c -> c.isModPresent("extrautils2") && UTConfigMods.EXTRA_UTILITIES.utDowngradePotionLogging); put("mixins/mods/mixins.extrautilities.radarexception.json", c -> c.isModPresent("extrautils2") && UTConfigMods.EXTRA_UTILITIES.utCatchRadarException); put("mixins/mods/mixins.extrautilities.radarloot.json", c -> c.isModPresent("extrautils2") && UTConfigMods.EXTRA_UTILITIES.utRadarSkipsLoottables); + put("mixins/mods/mixins.extreme_reactors.reactor_crash.json", c -> c.isModPresent("bigreactors") && UTConfigMods.EXTREME_REACTORS.utSteamReactorCrash); put("mixins/mods/mixins.forestry.extratrees.json", c -> c.isModPresent("extratrees") && UTConfigMods.FORESTRY.utFOGatherWindfallToggle); put("mixins/mods/mixins.forestry.json", c -> c.isModPresent("forestry")); put("mixins/mods/mixins.immersiveengineering.toolevent.json", c -> c.isModPresent("immersiveengineering") && UTConfigMods.IMMERSIVE_ENGINEERING.utFireBreakEvent); put("mixins/mods/mixins.immersiveengineering.toolhand.json", c -> c.isModPresent("immersiveengineering") && UTConfigMods.IMMERSIVE_ENGINEERING.utFixIncorrectHandReplacement); - put("mixins/mods/mixins.incontrol.json", c -> c.isModPresent("incontrol") && UTConfigMods.INCONTROL.utStatsFixToggle); + put("mixins/mods/mixins.incontrol.rule.json", c -> c.isModPresent("incontrol") && UTConfigMods.INCONTROL.utStatsFixToggle); + put("mixins/mods/mixins.incontrol.handler_crash.json", c -> c.isModPresent("incontrol") && UTConfigMods.INCONTROL.utClientCrash); put("mixins/mods/mixins.industrialcraft.dupes.json", c -> c.isModPresent("ic2") && UTConfigMods.INDUSTRIALCRAFT.utDuplicationFixesToggle); put("mixins/mods/mixins.industrialforegoing.dupes.json", c -> c.isModPresent("industrialforegoing") && UTConfigMods.INDUSTRIAL_FOREGOING.utDuplicationFixesToggle); put("mixins/mods/mixins.industrialforegoing.rangeaddon.json", c -> c.isModPresent("industrialforegoing") && UTConfigMods.INDUSTRIAL_FOREGOING.utRangeAddonNumberFix); @@ -161,6 +164,7 @@ public class UTMixinLoader implements ILateMixinLoader put("mixins/mods/mixins.randomthings.collector.json", c -> c.isModPresent("randomthings") && UTConfigMods.RANDOM_THINGS.utItemCollectorDupe); put("mixins/mods/mixins.requiousfrakto.json", c -> c.isModPresent("requious") && UTConfigMods.REQUIOUS_FRAKTO.utParticleFixesToggle); put("mixins/mods/mixins.reskillable.json", c -> c.isModPresent("reskillable")); + put("mixins/mods/mixins.rftools.json", c -> c.isModPresent("rftools") && UTConfigMods.RFTOOLS.utRFToolsStorageCrash); put("mixins/mods/mixins.rftoolsdimensions.json", c -> c.isModPresent("rftoolsdim")); put("mixins/mods/mixins.roost.contenttweaker.json", c -> c.isModPresent("roost") && c.isModPresent("contenttweaker")); put("mixins/mods/mixins.roots.creativepouch.json", c -> c.isModPresent("roots") && UTConfigMods.ROOTS.utDisableCreativePouchGUI); @@ -188,6 +192,7 @@ public class UTMixinLoader implements ILateMixinLoader put("mixins/mods/mixins.tombmanygraves.timestamp.json", c -> c.isModPresent("tombmanygraves") && UTConfigMods.TOMBMANYGRAVES.utISOTimestamp); put("mixins/mods/mixins.tombmanygraves.worldsize.json", c -> c.isModPresent("tombmanygraves") && UTConfigMods.TOMBMANYGRAVES.utProperWorldSizeCheck); put("mixins/mods/mixins.woot.json", c -> c.isModPresent("woot") && UTConfigMods.WOOT.utCleanupSimulatedKillsToggle); + put("mixins/mods/mixins.xnet.controller_crashes.json", c -> c.isModPresent("xnet") && UTConfigMods.XNET.utControllerCrashes); } if (UTConfigGeneral.MASTER_SWITCHES.utMasterSwitchTweaks) { diff --git a/src/main/java/mod/acgaming/universaltweaks/mods/ae2uel/mixin/UTItemHandlerIteratorMixin.java b/src/main/java/mod/acgaming/universaltweaks/mods/ae2uel/mixin/UTItemHandlerIteratorMixin.java new file mode 100644 index 00000000..74d72be2 --- /dev/null +++ b/src/main/java/mod/acgaming/universaltweaks/mods/ae2uel/mixin/UTItemHandlerIteratorMixin.java @@ -0,0 +1,54 @@ +package mod.acgaming.universaltweaks.mods.ae2uel.mixin; + +import net.minecraft.item.ItemStack; + +import appeng.util.inv.ItemHandlerIterator; +import appeng.util.inv.ItemSlot; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +@Mixin(value = ItemHandlerIterator.class, remap = false) +public class UTItemHandlerIteratorMixin { + + @Shadow + @Final + private ItemSlot itemSlot; + + @Shadow + private int slot; + + /// As far as I can tell, this crash happens when the IItemHandler that's being iterated over changes its + /// length in the middle of being iterated over. This is obviously a bug, but AE2 has no control over how the + /// IItemHandler behaves. This mixin changes the behaviour of ItemHandlerIterator to instead pretend these + /// invalid slots are empty and cannot be extracted from, instead of crashing. + /// + /// java.util.NoSuchElementException + /// at appeng.util.inv.ItemHandlerIterator.next(ItemHandlerIterator.java:48) + /// at appeng.util.inv.ItemHandlerIterator.next(ItemHandlerIterator.java:28) + /// at appeng.parts.misc.ItemHandlerAdapter$InventoryCache.update(ItemHandlerAdapter.java:272) + /// at appeng.parts.misc.ItemHandlerAdapter.onTick(ItemHandlerAdapter.java:201) + /// at appeng.parts.misc.PartStorageBus.tickingRequest(PartStorageBus.java:316) + /// at appeng.me.cache.TickManagerCache.onUpdateTick(TickManagerCache.java:91) + /// at appeng.me.GridCacheWrapper.onUpdateTick(GridCacheWrapper.java:40) + /// at appeng.me.Grid.update(Grid.java:229) + /// at appeng.hooks.TickHandler.onTick(TickHandler.java:196) + /// at net.minecraftforge.fml.common.eventhandler.ASMEventHandler.invoke(ASMEventHandler.java:78) + /// at net.minecraftforge.fml.common.eventhandler.EventBus.post(EventBus.java:212) + /// at net.minecraftforge.fml.common.FMLCommonHandler.onPostServerTick(FMLCommonHandler.java:277) + /// at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:712) + /// at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:185) + /// at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:526) + /// at java.lang.Thread.run(Thread.java:1474) + @Inject(method = "next()Lappeng/util/inv/ItemSlot;", at = @At(value = "NEW", target = "()Ljava/util/NoSuchElementException;"), cancellable = true) + private void ut$preventNSEE(CallbackInfoReturnable cir) { + ((UTItemSlotAccessor) this.itemSlot).ut$setExtractable(false); + this.itemSlot.setItemStack(ItemStack.EMPTY); + this.itemSlot.setSlot(this.slot); + ++this.slot; + cir.setReturnValue(this.itemSlot); + } +} diff --git a/src/main/java/mod/acgaming/universaltweaks/mods/ae2uel/mixin/UTItemSlotAccessor.java b/src/main/java/mod/acgaming/universaltweaks/mods/ae2uel/mixin/UTItemSlotAccessor.java new file mode 100644 index 00000000..53e1d371 --- /dev/null +++ b/src/main/java/mod/acgaming/universaltweaks/mods/ae2uel/mixin/UTItemSlotAccessor.java @@ -0,0 +1,14 @@ +package mod.acgaming.universaltweaks.mods.ae2uel.mixin; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Invoker; + +import appeng.util.inv.ItemSlot; + +@Mixin(value = ItemSlot.class, remap = false) +public interface UTItemSlotAccessor { + + @Invoker("setExtractable") + void ut$setExtractable(boolean isExtractable); + +} diff --git a/src/main/java/mod/acgaming/universaltweaks/mods/extreme_reactors/mixin/UTMultiblockReactorMixin.java b/src/main/java/mod/acgaming/universaltweaks/mods/extreme_reactors/mixin/UTMultiblockReactorMixin.java new file mode 100644 index 00000000..665fa593 --- /dev/null +++ b/src/main/java/mod/acgaming/universaltweaks/mods/extreme_reactors/mixin/UTMultiblockReactorMixin.java @@ -0,0 +1,39 @@ +package mod.acgaming.universaltweaks.mods.extreme_reactors.mixin; + +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumFacing; +import net.minecraftforge.fluids.FluidStack; + +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import erogenousbeef.bigreactors.common.multiblock.MultiblockReactor; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +@Mixin(value = MultiblockReactor.class, remap = false) +public class UTMultiblockReactorMixin { + + /// java.lang.NullPointerException: Cannot invoke "net.minecraft.util.EnumFacing.func_82601_c()" because "☃" is null + /// at net.minecraft.util.math.BlockPos.offset(SourceFile:158) + /// at net.minecraft.util.math.BlockPos.offset(SourceFile:150) + /// at erogenousbeef.bigreactors.utils.FluidHelper.getTile(FluidHelper.java:50) + /// at erogenousbeef.bigreactors.utils.FluidHelper.getTile(FluidHelper.java:56) + /// at erogenousbeef.bigreactors.utils.FluidHelper.fillAdjacentHandler(FluidHelper.java:25) + /// at erogenousbeef.bigreactors.common.multiblock.MultiblockReactor.updateServer(MultiblockReactor.java:542) + /// at it.zerono.mods.zerocore.api.multiblock.MultiblockControllerBase.updateMultiblockEntity(MultiblockControllerBase.java:533) + /// at it.zerono.mods.zerocore.internal.common.MultiblockWorldRegistry.tickStart(MultiblockWorldRegistry.java:91) + /// at it.zerono.mods.zerocore.internal.common.MultiblockRegistry.tickStart(MultiblockRegistry.java:95) + /// at it.zerono.mods.zerocore.internal.common.MultiblockEventHandler.onWorldTick(MultiblockEventHandler.java:32) + /// at net.minecraftforge.fml.common.eventhandler.ASMEventHandler.invoke(ASMEventHandler.java:78) + /// at net.minecraftforge.fml.common.eventhandler.EventBus.post(EventBus.java:212) + /// at net.minecraftforge.fml.common.FMLCommonHandler.onPreWorldTick(FMLCommonHandler.java:298) + /// at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:752) + /// at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:668) + /// at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:185) + /// at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:526) + /// at java.lang.Thread.run(Thread.java:1474) + @WrapOperation(method = "updateServer", at = @At(value = "INVOKE", target = "Lerogenousbeef/bigreactors/utils/FluidHelper;fillAdjacentHandler(Lnet/minecraft/tileentity/TileEntity;Lnet/minecraft/util/EnumFacing;Lnet/minecraftforge/fluids/FluidStack;Z)I")) + private int ut$preventNPE(TileEntity origin, EnumFacing facing, FluidStack fluid, boolean doFill, Operation original) { + return facing == null ? 0 : original.call(origin, facing, fluid, doFill); + } +} diff --git a/src/main/java/mod/acgaming/universaltweaks/mods/incontrol/mixin/UTForgeEventHandlersMixin.java b/src/main/java/mod/acgaming/universaltweaks/mods/incontrol/mixin/UTForgeEventHandlersMixin.java new file mode 100644 index 00000000..a478d085 --- /dev/null +++ b/src/main/java/mod/acgaming/universaltweaks/mods/incontrol/mixin/UTForgeEventHandlersMixin.java @@ -0,0 +1,58 @@ +package mod.acgaming.universaltweaks.mods.incontrol.mixin; + +import net.minecraftforge.event.entity.EntityJoinWorldEvent; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import mcjty.incontrol.ForgeEventHandlers; + +@Mixin(value = ForgeEventHandlers.class, remap = false) +public class UTForgeEventHandlersMixin { + + /// java.util.concurrent.ExecutionException: java.lang.RuntimeException: A severe problem occurred during the spawning of an entity at (-92.86881406101907, 65.0, 469.4996410616231) + /// at java.util.concurrent.FutureTask.report(FutureTask.java:124) + /// at java.util.concurrent.FutureTask.get(FutureTask.java:193) + /// at net.minecraft.util.Util.runTask(SourceFile:531) + /// at net.minecraft.client.Minecraft.runGameLoop(Minecraft.java:1068) + /// at net.minecraft.client.Minecraft.run(Minecraft.java:5605) + /// at net.minecraft.client.main.Main.main(SourceFile:123) + /// at top.outlands.foundation.LaunchHandler.launch(LaunchHandler.java:125) + /// at top.outlands.foundation.boot.Foundation.main(Foundation.java:39) + /// at jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104) + /// at java.lang.reflect.Method.invoke(Method.java:565) + /// at org.polymc.impl.OneSixLauncher.invokeMain(OneSixLauncher.java:104) + /// at org.polymc.impl.OneSixLauncher.launchWithMainClass(OneSixLauncher.java:176) + /// at org.polymc.impl.OneSixLauncher.launch(OneSixLauncher.java:186) + /// at org.polymc.EntryPoint.listen(EntryPoint.java:144) + /// at org.polymc.EntryPoint.main(EntryPoint.java:74) + /// Caused by: java.lang.RuntimeException: A severe problem occurred during the spawning of an entity at (-92.86881406101907, 65.0, 469.4996410616231) + /// at net.minecraftforge.fml.common.network.internal.EntitySpawnHandler.spawnEntity(EntitySpawnHandler.java:135) + /// at net.minecraftforge.fml.common.network.internal.EntitySpawnHandler.process(EntitySpawnHandler.java:64) + /// at net.minecraftforge.fml.common.network.internal.EntitySpawnHandler.lambda$channelRead0$0(EntitySpawnHandler.java:55) + /// at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:545) + /// at java.util.concurrent.FutureTask.run(FutureTask.java:328) + /// at net.minecraft.util.Util.runTask(SourceFile:529) + /// ... 12 more + /// Caused by: java.lang.NullPointerException: Cannot read field "total" because "x0" is null + /// at mcjty.incontrol.rules.RuleCache$CountPerMod.access$008(RuleCache.java:96) + /// at mcjty.incontrol.rules.RuleCache$CachePerWorld.count(RuleCache.java:203) + /// at mcjty.incontrol.rules.RuleCache$CachePerWorld.registerSpawn(RuleCache.java:227) + /// at mcjty.incontrol.rules.RuleCache.registerSpawn(RuleCache.java:78) + /// at mcjty.incontrol.ForgeEventHandlers.onEntityJoinWorldLast(ForgeEventHandlers.java:63) + /// at net.minecraftforge.fml.common.eventhandler.ASMEventHandler.invoke(ASMEventHandler.java:78) + /// at net.minecraftforge.fml.common.eventhandler.EventBus.post(EventBus.java:212) + /// at net.minecraft.world.World.spawnEntity(World.java:1209) + /// at net.minecraft.client.multiplayer.WorldClient.spawnEntity(WorldClient.java:196) + /// at net.minecraft.client.multiplayer.WorldClient.addEntityToWorld(WorldClient.java:259) + /// at net.minecraftforge.fml.common.network.internal.EntitySpawnHandler.spawnEntity(EntitySpawnHandler.java:131) + /// ... 17 more + @Inject(method = "onEntityJoinWorldLast", at = @At("HEAD"), cancellable = true) + private void ut$fixOnEntityJoinWorldLast(EntityJoinWorldEvent event, CallbackInfo ci) { + if (event.getWorld().isRemote) { + ci.cancel(); + } + } +} diff --git a/src/main/java/mod/acgaming/universaltweaks/mods/rftools/mixin/UTStorageConnectorSettingsMixin.java b/src/main/java/mod/acgaming/universaltweaks/mods/rftools/mixin/UTStorageConnectorSettingsMixin.java new file mode 100644 index 00000000..79433945 --- /dev/null +++ b/src/main/java/mod/acgaming/universaltweaks/mods/rftools/mixin/UTStorageConnectorSettingsMixin.java @@ -0,0 +1,41 @@ +package mod.acgaming.universaltweaks.mods.rftools.mixin; + +import net.minecraft.item.ItemStack; + +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import mcjty.lib.varia.ItemStackList; +import mcjty.rftools.compat.xnet.StorageConnectorSettings; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +@Mixin(StorageConnectorSettings.class) +public class UTStorageConnectorSettingsMixin { + + /// java.util.concurrent.ExecutionException: java.lang.NullPointerException: The validated object is null + /// at java.util.concurrent.FutureTask.report(FutureTask.java:124) + /// at java.util.concurrent.FutureTask.get(FutureTask.java:193) + /// at net.minecraft.util.Util.runTask(SourceFile:531) + /// at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:723) + /// at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:668) + /// at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:185) + /// at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:526) + /// at java.lang.Thread.run(Thread.java:1474) + /// Caused by: java.lang.NullPointerException: The validated object is null + /// at java.util.Objects.requireNonNull(Objects.java:340) + /// at org.apache.commons.lang3.Validate.notNull(Validate.java:1063) + /// at org.apache.commons.lang3.Validate.notNull(Validate.java:1045) + /// at net.minecraft.util.NonNullList.set(SourceFile:49) + /// at mcjty.rftools.compat.xnet.StorageConnectorSettings.update(StorageConnectorSettings.java:191) + /// at mcjty.xnet.blocks.controller.TileEntityController.updateConnector(TileEntityController.java:555) + /// at mcjty.xnet.blocks.controller.TileEntityController.execute(TileEntityController.java:1038) + /// at mcjty.lib.network.PacketServerCommandTyped.lambda$handle$0(PacketServerCommandTyped.java:93) + /// at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:545) + /// at java.util.concurrent.FutureTask.run(FutureTask.java:328) + /// at net.minecraft.util.Util.runTask(SourceFile:529) + /// ... 5 more + @WrapOperation(method = "update", at = @At(value = "INVOKE", target = "Lmcjty/lib/varia/ItemStackList;set(ILjava/lang/Object;)Ljava/lang/Object;")) + private Object ut$fixUpdate(ItemStackList instance, int i, Object o, Operation original) { + return original.call(instance, i, o == null ? ItemStack.EMPTY : o); + } +} diff --git a/src/main/java/mod/acgaming/universaltweaks/mods/xnet/mixin/UTTileEntityControllerMixin.java b/src/main/java/mod/acgaming/universaltweaks/mods/xnet/mixin/UTTileEntityControllerMixin.java new file mode 100644 index 00000000..721ca485 --- /dev/null +++ b/src/main/java/mod/acgaming/universaltweaks/mods/xnet/mixin/UTTileEntityControllerMixin.java @@ -0,0 +1,120 @@ +package mod.acgaming.universaltweaks.mods.xnet.mixin; + +import net.minecraft.entity.player.EntityPlayerMP; + +import com.llamalad7.mixinextras.sugar.Local; +import mcjty.lib.typed.TypedMap; +import mcjty.xnet.api.keys.SidedPos; +import mcjty.xnet.blocks.controller.TileEntityController; +import mcjty.xnet.logic.ChannelInfo; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +@Mixin(value = TileEntityController.class, remap = false) +public class UTTileEntityControllerMixin { + + @Shadow + @Final + private ChannelInfo[] channels; + + /// java.util.concurrent.ExecutionException: java.lang.ArrayIndexOutOfBoundsException: Index -1 out of bounds for length 8 + /// at java.util.concurrent.FutureTask.report(FutureTask.java:124) + /// at java.util.concurrent.FutureTask.get(FutureTask.java:193) + /// at net.minecraft.util.Util.runTask(SourceFile:531) + /// at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:723) + /// at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:668) + /// at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:185) + /// at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:526) + /// at java.lang.Thread.run(Thread.java:1474) + /// Caused by: java.lang.ArrayIndexOutOfBoundsException: Index -1 out of bounds for length 8 + /// at mcjty.xnet.blocks.controller.TileEntityController.createChannel(TileEntityController.java:541) + /// at mcjty.xnet.blocks.controller.TileEntityController.execute(TileEntityController.java:999) + /// at mcjty.lib.network.PacketServerCommandTyped.lambda$handle$0(PacketServerCommandTyped.java:93) + /// at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:545) + /// at java.util.concurrent.FutureTask.run(FutureTask.java:328) + /// at net.minecraft.util.Util.runTask(SourceFile:529) + /// ... 5 more + @Inject(method = "execute", at = @At(value = "INVOKE", target = "Lmcjty/xnet/blocks/controller/TileEntityController;createChannel(ILjava/lang/String;)V"), cancellable = true) + private void ut$fixCreateChannel(EntityPlayerMP playerMP, String command, TypedMap params, CallbackInfoReturnable cir, @Local(type = int.class) int index) { + if (index < 0 || index >= this.channels.length) { + cir.setReturnValue(false); + } + } + + /// java.util.concurrent.ExecutionException: java.lang.NullPointerException: Cannot invoke "mcjty.xnet.logic.ChannelInfo.getType()" because "this.channels[channel]" is null + /// at java.util.concurrent.FutureTask.report(FutureTask.java:124) + /// at java.util.concurrent.FutureTask.get(FutureTask.java:193) + /// at net.minecraft.util.Util.runTask(SourceFile:531) + /// at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:723) + /// at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:668) + /// at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:185) + /// at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:526) + /// at java.lang.Thread.run(Thread.java:1474) + /// Caused by: java.lang.NullPointerException: Cannot invoke "mcjty.xnet.logic.ChannelInfo.getType()" because "this.channels[channel]" is null + /// at mcjty.xnet.blocks.controller.TileEntityController.pasteConnector(TileEntityController.java:782) + /// at mcjty.xnet.blocks.controller.TileEntityController.execute(TileEntityController.java:1010) + /// at mcjty.lib.network.PacketServerCommandTyped.lambda$handle$0(PacketServerCommandTyped.java:93) + /// at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:545) + /// at java.util.concurrent.FutureTask.run(FutureTask.java:328) + /// at net.minecraft.util.Util.runTask(SourceFile:529) + /// ... 5 more + @Inject(method = "pasteConnector", at = @At("HEAD"), cancellable = true) + private void ut$fixPasteConnector(EntityPlayerMP player, int channel, SidedPos sidedPos, String json, CallbackInfo ci) { + if (channel < 0 || channel >= this.channels.length || this.channels[channel] == null) { + ci.cancel(); + } + } + + /// java.util.concurrent.ExecutionException: java.lang.ArrayIndexOutOfBoundsException: Index -1 out of bounds for length 8 + /// at java.util.concurrent.FutureTask.report(FutureTask.java:124) + /// at java.util.concurrent.FutureTask.get(FutureTask.java:193) + /// at net.minecraft.util.Util.runTask(SourceFile:531) + /// at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:723) + /// at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:668) + /// at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:185) + /// at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:526) + /// at java.lang.Thread.run(Thread.java:1474) + /// Caused by: java.lang.ArrayIndexOutOfBoundsException: Index -1 out of bounds for length 8 + /// at mcjty.xnet.blocks.controller.TileEntityController.removeChannel(TileEntityController.java:533) + /// at mcjty.xnet.blocks.controller.TileEntityController.execute(TileEntityController.java:1028) + /// at mcjty.lib.network.PacketServerCommandTyped.lambda$handle$0(PacketServerCommandTyped.java:93) + /// at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:545) + /// at java.util.concurrent.FutureTask.run(FutureTask.java:328) + /// at net.minecraft.util.Util.runTask(SourceFile:529) + /// ... 5 more + @Inject(method = "removeChannel", at = @At("HEAD"), cancellable = true) + private void ut$fixRemoveChannel(int channel, CallbackInfo ci) { + if (channel < 0 || channel >= this.channels.length) { + ci.cancel(); + } + } + + /// java.util.concurrent.ExecutionException: java.lang.ArrayIndexOutOfBoundsException: Index -1 out of bounds for length 8 + /// at java.util.concurrent.FutureTask.report(FutureTask.java:124) + /// at java.util.concurrent.FutureTask.get(FutureTask.java:193) + /// at net.minecraft.util.Util.runTask(SourceFile:531) + /// at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:723) + /// at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:668) + /// at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:185) + /// at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:526) + /// at java.lang.Thread.run(Thread.java:1474) + /// Caused by: java.lang.ArrayIndexOutOfBoundsException: Index -1 out of bounds for length 8 + /// at mcjty.xnet.blocks.controller.TileEntityController.copyChannel(TileEntityController.java:667) + /// at mcjty.xnet.blocks.controller.TileEntityController.execute(TileEntityController.java:1014) + /// at mcjty.lib.network.PacketServerCommandTyped.lambda$handle$0(PacketServerCommandTyped.java:93) + /// at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:545) + /// at java.util.concurrent.FutureTask.run(FutureTask.java:328) + /// at net.minecraft.util.Util.runTask(SourceFile:529) + /// ... 5 more + @Inject(method = "copyChannel", at = @At("HEAD"), cancellable = true) + private void ut$fixCopyChannel(EntityPlayerMP player, int index, CallbackInfo ci) { + if (index < 0 || index >= this.channels.length) { + ci.cancel(); + } + } +} diff --git a/src/main/resources/assets/universaltweaks/lang/en_us.lang b/src/main/resources/assets/universaltweaks/lang/en_us.lang index 9ddb3264..2abf5779 100644 --- a/src/main/resources/assets/universaltweaks/lang/en_us.lang +++ b/src/main/resources/assets/universaltweaks/lang/en_us.lang @@ -53,6 +53,7 @@ cfg.universaltweaks.bugfixes.entities.entitylists=Entity Lists cfg.universaltweaks.modintegration.abyssalcraft=AbyssalCraft cfg.universaltweaks.modintegration.actuallyadditions=Actually Additions +cfg.universaltweaks.modintegration.ae2uel=Applied Energistics 2 Unofficial Extended Life cfg.universaltweaks.modintegration.aether_legacy=Aether Legacy cfg.universaltweaks.modintegration.agricraft=Agricraft cfg.universaltweaks.modintegration.aoa=Advent of Ascension @@ -88,6 +89,7 @@ cfg.universaltweaks.modintegration.erebus=The Erebus cfg.universaltweaks.modintegration.evilcraft=EvilCraft cfg.universaltweaks.modintegration.esm=Epic Siege Mod cfg.universaltweaks.modintegration.extrautilities=Extra Utilities 2 +cfg.universaltweaks.modintegration.extreme_reactors=Extreme Reactors cfg.universaltweaks.modintegration.forestry=Forestry cfg.universaltweaks.modintegration.fpsreducer=FPS Reducer cfg.universaltweaks.modintegration.gaia_dimension=Gaia Dimension @@ -114,6 +116,7 @@ cfg.universaltweaks.modintegration.openblocks=OpenBlocks cfg.universaltweaks.modintegration.projectred=ProjectRed cfg.universaltweaks.modintegration.proper_pumpkin=Proper Pumpkin Mod cfg.universaltweaks.modintegration.quark=Quark +cfg.universaltweaks.modintegration.rftools=RFTools cfg.universaltweaks.modintegration.rftoolsdimensions=RFTools Dimensions cfg.universaltweaks.modintegration.railcraft=Railcraft cfg.universaltweaks.modintegration.randomthings=Random Things @@ -135,6 +138,7 @@ cfg.universaltweaks.modintegration.tinyprogressions=Tiny Progressions cfg.universaltweaks.modintegration.tombmanygraves=TombManyGraves2 cfg.universaltweaks.modintegration.tr=Tech Reborn cfg.universaltweaks.modintegration.woot=Woot +cfg.universaltweaks.modintegration.xnet=XNet cfg.universaltweaks.modintegration=Mod Integration cfg.universaltweaks.tweaks.blocks.anvil=Anvil diff --git a/src/main/resources/mixins/mods/mixins.ae2uel.handler_crash.json b/src/main/resources/mixins/mods/mixins.ae2uel.handler_crash.json new file mode 100644 index 00000000..b20021fa --- /dev/null +++ b/src/main/resources/mixins/mods/mixins.ae2uel.handler_crash.json @@ -0,0 +1,7 @@ +{ + "package": "mod.acgaming.universaltweaks.mods.ae2uel.mixin", + "refmap": "universaltweaks.refmap.json", + "minVersion": "0.8", + "compatibilityLevel": "JAVA_8", + "mixins": ["UTItemSlotAccessor", "UTItemHandlerIteratorMixin"] +} \ No newline at end of file diff --git a/src/main/resources/mixins/mods/mixins.extreme_reactors.reactor_crash.json b/src/main/resources/mixins/mods/mixins.extreme_reactors.reactor_crash.json new file mode 100644 index 00000000..3fade606 --- /dev/null +++ b/src/main/resources/mixins/mods/mixins.extreme_reactors.reactor_crash.json @@ -0,0 +1,7 @@ +{ + "package": "mod.acgaming.universaltweaks.mods.extreme_reactors.mixin", + "refmap": "universaltweaks.refmap.json", + "minVersion": "0.8", + "compatibilityLevel": "JAVA_8", + "mixins": ["UTMultiblockReactorMixin"] +} \ No newline at end of file diff --git a/src/main/resources/mixins/mods/mixins.incontrol.handler_crash.json b/src/main/resources/mixins/mods/mixins.incontrol.handler_crash.json new file mode 100644 index 00000000..c4046c5a --- /dev/null +++ b/src/main/resources/mixins/mods/mixins.incontrol.handler_crash.json @@ -0,0 +1,7 @@ +{ + "package": "mod.acgaming.universaltweaks.mods.incontrol.mixin", + "refmap": "universaltweaks.refmap.json", + "minVersion": "0.8", + "compatibilityLevel": "JAVA_8", + "mixins": ["UTForgeEventHandlersMixin"] +} \ No newline at end of file diff --git a/src/main/resources/mixins/mods/mixins.incontrol.json b/src/main/resources/mixins/mods/mixins.incontrol.rule.json similarity index 100% rename from src/main/resources/mixins/mods/mixins.incontrol.json rename to src/main/resources/mixins/mods/mixins.incontrol.rule.json diff --git a/src/main/resources/mixins/mods/mixins.rftools.json b/src/main/resources/mixins/mods/mixins.rftools.json new file mode 100644 index 00000000..2b3a451f --- /dev/null +++ b/src/main/resources/mixins/mods/mixins.rftools.json @@ -0,0 +1,7 @@ +{ + "package": "mod.acgaming.universaltweaks.mods.rftools.mixin", + "refmap": "universaltweaks.refmap.json", + "minVersion": "0.8", + "compatibilityLevel": "JAVA_8", + "mixins": ["UTStorageConnectorSettingsMixin"] +} \ No newline at end of file diff --git a/src/main/resources/mixins/mods/mixins.xnet.controller_crashes.json b/src/main/resources/mixins/mods/mixins.xnet.controller_crashes.json new file mode 100644 index 00000000..bfc4ab9d --- /dev/null +++ b/src/main/resources/mixins/mods/mixins.xnet.controller_crashes.json @@ -0,0 +1,7 @@ +{ + "package": "mod.acgaming.universaltweaks.mods.xnet.mixin", + "refmap": "universaltweaks.refmap.json", + "minVersion": "0.8", + "compatibilityLevel": "JAVA_8", + "mixins": ["UTTileEntityControllerMixin"] +} \ No newline at end of file