diff --git a/.gitignore b/.gitignore index cd3343a9..59b29725 100644 --- a/.gitignore +++ b/.gitignore @@ -36,6 +36,10 @@ othermods crashreport .cursor .cache +*.cache +*.bak.png +*.orig +*.rej .codex # external reference code references/ diff --git a/README.md b/README.md index 572b662e..459938e1 100644 --- a/README.md +++ b/README.md @@ -4,8 +4,9 @@ A Minecraft mod featuring various utilities and enhancements. ## Forge 1.20.1 -Version `20.2.4.6` targets Minecraft 1.20.1, Forge 47.3.10+, Java 17, -AE2 15.4.8 and the Create 2 Mekanism: Sky Edition 2 integration profile. +Version `20.2.4.7` targets Minecraft 1.20.1, Forge 47.3.10+, Java 17, +AE2 15.4.8+, Mekanism 10.4.15+ (compiled against 10.4.16.80), +Mekanism Extras 1.5.0+ and the Create 2 Mekanism: Sky Edition 2 integration profile. Build with `./gradlew build` (Windows: `gradlew.bat build`); Python 3 is used by nine release-bytecode/outline regression checks. Dependencies resolve from public Maven repositories. The `portBridgeTest` suite also runs as part of `check` and is not shipped in the mod jar. @@ -13,15 +14,21 @@ The `portBridgeTest` suite also runs as part of `check` and is not shipped in th Forge, Minecraft and AE2 are required. Every compiled mod integration declares a minimum and compatible version range in `src/main/resources/META-INF/mods.toml`; these integrations remain optional, so an absent integration does not prevent startup. -Minimum versions follow the actual mod metadata (for example, Mekanism `10.4.15`, -not the jar filename's build suffix). Ore Generator samples accept Forge's `ores` -and `raw_materials` item tags, plus the equivalent `c:` datapack tags. +Runtime minima and compile pins are separate: for example, Mekanism accepts +`10.4.15+` while this build compiles against `10.4.16.80`. Botany Pots is accepted +from `13.0.0`; Mekanism Extras starts at `1.5.0` and uses its plural +`registries`/`genregistries` API for the Naquadah reactor adapter. Ore Generator +samples accept Forge's `ores` and `raw_materials` item tags, plus the equivalent +`c:` datapack tags. Optional integrations without a Forge implementation are excluded explicitly in `gradle/forge1201-pack-profile.json`; this is not a universal backport of every NeoForge integration. Extended Crafting compiles against official 6.0.10; the pack's unofficial tier-5/11x11 extension is supported through its native recipe contract and registry lookup without bundling or replacing the pack's jar. +Missing optional adapter classes are skipped quietly at debug level instead of +failing the interaction; actual invocation failures are reported once. The +Occultism spirit-egg handler is one such excluded adapter in this Forge build. ## Features diff --git a/build.gradle b/build.gradle index 4980c2d8..b154ab98 100644 --- a/build.gradle +++ b/build.gradle @@ -54,7 +54,7 @@ dependencies { modCompileOnly 'maven.modrinth:rxYaglEe:d83Wdhdn' // AdvancedAE 1.3.6-1.20.1 modCompileOnly 'maven.modrinth:qDJXZJTz:PQ3IlR98' // Mekanism More Machine 1.2.1 modCompileOnly 'maven.modrinth:rqFWfVlz:tT3CLYvK' // apotheosis-1.20.1-7.4.8 - modCompileOnly 'maven.modrinth:IiATswDj:d9GM663Q' // applied-mekanistics-1.4.2 + modCompileOnly 'maven.modrinth:IiATswDj:9n9p68Qq' // applied-mekanistics-1.4.3 modCompileOnly 'maven.modrinth:XxWD5pD3:jYgSnxye' // appliedenergistics2-forge-15.4.11 modCompileOnly 'maven.modrinth:udZtKfzP:Qm3GW128' // neoecoae-20.4.2-forge modCompileOnly 'maven.modrinth:B1CBVXHX:YSOP0G6O' // ldlib-forge-1.20.1-1.0.52.a @@ -81,8 +81,8 @@ dependencies { modCompileOnly 'maven.modrinth:fRiHVvU7:WtJS5tVw' // emi-1.1.22-1.20.1-forge modCompileOnly 'maven.modrinth:u6dRKJwZ:TrKZlZ0b' // JEI 15.74.0.227 modCompileOnly 'maven.modrinth:umyGl7zF:g5igndAv' // kubejs-forge-2001.6.5-build.16 - modCompileOnly 'maven.modrinth:Ce6I4WUE:9iboPfea' // mekanism-1.20.1-10.4.15.75 - modCompileOnly 'maven.modrinth:OFVYKsAk:x9re7wt4' // mekanismgenerators-1.20.1-10.4.15.75 + modCompileOnly 'maven.modrinth:Ce6I4WUE:uxe1WQp4' // mekanism-1.20.1-10.4.16.80 + modCompileOnly 'maven.modrinth:OFVYKsAk:Th4Czz4N' // mekanismgenerators-1.20.1-10.4.16.80 modCompileOnly 'maven.modrinth:tCkE8p2N:6SkuAGoz' // placebo-1.20.1-8.6.3 modCompileOnly 'maven.modrinth:KZO4S4DO:xDOvxyqP' // powah-5.0.11 modCompileOnly 'com.tterrag.registrate:Registrate:MC1.20-1.3.11' // registrate-mc1.20-1.3.11 @@ -91,7 +91,7 @@ dependencies { modCompileOnly 'maven.modrinth:1Ro7m06l:8krhHkrZ' // titanium-1.20.1-3.8.32 modCompileOnly 'maven.modrinth:Rw1NrDzF:tHDveaxK' // cucumber-1.20.1-7.0.15 modCompileOnly 'maven.modrinth:UhW5uCKw:eoUaDkZf' // glodium-1.20-1.5-forge - modCompileOnly 'maven.modrinth:HUZkxNTQ:zzqHs32A' // mekanism_extras-1.20.1-1.4.1 + modCompileOnly 'maven.modrinth:HUZkxNTQ:9T6CetkG' // mekanism_extras-1.20.1-1.5.0 modCompileOnly 'net.createmod.ponder:Ponder-Forge-1.20.1:1.0.80' // ponder-forge-1.20.1-1.0.80 modCompileOnly 'dev.engine-room.flywheel:flywheel-forge-1.20.1:1.0.4' // flywheel-forge-1.20.1-1.0.4 annotationProcessor 'org.spongepowered:mixin:0.8.5:processor' diff --git a/gradle.properties b/gradle.properties index e57f6398..b4d4ee73 100644 --- a/gradle.properties +++ b/gradle.properties @@ -9,6 +9,6 @@ forge_version=47.4.10 loader_version_range=[47,) mod_id=useless_mod mod_name=Useless Mod -mod_version=20.2.4.6 +mod_version=20.2.4.7 mod_group_id=com.sorrowmist.useless mod_license=MIT diff --git a/src/main/java/com/sorrowmist/useless/UselessMod.java b/src/main/java/com/sorrowmist/useless/UselessMod.java index b8de687b..aeaebc5a 100644 --- a/src/main/java/com/sorrowmist/useless/UselessMod.java +++ b/src/main/java/com/sorrowmist/useless/UselessMod.java @@ -208,7 +208,9 @@ public void onRightClickItem(PlayerInteractEvent.RightClickItem event) { } private static InteractionResult trySpawnMarkedOccultismSpirit(PlayerInteractEvent.RightClickBlock event) { - if (!ModList.get().isLoaded("occultism")) { + if (!ModList.get().isLoaded("occultism") + || !OptionalIntegration.hasClass( + "com.sorrowmist.useless.content.recipe.adapters.occultism.OccultismSpiritEggHandler")) { return InteractionResult.PASS; } return OccultismCompat.trySpawnMarkedSpirit(event); diff --git a/src/main/java/com/sorrowmist/useless/compat/forge1201/OptionalIntegration.java b/src/main/java/com/sorrowmist/useless/compat/forge1201/OptionalIntegration.java index 4715ac66..385aea12 100644 --- a/src/main/java/com/sorrowmist/useless/compat/forge1201/OptionalIntegration.java +++ b/src/main/java/com/sorrowmist/useless/compat/forge1201/OptionalIntegration.java @@ -1,10 +1,17 @@ package com.sorrowmist.useless.compat.forge1201; +import com.mojang.logging.LogUtils; import java.lang.reflect.InvocationTargetException; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; import net.minecraftforge.fml.ModList; +import org.slf4j.Logger; /** Optional source boundaries: no class linkage when the corresponding mod is absent. */ public final class OptionalIntegration { + private static final Logger LOGGER = LogUtils.getLogger(); + private static final Set REPORTED_FAILURES = ConcurrentHashMap.newKeySet(); + private OptionalIntegration() {} public static boolean hasClass(String className) { @@ -14,14 +21,46 @@ public static boolean hasClass(String className) { public static T call(String modId,String className,String method,Class resultType,T absent, Class[] signature,Object... arguments) { - if (!ModList.get().isLoaded(modId)) return absent; + ModList modList = ModList.get(); + if (modList == null || !modList.isLoaded(modId)) return absent; try { Object result=Class.forName(className).getMethod(method,signature).invoke(null,arguments); return resultType==Void.class ? null : resultType.cast(result); } catch (InvocationTargetException e) { - throw new IllegalStateException("Integration "+modId+" failed in "+className+"#"+method,e.getCause()); + reportFailure(modId, className, method, e.getCause()); + return absent; } catch (ReflectiveOperationException | LinkageError e) { - throw new IllegalStateException("Installed integration "+modId+" is unavailable in this build: "+className,e); + reportFailure(modId, className, method, e); + return absent; + } catch (ClassCastException e) { + reportFailure(modId, className, method, e); + return absent; + } + } + + /** + * Optional integrations must not take the game down. A missing class is common + * when this Forge build intentionally excludes a NeoForge-only adapter; report + * the first occurrence once and let the caller continue with its fallback. + */ + private static void reportFailure(String modId, String className, String method, Throwable cause) { + String key = modId + "#" + className + "#" + method; + if (REPORTED_FAILURES.add(key)) { + boolean missing = cause instanceof ClassNotFoundException + || cause instanceof NoClassDefFoundError; + if (missing) { + // Build-profile exclusions are expected; keep them out of normal logs. + LOGGER.debug("Optional integration {} is not present at {}#{}; skipping it", + modId, className, method); + return; + } + if (cause == null) { + LOGGER.warn("Optional integration {} is unavailable or failed at {}#{}; skipping it", + modId, className, method); + } else { + LOGGER.warn("Optional integration {} is unavailable or failed at {}#{}; skipping it", + modId, className, method, cause); + } } } } diff --git a/src/main/java/com/sorrowmist/useless/compat/mekanismgenerators/MekanismGeneratorsCompatLoader.java b/src/main/java/com/sorrowmist/useless/compat/mekanismgenerators/MekanismGeneratorsCompatLoader.java index e7748967..35e4b01e 100644 --- a/src/main/java/com/sorrowmist/useless/compat/mekanismgenerators/MekanismGeneratorsCompatLoader.java +++ b/src/main/java/com/sorrowmist/useless/compat/mekanismgenerators/MekanismGeneratorsCompatLoader.java @@ -14,9 +14,34 @@ private MekanismGeneratorsCompatLoader() { public static void register() { AlloyFurnaceRecipeManager.getInstance().registerAdapter( new FissionRecipeAdapter(), RecipeSourceIds.MEKANISM_GENERATORS); - if (ModList.get().isLoaded("mekanism_extras")) { + if (ModList.get().isLoaded("mekanism_extras") && hasNaquadahApi()) { AlloyFurnaceRecipeManager.getInstance().registerAdapter( new NaquadahReactorRecipeAdapter(), RecipeSourceIds.MEKANISM_GENERATORS); } } + + /** + * The 1.5 API moved these registries into plural packages. Keep a string-only + * check here so a future package move does not turn an optional integration + * into a hard class-loading failure. + */ + private static boolean hasNaquadahApi() { + try { + ClassLoader loader = MekanismGeneratorsCompatLoader.class.getClassLoader(); + Class gases = Class.forName( + "com.jerry.mekanism_extras.common.registries.ExtraGases", false, loader); + gases.getField("RICH_NAQUADAH_FUEL"); + gases.getField("RICH_URANIUM_FUEL"); + gases.getField("NAQUADAH_URANIUM_FUEL"); + Class blocks = Class.forName( + "com.jerry.generator_extras.common.genregistries.ExtraGenBlocks", false, loader); + blocks.getField("NAQUADAH_REACTOR_CONTROLLER"); + Class genGases = Class.forName( + "com.jerry.generator_extras.common.genregistries.ExtraGenGases", false, loader); + genGases.getField("POLONIUM_CONTAINING_STEAM"); + return true; + } catch (ClassNotFoundException | NoSuchFieldException | LinkageError ignored) { + return false; + } + } } diff --git a/src/main/java/com/sorrowmist/useless/content/recipe/AlloyFurnaceRecipeCatalog.java b/src/main/java/com/sorrowmist/useless/content/recipe/AlloyFurnaceRecipeCatalog.java index de3795b1..cd8e9f08 100644 --- a/src/main/java/com/sorrowmist/useless/content/recipe/AlloyFurnaceRecipeCatalog.java +++ b/src/main/java/com/sorrowmist/useless/content/recipe/AlloyFurnaceRecipeCatalog.java @@ -579,7 +579,7 @@ private static Snapshot build(Level level, long generation) { Map.copyOf(bySource), Map.copyOf(bySourceAndRecipeId), generation, new ConcurrentHashMap<>(), new ConcurrentHashMap<>(), ConcurrentHashMap.newKeySet()); - LOGGER.info("Built alloy-furnace recipe catalog: generation={}, recipes={}, sources={}, elapsed={} ms", + LOGGER.debug("Built alloy-furnace recipe catalog: generation={}, recipes={}, sources={}, elapsed={} ms", generation, ordered.size(), bySource.size(), (System.nanoTime() - startedAt) / 1_000_000L); return snapshot; } diff --git a/src/main/java/com/sorrowmist/useless/content/recipe/adapters/RecipeAdapterCompatRegistry.java b/src/main/java/com/sorrowmist/useless/content/recipe/adapters/RecipeAdapterCompatRegistry.java index 040e6e51..2f976828 100644 --- a/src/main/java/com/sorrowmist/useless/content/recipe/adapters/RecipeAdapterCompatRegistry.java +++ b/src/main/java/com/sorrowmist/useless/content/recipe/adapters/RecipeAdapterCompatRegistry.java @@ -200,6 +200,10 @@ private static void initCompat(FMLCommonSetupEvent event, @Nullable String modId } private static void registerByName(String className) { + if (!isClassAvailable(className)) { + LOGGER.debug("Optional recipe adapter {} is not present in this build", className); + return; + } try { Class type=Class.forName(className,true,RecipeAdapterCompatRegistry.class.getClassLoader()); register((IRecipeAdapter)type.getConstructor().newInstance()); @@ -209,6 +213,10 @@ private static void registerByName(String className) { } private static void registerFactory(String className) { + if (!isClassAvailable(className)) { + LOGGER.debug("Optional recipe adapter factory {} is not present in this build", className); + return; + } try { Class type=Class.forName(className,true,RecipeAdapterCompatRegistry.class.getClassLoader()); var adapters=(java.util.List)type.getMethod("createAdapters").invoke(null); @@ -315,6 +323,10 @@ private static void registerExtendedAE() { } private static void registerAdvancedAE() { + if (!isClassAvailable("net.pedroksl.ae2addonlib.recipes.IngredientStack$Item")) { + LOGGER.debug("AdvancedAE 1.2.x does not expose the 1.3 addon-lib recipe API; skipping reaction chamber adapter"); + return; + } registerByName("com.sorrowmist.useless.content.recipe.adapters.ae.advancedae.ReactionChamberRecipeAdapter"); } @@ -329,6 +341,10 @@ private static void registerMekanismGenerators() { } private static void invokeOptionalLoader(String className) { + if (!isClassAvailable(className)) { + LOGGER.debug("Optional recipe adapter loader {} is not present in this build", className); + return; + } try { Class loader = Class.forName(className, true, RecipeAdapterCompatRegistry.class.getClassLoader()); loader.getMethod("register").invoke(null); diff --git a/src/main/java/com/sorrowmist/useless/content/recipe/adapters/mekanism/mekanismextra/NaquadahReactorRecipeAdapter.java b/src/main/java/com/sorrowmist/useless/content/recipe/adapters/mekanism/mekanismextra/NaquadahReactorRecipeAdapter.java index ba0af5d0..593511c2 100644 --- a/src/main/java/com/sorrowmist/useless/content/recipe/adapters/mekanism/mekanismextra/NaquadahReactorRecipeAdapter.java +++ b/src/main/java/com/sorrowmist/useless/content/recipe/adapters/mekanism/mekanismextra/NaquadahReactorRecipeAdapter.java @@ -2,9 +2,9 @@ import appeng.api.stacks.GenericStack; import com.jerry.generator_extras.common.config.GenLoadConfig; -import com.jerry.generator_extras.common.genregistry.ExtraGenBlocks; -import com.jerry.generator_extras.common.genregistry.ExtraGenGases; -import com.jerry.mekanism_extras.common.registry.ExtraGases; +import com.jerry.generator_extras.common.genregistries.ExtraGenBlocks; +import com.jerry.generator_extras.common.genregistries.ExtraGenGases; +import com.jerry.mekanism_extras.common.registries.ExtraGases; import com.sorrowmist.useless.content.recipe.AdapterUtils; import com.sorrowmist.useless.content.recipe.AdvancedAlloyFurnaceRecipe; import com.sorrowmist.useless.content.recipe.adapters.mekanism.MekanismChemicalRecipeSupport; @@ -22,7 +22,7 @@ import java.util.List; -/** Optional Mekanism Extras naquadah reactor recipe-viewer adapter. */ +/** Optional Mekanism Extras 1.5+ naquadah reactor recipe-viewer adapter. */ public final class NaquadahReactorRecipeAdapter extends MekanismSyntheticRecipeAdapter { private static final long PROCESS_TICKS = AdapterUtils.MEKANISM_BASE_TICKS_REQUIRED; private static final ResourceLocation SOURCE_ID = @@ -56,12 +56,12 @@ protected List> createGeneratedRecipes(Lev } addFuelRecipe(result, pairedFuelWaterInputs, - List.of(ExtraGases.RICH_SILICON_LIQUID_FUEL.getStack(1), - ExtraGases.RICH_URANIUM_LIQUID_FUEL.getStack(1)), + List.of(ExtraGases.RICH_NAQUADAH_FUEL.getStack(1), + ExtraGases.RICH_URANIUM_FUEL.getStack(1)), MekanismChemicalRecipeSupport.saturatingMultiply(waterPerFuel, 2L), "rich_fuels_water"); addFuelRecipe(result, singleFuelWaterInputs, - List.of(ExtraGases.SILICON_URANIUM_FUEL.getStack(1)), + List.of(ExtraGases.NAQUADAH_URANIUM_FUEL.getStack(1)), waterPerFuel, "naquadah_uranium_fuel_water"); addWaterOnlyRecipe(result); return result; diff --git a/src/main/java/com/sorrowmist/useless/core/config/ConfigManager.java b/src/main/java/com/sorrowmist/useless/core/config/ConfigManager.java index 7ff29460..302528f5 100644 --- a/src/main/java/com/sorrowmist/useless/core/config/ConfigManager.java +++ b/src/main/java/com/sorrowmist/useless/core/config/ConfigManager.java @@ -218,7 +218,8 @@ public class ConfigManager { .defineInRange("botany_pot_growth_multiplier", 1, 1, Integer.MAX_VALUE); MATRIX_PATTERN_COUNT = SERVER_BUILDER - .comment("矩阵样板槽位倍数 - 减少数量时请保持槽位空!否则可能会造成样板丢失") + .comment("矩阵样板槽位倍数 - 新放置的矩阵样板方块生效;已放置的方块保持原有容量", + "减少数量时请保持槽位空!否则可能会造成样板丢失") .defineInRange("matrix_pattern_count", 1, 1, 100); SERVER_BUILDER.pop(); @@ -803,6 +804,8 @@ public class ConfigManager { "enable_ufo_recipe_conversion", true); COMMON_BUILDER.pop(); + // Options for adapters excluded by gradle/forge1201-pack-profile.json stay in the + // spec for cross-pack config compatibility; the registry skips their absent classes. RECIPE_CONVERSION_OPTIONS = Map.ofEntries( Map.entry("thermal", ENABLE_THERMAL_RECIPE_CONVERSION), Map.entry("bloodmagic", ENABLE_BLOOD_MAGIC_RECIPE_CONVERSION), @@ -1013,6 +1016,15 @@ public static int getMaxUpgrade() { return getConfigValue(MAX_UPGRADE); } + /** Returns the loaded max_upgrade, or null while the server config is not available yet. */ + public static Integer getLoadedMaxUpgrade() { + try { + return MAX_UPGRADE.get(); + } catch (IllegalStateException | NullPointerException ignored) { + return null; + } + } + // 万象炉AE网络抽电配置 public static boolean isFurnaceDrawAppfluxEnergyEnabled() { return getConfigValue(FURNACE_DRAW_APPFLUX_ENERGY); diff --git a/src/main/java/com/sorrowmist/useless/init/ModBlockEntities.java b/src/main/java/com/sorrowmist/useless/init/ModBlockEntities.java index e800ae43..e20a98d7 100644 --- a/src/main/java/com/sorrowmist/useless/init/ModBlockEntities.java +++ b/src/main/java/com/sorrowmist/useless/init/ModBlockEntities.java @@ -12,6 +12,7 @@ import com.sorrowmist.useless.content.blockentities.multiblock.PassiveCraftingHatchBlockEntity; import com.sorrowmist.useless.compat.draconicevolution.DraconicOpStorageCompat; import com.sorrowmist.useless.compat.fluxnetworks.FluxNetworksEnergyCompat; +import com.sorrowmist.useless.compat.forge1201.OptionalIntegration; import net.minecraft.core.registries.Registries; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraftforge.eventbus.api.IEventBus; @@ -109,6 +110,10 @@ private static void registerCapabilities(RegisterCapabilitiesEvent event) { * JVM must not resolve AppMek's capability types on a server that does not install AppMek. */ private static void invokeOptionalCapabilityLoader(String className, RegisterCapabilitiesEvent event) { + if (!OptionalIntegration.hasClass(className)) { + UselessMod.LOGGER.debug("Optional capability loader {} is not present in this build", className); + return; + } try { Class loader = Class.forName(className, true, ModBlockEntities.class.getClassLoader()); loader.getMethod("registerCapabilities", RegisterCapabilitiesEvent.class).invoke(null, event); diff --git a/src/main/java/com/sorrowmist/useless/mixin/eae/TileAssemblerMatrixPatternMixin.java b/src/main/java/com/sorrowmist/useless/mixin/eae/TileAssemblerMatrixPatternMixin.java index a9b09e50..7d3ae24c 100644 --- a/src/main/java/com/sorrowmist/useless/mixin/eae/TileAssemblerMatrixPatternMixin.java +++ b/src/main/java/com/sorrowmist/useless/mixin/eae/TileAssemblerMatrixPatternMixin.java @@ -1,36 +1,23 @@ package com.sorrowmist.useless.mixin.eae; -import appeng.util.inv.AppEngInternalInventory; -import com.glodblock.github.extendedae.common.tileentities.matrix.TileAssemblerMatrixPattern; import com.sorrowmist.useless.core.config.ConfigManager; -import net.minecraft.core.BlockPos; -import net.minecraft.world.level.block.state.BlockState; -import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Mutable; -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.Constant; +import org.spongepowered.asm.mixin.injection.ModifyConstant; -@Mixin(value = TileAssemblerMatrixPattern.class,remap = false) +@Mixin(targets = "com.glodblock.github.extendedae.common.tileentities.matrix.TileAssemblerMatrixPattern", remap = false) public class TileAssemblerMatrixPatternMixin { - @Mutable @Shadow @Final private AppEngInternalInventory patternInventory; - /** - * 在构造函数完成后替换patternInventory + * 修改构造函数中 patternInventory 的硬编码容量。 + * 必须在 exposedInventory 包装它之前改掉,否则两个库存容量会不一致。 */ - @Inject( + @ModifyConstant( method = "", - at = @At("RETURN") + constant = @Constant(intValue = 36), + remap = false ) - private void onConstructed(BlockPos pos, BlockState blockState, CallbackInfo ci) { - TileAssemblerMatrixPattern self = (TileAssemblerMatrixPattern) (Object) this; - - // 创建新的库存实例 - int newSize = 36 * ConfigManager.getMatrixPatternCount(); - this.patternInventory = new AppEngInternalInventory(self, newSize, 1); - this.patternInventory.setFilter(new TileAssemblerMatrixPattern.Filter(self::getLevel)); + private int useless$modifyPatternInventorySize(int original) { + return 36 * ConfigManager.getMatrixPatternCount(); } } diff --git a/src/main/java/com/sorrowmist/useless/mixin/mek/CachedRecipeMixin.java b/src/main/java/com/sorrowmist/useless/mixin/mek/CachedRecipeMixin.java index db080511..e46cbf0d 100644 --- a/src/main/java/com/sorrowmist/useless/mixin/mek/CachedRecipeMixin.java +++ b/src/main/java/com/sorrowmist/useless/mixin/mek/CachedRecipeMixin.java @@ -1,6 +1,6 @@ package com.sorrowmist.useless.mixin.mek; -import com.sorrowmist.useless.utils.MekTemp; +import com.sorrowmist.useless.utils.MekanismAccelerationState; import mekanism.api.recipes.cache.CachedRecipe; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -10,7 +10,7 @@ import java.util.function.IntSupplier; -@Mixin(value = CachedRecipe.class, remap = false) +@Mixin(value = CachedRecipe.class, remap = false, priority = 2000) public abstract class CachedRecipeMixin { @Shadow @@ -29,6 +29,6 @@ public abstract class CachedRecipeMixin { remap = false ) private void injected(CallbackInfo ci) { - MekTemp.inject.accept(this.requiredTicks.getAsInt(), this::process); + MekanismAccelerationState.inject.accept(this.requiredTicks.getAsInt(), this::process); } } diff --git a/src/main/java/com/sorrowmist/useless/mixin/mek/DigitalMinerMixin.java b/src/main/java/com/sorrowmist/useless/mixin/mek/DigitalMinerMixin.java index 2ece5d1e..891358ef 100644 --- a/src/main/java/com/sorrowmist/useless/mixin/mek/DigitalMinerMixin.java +++ b/src/main/java/com/sorrowmist/useless/mixin/mek/DigitalMinerMixin.java @@ -2,14 +2,14 @@ import mekanism.api.Upgrade; import mekanism.common.tile.machine.TileEntityDigitalMiner; -import com.sorrowmist.useless.utils.MekTemp; +import com.sorrowmist.useless.utils.MekanismAccelerationState; 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; -@Mixin(value = TileEntityDigitalMiner.class, remap = false) +@Mixin(value = TileEntityDigitalMiner.class, remap = false, priority = 2000) public abstract class DigitalMinerMixin { @Shadow private int delay; @@ -28,9 +28,12 @@ public abstract class DigitalMinerMixin { remap = false ) private void onEnergyExtracted(CallbackInfo cir) { + if (MekanismAccelerationState.rebornOwnsAcceleration()) { + return; + } if (this.delay < 0) { // 补足所有负 delay 的挖掘 - int extraOperations = Math.min(-this.delay, MekTemp.MAX_EXTRA_OPERATIONS_PER_TICK); + int extraOperations = Math.min(-this.delay, MekanismAccelerationState.MAX_EXTRA_OPERATIONS_PER_TICK); for (int i = 0; i < extraOperations; i++) { this.tryMineBlock(); } diff --git a/src/main/java/com/sorrowmist/useless/mixin/mek/ElectricPumpMixin.java b/src/main/java/com/sorrowmist/useless/mixin/mek/ElectricPumpMixin.java index 4db2f0b3..c735e8e7 100644 --- a/src/main/java/com/sorrowmist/useless/mixin/mek/ElectricPumpMixin.java +++ b/src/main/java/com/sorrowmist/useless/mixin/mek/ElectricPumpMixin.java @@ -1,6 +1,6 @@ package com.sorrowmist.useless.mixin.mek; -import com.sorrowmist.useless.utils.MekTemp; +import com.sorrowmist.useless.utils.MekanismAccelerationState; import mekanism.common.tile.machine.TileEntityElectricPump; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -8,7 +8,7 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -@Mixin(value = TileEntityElectricPump.class, remap = false) +@Mixin(value = TileEntityElectricPump.class, remap = false, priority = 2000) public abstract class ElectricPumpMixin { @Shadow @@ -24,6 +24,6 @@ public abstract class ElectricPumpMixin { shift = At.Shift.AFTER ) ) private void injected(CallbackInfo cir) { - MekTemp.inject.accept(this.ticksRequired, this::onUpdateServer); + MekanismAccelerationState.inject.accept(this.ticksRequired, this::onUpdateServer); } } diff --git a/src/main/java/com/sorrowmist/useless/mixin/mek/FluidicPlenisherMixin.java b/src/main/java/com/sorrowmist/useless/mixin/mek/FluidicPlenisherMixin.java index 2fbb3bfb..643d0328 100644 --- a/src/main/java/com/sorrowmist/useless/mixin/mek/FluidicPlenisherMixin.java +++ b/src/main/java/com/sorrowmist/useless/mixin/mek/FluidicPlenisherMixin.java @@ -1,6 +1,6 @@ package com.sorrowmist.useless.mixin.mek; -import com.sorrowmist.useless.utils.MekTemp; +import com.sorrowmist.useless.utils.MekanismAccelerationState; import mekanism.common.tile.machine.TileEntityFluidicPlenisher; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -8,7 +8,7 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -@Mixin(value = TileEntityFluidicPlenisher.class, remap = false) +@Mixin(value = TileEntityFluidicPlenisher.class, remap = false, priority = 2000) public abstract class FluidicPlenisherMixin { @Shadow @@ -27,6 +27,6 @@ public abstract class FluidicPlenisherMixin { remap = false ) public void injected(CallbackInfo cir) { - MekTemp.inject.accept(this.ticksRequired, this::onUpdateServer); + MekanismAccelerationState.inject.accept(this.ticksRequired, this::onUpdateServer); } } diff --git a/src/main/java/com/sorrowmist/useless/mixin/mek/FormulaicAssemblicatorMixin.java b/src/main/java/com/sorrowmist/useless/mixin/mek/FormulaicAssemblicatorMixin.java index d0deeeed..cd5c92a3 100644 --- a/src/main/java/com/sorrowmist/useless/mixin/mek/FormulaicAssemblicatorMixin.java +++ b/src/main/java/com/sorrowmist/useless/mixin/mek/FormulaicAssemblicatorMixin.java @@ -1,6 +1,6 @@ package com.sorrowmist.useless.mixin.mek; -import com.sorrowmist.useless.utils.MekTemp; +import com.sorrowmist.useless.utils.MekanismAccelerationState; import mekanism.common.tile.machine.TileEntityFormulaicAssemblicator; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -8,7 +8,7 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -@Mixin(value = TileEntityFormulaicAssemblicator.class, remap = false) +@Mixin(value = TileEntityFormulaicAssemblicator.class, remap = false, priority = 2000) public abstract class FormulaicAssemblicatorMixin { @Shadow @@ -27,6 +27,6 @@ public abstract class FormulaicAssemblicatorMixin { remap = false ) public void injected(CallbackInfo cir) { - MekTemp.inject.accept(this.ticksRequired, this::onUpdateServer); + MekanismAccelerationState.inject.accept(this.ticksRequired, this::onUpdateServer); } } diff --git a/src/main/java/com/sorrowmist/useless/mixin/mek/MekanismUtilsMixin.java b/src/main/java/com/sorrowmist/useless/mixin/mek/MekanismUtilsMixin.java index 29d1965a..6d2bfb72 100644 --- a/src/main/java/com/sorrowmist/useless/mixin/mek/MekanismUtilsMixin.java +++ b/src/main/java/com/sorrowmist/useless/mixin/mek/MekanismUtilsMixin.java @@ -6,7 +6,7 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.*; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -@Mixin(value=MekanismUtils.class,remap=false) +@Mixin(value = MekanismUtils.class, remap = false, priority = 2000) public class MekanismUtilsMixin { @Inject(method="getTicks",at=@At("HEAD"),cancellable=true) private static void ticks(IUpgradeTile tile,int base,CallbackInfoReturnable cir){ diff --git a/src/main/java/com/sorrowmist/useless/mixin/mek/UpgradeMixin.java b/src/main/java/com/sorrowmist/useless/mixin/mek/UpgradeMixin.java index dfa6a852..09065fe1 100644 --- a/src/main/java/com/sorrowmist/useless/mixin/mek/UpgradeMixin.java +++ b/src/main/java/com/sorrowmist/useless/mixin/mek/UpgradeMixin.java @@ -1,16 +1,20 @@ package com.sorrowmist.useless.mixin.mek; -import com.sorrowmist.useless.utils.MekTemp; +import com.sorrowmist.useless.utils.MekanismAccelerationState; import com.sorrowmist.useless.utils.MekUtils; import mekanism.api.Upgrade; +import org.objectweb.asm.Opcodes; 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.ModifyVariable; +import org.spongepowered.asm.mixin.injection.Redirect; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; /** - * Mixin to modify Mekanism upgrade limits + * Mixin to modify Mekanism upgrade limits. */ -@Mixin({Upgrade.class}) +@Mixin(value = Upgrade.class, priority = 2000) public abstract class UpgradeMixin { @ModifyVariable( method = {""}, @@ -18,9 +22,9 @@ public abstract class UpgradeMixin { ordinal = 1, argsOnly = true ) - private static String getName(String s) { - MekTemp.name = s; - return s; + private static String useless$captureName(String name) { + MekanismAccelerationState.name = name; + return name; } @ModifyVariable( @@ -29,7 +33,38 @@ private static String getName(String s) { ordinal = 1, argsOnly = true ) - private static int toFullStack(int i) { - return !MekTemp.name.equals("speed") && !MekTemp.name.equals("energy") ? i : MekUtils.MAX_UPGRADE; + private static int useless$maxUpgrade(int original) { + return !"speed".equals(MekanismAccelerationState.name) + && !"energy".equals(MekanismAccelerationState.name) + ? original : MekUtils.getMaxUpgrade(); } + + /** + * maxStack is captured when the enum is constructed. Return the live config + * value for runtime reads too, including config reloads. + */ + @Inject(method = "getMax", at = @At("HEAD"), cancellable = true, remap = false) + private void useless$getMax(CallbackInfoReturnable cir) { + Upgrade self = (Upgrade) (Object) this; + if (self == Upgrade.SPEED || self == Upgrade.ENERGY) { + cir.setReturnValue(MekUtils.getMaxUpgrade()); + } + } + + /** + * NBT loading reads the captured maxStack field directly, bypassing getMax(). + */ + @Redirect( + method = "buildMap", + at = @At( + value = "FIELD", + target = "Lmekanism/api/Upgrade;maxStack:I", + opcode = Opcodes.GETFIELD + ), + remap = false + ) + private static int useless$nbtLoadMax(Upgrade upgrade) { + return upgrade.getMax(); + } + } diff --git a/src/main/java/com/sorrowmist/useless/mixin/mek/UpgradeUtilsMixin.java b/src/main/java/com/sorrowmist/useless/mixin/mek/UpgradeUtilsMixin.java index 9956226f..dfaa2b15 100644 --- a/src/main/java/com/sorrowmist/useless/mixin/mek/UpgradeUtilsMixin.java +++ b/src/main/java/com/sorrowmist/useless/mixin/mek/UpgradeUtilsMixin.java @@ -16,7 +16,7 @@ /** * Mixin for UpgradeUtils to modify upgrade information display */ -@Mixin(value = UpgradeUtils.class, remap = false) +@Mixin(value = UpgradeUtils.class, remap = false, priority = 2000) public class UpgradeUtilsMixin { /** diff --git a/src/main/java/com/sorrowmist/useless/utils/MekTemp.java b/src/main/java/com/sorrowmist/useless/utils/MekTemp.java deleted file mode 100644 index 76a13642..00000000 --- a/src/main/java/com/sorrowmist/useless/utils/MekTemp.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.sorrowmist.useless.utils; - -import java.util.function.BiConsumer; - -public class MekTemp { - public static String name; - public static final int MAX_EXTRA_OPERATIONS_PER_TICK = 128; - public static final ThreadLocal isInjecting = ThreadLocal.withInitial(() -> false); - public static final BiConsumer - inject = (reqTime, process) -> { - if (!isInjecting.get()) { - isInjecting.set(true); - - try { - int extraOperations = Math.min(-reqTime, MAX_EXTRA_OPERATIONS_PER_TICK); - for(int i = 0; i < extraOperations; ++i) { - process.run(); - } - } finally { - isInjecting.set(false); - } - } - }; -} diff --git a/src/main/java/com/sorrowmist/useless/utils/MekUtils.java b/src/main/java/com/sorrowmist/useless/utils/MekUtils.java index d683945a..ba9019a7 100644 --- a/src/main/java/com/sorrowmist/useless/utils/MekUtils.java +++ b/src/main/java/com/sorrowmist/useless/utils/MekUtils.java @@ -3,36 +3,69 @@ import com.electronwill.nightconfig.core.Config; import com.electronwill.nightconfig.core.file.CommentedFileConfig; import com.sorrowmist.useless.core.config.ConfigManager; +import com.mojang.logging.LogUtils; import mekanism.api.Upgrade; import mekanism.common.config.MekanismConfig; import mekanism.common.tile.interfaces.IUpgradeTile; import net.minecraftforge.fml.loading.FMLPaths; +import org.slf4j.Logger; -import java.io.File; +import java.nio.file.Files; +import java.nio.file.Path; public class MekUtils { - public static int MAX_UPGRADE = 16; + private static final Logger LOGGER = LogUtils.getLogger(); + private static final int DEFAULT_MAX_UPGRADE = 16; + private static volatile int startupMaxUpgrade = -1; - static { - File file = FMLPaths.CONFIGDIR.get().resolve("useless_mod-server.toml").toFile(); - - CommentedFileConfig config = CommentedFileConfig.builder(file).autosave().sync().build(); - config.load(); + /** + * Reads max_upgrade from the single owning config source. The TOML fallback + * is only used while Mekanism's Upgrade enum is being constructed, which + * happens before Forge finishes loading the server config. + */ + public static int getMaxUpgrade() { + Integer loaded = ConfigManager.getLoadedMaxUpgrade(); + if (loaded != null) { + return loaded; + } - Config mekanism = config.get("mekanism_upgrade"); - if (mekanism != null) { - int max = mekanism.getInt("max_upgrade"); - if (max < 1 || max > 64) { - max = 16; + int cached = startupMaxUpgrade; + if (cached < 0) { + synchronized (MekUtils.class) { + cached = startupMaxUpgrade; + if (cached < 0) { + cached = readStartupMaxUpgrade(); + startupMaxUpgrade = cached; + } } - MAX_UPGRADE = max; - } else { - config.set("mekanism_upgrade.max_upgrade", MAX_UPGRADE); - config.save(); + } + return cached; + } + + private static int readStartupMaxUpgrade() { + Path path = FMLPaths.CONFIGDIR.get().resolve("useless_mod-server.toml"); + if (!Files.isRegularFile(path)) { + return DEFAULT_MAX_UPGRADE; } - config.close(); + try (CommentedFileConfig config = CommentedFileConfig.builder(path).build()) { + config.load(); + Config section = config.get("mekanism_upgrade"); + if (section != null) { + Object raw = section.get("max_upgrade"); + if (raw instanceof Number number) { + int value = number.intValue(); + if (value >= 1 && value <= 64) { + return value; + } + } + } + } catch (RuntimeException exception) { + LOGGER.debug("Unable to read mekanism_upgrade.max_upgrade from {}; using {}", + path, DEFAULT_MAX_UPGRADE, exception); + } + return DEFAULT_MAX_UPGRADE; } public static double time(IUpgradeTile tile) { @@ -43,11 +76,17 @@ public static double time(IUpgradeTile tile) { public static double electricity(IUpgradeTile tile) { // 简化公式:每8个能量升级降低10倍能耗 - return Math.pow((double)(MekanismConfig.general.maxUpgradeMultiplier.get() * ConfigManager.getElectricityMultiplier()), (double)tile.getComponent().getUpgrades(Upgrade.ENERGY) / (double)-8.0F); + double multiplier = Math.pow((double)(MekanismConfig.general.maxUpgradeMultiplier.get() + * ConfigManager.getElectricityMultiplier()), + (double)tile.getComponent().getUpgrades(Upgrade.ENERGY) / (double)-8.0F); + return Double.isFinite(multiplier) ? multiplier : 1.0; } public static double capacity(IUpgradeTile tile) { - return Math.pow((double)(MekanismConfig.general.maxUpgradeMultiplier.get() * ConfigManager.getCapacityMultiplier()), (double)tile.getComponent().getUpgrades(Upgrade.ENERGY) / (double)8.0F); + double multiplier = Math.pow((double)(MekanismConfig.general.maxUpgradeMultiplier.get() + * ConfigManager.getCapacityMultiplier()), + (double)tile.getComponent().getUpgrades(Upgrade.ENERGY) / (double)8.0F); + return Double.isFinite(multiplier) ? multiplier : 1.0; } public static String exponential(double d) { diff --git a/src/main/java/com/sorrowmist/useless/utils/MekanismAccelerationState.java b/src/main/java/com/sorrowmist/useless/utils/MekanismAccelerationState.java new file mode 100644 index 00000000..9df60ff4 --- /dev/null +++ b/src/main/java/com/sorrowmist/useless/utils/MekanismAccelerationState.java @@ -0,0 +1,50 @@ +package com.sorrowmist.useless.utils; + +import net.minecraftforge.fml.ModList; + +import java.util.function.BiConsumer; + +public class MekanismAccelerationState { + /** Set by UpgradeMixin while Mekanism's Upgrade enum is being constructed. */ + public static String name; + public static final int MAX_EXTRA_OPERATIONS_PER_TICK = 128; + public static final ThreadLocal isInjecting = ThreadLocal.withInitial(() -> false); + private static Boolean rebornLoaded; + + /** + * Mekanism Upgrades: Reborn installs equivalent extra-operation callbacks. + * Running both would process the same machine twice per tick, so only one + * implementation may own the acceleration loop. + */ + public static boolean rebornOwnsAcceleration() { + Boolean cached = rebornLoaded; + if (cached == null) { + try { + if (ModList.get() == null) { + return false; + } + cached = ModList.get().isLoaded("mekanismupgradesreborn"); + } catch (Throwable ignored) { + cached = false; + } + rebornLoaded = cached; + } + return cached; + } + + public static final BiConsumer + inject = (reqTime, process) -> { + if (!rebornOwnsAcceleration() && !isInjecting.get()) { + isInjecting.set(true); + + try { + int extraOperations = Math.min(-reqTime, MAX_EXTRA_OPERATIONS_PER_TICK); + for(int i = 0; i < extraOperations; ++i) { + process.run(); + } + } finally { + isInjecting.set(false); + } + } + }; +} diff --git a/src/main/resources/META-INF/mods.toml b/src/main/resources/META-INF/mods.toml index 1db259bb..db7127d2 100644 --- a/src/main/resources/META-INF/mods.toml +++ b/src/main/resources/META-INF/mods.toml @@ -41,12 +41,12 @@ ordering="AFTER" side="BOTH" # Optional integrations: absence is allowed; installed versions must match the supported API line. -# Minimums are the versions used by this Forge build, taken from each dependency's mods.toml. +# Minimums are the lowest API lines accepted by this Forge build; compile pins live in build.gradle. [[dependencies.useless_mod]] modId="advanced_ae" mandatory=false -versionRange="[1.3.6-1.20.1,2)" +versionRange="[1.2.7-1.20.1,2)" ordering="AFTER" side="BOTH" @@ -88,7 +88,7 @@ side="BOTH" [[dependencies.useless_mod]] modId="botanypots" mandatory=false -versionRange="[13.0.41,14)" +versionRange="[13.0.0,14)" ordering="AFTER" side="BOTH" @@ -291,7 +291,7 @@ side="BOTH" [[dependencies.useless_mod]] modId="mekanism_extras" mandatory=false -versionRange="[1.20.1-1.4.1,1.20.2)" +versionRange="[1.5.0,2)" ordering="AFTER" side="BOTH" @@ -340,7 +340,7 @@ side="BOTH" [[dependencies.useless_mod]] modId="bloodmagic" mandatory=false -versionRange="[3.3.5-47,3.4)" +versionRange="[3.3.3-45,3.4)" ordering="AFTER" side="BOTH" diff --git a/src/main/resources/assets/useless_mod/textures/block/advanced_alloy_furnace_bottom.png b/src/main/resources/assets/useless_mod/textures/block/advanced_alloy_furnace_bottom.png deleted file mode 100644 index af5005ae..00000000 Binary files a/src/main/resources/assets/useless_mod/textures/block/advanced_alloy_furnace_bottom.png and /dev/null differ diff --git a/src/main/resources/assets/useless_mod/textures/block/advanced_alloy_furnace_flame.png b/src/main/resources/assets/useless_mod/textures/block/advanced_alloy_furnace_flame.png deleted file mode 100644 index bc084c22..00000000 Binary files a/src/main/resources/assets/useless_mod/textures/block/advanced_alloy_furnace_flame.png and /dev/null differ diff --git a/src/main/resources/assets/useless_mod/textures/block/advanced_alloy_furnace_flame.png.mcmeta b/src/main/resources/assets/useless_mod/textures/block/advanced_alloy_furnace_flame.png.mcmeta deleted file mode 100644 index 338035db..00000000 --- a/src/main/resources/assets/useless_mod/textures/block/advanced_alloy_furnace_flame.png.mcmeta +++ /dev/null @@ -1,6 +0,0 @@ -{ - "animation": { - "frametime": 8, - "frames": [0, 1, 3, 2, 3, 1, 2, 1, 0, 3, 2, 0, 1, 3] - } -} \ No newline at end of file diff --git a/src/main/resources/assets/useless_mod/textures/block/advanced_alloy_furnace_front.png b/src/main/resources/assets/useless_mod/textures/block/advanced_alloy_furnace_front.png deleted file mode 100644 index 2ecc2f51..00000000 Binary files a/src/main/resources/assets/useless_mod/textures/block/advanced_alloy_furnace_front.png and /dev/null differ diff --git a/src/main/resources/assets/useless_mod/textures/block/advanced_alloy_furnace_front_active.png b/src/main/resources/assets/useless_mod/textures/block/advanced_alloy_furnace_front_active.png deleted file mode 100644 index 96d2d454..00000000 Binary files a/src/main/resources/assets/useless_mod/textures/block/advanced_alloy_furnace_front_active.png and /dev/null differ diff --git a/src/main/resources/assets/useless_mod/textures/block/advanced_alloy_furnace_front_active.png.mcmeta b/src/main/resources/assets/useless_mod/textures/block/advanced_alloy_furnace_front_active.png.mcmeta deleted file mode 100644 index c09e1cee..00000000 --- a/src/main/resources/assets/useless_mod/textures/block/advanced_alloy_furnace_front_active.png.mcmeta +++ /dev/null @@ -1,6 +0,0 @@ -{ - "animation": { - "interpolate": true, - "frametime": 8 - } -} diff --git a/src/main/resources/assets/useless_mod/textures/block/advanced_alloy_furnace_granule.png b/src/main/resources/assets/useless_mod/textures/block/advanced_alloy_furnace_granule.png deleted file mode 100644 index 84f01325..00000000 Binary files a/src/main/resources/assets/useless_mod/textures/block/advanced_alloy_furnace_granule.png and /dev/null differ diff --git a/src/main/resources/assets/useless_mod/textures/block/advanced_alloy_furnace_side.png b/src/main/resources/assets/useless_mod/textures/block/advanced_alloy_furnace_side.png deleted file mode 100644 index ce0edad4..00000000 Binary files a/src/main/resources/assets/useless_mod/textures/block/advanced_alloy_furnace_side.png and /dev/null differ diff --git a/src/main/resources/assets/useless_mod/textures/block/advanced_alloy_furnace_top.png b/src/main/resources/assets/useless_mod/textures/block/advanced_alloy_furnace_top.png deleted file mode 100644 index a0edd7e7..00000000 Binary files a/src/main/resources/assets/useless_mod/textures/block/advanced_alloy_furnace_top.png and /dev/null differ diff --git a/src/main/resources/assets/useless_mod/textures/block/temperature_regulator_panel.dark-original.bak.png b/src/main/resources/assets/useless_mod/textures/block/temperature_regulator_panel.dark-original.bak.png deleted file mode 100644 index 59eab450..00000000 Binary files a/src/main/resources/assets/useless_mod/textures/block/temperature_regulator_panel.dark-original.bak.png and /dev/null differ diff --git a/src/main/resources/assets/useless_mod/textures/gui/advanced_alloy_furnace_pattern_solt.png b/src/main/resources/assets/useless_mod/textures/gui/advanced_alloy_furnace_pattern_solt.png deleted file mode 100644 index b2b09413..00000000 Binary files a/src/main/resources/assets/useless_mod/textures/gui/advanced_alloy_furnace_pattern_solt.png and /dev/null differ diff --git a/src/main/resources/assets/useless_mod/textures/gui/advanced_alloy_furnace_tips.png b/src/main/resources/assets/useless_mod/textures/gui/advanced_alloy_furnace_tips.png deleted file mode 100644 index bc23b7db..00000000 Binary files a/src/main/resources/assets/useless_mod/textures/gui/advanced_alloy_furnace_tips.png and /dev/null differ diff --git a/src/main/resources/assets/useless_mod/textures/gui/advanced_alloy_furnace_zu_jian.png b/src/main/resources/assets/useless_mod/textures/gui/advanced_alloy_furnace_zu_jian.png deleted file mode 100644 index 15204565..00000000 Binary files a/src/main/resources/assets/useless_mod/textures/gui/advanced_alloy_furnace_zu_jian.png and /dev/null differ diff --git a/src/main/resources/assets/useless_mod/textures/gui/jei_arrow_advanced_alloy_furnace_gui.png b/src/main/resources/assets/useless_mod/textures/gui/jei_arrow_advanced_alloy_furnace_gui.png deleted file mode 100644 index c5c16997..00000000 Binary files a/src/main/resources/assets/useless_mod/textures/gui/jei_arrow_advanced_alloy_furnace_gui.png and /dev/null differ diff --git a/src/main/resources/assets/useless_mod/textures/icon/slave.png b/src/main/resources/assets/useless_mod/textures/icon/slave.png deleted file mode 100644 index feefa449..00000000 Binary files a/src/main/resources/assets/useless_mod/textures/icon/slave.png and /dev/null differ diff --git a/src/main/resources/xia/assets/useless_mod/textures/block/multiblock_alloy_furnace/coils/Coil_ctm.png b/src/main/resources/xia/assets/useless_mod/textures/block/multiblock_alloy_furnace/coils/Coil_ctm.png deleted file mode 100644 index f28a68e2..00000000 Binary files a/src/main/resources/xia/assets/useless_mod/textures/block/multiblock_alloy_furnace/coils/Coil_ctm.png and /dev/null differ diff --git a/src/main/resources/xia/assets/useless_mod/textures/block/multiblock_alloy_furnace/coils/Coli_base.png b/src/main/resources/xia/assets/useless_mod/textures/block/multiblock_alloy_furnace/coils/Coli_base.png deleted file mode 100644 index a9ea8042..00000000 Binary files a/src/main/resources/xia/assets/useless_mod/textures/block/multiblock_alloy_furnace/coils/Coli_base.png and /dev/null differ diff --git a/src/main/resources/xia/assets/useless_mod/textures/block/multiblock_alloy_furnace/coils/Gallery.cache b/src/main/resources/xia/assets/useless_mod/textures/block/multiblock_alloy_furnace/coils/Gallery.cache deleted file mode 100644 index a58b704b..00000000 --- a/src/main/resources/xia/assets/useless_mod/textures/block/multiblock_alloy_furnace/coils/Gallery.cache +++ /dev/null @@ -1 +0,0 @@ -[{"Path":"/storage/emulated/0/Android/data/com.pixelstudio.pro/files/Storage/useless/coils/Coli_base.png","LastWriteTime":639232982368819097,"Height":16,"Width":16,"Texture":"iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAeklEQVQ4EWNgGGjAeL09/b+ilhrYHfev3WIglc24N8DrPyW+YJEylyXZVmRXMi60sP8vI8ENdsSTF18ZSGWzmPlrDLALtE2FGLilxMBe4H/2imQ2y9XT74CaQRgGSGOzILvgK5ILiGUPEhfISPwEBwAkHZDGhoXcwNEAUMej/MWS7qYAAAAASUVORK5CYII="},{"Path":"/storage/emulated/0/Android/data/com.pixelstudio.pro/files/Storage/useless/coils/useless_coil_tier_1.png","LastWriteTime":639232983458859097,"Height":16,"Width":16,"Texture":"iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAA20lEQVQ4EWPM/db3/+O/VwwgwM8kxgBig+gHf84zKLAYgsXxyTM6XHD7/+fbL7BCxg8/wDSI+C/AAWazcLEx4JWfvl2RQVFLDaz4/rVbCPZBJDayOIz9moEBpJ5xb4DXf7BuMgkWKXNZhK0w04GGobgGjzjjQgv7/zIS3GD7n7z4ykAqm8XMX2OAXaBtKsTALSUG9gL/s1cks1munn4H1AzCMEAamwXZBV+RXEAse5C4QEbiJzgAIOmANDaj76fY/9/ffIKFIJjmFOFjgIkhs2GKkMUYNZLFKMoLAFW21sUW51U4AAAAAElFTkSuQmCC"},{"Path":"/storage/emulated/0/Android/data/com.pixelstudio.pro/files/Storage/useless/coils/Coil_ctm.png","LastWriteTime":639232986264339098,"Height":32,"Width":32,"Texture":"iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAABGklEQVRYCWO83p7+X1FLjQEE7l+7xUAKmxw96HYwLrSw/y8jwQ12wJMXXxlIZYM0kqoHWT2Lmb8GSb5G9gFVQmBvgNd/sPcHiGCRMpcd2BAYTQOjITAaAqPlwGgaAIXAAFUDYGsZqWX5j429/5FrSkJsDv9isN0s1HLA0fl7GUDtiWcnH4ONJIYNUsg4kC0isANGdDkADgFyywFQHMMAchuPWDZM/4C2CQdHCGibCjFwS4mBQ5P/2Sui2VLQ8P9Kgh6QFpgdMP3gfgHUrAGhWJBDANk3xLBBLiZGHS41IP2jIcBy9fQ7YN/uJyg0wGU5sWxYPgbpI1YPsh0w/VSrDUF1Cq64xiauWTmTurXhqY03QB4EgncQikg2ABJy7uTf9ldPAAAAAElFTkSuQmCC"},{"Path":"/storage/emulated/0/Android/data/com.pixelstudio.pro/files/Storage/useless/coils/useless_coil_tier_1_ctm.png","LastWriteTime":639232986121779098,"Height":32,"Width":32,"Texture":"iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAABYklEQVRYCWO83p7+X1FLjQEE7l+7xUAKmxw96HYwLrSw/y8jwQ12wJMXXxlIZYM0kqoHWT2Lmb8GSb5G9gFVQmBvgNd/sPcHiGCRMpcd2BAYTQOjITAaAqPlwGgaAIXAAFUDYGtZzuzzZ/j47xWYw88kBmaD6Ad/zjMosBiCxYmRn7VXlKT2RKjjBbD5jA4X3P7/+fYLbBHjhx9gGkT8F+AAs1m42BiIkW/s4mIgpT1RX/YNbD7jQLaIQC5gHNHlADgEyC0HQPENA8htPGLZMP0D2iYcHCGgbSrEwC0lBg5N/meviGZLQcP/Kwl6QFpgdsD0g/sFULMGhGJBDgFk3xDDBrmYGHW41ID0j4YAy9XT74B9u5+g0ICW5cSxYfkYpI8S/Yy+n2L/f3/zCWQOHHCK8DHAxJDZMAXIYjD25JUSJKWH3PAXYONYbhfuhJlLEX3qqiZU/zskc3Czn9y5DlYHADwKIiFgYRAAAAAAAElFTkSuQmCC"},{"Path":"/storage/emulated/0/Android/data/com.pixelstudio.pro/files/Storage/useless/coils/useless_coil_tier_2.png","LastWriteTime":639232986616619098,"Height":16,"Width":16,"Texture":"iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAy0lEQVQ4EWO8lPvt/8eP/xhAgJ+fiQHEBtH3HvxhUFJgAYvjk2fsc7jw//ufb2CFb/98ANMgQphFAMzmZOFiwCfP4uk+nUFRSw2s+P61WySzGfcGeP0H6yaTYJEylyXZVmQXMy60sP8vI8ENtv/Ji68MpLJZzPw1BtgF2qZCDNxSYmAv8D97RTKb5erpd0DNIAwDpLFZkF3wFckFxLIHiQtkJH6CAwCSDkhjM27w/fT/zfc3sBAE0yKcIgwwMWQ2TBGyGKOWWDJFeQEA6CnWf/N4qL0AAAAASUVORK5CYII="},{"Path":"/storage/emulated/0/Android/data/com.pixelstudio.pro/files/Storage/useless/coils/useless_coil_tier_2_ctm.png","LastWriteTime":639232986803259098,"Height":32,"Width":32,"Texture":"iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAABXklEQVRYCWO83p7+X1FLjQEE7l+7xUAKmxw96HYwLrSw/y8jwQ12wJMXXxlIZYM0kqoHWT2Lmb8GSb5G9gFVQmBvgNd/sPcHiGCRMpcd2BAYTQOjITAaAqPlwGgaAIXAAFUDYGsZL+V++//x4z8wh5+fiQHEBtH3HvxhUFJgAYsTI28aPJOk9sSOOalg8xn7HC78//7nG9iit38+gGkQIcwiAGZzsnAxECNvIdLCQEp74sSbGrD5jAPZIgK5gHFElwPgECC3HADFNwwgt/GIZcP0D2ibcHCEgLapEAO3lBg4NPmfvSKaLQUN/68k6AFpgdkB0w/uF0DNGhCKBTkEkH1DDBvkYmLU4VID0j8aAixXT78D9u1+gkIDWpYTx4blY5A+SvQzbvD99P/N9zcgc+BAhFOEASaGzIYpQBaDsa2dO0lKD0f3loONY9QSS6ZKe6Bc6Q7MfUTRnfdUwOoAm/oejupeW+kAAAAASUVORK5CYII="},{"Path":"/storage/emulated/0/Android/data/com.pixelstudio.pro/files/Storage/useless/coils/useless_coil_tier_3.png","LastWriteTime":639232986969259098,"Height":16,"Width":16,"Texture":"iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAA0ElEQVQ4EWP8ltv2/9/HvwwgwMTPzABig+g/D34zsCiwgsXxybPcuvyB4dufP2CFH/78B9MgQoCFkYHhPQMDFwsLXnkWdvePDBpaamCN96/dYlAkkc24N8ALYS3cfuIZLFLmsiTbiuxKxoUW9v9lJLjBVj558ZWBVDaLmb/GALtA21SIgVtKDOwF/mevSGazXD39DqgZhGGANDYLsgu+IrmAWPYgcYGMxE9wAEDSAWlsxk++jf/ffP8BC0EwLcLJwQATQ2bDFCGLMSaLeVKUFwADW9g0aWtYnwAAAABJRU5ErkJggg=="},{"Path":"/storage/emulated/0/Android/data/com.pixelstudio.pro/files/Storage/useless/coils/useless_coil_tier_3_ctm.png","LastWriteTime":639232987099019098,"Height":32,"Width":32,"Texture":"iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAABe0lEQVRYCWO83p7+X1FLjQEE7l+7xUAKmxw96HYwLrSw/y8jwQ12wJMXXxlIZYM0kqoHWT2Lmb8GSb5G9gFVQmBvgNd/sPcHiGCRMpcd2BAYTQOjITAaAqPlwGgaAIXAAFUDYGsZv+XO+f/vI8QNTPyMDCA2iP7zgJGBRQEiTow8S/AnktoTv+YIgM1nvODQ9//bn99g13z48xceGAIszGA2FwsrAzHy30UOMpDSnuB8Yw82n4Xd/SaDBrxFdA9Lzfgf6DOYOAuKL0Em3L8G0++MIofcbsDFBulnHNHlADgEyC0HQPENA8htPGLZMP0D2iYcHCGgbSrEwC0lBg5N/meviGZLQcP/Kwl6QFpgdsD0g/sFULMGhGJBDgFk3xDDBrmYGHW41ID0j4YAy9XT74B9u5+g0ICW5cSxYfkYpI8S/YyffOf+f/P9G8gcOBDh5GKAiSGzYQqQxWDsn85XSEoP7Ht1wMYxJouFUqU9YKf0CuY+ouhD9yBZHwATDR8/pSfJtgAAAABJRU5ErkJggg=="},{"Path":"/storage/emulated/0/Android/data/com.pixelstudio.pro/files/Storage/useless/coils/useless_coil_tier_4.png","LastWriteTime":639232987250259098,"Height":16,"Width":16,"Texture":"iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAzElEQVQ4EWPM/fby/8d/nxlAgJ+JlwHEBtEP/jxmUGCRBYvjk2d0uLDs/59v38AK/3x4DaZBBIuAKJjNwsXFgE+e8Xp7+n9FLTWw4vvXbjGQymbcG+D1H6ybTIJFylyWZFuRXcm40ML+v4wEN9j+Jy++MpDKZjHz1xhgF2ibCjFwS4mBvcD/7BXJbJarp98BNYMwDJDGZkF2wVckFxDLHiQukJH4CQ4ASDogjc3o++nM/+9vXsFCEExziogxwMSQ2TBFyGKMYsnmFOUFAFol2G4PQYsKAAAAAElFTkSuQmCC"},{"Path":"/storage/emulated/0/Android/data/com.pixelstudio.pro/files/Storage/useless/coils/useless_coil_tier_4_ctm.png","LastWriteTime":639232987381299098,"Height":32,"Width":32,"Texture":"iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAABbUlEQVRYCWO83p7+X1FLjQEE7l+7xUAKmxw96HYwLrSw/y8jwQ12wJMXXxlIZYM0kqoHWT2Lmb8GSb5G9gFVQmBvgNd/sPcHiGCRMpcd2BAYTQOjITAaAqPlwGgaAIXAAFUDYGsZc7+9/P/x32cwh5+JlwHEBtEP/jxmUGCRBYsTIz9r70aS2hOhjvZg81ku39rL8OfbN7BFfz68BtMggkVAlOE9wwUGFi4uouSPzt/LAGpPPDv5GGwGIfZ7UX6w+YwD2SICuZRxRJcD4BAgtxwAxTEMILfxiGXD9A9om3BwhIC2qRADt5QYODT5n70imi0FDf+vJOgBaYHZAdMP7hdAzRoQigU5BJB9Qwwb5GJi1OFSA9I/GgIsV0+/A/btfoJCA1yWE8uG5WOQPmL1INsB08/o++nM/+9vXoHk4IBTRIwBJobMhilAFoOxJ6/cSFJ6yA33BxvHKJZsTpX2QPdVDpj7iKJLtX+A1QEA0GMtWAgkeokAAAAASUVORK5CYII="},{"Path":"/storage/emulated/0/Android/data/com.pixelstudio.pro/files/Storage/useless/coils/useless_coil_tier_5.png","LastWriteTime":639232987587219098,"Height":16,"Width":16,"Texture":"iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAvElEQVQ4EWP8f/n/f4aPDBDAD6RAbBD9AIgVgBgE8MizMFwGKvgDVoagQVwWIH4PpfHIs9x4mMGgqKUG0sJw/9otktmMewO8/oN1k0mwSJnLkmwrsosZF1rY/5eR4Abb/+TFVwZS2Sxm/hoD7AJtUyEGbikxsBf4n70imc1y9fQ7oGYQhgHS2CzILviK5AJi2YPEBTISP8EBAEkHpLEZ/28G5sbvsACE0pxAGiaGzIYpQxJjOXLyFEyYLBoA23y94QBGKokAAAAASUVORK5CYII="},{"Path":"/storage/emulated/0/Android/data/com.pixelstudio.pro/files/Storage/useless/coils/useless_coil_tier_5_ctm.png","LastWriteTime":639232987729219098,"Height":32,"Width":32,"Texture":"iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAABUUlEQVRYCWO83p7+X1FLjQEE7l+7xUAKmxw96HYwLrSw/y8jwQ12wJMXXxlIZYM0kqoHWT2Lmb8GSb5G9gFVQmBvgNd/sPcHiGCRMpcd2BAYTQOjITAaAqPlwGgaAIXAAFUDYGsZ/1/+/5/hI9QJ/EAaxAbRD4BYAYhBgAj5n2/7SGpPsDMVgc1n/L8M6IA/EHvgNIjLAhUD0UTI71vnzUBKe8IpaCvYAsaBbBGBXMA4ossBcAiQWw6A4hsGkNt4xLJh+ge0TTg4QkDbVIiBW0oMHJr8z14RzZaChv9XEvSAtMDsgOkH9wugZg0IxYIcAsi+IYYNcjEx6nCpAekfDQGWq6ffAft2P0GhAS3LiWPD8jFIHyX6Gf9vBlZG30HGIAFOIBsmhsyGKUEWg7Jv3M0gKT1oKM8Am8Zy5OQpmLEU0ff23IDqf4dkDm72GxeIvQDEwwUJbHgkZAAAAABJRU5ErkJggg=="},{"Path":"/storage/emulated/0/Android/data/com.pixelstudio.pro/files/Storage/useless/coils/useless_coil_tier_6.png","LastWriteTime":639232987868419098,"Height":16,"Width":16,"Texture":"iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAzElEQVQ4EWPckPvt/9uP/xhAQJifiQHEBtHXH/xh0FRgAYvjk2fMcrjw/8efb2CFH/58ANMgQoBFAMzmYOFiwCfPeL09/b+ilhpY8f1rtxhIZTPuDfD6D9ZNJsEiZS5Lsq3IrmRcaGH/X0aCG2z/kxdfGUhls5j5awywC7RNhRi4pcTAXuB/9opkNsvV0++AmkEYBkhjsyC74CuSC4hlDxIXyEj8BAcAJB2QxmZs9/30/933N7AQBNNCnCIMMDFkNkwRshijuFgyRXkBAG1f15qPmdtDAAAAAElFTkSuQmCC"},{"Path":"/storage/emulated/0/Android/data/com.pixelstudio.pro/files/Storage/useless/coils/useless_coil_tier_6_ctm.png","LastWriteTime":639232987988059098,"Height":32,"Width":32,"Texture":"iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAABXUlEQVRYCWO83p7+X1FLjQEE7l+7xUAKmxw96HYwLrSw/y8jwQ12wJMXXxlIZYM0kqoHWT2Lmb8GSb5G9gFVQmBvgNd/sPcHiGCRMpcd2BAYTQOjITAaAqPlwGgaAIXAAFUDYGtZ+E23M7z9+A/MEeZnArNB9PUHfxg0FVjA4sTIRwfPJKk90T8nFWw+Y5bDhf8//nwDW/ThzwcwDSIEWATAbA4WLgZi5KNFWhhIaU8sfVMDNp9xIFtEIBcwjuhyABwC5JYDoPiGAeQ2HrFsmP4BbRMOjhDQNhVi4JYSA4cm/7NXRLOloOH/lQQ9IC0wO2D6wf0CqFkDQrEghwCyb4hhg1xMjDpcakD6R0OA5erpd8C+3U9QaEDLcuLYsHwM0keJfsZ230//331/AzIHDoQ4RRhgYshsmAJkMRg7ybmTpPQwb2852DhGcbFkqrQHupTuwNxHFF12TwWsDgCreBv7pfsz7AAAAABJRU5ErkJggg=="},{"Path":"/storage/emulated/0/Android/data/com.pixelstudio.pro/files/Storage/useless/coils/useless_coil_tier_7.png","LastWriteTime":639232988155019098,"Height":16,"Width":16,"Texture":"iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAyUlEQVQ4EWP08/P7/+nTJwYQ4OPjYwCxQfSjR48Y5OTkwOL45BmlpaX///r1C6zw27dvYBpEcHFxgdlsbGwM+ORZ9uT4MChqqYEV3792i2Q2494Ar/9g3WQSLFLmsiTbiuxixoUW9v9lJLjB9j958ZWBVDaLmb/GALtA21SIgVtKDOwF/mevSGazXD39DqgZhGGANDYLsgu+IrmAWPYgcYGMxE9wAEDSAWlsRgMDg/+fP3+GhSCY5uXlZYCJIbNhipDFGIGCFOUFAAl90kGnakYDAAAAAElFTkSuQmCC"},{"Path":"/storage/emulated/0/Android/data/com.pixelstudio.pro/files/Storage/useless/coils/useless_coil_tier_7_ctm.png","LastWriteTime":639232988300299098,"Height":32,"Width":32,"Texture":"iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAABW0lEQVRYCWO83p7+X1FLjQEE7l+7xUAKmxw96HYwLrSw/y8jwQ12wJMXXxlIZYM0kqoHWT2Lmb8GSb5G9gFVQmBvgNd/sPcHiGCRMpcd2BAYTQOjITAaAqPlwGgaAIXAAFUDYGtZ1orxM3z69AnM4ePjA7NB9KNHjxjk5OTA4sTI7yj0Jak9YVG/GGw+o7S09P9fv36BLfr27RuYBhFcXFxgNhsbGwMx8iusTRlIaU9EHD0NNp9xIFtEIBcwjuhyABwC5JYDoPiGAeQ2HrFsmP4BbRMOjhDQNhVi4JYSA4cm/7NXRLOloOH/lQQ9IC0wO2D6wf0CqFkDQrEghwCyb4hhg1xMjDpcakD6R0OA5erpd8C+3U9QaEDLcuLYsHwM0keJfkYDA4P/nz9/BpkDB7y8vAwwMWQ2TAGyGIy9JcWFpPTgM2cP2DhGIEmV9gCwRIW5jyg6/sRBsDoASd8Y76KlEdwAAAAASUVORK5CYII="},{"Path":"/storage/emulated/0/Android/data/com.pixelstudio.pro/files/Storage/useless/coils/useless_coil_tier_8.png","LastWriteTime":639232988572019098,"Height":16,"Width":16,"Texture":"iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAxklEQVQ4EWP0zXvy//PnLwwgwMvLwwBig+jnL94ySEoIg8XxyTM6+t38/+H9K7DC79/fgWkQwckpBGYLCIox4JNnvN6e/l9RSw2s+P61Wwykshn3Bnj9B+smk2CRMpcl2VZkVzIutLD/LyPBDbb/yYuvDKSyWcz8NQbYBdqmQgzcUmJgL/A/e0Uym+XqaVDcI+KfVDYLsgu+IrmAWPYgcYGMxE+kdEAam9Ek7OL/tx9+gA2AEcICHAwwMWQ2NnlGLp3JFOUFAK9v1sWmulCyAAAAAElFTkSuQmCC"},{"Path":"/storage/emulated/0/Android/data/com.pixelstudio.pro/files/Storage/useless/coils/useless_coil_tier_8_ctm.png","LastWriteTime":639232988713539098,"Height":32,"Width":32,"Texture":"iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAABXklEQVRYCWO83p7+X1FLjQEE7l+7xUAKmxw96HYwLrSw/y8jwQ12wJMXXxlIZYM0kqoHWT2Lmb8GSb5G9gFVQmBvgNd/sPcHiGCRMpcd2BAYTQOjITAaAqPlwGgaAIXAAFUDYGsZffOe/P/8+QuYw8vLwwBig+jnL94ySEoIg8WJkd8RsJWk9oTNUhew+YyOfjf/f3j/CmzR9+/vwDSI4OQUArMFBMUYiJHvEW5nIKU9UfK2Emw+40C2iEAuYBzR5QA4BMgtB0DxDQPIbTxi2TD9A9omHBwhoG0qxMAtJQYOTf5nr4hmS0HD/ysJekBaYHbA9IP7BVCzBoRiQQ4BZN8Qwwa5mBh1uNSA9I+GAMvV0++AfbufoNCAluXEsWH5GKSPEv2MJmEX/7/98ANkDhwIC3AwwMSQ2TAFyGIw9jbHeSSlB6/9SWDjGLl0JlOlPTCdZw3MfUTRmV9CwOoAHd8dOiLLgEAAAAAASUVORK5CYII="},{"Path":"/storage/emulated/0/Android/data/com.pixelstudio.pro/files/Storage/useless/coils/useless_coil_tier_9.png","LastWriteTime":639232988828739098,"Height":16,"Width":16,"Texture":"iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAA2UlEQVQ4EWP8djf3/79PHxlAgImPnwHEBtF/Hj5gYJFXAIvjk2e8MMvh/7fvf8AKP7yG0CCOgCgLWIyLk4UBnzwL+1t1Bg0tNbDi+99uMSjC2NewsBUYGO6jiTPuDfD6D9ZNJsEiZS6L31agwei2IruScaGF/X8ZCW6w/U9efGUglc1i5q8xwC7QNhVi4JYSA3uB/9krktksV0+/A2oGYRggjc2C7IKvSC4glj1IXCAj8RMcAJB0QBqb8dM+3/9vXn+HhSCYFhHlZICJIbNhipDFGJMNxCjKCwAXvtbknEO04QAAAABJRU5ErkJggg=="},{"Path":"/storage/emulated/0/Android/data/com.pixelstudio.pro/files/Storage/useless/coils/useless_coil_tier_9_ctm.png","LastWriteTime":639232988964099098,"Height":32,"Width":32,"Texture":"iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAABeUlEQVRYCWO83p7+X1FLjQEE7l+7xUAKmxw96HYwLrSw/y8jwQ12wJMXXxlIZYM0kqoHWT2Lmb8GSb5G9gFVQmBvgNd/sPcHiGCRMpcd2BAYTQOjITAaAqPlwGgaAIXAAFUDYGsZv93N/f/v00cwh4mPnwHEBtF/Hj5gYJFXAIsTI8/ySJ+k9sQv3gNg8xkvzHL4/+37H7BFH15DaBBHQJQFLMbFycJAjPz3/XwMpLQnOB0/gc1nYX+rzqABaxF9I9AiUkBtNYFMALUPwPoTUeWQ2w242CD9jCO6HACHALnlACi+YQC5jUcsG6Z/QNuEgyMEtE2FGLilxMChyf/sFdFsKWj4fyVBD0gLzA6YfnC/AGrWgFAsyCGA7Bti2CAXE6MOlxqQ/tEQYLl6+h2wb/cTFBrQspw4Niwfg/RRop/x0z7f/29efweZAwciopwMMDFkNkwBshiM/fOeMknpgV3pLtg4xmQDMaq0B+w4NGHuI4o+9OM6WB0Ampwdwfy7/RcAAAAASUVORK5CYII="},{"Path":"/storage/emulated/0/Android/data/com.pixelstudio.pro/files/Storage/useless/coils/useless_coil_active.png","LastWriteTime":639232991040612591,"Height":16,"Width":16,"Texture":"iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAd0lEQVQ4EWNgGGjA+P/48v8MWmoQd1y7xUAqm/HvhK7/lPiChclclmRbkV3J+LCi/r+MBDfYEU9efGUglU15GFDugrUT/zNIiUHC8dkrBlLZLI9OvwNqBmEYII3NImcqRLKtyK4cJC6QkfgJDgBIOiCNDQu5gaMBYmmS2q3ArSAAAAAASUVORK5CYII="},{"Path":"/storage/emulated/0/Android/data/com.pixelstudio.pro/files/Storage/useless/coils/useless_coil_active_ctm.png","LastWriteTime":639232991218532591,"Height":32,"Width":32,"Texture":"iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAABCklEQVRYCWP8f3z5fwYtNQYwuHaLgSQ2SBOpetDUMz6sqP8vI8ENtv/Ji68MpLJBGknVg6yeccBD4O+Erv9g7w8QwcJkLktavCPHIcjRyHwy2KNpYDQERkOAcbQcGK0LQCEwQNUA2FpGaln+/+PZ/6TUC4z8xmC7WajlgH/z9zKA2xMnH4ONJIYNUjiw7QGQA0Z2OQAKAXLLAVAcwwByG49YNkz/wKeBgQ+BtRP/M0iJQULz2SsGktggXaTqQVYP1A5OAxDbB4ZkkTMVIs3XaD4YDQFKQ4Dl0el3wL7dT3ACAJffRLJh+RikkRL91KsNQb1s5PRBgM1oGUnd2vDRxhvQbPQOSoMowmwAXeSCb79zD5oAAAAASUVORK5CYII="},{"Path":"/storage/emulated/0/Android/data/com.pixelstudio.pro/files/Storage/useless/coils/useful_coil.png","LastWriteTime":639232991909492591,"Height":32,"Width":16,"Texture":"iVBORw0KGgoAAAANSUhEUgAAABAAAAAgCAYAAAAbifjMAAAA+klEQVRIDc1UsQqEMAxNoDgouimC4OLgIIjgJ7g7+xn+j3/l5uokuCk4uPRsDo/eItd26HVoHmnSvqbNw7Zt+bZtIEYQBCCwsPM8Q5qm5H9axyRJ+HmeFHgcB1kxua5L2HEceFrHYRh4nucUPE0TqGLs+55TtubEiqJQPlVmiV3X8TiO6fxlWUAVs6ZpLDMoyxLCMKQrRFGkjNk4jpr1f6cxmcG6rh8Gv+I/YaD69nI8VlXF933/KqTv+3D7ZHwHyT68nGa9cOkBaYDY3YoesLquzXohyzKzGhjrged5lvXAmIHcjTp6gILB/UV1rLEe/AkDub9VsX09eAFEiHGEsJ4ctQAAAABJRU5ErkJggg=="},{"Path":"/storage/emulated/0/Android/data/com.pixelstudio.pro/files/Storage/useless/coils/useful_coil_ctm.png","LastWriteTime":639232992375692591,"Height":64,"Width":32,"Texture":"iVBORw0KGgoAAAANSUhEUgAAACAAAABACAYAAAB7jnWuAAACJElEQVRoBe1YMaoCMRBNIFgoWikKgo2IgqCCYGFrby14B7G0thDvYO0lBO8gVlrYWAlaKVrY5P83EAlb/L+zLkQwA25esplk5pnMTiIXi4WuVqsCst/vBQdH0QnOIQeDgS4UCmTA6XQSXAxFro7dX/V6PZbXtgexMDAejzW57+ih6vW6Wwb8GvAMeAZ8HPBrAAw4+gzQtOrxeIjr9UqVTCZDGOXxeBSlUonaw7yfTqesfGI0GtH4slgs6ufzSRPBGCPJZJJgIpEQYd4Ph0PBySeWyyWNL11mRLBAfnUcIAaixgH830bsHC8sNvpOc8KPYEDOZjOdy+WIzfP5LDgYSlwduz/01Xa7RelMVKPRYHkd9MCuczG89gwQA2H3Ligz8d7sY7S9oy9brZa+3W4Y5yXpdFqYNhubDnabwZPJhLUj5vM5Dac2m40Z961yvV6z9A+HA/WX/X5f12o1qux2O8HBUOLqBPvLVCrl/n6A47XtQSwMlMtltzkh7gecMuDXgGfAM+DjgF8DYIC+xY4edDIKc/6HfX/dH3Q6HVZusFqt4r0fgHEmX4Sx/2HjtGq3286+hjBUfnUcIAaixoG4zgW0C1xlRB/BgOx2uzqbzcIYcblcBAdH0bHngD6dCwBciWo2myyvgx7YdS6G056ByGfD2OJApVJ53QWYiwac+Y3YGG3oY7eZ+wGcsPL5/Gs9hcEYT/7+YskHfiMqxgst9/ud+v4A2eER6ixJ9qYAAAAASUVORK5CYII="},{"Path":"/storage/emulated/0/Android/data/com.pixelstudio.pro/files/Storage/useless/coils/useful_coil_active.png","LastWriteTime":639232992644252591,"Height":16,"Width":16,"Texture":"iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAZElEQVQ4EWNgGHBw+/bt/zBADptxw4YN/ynyBTm2IruYccaMGf8lJCTAjnjx4gUDqWyGAXcBi56eHoOoqCjYC2JiYiSzWS5dukRRJKC44PXr13AXEMseJC4gNe6R1VMUgFTRDAAAbBb1b15/JwAAAABJRU5ErkJggg=="},{"Path":"/storage/emulated/0/Android/data/com.pixelstudio.pro/files/Storage/useless/coils/useful_coil_active_ctm.png","LastWriteTime":639232992863292591,"Height":32,"Width":32,"Texture":"iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAA50lEQVRYCe1XQQ6EIAyExC+Y8AGuvtdn6AO4+gASTn6AhEewO00whMtaJelh6YXRdMCOpQV1nmcuxsXgcTmtv17XNRtjFCzGqLgYPC6n9lftF3HU6KLAtm0ZUYiZuAIjB4YCQ4FRB0YOQAGxPtBzYW5nLGtPBbwd932n80QIgabC2eIXJkfJbgjV9F/XAVLgaR3APy5Wn/Hu4osvngPSCujjOPI8z6RmSklxMEhcTu0P/uS9xyhm07IsrKjbCOpnLkbUQwFS4O7ehWTl/njt4++7N3yNSXsY6gknB6y1tHa3buicexTHB4sbDXoXJ2nZAAAAAElFTkSuQmCC"}] \ No newline at end of file diff --git a/src/main/resources/xia/assets/useless_mod/textures/block/xbai2024.png b/src/main/resources/xia/assets/useless_mod/textures/block/xbai2024.png deleted file mode 100644 index b6647078..00000000 Binary files a/src/main/resources/xia/assets/useless_mod/textures/block/xbai2024.png and /dev/null differ diff --git a/src/main/resources/xia/assets/useless_mod/textures/gui/advanced_alloy_furnace_tips.png b/src/main/resources/xia/assets/useless_mod/textures/gui/advanced_alloy_furnace_tips.png deleted file mode 100644 index bc23b7db..00000000 Binary files a/src/main/resources/xia/assets/useless_mod/textures/gui/advanced_alloy_furnace_tips.png and /dev/null differ diff --git a/src/main/resources/xia/assets/useless_mod/textures/gui/jei_arrow_advanced_alloy_furnace_gui.png b/src/main/resources/xia/assets/useless_mod/textures/gui/jei_arrow_advanced_alloy_furnace_gui.png deleted file mode 100644 index c5c16997..00000000 Binary files a/src/main/resources/xia/assets/useless_mod/textures/gui/jei_arrow_advanced_alloy_furnace_gui.png and /dev/null differ diff --git a/src/main/resources/xia/updatelog.txt b/src/main/resources/xia/updatelog.txt deleted file mode 100644 index 5889e6f8..00000000 --- a/src/main/resources/xia/updatelog.txt +++ /dev/null @@ -1,56 +0,0 @@ -v1.0 -加入了三种维度方块材质 - -v1.2 -加入了矿石生成器材质 - -v1.3 -修改了塑料方块材质 - -v1.4 -修改了合金炉材质 - -v1.5 -修复合金炉材质bug -修改模具物品材质 - -v1.6 -修改了造化杖的模型方便区分模式 - -v1.7 -修改了所有的无用锭材质 - -v1.8 -修改了有用锭的材质 - -v1.9 -修改了并行控制器的材质 - -v2.0(也许是最终版本) -微调了万象合金炉的gui和jei界面 - -v2.1 -适配了新版的gui,修改了部分物品材质 - -v2.2 -修复了1.21牛排棒无法在切换精准模式时改变颜色的bug - -v2.3 -? - -v2.4 -填坑了多方块万象的外观,修复了手持时万象的模型bug,更改了jei的gui适配多物品/多模具 -(实际上ae风格的多方块完全没有必要做出来,只是书生想要而已) -如何删除多方块的纹理:找到 -/assets/useless_mod/textures/block/multiblock_alloy_furnace/ -路径下的所有文件,删掉即可 - -v2.5 -修复了监工方块书生骑的是压力锅的bug -优化了无用玻璃的材质 -微调了多方块控制器的外观 -更换了材质包封面 - -v2.6 -修复了部分材质bug -修改了牛排棒的名字让他更接近本来的意思 \ No newline at end of file diff --git a/src/main/templates/META-INF/enumextensions.json b/src/main/templates/META-INF/enumextensions.json deleted file mode 100644 index 34fb4c05..00000000 --- a/src/main/templates/META-INF/enumextensions.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "entries": [ - { - "enum": "net/minecraft/world/item/Rarity", - "name": "USELESS_MOD_MYTHIC", - "constructor": "(ILjava/lang/String;Ljava/util/function/UnaryOperator;)V", - "parameters": { - "class": "com/sorrowmist/useless/api/enums/RarityExtension", - "field": "MYTHIC" - } - }, - { - "enum": "net/minecraft/world/item/Rarity", - "name": "USELESS_MOD_LEGENDARY", - "constructor": "(ILjava/lang/String;Ljava/util/function/UnaryOperator;)V", - "parameters": { - "class": "com/sorrowmist/useless/api/enums/RarityExtension", - "field": "LEGENDARY" - } - } - ] -} \ No newline at end of file diff --git a/src/main/templates/META-INF/neoforge.mods.toml b/src/main/templates/META-INF/neoforge.mods.toml deleted file mode 100644 index 30b65025..00000000 --- a/src/main/templates/META-INF/neoforge.mods.toml +++ /dev/null @@ -1,222 +0,0 @@ -# This is an example neoforge.mods.toml file. It contains the data relating to the loading mods. -# There are several mandatory fields (#mandatory), and many more that are optional (#optional). -# The overall format is standard TOML format, v0.5.0. -# Note that there are a couple of TOML lists in this file. -# Find more information on toml format here: https://github.com/toml-lang/toml - -# The name of the mod loader type to load - for regular FML @Mod mods it should be javafml -modLoader="javafml" #mandatory - -# A version range to match for said mod loader - for regular FML @Mod it will be the FML version. This is currently 2. -loaderVersion="${loader_version_range}" #mandatory - -# The license for you mod. This is mandatory metadata and allows for easier comprehension of your redistributive properties. -# Review your options at https://choosealicense.com/. All rights reserved is the default copyright stance, and is thus the default here. -license="${mod_license}" - -# A URL to refer people to when problems occur with this mod -#issueTrackerURL="https://change.me.to.your.issue.tracker.example.invalid/" #optional - -# A list of mods - how many allowed here is determined by the individual mod loader -[[mods]] #mandatory - -# The modid of the mod -modId="${mod_id}" #mandatory - -# The version number of the mod -version="${mod_version}" #mandatory - -# A display name for the mod -displayName="${mod_name}" #mandatory - -# A URL to query for updates for this mod. See the JSON update specification https://docs.neoforged.net/docs/misc/updatechecker/ -#updateJSONURL="https://change.me.example.invalid/updates.json" #optional - -# A URL for the "homepage" for this mod, displayed in the mod UI -#displayURL="https://change.me.to.your.mods.homepage.example.invalid/" #optional - -# A file name (in the root of the mod JAR) containing a logo for display -#logoFile="examplemod.png" #optional - -# A text field displayed in the mod UI -credits="Art by 虾比、麦淇淋" #optional - -# A text field displayed in the mod UI -authors="C-H716、水幕忘忧" - -# The description text for the mod (multi line!) (#mandatory) -description='''这个mod可能很有用, 但这个mod很有用不太可能。''' - -enumExtensions = "META-INF/enumextensions.json" -# The [[mixins]] block allows you to declare your mixin config to FML so that it gets loaded. -[[mixins]] -config="${mod_id}.mixins.json" - -# 承载「紧凑方块接入 AE2 网格」的关键混入:这里故意设成 required=true, -# 一旦混入失效直接启动报错,避免又出现「看起来正常其实没生效」。 -[[mixins]] -config="${mod_id}.compact.mixins.json" - -[[mixins]] -config="${mod_id}.mekanism.mixins.json" -requiredMods=["mekanism"] - -[[mixins]] -config="${mod_id}.jade.mixins.json" -requiredMods=["jade"] - -[[mixins]] -config="${mod_id}.item_obliterator.mixins.json" -requiredMods=["item_obliterator"] - -[[mixins]] -config="${mod_id}.malum.mixins.json" -requiredMods=["malum"] - -# 无线物流的「应力」介质要在动力学方块的自身转速入口与网络合计处注入, -# 因此这份配置只在动力学模组在场时才加载。 -[[mixins]] -config="${mod_id}.create.mixins.json" -requiredMods=["create"] - -# 无线物流的「气压」介质:被无线绑定的气动方块要"视同已连接"、不再向环境漏气。 -# 注入的是 PneumaticCraft 的内部空气处理器,因此只在气动工艺在场时才加载。 -[[mixins]] -config="${mod_id}.pneumaticcraft.mixins.json" -requiredMods=["pneumaticcraft"] - -# The [[accessTransformers]] block allows you to declare where your AT file is. -# If this block is omitted, a fallback attempt will be made to load an AT from META-INF/accesstransformer.cfg -#[[accessTransformers]] -#file="META-INF/accesstransformer.cfg" - -# The coremods config file path is not configurable and is always loaded from META-INF/coremods.json - -# A dependency - use the . to indicate dependency for a specific modid. Dependencies are optional. -[[dependencies.${mod_id}]] #optional - # the modid of the dependency - modId="neoforge" #mandatory - # The type of the dependency. Can be one of "required", "optional", "incompatible" or "discouraged" (case insensitive). - # 'required' requires the mod to exist, 'optional' does not - # 'incompatible' will prevent the game from loading when the mod exists, and 'discouraged' will show a warning - type="required" #mandatory - # Optional field describing why the dependency is required or why it is incompatible - # reason="..." - # The version range of the dependency - versionRange="[21.1.1,)" #mandatory - # An ordering relationship for the dependency. - # BEFORE - This mod is loaded BEFORE the dependency - # AFTER - This mod is loaded AFTER the dependency - ordering="NONE" - # Side this dependency is applied on - BOTH, CLIENT, or SERVER - side="BOTH" - -# Here's another dependency -[[dependencies.${mod_id}]] - modId="minecraft" - type="required" - # This version range declares a minimum of the current minecraft version up to but not including the next major version - versionRange="${minecraft_version_range}" - ordering="NONE" - side="BOTH" - -# AE2 is required by the alloy-furnace crafting provider and omniversal patterns. -[[dependencies.${mod_id}]] - modId="ae2" - type="required" - versionRange="[19.2.17,20)" - ordering="AFTER" - side="BOTH" - -[[dependencies.${mod_id}]] - modId="neoecoae" - type="optional" - versionRange="[21.2.0,)" - ordering="NONE" - side="BOTH" - -[[dependencies.${mod_id}]] - modId="jdte" - type="optional" - versionRange="[0.6.0,)" - ordering="AFTER" - side="BOTH" - -# 兼容层引用 1.4.0 起提供的模糊配方类型(FlexPotRecipe / FlexStockpotRecipe)。 -[[dependencies.${mod_id}]] - modId="kaleidoscope_cookery" - type="optional" - versionRange="[1.4.0,)" - ordering="AFTER" - side="BOTH" - -# Ex Deorum 兼容层引用 3.12 起提供的实例缓存 API(RecipeUtil.getCaches 返回 RecipeCaches)。 -# 3.12 之前为静态查询形态(RecipeUtil.getHammerRecipe 等),与本模组的调用方式不兼容, -[[dependencies.${mod_id}]] - modId="exdeorum" - type="optional" - versionRange="[3.12,)" - ordering="AFTER" - side="BOTH" - -[[dependencies.${mod_id}]] - modId="botanypots" - type="optional" - versionRange="[21.1.34,)" - ordering="AFTER" - side="BOTH" - -# 无线物流的「应力」介质:转速与应力容量都靠动力学方块实体之间的传播机制承载。 -# 缺了它,该介质会从下拉列表里消失、服务端也会拒绝写入。 -[[dependencies.${mod_id}]] - modId="create" - type="optional" - versionRange="[6.0.0,6.1.0)" - ordering="AFTER" - side="BOTH" - -# 无线物流的「气压」介质:方块侧走气动工艺的空气处理器(IAirHandlerMachine)。 -# 缺了它,PRESSURE 会从下拉列表里消失、服务端也会拒绝写入。 -[[dependencies.${mod_id}]] - modId="pneumaticcraft" - type="optional" - versionRange="[8.2.0,)" - ordering="AFTER" - side="BOTH" - -# 无线物流的「AE 气压」介质:空气要进 ME 网络得靠 Applied Pneumatics 的 AirKey。 -# 缺了它,AE_PRESSURE 会从下拉列表里消失、服务端也会拒绝写入。 -[[dependencies.${mod_id}]] - modId="appliedpneumatics" - type="optional" - versionRange="[1.0.0,)" - ordering="AFTER" - side="BOTH" - -# 星辉魔法的祭坛适配器按 2.0.1.26 起的附加输入类型(NeoForge 的 SizedIngredient)编译。 -# 更早版本中附加输入的元素是 AS 内部的 CountIngredient,本模组以 SizedIngredient 访问时会在运行期 -# 抛出 ClassCastException,因此下限锁定在 2.0.1.26。 -[[dependencies.${mod_id}]] - modId="astralsorcery" - type="optional" - versionRange="[2.0.1.26,)" - ordering="AFTER" - side="BOTH" - -# 数据能源集成是软加载:入口走它自己的 @DataEnergisticsEntrypoint 扫描, -# 没装数据能源时 integration.dataenergistics 整包不会被触达,本模组照常运行,因此声明为 optional。 -# -# 下限锁定 3.3.4:本模组按数据能源 3.3.4 的 API 编译(ProcessingMatchMode、 -# BigIntegerCraftingAdmission.count() 抽象化、FastUtil ObjectList 参数),旧版缺这些符号。 -[[dependencies.${mod_id}]] - modId="data_energistics" - type="optional" - versionRange="[3.3.4,)" - ordering="AFTER" - side="BOTH" - -# Features are specific properties of the game environment, that you may want to declare you require. This example declares -# that your mod requires GL version 3.2 or higher. Other features will be added. They are side aware so declaring this won't -# stop your mod loading on the server for example. -#[features.${mod_id}] -#openGLVersion="[3.2,)" diff --git a/src/portBridgeTest/java/com/sorrowmist/useless/compat/forge1201/DependencyMetadataTest.java b/src/portBridgeTest/java/com/sorrowmist/useless/compat/forge1201/DependencyMetadataTest.java index 335d11a9..bc45c37a 100644 --- a/src/portBridgeTest/java/com/sorrowmist/useless/compat/forge1201/DependencyMetadataTest.java +++ b/src/portBridgeTest/java/com/sorrowmist/useless/compat/forge1201/DependencyMetadataTest.java @@ -71,12 +71,14 @@ private static Map requirements() throws Exception { @Test void obsoleteApisAreRejectedButTheUpdatedPackVersionsRemainAllowed() throws Exception { var requirements = requirements(); for (var entry : Map.of("ae2", "15.4.10", "expatternprovider", "1.20-1.4.12-forge", - "jei", "15.48.0.177", "extendedcrafting", "6.1.5u", "mekanism", "10.4.15").entrySet()) { + "jei", "15.48.0.177", "extendedcrafting", "6.1.5u", "mekanism", "10.4.15", + "botanypots", "13.0.0", "mekanism_extras", "1.5.0").entrySet()) { var range = VersionRange.createFromVersionSpec(requirements.get(entry.getKey()).get("versionRange")); assertTrue(range.containsVersion(new DefaultArtifactVersion(entry.getValue())), entry.toString()); } for (var entry : Map.of("ae2", "14.0.0", "create", "0.5.1", "mekanism", "10.3.0", - "jei", "15.0.0", "exdeorum", "1.0").entrySet()) { + "jei", "15.0.0", "exdeorum", "1.0", + "botanypots", "12.0.0", "mekanism_extras", "1.4.1").entrySet()) { var range = VersionRange.createFromVersionSpec(requirements.get(entry.getKey()).get("versionRange")); assertFalse(range.containsVersion(new DefaultArtifactVersion(entry.getValue())), entry.toString()); } diff --git a/src/portBridgeTest/java/com/sorrowmist/useless/compat/forge1201/OptionalIntegrationTest.java b/src/portBridgeTest/java/com/sorrowmist/useless/compat/forge1201/OptionalIntegrationTest.java new file mode 100644 index 00000000..e2c6b694 --- /dev/null +++ b/src/portBridgeTest/java/com/sorrowmist/useless/compat/forge1201/OptionalIntegrationTest.java @@ -0,0 +1,18 @@ +package com.sorrowmist.useless.compat.forge1201; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +class OptionalIntegrationTest { + @Test + void missingOptionalClassFallsBackInsteadOfCrashing() { + assertEquals("fallback", OptionalIntegration.call( + "minecraft", + "com.sorrowmist.useless.integration.DoesNotExist", + "run", + String.class, + "fallback", + new Class[0])); + } +}