diff --git a/CHANGELOG.md b/CHANGELOG.md index 9b48338a..5663ac0b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,8 @@ ## Alpha warning! -- **1.19.3 & 1.18.2 will no longer receive alpha updates!** +- **1.19.3 is no longer supported!** +- **1.18.2 will no longer receive alpha updates!** *** -- 2.51.2 From 0a4a2d8f31f6f7b63df333e0c2c56763fc2fef29 Mon Sep 17 00:00:00 2001 From: melontini <104443436+melontini@users.noreply.github.com> Date: Fri, 5 Jan 2024 17:54:54 +0700 Subject: [PATCH 02/15] Update DM --- build.gradle | 2 +- gradle.properties | 2 +- .../melontini/andromeda/base/Bootstrap.java | 4 + .../melontini/andromeda/common/Andromeda.java | 5 -- .../common/client/AndromedaClient.java | 3 - .../misc/translations/TranslationUpdater.java | 4 +- .../andromeda/util/CrashHandler.java | 75 ++++++++----------- .../util/exceptions/AndromedaException.java | 11 +-- .../andromeda/util/mixin/ErrorHandler.java | 11 --- 9 files changed, 41 insertions(+), 76 deletions(-) diff --git a/build.gradle b/build.gradle index b309bcca..90345b49 100644 --- a/build.gradle +++ b/build.gradle @@ -31,7 +31,7 @@ dependencies { // Fabric API. This is technically optional, but you probably want it anyway. modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}" - def dmModules = ["base", "minecraft", "analytics", "analytics-crashes", "analytics-mixpanel", "content", "mirage", "glitter"] + def dmModules = ["base", "minecraft", "content", "crash-handler", "mirage", "glitter"] for (final def module in dmModules) { modApi include("me.melontini.dark-matter:dark-matter-${module}:${project.dark_matter}") } diff --git a/gradle.properties b/gradle.properties index 0c55e37d..ffd75779 100644 --- a/gradle.properties +++ b/gradle.properties @@ -17,5 +17,5 @@ modmenu_version=4.2.0-beta.2 fabric_version=0.76.0+1.19.2 cloth_version=8.3.103 fabric_asm_version=2.3 -dark_matter=2.2.0-1.19.2 +dark_matter=0dd04d98ed mixin_extras_version=0.3.1 \ No newline at end of file diff --git a/src/main/java/me/melontini/andromeda/base/Bootstrap.java b/src/main/java/me/melontini/andromeda/base/Bootstrap.java index 291008b2..578dd6a0 100644 --- a/src/main/java/me/melontini/andromeda/base/Bootstrap.java +++ b/src/main/java/me/melontini/andromeda/base/Bootstrap.java @@ -8,11 +8,13 @@ import me.melontini.andromeda.common.Andromeda; import me.melontini.andromeda.common.client.AndromedaClient; import me.melontini.andromeda.util.ClassPath; import me.melontini.andromeda.util.CommonValues; +import me.melontini.andromeda.util.CrashHandler; import me.melontini.andromeda.util.Debug; import me.melontini.andromeda.util.exceptions.AndromedaException; import me.melontini.andromeda.util.mixin.AndromedaMixins; import me.melontini.dark_matter.api.base.util.EntrypointRunner; import me.melontini.dark_matter.api.base.util.classes.ThrowingRunnable; +import me.melontini.dark_matter.api.crash_handler.Crashlytics; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.loader.api.FabricLoader; @@ -99,6 +101,8 @@ public class Bootstrap { public static void onPreLaunch() { LOGGER.info("Andromeda({}) on {}({})", CommonValues.version(), CommonValues.platform(), CommonValues.platform().version()); + Crashlytics.addHandler("andromeda", CrashHandler::handleCrash); + AtomicReference oldCfg = new AtomicReference<>(); var oldCfgPath = FabricLoader.getInstance().getConfigDir().resolve("andromeda.json"); if (Files.exists(oldCfgPath)) { diff --git a/src/main/java/me/melontini/andromeda/common/Andromeda.java b/src/main/java/me/melontini/andromeda/common/Andromeda.java index 2e972c0b..42f0a046 100644 --- a/src/main/java/me/melontini/andromeda/common/Andromeda.java +++ b/src/main/java/me/melontini/andromeda/common/Andromeda.java @@ -8,9 +8,7 @@ import me.melontini.andromeda.common.config.DataConfigs; import me.melontini.andromeda.common.registries.Common; import me.melontini.andromeda.common.util.AndromedaPackets; import me.melontini.andromeda.util.CommonValues; -import me.melontini.andromeda.util.CrashHandler; import me.melontini.andromeda.util.Debug; -import me.melontini.dark_matter.api.analytics.crashes.Crashlytics; import me.melontini.dark_matter.api.base.util.Support; import me.melontini.dark_matter.api.minecraft.util.TextUtil; import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents; @@ -38,9 +36,6 @@ public class Andromeda { } private void onInitialize() { - Crashlytics.addHandler("andromeda", CrashHandler.get(), (report, cause, latestLog, envType) -> CrashHandler.handleCrash(false, cause, report.getMessage())); - CrashHandler.tickMain(); - Common.bootstrap(); ResourceManagerHelper.get(ResourceType.SERVER_DATA).registerReloadListener(new DataConfigs()); diff --git a/src/main/java/me/melontini/andromeda/common/client/AndromedaClient.java b/src/main/java/me/melontini/andromeda/common/client/AndromedaClient.java index fc06544b..81773c29 100644 --- a/src/main/java/me/melontini/andromeda/common/client/AndromedaClient.java +++ b/src/main/java/me/melontini/andromeda/common/client/AndromedaClient.java @@ -10,7 +10,6 @@ import me.melontini.andromeda.common.client.config.FeatureBlockade; import me.melontini.andromeda.common.registries.AndromedaItemGroup; import me.melontini.andromeda.util.AndromedaLog; import me.melontini.andromeda.util.CommonValues; -import me.melontini.andromeda.util.CrashHandler; import me.melontini.andromeda.util.Debug; import me.melontini.dark_matter.api.base.util.Support; import me.melontini.dark_matter.api.minecraft.util.TextUtil; @@ -80,8 +79,6 @@ public class AndromedaClient { animate = false; } })); - - Support.runWeak(EnvType.CLIENT, () -> CrashHandler::nukeProfile); } private static void printMissingTooltips() { diff --git a/src/main/java/me/melontini/andromeda/modules/misc/translations/TranslationUpdater.java b/src/main/java/me/melontini/andromeda/modules/misc/translations/TranslationUpdater.java index 19f0008f..7a93b569 100644 --- a/src/main/java/me/melontini/andromeda/modules/misc/translations/TranslationUpdater.java +++ b/src/main/java/me/melontini/andromeda/modules/misc/translations/TranslationUpdater.java @@ -5,7 +5,6 @@ import me.melontini.andromeda.util.AndromedaLog; import me.melontini.andromeda.util.CommonValues; import me.melontini.andromeda.util.GitTracker; import me.melontini.andromeda.util.exceptions.AndromedaException; -import me.melontini.dark_matter.api.analytics.MessageHandler; import net.fabricmc.loader.api.FabricLoader; import java.io.IOException; @@ -19,6 +18,7 @@ import java.nio.file.attribute.FileTime; import java.time.Instant; import java.time.temporal.ChronoUnit; import java.util.Set; +import java.util.concurrent.ForkJoinPool; public class TranslationUpdater { @@ -45,7 +45,7 @@ public class TranslationUpdater { Set languages = Sets.newHashSet("en_us"); String s = TranslationUpdater.getSelectedLanguage(); if (!s.isEmpty()) languages.add(s); - MessageHandler.EXECUTOR.submit(() -> TranslationUpdater.downloadTranslations(languages)); + ForkJoinPool.commonPool().submit(() -> TranslationUpdater.downloadTranslations(languages)); } else { AndromedaLog.info("Skipped translations update."); } diff --git a/src/main/java/me/melontini/andromeda/util/CrashHandler.java b/src/main/java/me/melontini/andromeda/util/CrashHandler.java index 1a5a0063..f3530196 100644 --- a/src/main/java/me/melontini/andromeda/util/CrashHandler.java +++ b/src/main/java/me/melontini/andromeda/util/CrashHandler.java @@ -6,12 +6,14 @@ import com.google.gson.JsonObject; import me.melontini.andromeda.base.Bootstrap; import me.melontini.andromeda.base.config.Config; import me.melontini.andromeda.util.exceptions.AndromedaException; -import me.melontini.dark_matter.api.analytics.Analytics; -import me.melontini.dark_matter.api.analytics.Prop; -import me.melontini.dark_matter.api.analytics.mixpanel.MixpanelAnalytics; -import me.melontini.dark_matter.api.analytics.mixpanel.MixpanelHandler; -import me.melontini.dark_matter.api.base.util.Utilities; +import me.melontini.dark_matter.api.base.util.classes.Context; +import me.melontini.dark_matter.api.crash_handler.Crashlytics; +import me.melontini.dark_matter.api.crash_handler.Prop; +import me.melontini.dark_matter.api.crash_handler.uploading.Mixpanel; import net.fabricmc.loader.api.FabricLoader; +import net.fabricmc.loader.impl.util.StringUtil; +import net.minecraft.util.crash.CrashReport; +import org.spongepowered.asm.mixin.extensibility.IMixinInfo; import java.io.IOException; import java.io.PrintWriter; @@ -21,34 +23,7 @@ import java.util.Set; public class CrashHandler { - public static final String CRASH_UUID = "be4db047-16df-4e41-9121-f1e87618ddea"; - private static final Analytics ANALYTICS = Analytics.get(CommonValues.mod()); - private static final MixpanelHandler HANDLER = Utilities.supply(() -> MixpanelAnalytics.init(ANALYTICS, new String(Base64.getDecoder().decode("NGQ3YWVhZGRjN2M5M2JkNzhiODRmNDViZWI3Y2NlOTE=")), true)); - private static volatile boolean mainHooked = false; - - @SuppressWarnings("deprecation") - public static void nukeProfile() { - if (!FabricLoader.getInstance().isDevelopmentEnvironment()) { - if (CommonValues.updated() && !ANALYTICS.getDefaultUUID().equals(ANALYTICS.getUUID())) { - Analytics.oldUUID().ifPresent(uuid -> HANDLER.send((mixpanel, analytics) -> mixpanel.delete(uuid.toString()))); - HANDLER.send((mixpanel, analytics) -> mixpanel.delete(analytics.getUUIDString())); - } - } - } - - public static void tickMain() { - mainHooked = true; - } - - public static void offer(AndromedaException e) { - if (e.shouldReport() && !mainHooked) { - handleCrash(false, e, e.getMessage()); - } - } - - public static Analytics get() { - return ANALYTICS; - } + private static final Mixpanel MIXPANEL = Mixpanel.get(new String(Base64.getDecoder().decode("NGQ3YWVhZGRjN2M5M2JkNzhiODRmNDViZWI3Y2NlOTE=")), true); private static boolean findAndromedaInTrace(Throwable cause) { if (cause instanceof AndromedaException e && e.shouldReport()) return true; @@ -56,8 +31,8 @@ public class CrashHandler { for (StackTraceElement element : cause.getStackTrace()) { if (element.isNativeMethod()) continue; String cls = element.getClassName(); - if (cls.contains("me.melontini.andromeda.")) return true; - if (cls.contains("net.minecraft.")) { + if (cls.startsWith("me.melontini.andromeda.")) return true; + if (cls.startsWith("net.minecraft.")) { String mthd = element.getMethodName(); return (mthd.contains("$andromeda$") || mthd.contains(".andromeda$")); } @@ -65,21 +40,24 @@ public class CrashHandler { return cause.getCause() != null && findAndromedaInTrace(cause.getCause()); } - public static void handleCrash(boolean force, Throwable cause, String message) { + public static void handleCrash(Throwable cause, Context context) { if (FabricLoader.getInstance().isDevelopmentEnvironment() || !Config.get().sendCrashReports) return; - if (!force && !findAndromedaInTrace(cause)) return; - - HANDLER.send((mixpanel, analytics) -> { + if (context.get(IMixinInfo.class, Crashlytics.Keys.MIXIN_INFO).map(info -> info.getClassName().startsWith("me.melontini.andromeda")).orElse(false) || findAndromedaInTrace(cause)) { AndromedaLog.warn("Found Andromeda in trace, collecting and uploading crash report..."); JsonObject object = new JsonObject(); + String message = "Something terrible happened!"; + if (context.get(Object.class, Crashlytics.Keys.CRASH_REPORT).isPresent()) { + message = getFromCrashReport(context); + } + //fill trace. JsonArray stackTrace = new JsonArray(); - for (String string : getCauseAsString(cause, message).lines().toList()) stackTrace.add(string); + for (String string : getCauseAsString(cause, message).lines().flatMap(s -> StringUtil.wrapLines(s, 190).lines()).toList()) + stackTrace.add(string); object.add("stackTrace", stackTrace); - MixpanelAnalytics.attachProps(object, Prop.ENVIRONMENT, Prop.OS, Prop.JAVA_VERSION); - object.addProperty("java_vendor", System.getProperty("java.vendor")); + MIXPANEL.attachProps(object, Prop.ENVIRONMENT, Prop.OS, Prop.JAVA_VERSION, Prop.JAVA_VENDOR); object.addProperty("platform", CommonValues.platform().toString().toLowerCase()); object.addProperty("bootstrap_status", Bootstrap.getStatus().toString()); @@ -92,8 +70,17 @@ public class CrashHandler { object.add("mods", mods); - mixpanel.trackEvent(CRASH_UUID, "Crash", object); - }); + MIXPANEL.upload(new Mixpanel.Context("Crash", object)).handle((unused, throwable) -> { + if (throwable != null) + AndromedaLog.error("Failed to upload crash report! {}: {}", throwable.getClass().getSimpleName(), throwable.getMessage()); + return null; + }); + } + } + + private static String getFromCrashReport(Context context) { + return context.get(Object.class, Crashlytics.Keys.CRASH_REPORT) + .map(CrashReport.class::cast).map(CrashReport::getMessage).orElse("null"); } private static String getCauseAsString(Throwable cause, String message) { diff --git a/src/main/java/me/melontini/andromeda/util/exceptions/AndromedaException.java b/src/main/java/me/melontini/andromeda/util/exceptions/AndromedaException.java index 4559d2dc..05a3591b 100644 --- a/src/main/java/me/melontini/andromeda/util/exceptions/AndromedaException.java +++ b/src/main/java/me/melontini/andromeda/util/exceptions/AndromedaException.java @@ -2,9 +2,8 @@ package me.melontini.andromeda.util.exceptions; import com.google.common.base.Strings; import me.melontini.andromeda.base.Bootstrap; -import me.melontini.andromeda.util.CrashHandler; -import me.melontini.dark_matter.api.analytics.Prop; import me.melontini.dark_matter.api.base.util.classes.ThrowingRunnable; +import me.melontini.dark_matter.api.crash_handler.Prop; import java.util.Collections; import java.util.LinkedHashMap; @@ -117,17 +116,11 @@ public class AndromedaException extends RuntimeException { } public AndromedaException build() { - return build(true); - } - - public AndromedaException build(boolean submit) { disableInHierarchy(cause); - var e = new AndromedaException(report, + return new AndromedaException(report, Strings.isNullOrEmpty(message) ? "Something went very wrong!" : message, cause, statuses); - if (submit) CrashHandler.offer(e); - return e; } } } diff --git a/src/main/java/me/melontini/andromeda/util/mixin/ErrorHandler.java b/src/main/java/me/melontini/andromeda/util/mixin/ErrorHandler.java index 5fce1806..98b35314 100644 --- a/src/main/java/me/melontini/andromeda/util/mixin/ErrorHandler.java +++ b/src/main/java/me/melontini/andromeda/util/mixin/ErrorHandler.java @@ -3,9 +3,7 @@ package me.melontini.andromeda.util.mixin; import lombok.CustomLog; import me.melontini.andromeda.base.ModuleManager; import me.melontini.andromeda.util.AndromedaLog; -import me.melontini.andromeda.util.CrashHandler; import me.melontini.andromeda.util.Debug; -import me.melontini.andromeda.util.exceptions.AndromedaException; import org.spongepowered.asm.mixin.extensibility.IMixinConfig; import org.spongepowered.asm.mixin.extensibility.IMixinErrorHandler; import org.spongepowered.asm.mixin.extensibility.IMixinInfo; @@ -27,15 +25,6 @@ public class ErrorHandler implements IMixinErrorHandler { if (Debug.hasKey(Debug.Keys.SKIP_MIXIN_ERROR_HANDLER)) return action; if (action == ErrorAction.ERROR) { - if (mixin.getClassName().startsWith("me.melontini.andromeda")) { - CrashHandler.offer(new AndromedaException.Builder() - .cause(th).message("Failed to " + phase + " " + mixin.getClassName()) - .add("phase", phase) - .add("mixin", mixin.getClassName()) - .add("mixin_config", mixin.getConfig().getName()) - .build(false)); - } - ModuleManager.get().moduleFromConfig(mixin.getConfig().getName()).ifPresent(module -> { module.config().enabled = false; module.save(); -- 2.51.2 From 9e2905c49ebda00992253bf3c1e41bc336a9f1ef Mon Sep 17 00:00:00 2001 From: melontini <104443436+melontini@users.noreply.github.com> Date: Fri, 5 Jan 2024 20:56:51 +0700 Subject: [PATCH 03/15] Merge some things. Move conflict resolution to Bootstrap. --- .../Config.java => AndromedaConfig.java} | 23 ++++++--- .../melontini/andromeda/base/Bootstrap.java | 37 +++++++++++--- .../me/melontini/andromeda/base/Module.java | 23 ++++++++- .../andromeda/base/ModuleManager.java | 51 ++++++------------- .../base/config/AndromedaConfig.java | 11 ---- .../andromeda/base/config/BasicConfig.java | 22 -------- .../melontini/andromeda/common/Andromeda.java | 10 ++-- .../common/client/AndromedaClient.java | 4 +- .../client/config/AutoConfigScreen.java | 11 ++-- .../andromeda/common/config/DataConfigs.java | 13 +++-- .../common/config/ScopedConfigs.java | 25 +++++---- .../modules/blocks/bed/power/Power.java | 3 +- .../modules/blocks/bed/safe/Safe.java | 3 +- .../modules/blocks/bed/unsafe/Unsafe.java | 5 +- .../BetterFletchingTable.java | 3 +- .../cactus_bottle_filling/CactusFiller.java | 3 +- .../campfire_effects/CampfireEffects.java | 3 +- .../falling_propagule/FallingPropagule.java | 3 +- .../blocks/guarded_loot/GuardedLoot.java | 3 +- .../modules/blocks/incubator/Incubator.java | 3 +- .../blocks/leaf_slowdown/LeafSlowdown.java | 3 +- .../advancement_shadow/AdvancementShadow.java | 3 +- .../AlignedRecipeAlternatives.java | 3 +- .../BeeFlowerDuplication.java | 3 +- .../BetterFurnaceMinecart.java | 3 +- .../modules/entities/boats/Boats.java | 3 +- .../modules/entities/minecarts/Minecarts.java | 3 +- .../modules/entities/slimes/Slimes.java | 3 +- .../entities/snowball_tweaks/Snowballs.java | 3 +- .../VillagersFollowEmeralds.java | 3 +- .../entities/zombie/all_pick_up/Pickup.java | 3 +- .../entities/zombie/clean_pickup/Pickup.java | 3 +- .../gui/gui_particles/GuiParticles.java | 3 +- .../ItemFrameTooltips.java | 5 +- .../gui/name_tooltips/NameTooltips.java | 5 +- .../no_more_adventure/NoMoreAdventure.java | 3 +- .../balanced_mending/BalancedMending.java | 3 +- .../items/better_names/BetterNames.java | 3 +- .../items/infinite_totem/InfiniteTotem.java | 3 +- .../modules/items/lockpick/Lockpick.java | 3 +- .../modules/items/magnet/Magnet.java | 3 +- .../MinecartBlockPicking.java | 3 +- .../modules/items/tooltips/Tooltips.java | 3 +- .../mechanics/dragon_fight/DragonFight.java | 3 +- .../throwable_items/ThrowableItems.java | 3 +- .../mechanics/trading_goat_horn/GoatHorn.java | 3 +- .../villager_gifting/VillagerGifting.java | 3 +- .../misc/damage_backport/DamageBackport.java | 3 +- .../MinorInconvenience.java | 3 +- .../AdvancementGeneration.java | 3 +- .../misc/translations/Translations.java | 3 +- .../modules/misc/unknown/Unknown.java | 3 +- .../world/auto_planting/AutoPlanting.java | 3 +- .../crop_temperature/PlantTemperature.java | 3 +- .../falling_beenests/CanBeeNestsFall.java | 3 +- .../world/moist_control/MoistControl.java | 3 +- .../modules/world/quick_fire/QuickFire.java | 3 +- .../andromeda/util/CrashHandler.java | 4 +- .../me/melontini/andromeda/util/Debug.java | 4 +- 59 files changed, 165 insertions(+), 217 deletions(-) rename src/main/java/me/melontini/andromeda/base/{config/Config.java => AndromedaConfig.java} (55%) delete mode 100644 src/main/java/me/melontini/andromeda/base/config/AndromedaConfig.java delete mode 100644 src/main/java/me/melontini/andromeda/base/config/BasicConfig.java diff --git a/src/main/java/me/melontini/andromeda/base/config/Config.java b/src/main/java/me/melontini/andromeda/base/AndromedaConfig.java similarity index 55% rename from src/main/java/me/melontini/andromeda/base/config/Config.java rename to src/main/java/me/melontini/andromeda/base/AndromedaConfig.java index fd27f723..d839e3e1 100644 --- a/src/main/java/me/melontini/andromeda/base/config/Config.java +++ b/src/main/java/me/melontini/andromeda/base/AndromedaConfig.java @@ -1,16 +1,17 @@ -package me.melontini.andromeda.base.config; +package me.melontini.andromeda.base; import lombok.CustomLog; import me.melontini.dark_matter.api.base.config.ConfigManager; +import me.shedaniel.autoconfig.annotation.ConfigEntry; import net.fabricmc.loader.api.FabricLoader; @CustomLog -public class Config { +public class AndromedaConfig { - private static final ConfigManager MANAGER = ConfigManager.of(AndromedaConfig.class, "andromeda/mod", AndromedaConfig::new) + private static final ConfigManager MANAGER = ConfigManager.of(Config.class, "andromeda/mod", Config::new) .exceptionHandler((e, stage) -> LOGGER.error("Failed to %s main Andromeda config (mod.json)!".formatted(stage.toString().toLowerCase()), e)); - private static AndromedaConfig CONFIG; - private static AndromedaConfig DEFAULT; + private static Config CONFIG; + private static Config DEFAULT; public static void load() { CONFIG = MANAGER.load(FabricLoader.getInstance().getConfigDir()); @@ -18,15 +19,23 @@ public class Config { MANAGER.save(FabricLoader.getInstance().getConfigDir(), CONFIG); } - public static AndromedaConfig get() { + public static Config get() { return CONFIG; } - public static AndromedaConfig getDefault() { + public static Config getDefault() { return DEFAULT; } public static void save() { MANAGER.save(FabricLoader.getInstance().getConfigDir(), CONFIG); } + + public static class Config { + + @ConfigEntry.Gui.RequiresRestart + public boolean sideOnlyMode = false; + + public boolean sendCrashReports = true; + } } diff --git a/src/main/java/me/melontini/andromeda/base/Bootstrap.java b/src/main/java/me/melontini/andromeda/base/Bootstrap.java index 578dd6a0..d67c4eb5 100644 --- a/src/main/java/me/melontini/andromeda/base/Bootstrap.java +++ b/src/main/java/me/melontini/andromeda/base/Bootstrap.java @@ -3,7 +3,6 @@ package me.melontini.andromeda.base; import com.google.gson.JsonObject; import com.google.gson.JsonParser; import lombok.CustomLog; -import me.melontini.andromeda.base.config.Config; import me.melontini.andromeda.common.Andromeda; import me.melontini.andromeda.common.client.AndromedaClient; import me.melontini.andromeda.util.ClassPath; @@ -26,10 +25,7 @@ import org.spongepowered.asm.mixin.Mixins; import java.io.IOException; import java.nio.file.Files; -import java.util.ArrayList; -import java.util.List; -import java.util.Optional; -import java.util.ServiceLoader; +import java.util.*; import java.util.concurrent.ExecutorService; import java.util.concurrent.ForkJoinPool; import java.util.concurrent.atomic.AtomicReference; @@ -117,9 +113,10 @@ public class Bootstrap { } } - Config.load(); + AndromedaConfig.load(); updateStatus(Status.DISCOVERY); + List> list = new ArrayList<>(40); AndromedaException.run(() -> { //This should probably be removed. @@ -133,9 +130,18 @@ public class Bootstrap { list.removeIf(m -> (m.meta().environment() == me.melontini.andromeda.base.Environment.CLIENT && CommonValues.environment() == EnvType.SERVER)); + resolveConflicts(list); + + List> sorted = list.stream().sorted(Comparator.comparingInt(m -> { + int i = ModuleManager.CATEGORIES.indexOf(m.meta().category()); + return i >= 0 ? i : ModuleManager.CATEGORIES.size(); + })).toList(); + + updateStatus(Status.SETUP); + ModuleManager m; try { - m = new ModuleManager(list, oldCfg.get()); + m = new ModuleManager(sorted, oldCfg.get()); } catch (Throwable t) {//Manager constructor does a lot of heavy-lifting, so we want to catch any errors. throw new AndromedaException.Builder() .cause(t).message("Failed to initialize ModuleManager!!!") @@ -155,6 +161,22 @@ public class Bootstrap { } } + private static void resolveConflicts(Collection> list) { + Map> packages = new HashMap<>(); + Map> ids = new HashMap<>(); + for (Module module : list) { + ModuleManager.validateModule(module); + + var id = ids.put(module.meta().id(), module); + if (id != null) + throw new IllegalStateException("Duplicate module IDs! ID: %s, Duplicate: %s, Module: %s".formatted(module.meta().id(), module.getClass(), id.getClass())); + + var pkg = packages.put(module.getClass().getPackageName(), module); + if (pkg != null) + throw new IllegalStateException("Duplicate module packages! Package: %s, Duplicate: %s, Module: %s".formatted(module.getClass().getPackageName(), module.getClass(), pkg.getClass())); + } + } + static void wrapIO(ThrowingRunnable runnable, String msg) { try { runnable.run(); @@ -200,6 +222,7 @@ public class Bootstrap { public enum Status { PRE_INIT, DISCOVERY, + SETUP, PRE_LAUNCH, MAIN, CLIENT, diff --git a/src/main/java/me/melontini/andromeda/base/Module.java b/src/main/java/me/melontini/andromeda/base/Module.java index fcf17a7e..ebeb3473 100644 --- a/src/main/java/me/melontini/andromeda/base/Module.java +++ b/src/main/java/me/melontini/andromeda/base/Module.java @@ -2,12 +2,14 @@ package me.melontini.andromeda.base; import com.google.gson.JsonObject; import lombok.CustomLog; +import lombok.Getter; +import lombok.Setter; import me.melontini.andromeda.base.annotations.ModuleInfo; import me.melontini.andromeda.base.annotations.OldConfigKey; -import me.melontini.andromeda.base.config.BasicConfig; import me.melontini.andromeda.common.registries.Common; import me.melontini.andromeda.util.JsonOps; import me.melontini.dark_matter.api.base.config.ConfigManager; +import me.shedaniel.autoconfig.annotation.ConfigEntry; import net.fabricmc.loader.api.FabricLoader; import org.jetbrains.annotations.ApiStatus; @@ -20,7 +22,7 @@ import org.jetbrains.annotations.ApiStatus; * @param the config type for this module. */ @CustomLog -public abstract class Module { +public abstract class Module { private final Metadata info; @@ -124,4 +126,21 @@ public abstract class Module { return id().replace('/', '.'); } } + + @Getter + @Setter + public static class BaseConfig { + + @ConfigEntry.Gui.RequiresRestart + public boolean enabled = false; + + @ConfigEntry.Gui.Excluded + public Scope scope = Scope.GLOBAL; + + public enum Scope { + GLOBAL, + WORLD, + DIMENSION + } + } } diff --git a/src/main/java/me/melontini/andromeda/base/ModuleManager.java b/src/main/java/me/melontini/andromeda/base/ModuleManager.java index 1500831a..95caa1e3 100644 --- a/src/main/java/me/melontini/andromeda/base/ModuleManager.java +++ b/src/main/java/me/melontini/andromeda/base/ModuleManager.java @@ -4,8 +4,6 @@ import com.google.gson.JsonObject; import it.unimi.dsi.fastutil.objects.*; import lombok.CustomLog; import me.melontini.andromeda.base.annotations.Unscoped; -import me.melontini.andromeda.base.config.BasicConfig; -import me.melontini.andromeda.base.config.Config; import me.melontini.andromeda.util.Debug; import me.melontini.dark_matter.api.base.config.ConfigManager; import me.melontini.dark_matter.api.base.util.MakeSure; @@ -35,7 +33,7 @@ import java.util.stream.Collectors; @CustomLog public class ModuleManager { - private static final List categories = List.of("world", "blocks", "entities", "items", "bugfixes", "mechanics", "gui", "misc"); + public static final List CATEGORIES = List.of("world", "blocks", "entities", "items", "bugfixes", "mechanics", "gui", "misc"); private final Reference2ReferenceMap, Module> discoveredModules; private final Object2ReferenceMap> discoveredModuleNames; @@ -45,30 +43,11 @@ public class ModuleManager { final Map> mixinConfigs = new Object2ReferenceOpenHashMap<>(); - ModuleManager(List> discovered, @Nullable JsonObject oldCfg) { + ModuleManager(List> sorted, @Nullable JsonObject oldCfg) { if (Bootstrap.INSTANCE != null) throw new IllegalStateException("ModuleManager already initialized!"); Bootstrap.INSTANCE = this; - Map> packages = new HashMap<>(); - Map> ids = new HashMap<>(); - for (Module module : discovered) { - validateModule(module); - - var id = ids.put(module.meta().id(), module); - if (id != null) - throw new IllegalStateException("Duplicate module IDs! ID: %s, Duplicate: %s, Module: %s".formatted(module.meta().id(), module.getClass(), id.getClass())); - - var pkg = packages.put(module.getClass().getPackageName(), module); - if (pkg != null) - throw new IllegalStateException("Duplicate module packages! Package: %s, Duplicate: %s, Module: %s".formatted(module.getClass().getPackageName(), module.getClass(), pkg.getClass())); - } - - List> sorted = discovered.stream().sorted(Comparator.comparingInt(m -> { - int i = categories.indexOf(m.meta().category()); - return i >= 0 ? i : categories.size(); - })).toList(); - this.discoveredModules = Utilities.supply(() -> { var m = sorted.stream().collect(Collectors.toMap(Object::getClass, Function.identity(), (t, t2) -> t, Reference2ReferenceLinkedOpenHashMap::new)); return Reference2ReferenceMaps.unmodifiable(m); @@ -116,28 +95,28 @@ public class ModuleManager { private void fixScopes(Collection> modules) { modules.forEach(m -> { - if (m.meta().environment() == Environment.CLIENT && m.config().scope != BasicConfig.Scope.GLOBAL) { + if (m.meta().environment() == Environment.CLIENT && m.config().scope != Module.BaseConfig.Scope.GLOBAL) { LOGGER.error("{} Module '{}' has an invalid scope ({}), must be {}", - m.meta().environment(), m.meta().id(), m.config().scope, BasicConfig.Scope.GLOBAL); - m.config().scope = BasicConfig.Scope.GLOBAL; + m.meta().environment(), m.meta().id(), m.config().scope, Module.BaseConfig.Scope.GLOBAL); + m.config().scope = Module.BaseConfig.Scope.GLOBAL; } - if (m.getClass().isAnnotationPresent(Unscoped.class) && m.config().scope != BasicConfig.Scope.GLOBAL) { + if (m.getClass().isAnnotationPresent(Unscoped.class) && m.config().scope != Module.BaseConfig.Scope.GLOBAL) { LOGGER.error("{} Module '{}' has an invalid scope ({}), must be {}", - "Unscoped", m.meta().id(), m.config().scope, BasicConfig.Scope.GLOBAL); - m.config().scope = BasicConfig.Scope.GLOBAL; + "Unscoped", m.meta().id(), m.config().scope, Module.BaseConfig.Scope.GLOBAL); + m.config().scope = Module.BaseConfig.Scope.GLOBAL; } }); if (Debug.hasKey(Debug.Keys.FORCE_DIMENSION_SCOPE)) modules.forEach(m -> { if (m.meta().environment() != Environment.CLIENT && !m.getClass().isAnnotationPresent(Unscoped.class)) { - m.config().scope = BasicConfig.Scope.DIMENSION; + m.config().scope = Module.BaseConfig.Scope.DIMENSION; } }); } - void validateModule(Module module) { + static void validateModule(Module module) { MakeSure.notEmpty(module.meta().category(), "Module category can't be null or empty! Module: " + module.getClass()); MakeSure.isTrue(!module.meta().category().contains("/"), "Module category can't contain '/'! Module: " + module.getClass()); MakeSure.notEmpty(module.meta().name(), "Module name can't be null or empty! Module: " + module.getClass()); @@ -147,7 +126,7 @@ public class ModuleManager { doWork(modules, m -> { var config = ConfigManager.of(getConfigClass(m.getClass()), "andromeda/" + m.meta().id()); config.onLoad(config1 -> { - if (Config.get().sideOnlyMode) { + if (AndromedaConfig.get().sideOnlyMode) { switch (m.meta().environment()) { case BOTH -> config1.enabled = false; case CLIENT -> { @@ -173,15 +152,15 @@ public class ModuleManager { * @param m the module class. * @return the config class. */ - public Class getConfigClass(Class m) { + public Class getConfigClass(Class m) { if (m.getGenericSuperclass() instanceof ParameterizedType pt) { for (Type ta : pt.getActualTypeArguments()) { - if (ta instanceof Class cls && BasicConfig.class.isAssignableFrom(cls)) { + if (ta instanceof Class cls && Module.BaseConfig.class.isAssignableFrom(cls)) { return Utilities.cast(cls); } } } - return !Object.class.equals(m.getSuperclass()) ? getConfigClass(m.getSuperclass()) : BasicConfig.class; + return !Object.class.equals(m.getSuperclass()) ? getConfigClass(m.getSuperclass()) : Module.BaseConfig.class; } public void cleanConfigs(Path root, Collection> modules) { @@ -310,7 +289,7 @@ public class ModuleManager { StringBuilder builder = new StringBuilder(); categories.forEach((s, strings) -> { builder.append("\n\t - ").append(s); - if (!ModuleManager.categories.contains(s)) builder.append("*"); + if (!ModuleManager.CATEGORIES.contains(s)) builder.append("*"); builder.append("\n\t |-- "); StringJoiner joiner = new StringJoiner(", "); diff --git a/src/main/java/me/melontini/andromeda/base/config/AndromedaConfig.java b/src/main/java/me/melontini/andromeda/base/config/AndromedaConfig.java deleted file mode 100644 index 376c233e..00000000 --- a/src/main/java/me/melontini/andromeda/base/config/AndromedaConfig.java +++ /dev/null @@ -1,11 +0,0 @@ -package me.melontini.andromeda.base.config; - -import me.shedaniel.autoconfig.annotation.ConfigEntry; - -public class AndromedaConfig { - - @ConfigEntry.Gui.RequiresRestart - public boolean sideOnlyMode = false; - - public boolean sendCrashReports = true; -} diff --git a/src/main/java/me/melontini/andromeda/base/config/BasicConfig.java b/src/main/java/me/melontini/andromeda/base/config/BasicConfig.java deleted file mode 100644 index 220fd266..00000000 --- a/src/main/java/me/melontini/andromeda/base/config/BasicConfig.java +++ /dev/null @@ -1,22 +0,0 @@ -package me.melontini.andromeda.base.config; - -import lombok.Getter; -import lombok.Setter; -import me.shedaniel.autoconfig.annotation.ConfigEntry; - -@Getter -@Setter -public class BasicConfig { - - @ConfigEntry.Gui.RequiresRestart - public boolean enabled = false; - - @ConfigEntry.Gui.Excluded - public Scope scope = Scope.GLOBAL; - - public enum Scope { - GLOBAL, - WORLD, - DIMENSION - } -} diff --git a/src/main/java/me/melontini/andromeda/common/Andromeda.java b/src/main/java/me/melontini/andromeda/common/Andromeda.java index 42f0a046..04e166e0 100644 --- a/src/main/java/me/melontini/andromeda/common/Andromeda.java +++ b/src/main/java/me/melontini/andromeda/common/Andromeda.java @@ -1,9 +1,9 @@ package me.melontini.andromeda.common;//common between modules, not environments. import me.melontini.andromeda.base.Environment; +import me.melontini.andromeda.base.Module; import me.melontini.andromeda.base.ModuleManager; -import me.melontini.andromeda.base.config.BasicConfig; -import me.melontini.andromeda.base.config.Config; +import me.melontini.andromeda.base.AndromedaConfig; import me.melontini.andromeda.common.config.DataConfigs; import me.melontini.andromeda.common.registries.Common; import me.melontini.andromeda.common.util.AndromedaPackets; @@ -44,17 +44,17 @@ public class Andromeda { }); ServerLifecycleEvents.SERVER_STARTED.register(server -> { - var list = ModuleManager.get().loaded().stream().filter(module -> module.config().scope == BasicConfig.Scope.DIMENSION).toList(); + var list = ModuleManager.get().loaded().stream().filter(module -> module.config().scope == Module.BaseConfig.Scope.DIMENSION).toList(); server.getWorlds().forEach(world -> ModuleManager.get().cleanConfigs(server.session.getWorldDirectory(world.getRegistryKey()).resolve("world_config/andromeda"), list)); ModuleManager.get().cleanConfigs(server.session.getDirectory(WorldSavePath.ROOT).resolve("config/andromeda"), - ModuleManager.get().loaded().stream().filter(module -> module.config().scope == BasicConfig.Scope.WORLD).toList()); + ModuleManager.get().loaded().stream().filter(module -> module.config().scope == Module.BaseConfig.Scope.WORLD).toList()); }); ServerLifecycleEvents.END_DATA_PACK_RELOAD.register((server, resourceManager, success) -> { if (success) DataConfigs.apply(server); }); - if (!Config.get().sideOnlyMode) { + if (!AndromedaConfig.get().sideOnlyMode) { ServerLoginNetworking.registerGlobalReceiver(AndromedaPackets.VERIFY_MODULES, (server, handler, understood, buf, synchronizer, responseSender) -> { if (Debug.hasKey(Debug.Keys.SKIP_SERVER_MODULE_CHECK)) return; diff --git a/src/main/java/me/melontini/andromeda/common/client/AndromedaClient.java b/src/main/java/me/melontini/andromeda/common/client/AndromedaClient.java index 81773c29..0a1054ff 100644 --- a/src/main/java/me/melontini/andromeda/common/client/AndromedaClient.java +++ b/src/main/java/me/melontini/andromeda/common/client/AndromedaClient.java @@ -4,7 +4,7 @@ import com.mojang.blaze3d.systems.RenderSystem; import lombok.Getter; import me.melontini.andromeda.base.Module; import me.melontini.andromeda.base.ModuleManager; -import me.melontini.andromeda.base.config.Config; +import me.melontini.andromeda.base.AndromedaConfig; import me.melontini.andromeda.common.client.config.AutoConfigScreen; import me.melontini.andromeda.common.client.config.FeatureBlockade; import me.melontini.andromeda.common.registries.AndromedaItemGroup; @@ -51,7 +51,7 @@ public class AndromedaClient { public void onInitializeClient() { Support.run("cloth-config", () -> AutoConfigScreen::register); - if (!Config.get().sideOnlyMode) ClientSideNetworking.register(); + if (!AndromedaConfig.get().sideOnlyMode) ClientSideNetworking.register(); else { for (Module module : ModuleManager.get().all()) { switch (module.meta().environment()) { diff --git a/src/main/java/me/melontini/andromeda/common/client/config/AutoConfigScreen.java b/src/main/java/me/melontini/andromeda/common/client/config/AutoConfigScreen.java index 580cac14..f9f96e53 100644 --- a/src/main/java/me/melontini/andromeda/common/client/config/AutoConfigScreen.java +++ b/src/main/java/me/melontini/andromeda/common/client/config/AutoConfigScreen.java @@ -5,8 +5,7 @@ import me.melontini.andromeda.base.Module; import me.melontini.andromeda.base.ModuleManager; import me.melontini.andromeda.base.annotations.Origin; import me.melontini.andromeda.base.annotations.SpecialEnvironment; -import me.melontini.andromeda.base.config.AndromedaConfig; -import me.melontini.andromeda.base.config.Config; +import me.melontini.andromeda.base.AndromedaConfig; import me.melontini.andromeda.common.client.OrderedTextUtil; import me.melontini.andromeda.util.AndromedaLog; import me.melontini.andromeda.util.CommonValues; @@ -104,13 +103,13 @@ public class AutoConfigScreen { }); ConfigCategory misc = builder.getOrCreateCategory(TextUtil.translatable("config.andromeda.category.misc")); - Arrays.stream(AndromedaConfig.class.getFields()).forEach((field) -> { + Arrays.stream(AndromedaConfig.Config.class.getFields()).forEach((field) -> { String opt = "config.andromeda.base.option." + field.getName(); - registry.getAndTransform(opt, field, Config.get(), Config.getDefault(), registry).forEach(e -> { + registry.getAndTransform(opt, field, AndromedaConfig.get(), AndromedaConfig.getDefault(), registry).forEach(e -> { setOptionTooltip(e, opt + ".@Tooltip"); appendEnvInfo(e, field); wrapTooltip(e); - wrapSaveCallback(e, Config::save); + wrapSaveCallback(e, AndromedaConfig::save); misc.addEntry(e); }); }); @@ -224,11 +223,11 @@ public class AutoConfigScreen { } private static void powerSave() { - Config.save(); if (saveCallback.isPresent()) { saveQueue.get().forEach(Runnable::run); saveQueue.get().clear(); } else { + AndromedaConfig.save(); ModuleManager.get().all().forEach(Module::save); } } diff --git a/src/main/java/me/melontini/andromeda/common/config/DataConfigs.java b/src/main/java/me/melontini/andromeda/common/config/DataConfigs.java index 3a6d550f..57e39c06 100644 --- a/src/main/java/me/melontini/andromeda/common/config/DataConfigs.java +++ b/src/main/java/me/melontini/andromeda/common/config/DataConfigs.java @@ -10,7 +10,6 @@ import it.unimi.dsi.fastutil.objects.ReferenceOpenHashSet; import me.melontini.andromeda.base.Module; import me.melontini.andromeda.base.ModuleManager; import me.melontini.andromeda.base.annotations.Unscoped; -import me.melontini.andromeda.base.config.BasicConfig; import me.melontini.andromeda.common.registries.Common; import me.melontini.andromeda.common.util.JsonDataLoader; import me.melontini.dark_matter.api.base.util.MakeSure; @@ -48,9 +47,9 @@ public class DataConfigs extends JsonDataLoader { var m = ModuleManager.get().getModule(id.getPath()).orElseThrow(() -> new IllegalStateException("Invalid module path '%s'! The module must be enabled!".formatted(id.getPath()))); var cls = ModuleManager.get().getConfigClass(m.getClass()); - if (m.config().scope == BasicConfig.Scope.WORLD) { + if (m.config().scope == Module.BaseConfig.Scope.WORLD) { if (!object.has(DEFAULT.toString()) || object.size() > 1) - throw new IllegalStateException("'%s' modules only support '%s' as their dimension!".formatted(BasicConfig.Scope.WORLD, DEFAULT)); + throw new IllegalStateException("'%s' modules only support '%s' as their dimension!".formatted(Module.BaseConfig.Scope.WORLD, DEFAULT)); var map = configs.computeIfAbsent(DEFAULT, identifier -> new Reference2ObjectOpenHashMap<>()); map.computeIfAbsent(m, module -> new ReferenceLinkedOpenHashSet<>()) @@ -80,7 +79,7 @@ public class DataConfigs extends JsonDataLoader { }, executor); } - private static CompletableFuture makeFuture(Gson gson, Module m, Class cls, JsonElement element) { + private static CompletableFuture makeFuture(Gson gson, Module m, Class cls, JsonElement element) { return CompletableFuture.supplyAsync(() -> { try { var instance = gson.fromJson(element, cls); @@ -102,7 +101,7 @@ public class DataConfigs extends JsonDataLoader { }, Util.getMainWorkerExecutor()); } - public record Data(Set fields, BasicConfig config) { + public record Data(Set fields, Module.BaseConfig config) { } @Override @@ -152,7 +151,7 @@ public class DataConfigs extends JsonDataLoader { server.runTasks(task::isDone); } - private static void apply(BasicConfig config, Data data) { + private static void apply(Module.BaseConfig config, Data data) { data.fields().forEach((field) -> { try { field.set(config, field.get(data.config())); @@ -162,7 +161,7 @@ public class DataConfigs extends JsonDataLoader { }); } - static void applyDataPacks(BasicConfig config, Module m, Identifier id) { + static void applyDataPacks(Module.BaseConfig config, Module m, Identifier id) { if (DEFAULT_CONFIGS != null) { var forModule = DEFAULT_CONFIGS.get(m); if (forModule != null) { diff --git a/src/main/java/me/melontini/andromeda/common/config/ScopedConfigs.java b/src/main/java/me/melontini/andromeda/common/config/ScopedConfigs.java index 1a4cb742..ff7973f5 100644 --- a/src/main/java/me/melontini/andromeda/common/config/ScopedConfigs.java +++ b/src/main/java/me/melontini/andromeda/common/config/ScopedConfigs.java @@ -4,7 +4,6 @@ import it.unimi.dsi.fastutil.objects.Reference2ObjectOpenHashMap; import lombok.SneakyThrows; import me.melontini.andromeda.base.Module; import me.melontini.andromeda.base.ModuleManager; -import me.melontini.andromeda.base.config.BasicConfig; import me.melontini.andromeda.util.AndromedaLog; import me.melontini.dark_matter.api.base.util.Utilities; import me.melontini.dark_matter.api.minecraft.world.PersistentStateHelper; @@ -22,7 +21,7 @@ import java.util.Map; public class ScopedConfigs { - public static T get(World world, Module module) { + public static T get(World world, Module module) { if (world instanceof ServerWorld sw) { return switch (module.config().scope) { case GLOBAL -> module.config(); @@ -52,7 +51,7 @@ public class ScopedConfigs { } @SneakyThrows - private static BasicConfig loadScoped(Path root, Module module) { + private static Module.BaseConfig loadScoped(Path root, Module module) { var manager = module.manager(); if (Files.exists(manager.resolve(root))) { return manager.load(root); @@ -62,33 +61,33 @@ public class ScopedConfigs { static void prepareForWorld(ServerWorld world, Module module, Path p) { ScopedConfigs.State state = ScopedConfigs.get(world); - BasicConfig config = ScopedConfigs.loadScoped(p, module); + Module.BaseConfig config = ScopedConfigs.loadScoped(p, module); module.manager().save(p, Utilities.cast(config)); - if (module.config().scope == BasicConfig.Scope.DIMENSION) { + if (module.config().scope == Module.BaseConfig.Scope.DIMENSION) { DataConfigs.applyDataPacks(config, module, world.getRegistryKey().getValue()); } state.addConfig(module, config); } public interface WorldExtension { - default T am$get(Class> cls) { + default T am$get(Class> cls) { return am$get(ModuleManager.quick(cls)); } - default BasicConfig am$get(String module) { + default Module.BaseConfig am$get(String module) { return am$get(ModuleManager.get().getModule(module).orElseThrow(() -> new IllegalStateException("Module %s not found".formatted(module)))); } - default T am$get(Module module) { + default T am$get(Module module) { if (this instanceof ServerWorld w) { return ScopedConfigs.get(w, module); } return module.config(); } - default void am$save(Class> cls) { + default void am$save(Class> cls) { am$save(ModuleManager.quick(cls)); } @@ -96,7 +95,7 @@ public class ScopedConfigs { am$save(ModuleManager.get().getModule(module).orElseThrow(() -> new IllegalStateException("Module %s not found".formatted(module)))); } - default void am$save(Module module) { + default void am$save(Module module) { if (this instanceof ServerWorld w) { module.manager().save(getPath(w, module), am$get(module)); } @@ -112,13 +111,13 @@ public class ScopedConfigs { public static class State extends PersistentState implements DeserializableState { - private final Map, BasicConfig> configs = new Reference2ObjectOpenHashMap<>(); + private final Map, Module.BaseConfig> configs = new Reference2ObjectOpenHashMap<>(); - public T get(Module module) { + public T get(Module module) { return (T) configs.get(module); } - public void addConfig(Module module, BasicConfig config) { + public void addConfig(Module module, Module.BaseConfig config) { synchronized (this.configs) { this.configs.put(module, config); } diff --git a/src/main/java/me/melontini/andromeda/modules/blocks/bed/power/Power.java b/src/main/java/me/melontini/andromeda/modules/blocks/bed/power/Power.java index 53220a58..d5e08fbb 100644 --- a/src/main/java/me/melontini/andromeda/modules/blocks/bed/power/Power.java +++ b/src/main/java/me/melontini/andromeda/modules/blocks/bed/power/Power.java @@ -4,13 +4,12 @@ import me.melontini.andromeda.base.Environment; import me.melontini.andromeda.base.Module; import me.melontini.andromeda.base.annotations.ModuleInfo; import me.melontini.andromeda.base.annotations.OldConfigKey; -import me.melontini.andromeda.base.config.BasicConfig; @OldConfigKey("enableBedExplosionPower") @ModuleInfo(name = "bed/power", category = "blocks", environment = Environment.SERVER) public class Power extends Module { - public static class Config extends BasicConfig { + public static class Config extends BaseConfig { public float power = 5.0F; } } diff --git a/src/main/java/me/melontini/andromeda/modules/blocks/bed/safe/Safe.java b/src/main/java/me/melontini/andromeda/modules/blocks/bed/safe/Safe.java index e657e221..5f17ae93 100644 --- a/src/main/java/me/melontini/andromeda/modules/blocks/bed/safe/Safe.java +++ b/src/main/java/me/melontini/andromeda/modules/blocks/bed/safe/Safe.java @@ -3,9 +3,8 @@ package me.melontini.andromeda.modules.blocks.bed.safe; import me.melontini.andromeda.base.Module; import me.melontini.andromeda.base.annotations.ModuleInfo; import me.melontini.andromeda.base.annotations.OldConfigKey; -import me.melontini.andromeda.base.config.BasicConfig; @OldConfigKey("safeBeds") @ModuleInfo(name = "bed/safe", category = "blocks") -public class Safe extends Module { +public class Safe extends Module { } diff --git a/src/main/java/me/melontini/andromeda/modules/blocks/bed/unsafe/Unsafe.java b/src/main/java/me/melontini/andromeda/modules/blocks/bed/unsafe/Unsafe.java index a117ecc3..1ebb1ad2 100644 --- a/src/main/java/me/melontini/andromeda/modules/blocks/bed/unsafe/Unsafe.java +++ b/src/main/java/me/melontini/andromeda/modules/blocks/bed/unsafe/Unsafe.java @@ -5,7 +5,6 @@ import me.melontini.andromeda.base.Module; import me.melontini.andromeda.base.ModuleManager; import me.melontini.andromeda.base.annotations.ModuleInfo; import me.melontini.andromeda.base.annotations.OldConfigKey; -import me.melontini.andromeda.base.config.BasicConfig; import me.melontini.andromeda.common.client.config.FeatureBlockade; import me.melontini.andromeda.modules.blocks.bed.safe.Safe; import me.melontini.dark_matter.api.base.config.ConfigManager; @@ -13,10 +12,10 @@ import me.melontini.dark_matter.api.minecraft.util.TextUtil; @OldConfigKey("bedsExplodeEverywhere") @ModuleInfo(name = "bed/unsafe", category = "blocks", environment = Environment.SERVER) -public class Unsafe extends Module { +public class Unsafe extends Module { @Override - public void onConfig(ConfigManager manager) { + public void onConfig(ConfigManager manager) { manager.onSave(config -> { if (ModuleManager.get().getDiscovered(Safe.class).filter(Module::enabled).isPresent()) { config.enabled = false; diff --git a/src/main/java/me/melontini/andromeda/modules/blocks/better_fletching_table/BetterFletchingTable.java b/src/main/java/me/melontini/andromeda/modules/blocks/better_fletching_table/BetterFletchingTable.java index 9520b268..1b5733b1 100644 --- a/src/main/java/me/melontini/andromeda/modules/blocks/better_fletching_table/BetterFletchingTable.java +++ b/src/main/java/me/melontini/andromeda/modules/blocks/better_fletching_table/BetterFletchingTable.java @@ -4,11 +4,10 @@ import me.melontini.andromeda.base.Module; import me.melontini.andromeda.base.annotations.ModuleInfo; import me.melontini.andromeda.base.annotations.OldConfigKey; import me.melontini.andromeda.base.annotations.Unscoped; -import me.melontini.andromeda.base.config.BasicConfig; @Unscoped @OldConfigKey("usefulFletching") @ModuleInfo(name = "better_fletching_table", category = "blocks") -public class BetterFletchingTable extends Module { +public class BetterFletchingTable extends Module { } diff --git a/src/main/java/me/melontini/andromeda/modules/blocks/cactus_bottle_filling/CactusFiller.java b/src/main/java/me/melontini/andromeda/modules/blocks/cactus_bottle_filling/CactusFiller.java index 73acce15..7a3e836d 100644 --- a/src/main/java/me/melontini/andromeda/modules/blocks/cactus_bottle_filling/CactusFiller.java +++ b/src/main/java/me/melontini/andromeda/modules/blocks/cactus_bottle_filling/CactusFiller.java @@ -3,10 +3,9 @@ package me.melontini.andromeda.modules.blocks.cactus_bottle_filling; import me.melontini.andromeda.base.Module; import me.melontini.andromeda.base.annotations.ModuleInfo; import me.melontini.andromeda.base.annotations.OldConfigKey; -import me.melontini.andromeda.base.config.BasicConfig; @OldConfigKey("cactusBottleFilling") @ModuleInfo(name = "cactus_bottle_filling", category = "blocks") -public class CactusFiller extends Module { +public class CactusFiller extends Module { } diff --git a/src/main/java/me/melontini/andromeda/modules/blocks/campfire_effects/CampfireEffects.java b/src/main/java/me/melontini/andromeda/modules/blocks/campfire_effects/CampfireEffects.java index e5b247da..89a3525f 100644 --- a/src/main/java/me/melontini/andromeda/modules/blocks/campfire_effects/CampfireEffects.java +++ b/src/main/java/me/melontini/andromeda/modules/blocks/campfire_effects/CampfireEffects.java @@ -7,7 +7,6 @@ import lombok.NoArgsConstructor; import me.melontini.andromeda.base.Environment; import me.melontini.andromeda.base.Module; import me.melontini.andromeda.base.annotations.ModuleInfo; -import me.melontini.andromeda.base.config.BasicConfig; import me.melontini.andromeda.util.JsonOps; import me.shedaniel.autoconfig.annotation.ConfigEntry; @@ -38,7 +37,7 @@ public class CampfireEffects extends Module { } } - public static class Config extends BasicConfig { + public static class Config extends BaseConfig { public boolean affectsPassive = true; diff --git a/src/main/java/me/melontini/andromeda/modules/blocks/falling_propagule/FallingPropagule.java b/src/main/java/me/melontini/andromeda/modules/blocks/falling_propagule/FallingPropagule.java index 7d01ccc9..9db111d7 100644 --- a/src/main/java/me/melontini/andromeda/modules/blocks/falling_propagule/FallingPropagule.java +++ b/src/main/java/me/melontini/andromeda/modules/blocks/falling_propagule/FallingPropagule.java @@ -4,10 +4,9 @@ import me.melontini.andromeda.base.Environment; import me.melontini.andromeda.base.Module; import me.melontini.andromeda.base.annotations.ModuleInfo; import me.melontini.andromeda.base.annotations.OldConfigKey; -import me.melontini.andromeda.base.config.BasicConfig; @OldConfigKey("fallingPropagule") @ModuleInfo(name = "falling_propagule", category = "blocks", environment = Environment.SERVER) -public class FallingPropagule extends Module { +public class FallingPropagule extends Module { } diff --git a/src/main/java/me/melontini/andromeda/modules/blocks/guarded_loot/GuardedLoot.java b/src/main/java/me/melontini/andromeda/modules/blocks/guarded_loot/GuardedLoot.java index 4c5069cb..8b1904b3 100644 --- a/src/main/java/me/melontini/andromeda/modules/blocks/guarded_loot/GuardedLoot.java +++ b/src/main/java/me/melontini/andromeda/modules/blocks/guarded_loot/GuardedLoot.java @@ -3,7 +3,6 @@ package me.melontini.andromeda.modules.blocks.guarded_loot; import com.google.gson.JsonObject; import me.melontini.andromeda.base.Module; import me.melontini.andromeda.base.annotations.ModuleInfo; -import me.melontini.andromeda.base.config.BasicConfig; import me.melontini.andromeda.util.JsonOps; @ModuleInfo(name = "guarded_loot", category = "blocks") @@ -19,7 +18,7 @@ public class GuardedLoot extends Module { } } - public static class Config extends BasicConfig { + public static class Config extends BaseConfig { public int range = 4; diff --git a/src/main/java/me/melontini/andromeda/modules/blocks/incubator/Incubator.java b/src/main/java/me/melontini/andromeda/modules/blocks/incubator/Incubator.java index 00e750b6..066dfd41 100644 --- a/src/main/java/me/melontini/andromeda/modules/blocks/incubator/Incubator.java +++ b/src/main/java/me/melontini/andromeda/modules/blocks/incubator/Incubator.java @@ -6,7 +6,6 @@ import me.melontini.andromeda.base.Module; import me.melontini.andromeda.base.annotations.ModuleInfo; import me.melontini.andromeda.base.annotations.SpecialEnvironment; import me.melontini.andromeda.base.annotations.Unscoped; -import me.melontini.andromeda.base.config.BasicConfig; import me.melontini.andromeda.common.registries.Common; import me.melontini.andromeda.modules.blocks.incubator.data.EggProcessingData; import me.melontini.andromeda.util.JsonOps; @@ -30,7 +29,7 @@ public class Incubator extends Module { Common.bootstrap(this, Content.class, EggProcessingData.class); } - public static class Config extends BasicConfig { + public static class Config extends BaseConfig { @SpecialEnvironment(Environment.SERVER) public boolean randomness = true; diff --git a/src/main/java/me/melontini/andromeda/modules/blocks/leaf_slowdown/LeafSlowdown.java b/src/main/java/me/melontini/andromeda/modules/blocks/leaf_slowdown/LeafSlowdown.java index 82cc5672..c760f393 100644 --- a/src/main/java/me/melontini/andromeda/modules/blocks/leaf_slowdown/LeafSlowdown.java +++ b/src/main/java/me/melontini/andromeda/modules/blocks/leaf_slowdown/LeafSlowdown.java @@ -4,10 +4,9 @@ import me.melontini.andromeda.base.Environment; import me.melontini.andromeda.base.Module; import me.melontini.andromeda.base.annotations.ModuleInfo; import me.melontini.andromeda.base.annotations.OldConfigKey; -import me.melontini.andromeda.base.config.BasicConfig; @OldConfigKey("leafSlowdown") @ModuleInfo(name = "leaf_slowdown", category = "blocks", environment = Environment.SERVER) -public class LeafSlowdown extends Module { +public class LeafSlowdown extends Module { } diff --git a/src/main/java/me/melontini/andromeda/modules/bugfixes/advancement_shadow/AdvancementShadow.java b/src/main/java/me/melontini/andromeda/modules/bugfixes/advancement_shadow/AdvancementShadow.java index 859b9334..d575f209 100644 --- a/src/main/java/me/melontini/andromeda/modules/bugfixes/advancement_shadow/AdvancementShadow.java +++ b/src/main/java/me/melontini/andromeda/modules/bugfixes/advancement_shadow/AdvancementShadow.java @@ -4,10 +4,9 @@ import me.melontini.andromeda.base.Environment; import me.melontini.andromeda.base.Module; import me.melontini.andromeda.base.annotations.ModuleInfo; import me.melontini.andromeda.base.annotations.OldConfigKey; -import me.melontini.andromeda.base.config.BasicConfig; @OldConfigKey("frameIndependentAdvancementShadow") @ModuleInfo(name = "advancement_shadow", category = "bugfixes", environment = Environment.CLIENT) -public class AdvancementShadow extends Module { +public class AdvancementShadow extends Module { } diff --git a/src/main/java/me/melontini/andromeda/modules/bugfixes/aligned_alternatives/AlignedRecipeAlternatives.java b/src/main/java/me/melontini/andromeda/modules/bugfixes/aligned_alternatives/AlignedRecipeAlternatives.java index e41f9405..b82687d6 100644 --- a/src/main/java/me/melontini/andromeda/modules/bugfixes/aligned_alternatives/AlignedRecipeAlternatives.java +++ b/src/main/java/me/melontini/andromeda/modules/bugfixes/aligned_alternatives/AlignedRecipeAlternatives.java @@ -5,11 +5,10 @@ import me.melontini.andromeda.base.Module; import me.melontini.andromeda.base.annotations.ModuleInfo; import me.melontini.andromeda.base.annotations.OldConfigKey; import me.melontini.andromeda.base.annotations.SpecialEnvironment; -import me.melontini.andromeda.base.config.BasicConfig; @OldConfigKey("properlyAlignedRecipeAlternatives") @SpecialEnvironment(Environment.CLIENT) @ModuleInfo(name = "aligned_alternatives", category = "bugfixes", environment = Environment.CLIENT) -public class AlignedRecipeAlternatives extends Module { +public class AlignedRecipeAlternatives extends Module { } diff --git a/src/main/java/me/melontini/andromeda/modules/entities/bee_flower_duplication/BeeFlowerDuplication.java b/src/main/java/me/melontini/andromeda/modules/entities/bee_flower_duplication/BeeFlowerDuplication.java index e4896660..6479d956 100644 --- a/src/main/java/me/melontini/andromeda/modules/entities/bee_flower_duplication/BeeFlowerDuplication.java +++ b/src/main/java/me/melontini/andromeda/modules/entities/bee_flower_duplication/BeeFlowerDuplication.java @@ -4,7 +4,6 @@ import com.google.gson.JsonObject; import me.melontini.andromeda.base.Environment; import me.melontini.andromeda.base.Module; import me.melontini.andromeda.base.annotations.ModuleInfo; -import me.melontini.andromeda.base.config.BasicConfig; import me.melontini.andromeda.util.JsonOps; @ModuleInfo(name = "bee_flower_duplication", category = "entities", environment = Environment.SERVER) @@ -16,7 +15,7 @@ public class BeeFlowerDuplication extends Module { JsonOps.ifPresent(config, "beeTallFlowerDuplication", e -> this.config().tallFlowers = e.getAsBoolean()); } - public static class Config extends BasicConfig { + public static class Config extends BaseConfig { public boolean tallFlowers = true; } } diff --git a/src/main/java/me/melontini/andromeda/modules/entities/better_furnace_minecart/BetterFurnaceMinecart.java b/src/main/java/me/melontini/andromeda/modules/entities/better_furnace_minecart/BetterFurnaceMinecart.java index 10bd0076..ac42b459 100644 --- a/src/main/java/me/melontini/andromeda/modules/entities/better_furnace_minecart/BetterFurnaceMinecart.java +++ b/src/main/java/me/melontini/andromeda/modules/entities/better_furnace_minecart/BetterFurnaceMinecart.java @@ -5,7 +5,6 @@ import me.melontini.andromeda.base.Environment; import me.melontini.andromeda.base.Module; import me.melontini.andromeda.base.annotations.ModuleInfo; import me.melontini.andromeda.base.annotations.Unscoped; -import me.melontini.andromeda.base.config.BasicConfig; import me.melontini.andromeda.util.JsonOps; @Unscoped @@ -19,7 +18,7 @@ public class BetterFurnaceMinecart extends Module JsonOps.ifPresent(config, "furnaceMinecartTakeFuelWhenLow", e -> this.config().takeFuelWhenLow = e.getAsBoolean()); } - public static class Config extends BasicConfig { + public static class Config extends BaseConfig { public int maxFuel = 45000; public boolean takeFuelWhenLow = true; diff --git a/src/main/java/me/melontini/andromeda/modules/entities/boats/Boats.java b/src/main/java/me/melontini/andromeda/modules/entities/boats/Boats.java index ec99f71b..5d9138cb 100644 --- a/src/main/java/me/melontini/andromeda/modules/entities/boats/Boats.java +++ b/src/main/java/me/melontini/andromeda/modules/entities/boats/Boats.java @@ -6,7 +6,6 @@ import me.melontini.andromeda.base.Module; import me.melontini.andromeda.base.annotations.ModuleInfo; import me.melontini.andromeda.base.annotations.SpecialEnvironment; import me.melontini.andromeda.base.annotations.Unscoped; -import me.melontini.andromeda.base.config.BasicConfig; import me.melontini.andromeda.common.registries.Common; import me.melontini.andromeda.util.JsonOps; import me.shedaniel.autoconfig.annotation.ConfigEntry; @@ -32,7 +31,7 @@ public class Boats extends Module { Common.bootstrap(this, BoatItems.class, BoatEntities.class); } - public static class Config extends BasicConfig { + public static class Config extends BaseConfig { @Unscoped @ConfigEntry.Gui.RequiresRestart diff --git a/src/main/java/me/melontini/andromeda/modules/entities/minecarts/Minecarts.java b/src/main/java/me/melontini/andromeda/modules/entities/minecarts/Minecarts.java index d69b9175..de228502 100644 --- a/src/main/java/me/melontini/andromeda/modules/entities/minecarts/Minecarts.java +++ b/src/main/java/me/melontini/andromeda/modules/entities/minecarts/Minecarts.java @@ -6,7 +6,6 @@ import me.melontini.andromeda.base.Module; import me.melontini.andromeda.base.annotations.ModuleInfo; import me.melontini.andromeda.base.annotations.SpecialEnvironment; import me.melontini.andromeda.base.annotations.Unscoped; -import me.melontini.andromeda.base.config.BasicConfig; import me.melontini.andromeda.common.registries.Common; import me.melontini.andromeda.util.JsonOps; import me.shedaniel.autoconfig.annotation.ConfigEntry; @@ -31,7 +30,7 @@ public class Minecarts extends Module { Common.bootstrap(this, MinecartItems.class, MinecartEntities.class); } - public static class Config extends BasicConfig { + public static class Config extends BaseConfig { @Unscoped @ConfigEntry.Gui.RequiresRestart diff --git a/src/main/java/me/melontini/andromeda/modules/entities/slimes/Slimes.java b/src/main/java/me/melontini/andromeda/modules/entities/slimes/Slimes.java index e895f9d2..32fbe9c9 100644 --- a/src/main/java/me/melontini/andromeda/modules/entities/slimes/Slimes.java +++ b/src/main/java/me/melontini/andromeda/modules/entities/slimes/Slimes.java @@ -4,7 +4,6 @@ import com.google.gson.JsonObject; import me.melontini.andromeda.base.Environment; import me.melontini.andromeda.base.Module; import me.melontini.andromeda.base.annotations.ModuleInfo; -import me.melontini.andromeda.base.config.BasicConfig; import me.melontini.andromeda.util.JsonOps; @ModuleInfo(name = "slimes", category = "entities", environment = Environment.SERVER) @@ -22,7 +21,7 @@ public class Slimes extends Module { } } - public static class Config extends BasicConfig { + public static class Config extends BaseConfig { public boolean flee = true; diff --git a/src/main/java/me/melontini/andromeda/modules/entities/snowball_tweaks/Snowballs.java b/src/main/java/me/melontini/andromeda/modules/entities/snowball_tweaks/Snowballs.java index 75650bd2..101efd5f 100644 --- a/src/main/java/me/melontini/andromeda/modules/entities/snowball_tweaks/Snowballs.java +++ b/src/main/java/me/melontini/andromeda/modules/entities/snowball_tweaks/Snowballs.java @@ -4,7 +4,6 @@ import com.google.gson.JsonObject; import me.melontini.andromeda.base.Environment; import me.melontini.andromeda.base.Module; import me.melontini.andromeda.base.annotations.ModuleInfo; -import me.melontini.andromeda.base.config.BasicConfig; import me.melontini.andromeda.util.JsonOps; @ModuleInfo(name = "snowball_tweaks", category = "entities", environment = Environment.SERVER) @@ -24,7 +23,7 @@ public class Snowballs extends Module { } } - public static class Config extends BasicConfig { + public static class Config extends BaseConfig { public boolean freeze = true; diff --git a/src/main/java/me/melontini/andromeda/modules/entities/villagers_follow_emeralds/VillagersFollowEmeralds.java b/src/main/java/me/melontini/andromeda/modules/entities/villagers_follow_emeralds/VillagersFollowEmeralds.java index 19d1dcb4..041b8b86 100644 --- a/src/main/java/me/melontini/andromeda/modules/entities/villagers_follow_emeralds/VillagersFollowEmeralds.java +++ b/src/main/java/me/melontini/andromeda/modules/entities/villagers_follow_emeralds/VillagersFollowEmeralds.java @@ -4,12 +4,11 @@ import me.melontini.andromeda.base.Environment; import me.melontini.andromeda.base.Module; import me.melontini.andromeda.base.annotations.ModuleInfo; import me.melontini.andromeda.base.annotations.OldConfigKey; -import me.melontini.andromeda.base.config.BasicConfig; import me.melontini.andromeda.common.registries.Common; @OldConfigKey("villagersFollowEmeraldBlocks") @ModuleInfo(name = "villagers_follow_emeralds", category = "entities", environment = Environment.SERVER) -public class VillagersFollowEmeralds extends Module { +public class VillagersFollowEmeralds extends Module { @Override public void onMain() { diff --git a/src/main/java/me/melontini/andromeda/modules/entities/zombie/all_pick_up/Pickup.java b/src/main/java/me/melontini/andromeda/modules/entities/zombie/all_pick_up/Pickup.java index 960d09d3..2ec75f37 100644 --- a/src/main/java/me/melontini/andromeda/modules/entities/zombie/all_pick_up/Pickup.java +++ b/src/main/java/me/melontini/andromeda/modules/entities/zombie/all_pick_up/Pickup.java @@ -4,10 +4,9 @@ import me.melontini.andromeda.base.Environment; import me.melontini.andromeda.base.Module; import me.melontini.andromeda.base.annotations.ModuleInfo; import me.melontini.andromeda.base.annotations.OldConfigKey; -import me.melontini.andromeda.base.config.BasicConfig; @OldConfigKey("allZombiesCanPickUpItems") @ModuleInfo(name = "zombie/all_pick_up", category = "entities", environment = Environment.SERVER) -public class Pickup extends Module { +public class Pickup extends Module { } diff --git a/src/main/java/me/melontini/andromeda/modules/entities/zombie/clean_pickup/Pickup.java b/src/main/java/me/melontini/andromeda/modules/entities/zombie/clean_pickup/Pickup.java index 3cc34e97..bb562fe0 100644 --- a/src/main/java/me/melontini/andromeda/modules/entities/zombie/clean_pickup/Pickup.java +++ b/src/main/java/me/melontini/andromeda/modules/entities/zombie/clean_pickup/Pickup.java @@ -4,11 +4,10 @@ import com.google.gson.JsonObject; import me.melontini.andromeda.base.Environment; import me.melontini.andromeda.base.Module; import me.melontini.andromeda.base.annotations.ModuleInfo; -import me.melontini.andromeda.base.config.BasicConfig; import me.melontini.andromeda.common.registries.Common; @ModuleInfo(name = "zombie/clean_pickup", category = "entities", environment = Environment.SERVER) -public class Pickup extends Module { +public class Pickup extends Module { @Override public void acceptLegacyConfig(JsonObject config) { diff --git a/src/main/java/me/melontini/andromeda/modules/gui/gui_particles/GuiParticles.java b/src/main/java/me/melontini/andromeda/modules/gui/gui_particles/GuiParticles.java index 2676ac1c..37e47676 100644 --- a/src/main/java/me/melontini/andromeda/modules/gui/gui_particles/GuiParticles.java +++ b/src/main/java/me/melontini/andromeda/modules/gui/gui_particles/GuiParticles.java @@ -4,7 +4,6 @@ import com.google.gson.JsonObject; import me.melontini.andromeda.base.Environment; import me.melontini.andromeda.base.Module; import me.melontini.andromeda.base.annotations.ModuleInfo; -import me.melontini.andromeda.base.config.BasicConfig; import me.melontini.andromeda.util.JsonOps; @ModuleInfo(name = "gui_particles", category = "gui", environment = Environment.CLIENT) @@ -25,7 +24,7 @@ public class GuiParticles extends Module { } } - public static class Config extends BasicConfig { + public static class Config extends BaseConfig { public boolean anvilScreenParticles = true; diff --git a/src/main/java/me/melontini/andromeda/modules/gui/item_frame_tooltips/ItemFrameTooltips.java b/src/main/java/me/melontini/andromeda/modules/gui/item_frame_tooltips/ItemFrameTooltips.java index aa8c847d..b9065592 100644 --- a/src/main/java/me/melontini/andromeda/modules/gui/item_frame_tooltips/ItemFrameTooltips.java +++ b/src/main/java/me/melontini/andromeda/modules/gui/item_frame_tooltips/ItemFrameTooltips.java @@ -4,7 +4,6 @@ import me.melontini.andromeda.base.Environment; import me.melontini.andromeda.base.Module; import me.melontini.andromeda.base.annotations.ModuleInfo; import me.melontini.andromeda.base.annotations.OldConfigKey; -import me.melontini.andromeda.base.config.BasicConfig; import me.melontini.andromeda.common.client.config.FeatureBlockade; import me.melontini.dark_matter.api.base.config.ConfigManager; import me.melontini.dark_matter.api.minecraft.util.TextUtil; @@ -15,12 +14,12 @@ import static me.melontini.andromeda.base.Bootstrap.testModVersion; @OldConfigKey("itemFrameTooltips") @ModuleInfo(name = "item_frame_tooltips", category = "gui", environment = Environment.CLIENT) -public class ItemFrameTooltips extends Module { +public class ItemFrameTooltips extends Module { private final BooleanSupplier iceberg = () -> testModVersion(this, "minecraft", ">=1.20") && testModVersion(this, "iceberg", "<1.1.13"); @Override - public void onConfig(ConfigManager manager) { + public void onConfig(ConfigManager manager) { manager.onLoad(config -> { if (iceberg.getAsBoolean()) config.enabled = false; }); diff --git a/src/main/java/me/melontini/andromeda/modules/gui/name_tooltips/NameTooltips.java b/src/main/java/me/melontini/andromeda/modules/gui/name_tooltips/NameTooltips.java index a4edfff0..24c17129 100644 --- a/src/main/java/me/melontini/andromeda/modules/gui/name_tooltips/NameTooltips.java +++ b/src/main/java/me/melontini/andromeda/modules/gui/name_tooltips/NameTooltips.java @@ -4,7 +4,6 @@ import me.melontini.andromeda.base.Environment; import me.melontini.andromeda.base.Module; import me.melontini.andromeda.base.annotations.ModuleInfo; import me.melontini.andromeda.base.annotations.OldConfigKey; -import me.melontini.andromeda.base.config.BasicConfig; import me.melontini.andromeda.common.client.config.FeatureBlockade; import me.melontini.dark_matter.api.base.config.ConfigManager; import me.melontini.dark_matter.api.minecraft.util.TextUtil; @@ -15,12 +14,12 @@ import static me.melontini.andromeda.base.Bootstrap.testModVersion; @OldConfigKey("tooltipNotName") @ModuleInfo(name = "name_tooltips", category = "gui", environment = Environment.CLIENT) -public class NameTooltips extends Module { +public class NameTooltips extends Module { private final BooleanSupplier iceberg = () -> testModVersion(this, "minecraft", ">=1.20") && testModVersion(this, "iceberg", "<1.1.13"); @Override - public void onConfig(ConfigManager manager) { + public void onConfig(ConfigManager manager) { manager.onLoad(config -> { if (iceberg.getAsBoolean()) config.enabled = false; }); diff --git a/src/main/java/me/melontini/andromeda/modules/gui/no_more_adventure/NoMoreAdventure.java b/src/main/java/me/melontini/andromeda/modules/gui/no_more_adventure/NoMoreAdventure.java index 21f76ed9..46111729 100644 --- a/src/main/java/me/melontini/andromeda/modules/gui/no_more_adventure/NoMoreAdventure.java +++ b/src/main/java/me/melontini/andromeda/modules/gui/no_more_adventure/NoMoreAdventure.java @@ -4,10 +4,9 @@ import me.melontini.andromeda.base.Environment; import me.melontini.andromeda.base.Module; import me.melontini.andromeda.base.annotations.ModuleInfo; import me.melontini.andromeda.base.annotations.OldConfigKey; -import me.melontini.andromeda.base.config.BasicConfig; @OldConfigKey("noMoreAdventure") @ModuleInfo(name = "no_more_adventure", category = "gui", environment = Environment.CLIENT) -public class NoMoreAdventure extends Module { +public class NoMoreAdventure extends Module { } diff --git a/src/main/java/me/melontini/andromeda/modules/items/balanced_mending/BalancedMending.java b/src/main/java/me/melontini/andromeda/modules/items/balanced_mending/BalancedMending.java index 1804b53c..1232912c 100644 --- a/src/main/java/me/melontini/andromeda/modules/items/balanced_mending/BalancedMending.java +++ b/src/main/java/me/melontini/andromeda/modules/items/balanced_mending/BalancedMending.java @@ -4,11 +4,10 @@ import me.melontini.andromeda.base.Module; import me.melontini.andromeda.base.annotations.ModuleInfo; import me.melontini.andromeda.base.annotations.OldConfigKey; import me.melontini.andromeda.base.annotations.Unscoped; -import me.melontini.andromeda.base.config.BasicConfig; @Unscoped @OldConfigKey("balancedMending") @ModuleInfo(name = "balanced_mending", category = "items") -public class BalancedMending extends Module { +public class BalancedMending extends Module { } diff --git a/src/main/java/me/melontini/andromeda/modules/items/better_names/BetterNames.java b/src/main/java/me/melontini/andromeda/modules/items/better_names/BetterNames.java index de0d2c94..7077beab 100644 --- a/src/main/java/me/melontini/andromeda/modules/items/better_names/BetterNames.java +++ b/src/main/java/me/melontini/andromeda/modules/items/better_names/BetterNames.java @@ -4,10 +4,9 @@ import me.melontini.andromeda.base.Environment; import me.melontini.andromeda.base.Module; import me.melontini.andromeda.base.annotations.ModuleInfo; import me.melontini.andromeda.base.annotations.OldConfigKey; -import me.melontini.andromeda.base.config.BasicConfig; @OldConfigKey("slightlyBetterItemNames") @ModuleInfo(name = "better_names", category = "items", environment = Environment.CLIENT) -public class BetterNames extends Module { +public class BetterNames extends Module { } diff --git a/src/main/java/me/melontini/andromeda/modules/items/infinite_totem/InfiniteTotem.java b/src/main/java/me/melontini/andromeda/modules/items/infinite_totem/InfiniteTotem.java index 152d6907..3479dace 100644 --- a/src/main/java/me/melontini/andromeda/modules/items/infinite_totem/InfiniteTotem.java +++ b/src/main/java/me/melontini/andromeda/modules/items/infinite_totem/InfiniteTotem.java @@ -3,7 +3,6 @@ package me.melontini.andromeda.modules.items.infinite_totem; import com.google.gson.JsonObject; import me.melontini.andromeda.base.Module; import me.melontini.andromeda.base.annotations.ModuleInfo; -import me.melontini.andromeda.base.config.BasicConfig; import me.melontini.andromeda.util.JsonOps; @ModuleInfo(name = "infinite_totem", category = "items") @@ -19,7 +18,7 @@ public class InfiniteTotem extends Module { } } - public static class Config extends BasicConfig { + public static class Config extends BaseConfig { public boolean enableAscension = true; } diff --git a/src/main/java/me/melontini/andromeda/modules/items/lockpick/Lockpick.java b/src/main/java/me/melontini/andromeda/modules/items/lockpick/Lockpick.java index 564a854a..9526f593 100644 --- a/src/main/java/me/melontini/andromeda/modules/items/lockpick/Lockpick.java +++ b/src/main/java/me/melontini/andromeda/modules/items/lockpick/Lockpick.java @@ -4,7 +4,6 @@ import com.google.gson.JsonObject; import me.melontini.andromeda.base.Module; import me.melontini.andromeda.base.annotations.ModuleInfo; import me.melontini.andromeda.base.annotations.Unscoped; -import me.melontini.andromeda.base.config.BasicConfig; import me.melontini.andromeda.util.JsonOps; import me.melontini.dark_matter.api.base.util.MathStuff; @@ -29,7 +28,7 @@ public class Lockpick extends Module { return this.config().chance - 1 == 0 || MathStuff.threadRandom().nextInt(this.config().chance - 1) == 0; } - public static class Config extends BasicConfig { + public static class Config extends BaseConfig { public int chance = 3; diff --git a/src/main/java/me/melontini/andromeda/modules/items/magnet/Magnet.java b/src/main/java/me/melontini/andromeda/modules/items/magnet/Magnet.java index 08bf013b..04c9ef9e 100644 --- a/src/main/java/me/melontini/andromeda/modules/items/magnet/Magnet.java +++ b/src/main/java/me/melontini/andromeda/modules/items/magnet/Magnet.java @@ -3,9 +3,8 @@ package me.melontini.andromeda.modules.items.magnet; import me.melontini.andromeda.base.Module; import me.melontini.andromeda.base.annotations.ModuleInfo; import me.melontini.andromeda.base.annotations.Unscoped; -import me.melontini.andromeda.base.config.BasicConfig; @Unscoped @ModuleInfo(name = "magnet", category = "items") -public class Magnet extends Module { +public class Magnet extends Module { } diff --git a/src/main/java/me/melontini/andromeda/modules/items/minecart_block_picking/MinecartBlockPicking.java b/src/main/java/me/melontini/andromeda/modules/items/minecart_block_picking/MinecartBlockPicking.java index 5e9bcf81..76dd3b60 100644 --- a/src/main/java/me/melontini/andromeda/modules/items/minecart_block_picking/MinecartBlockPicking.java +++ b/src/main/java/me/melontini/andromeda/modules/items/minecart_block_picking/MinecartBlockPicking.java @@ -4,7 +4,6 @@ import com.google.gson.JsonObject; import me.melontini.andromeda.base.Module; import me.melontini.andromeda.base.annotations.ModuleInfo; import me.melontini.andromeda.base.annotations.Unscoped; -import me.melontini.andromeda.base.config.BasicConfig; import me.melontini.andromeda.util.JsonOps; @Unscoped @@ -23,7 +22,7 @@ public class MinecartBlockPicking extends Module { JsonOps.ifPresent(config, "minecartSpawnerPicking", e -> this.config().spawnerPicking = e.getAsBoolean()); } - public static class Config extends BasicConfig { + public static class Config extends BaseConfig { public boolean spawnerPicking = false; } diff --git a/src/main/java/me/melontini/andromeda/modules/items/tooltips/Tooltips.java b/src/main/java/me/melontini/andromeda/modules/items/tooltips/Tooltips.java index b46e11f3..e95937aa 100644 --- a/src/main/java/me/melontini/andromeda/modules/items/tooltips/Tooltips.java +++ b/src/main/java/me/melontini/andromeda/modules/items/tooltips/Tooltips.java @@ -4,7 +4,6 @@ import com.google.gson.JsonObject; import me.melontini.andromeda.base.Environment; import me.melontini.andromeda.base.Module; import me.melontini.andromeda.base.annotations.ModuleInfo; -import me.melontini.andromeda.base.config.BasicConfig; import me.melontini.andromeda.util.JsonOps; @ModuleInfo(name = "tooltips", category = "items", environment = Environment.CLIENT) @@ -22,7 +21,7 @@ public class Tooltips extends Module { } } - public static class Config extends BasicConfig { + public static class Config extends BaseConfig { public boolean clock = true; diff --git a/src/main/java/me/melontini/andromeda/modules/mechanics/dragon_fight/DragonFight.java b/src/main/java/me/melontini/andromeda/modules/mechanics/dragon_fight/DragonFight.java index 96d01d57..c972e298 100644 --- a/src/main/java/me/melontini/andromeda/modules/mechanics/dragon_fight/DragonFight.java +++ b/src/main/java/me/melontini/andromeda/modules/mechanics/dragon_fight/DragonFight.java @@ -5,7 +5,6 @@ import me.melontini.andromeda.base.Environment; import me.melontini.andromeda.base.Module; import me.melontini.andromeda.base.annotations.ModuleInfo; import me.melontini.andromeda.base.annotations.Unscoped; -import me.melontini.andromeda.base.config.BasicConfig; import me.melontini.andromeda.common.registries.Common; import me.melontini.andromeda.util.JsonOps; import me.shedaniel.autoconfig.annotation.ConfigEntry; @@ -31,7 +30,7 @@ public class DragonFight extends Module { Common.bootstrap(this, EnderDragonManager.class); } - public static class Config extends BasicConfig { + public static class Config extends BaseConfig { @ConfigEntry.Category("mechanics") public boolean respawnCrystals = true; diff --git a/src/main/java/me/melontini/andromeda/modules/mechanics/throwable_items/ThrowableItems.java b/src/main/java/me/melontini/andromeda/modules/mechanics/throwable_items/ThrowableItems.java index 8c73967a..cd6b27e7 100644 --- a/src/main/java/me/melontini/andromeda/modules/mechanics/throwable_items/ThrowableItems.java +++ b/src/main/java/me/melontini/andromeda/modules/mechanics/throwable_items/ThrowableItems.java @@ -6,7 +6,6 @@ import me.melontini.andromeda.base.Module; import me.melontini.andromeda.base.annotations.ModuleInfo; import me.melontini.andromeda.base.annotations.SpecialEnvironment; import me.melontini.andromeda.base.annotations.Unscoped; -import me.melontini.andromeda.base.config.BasicConfig; import me.melontini.andromeda.common.registries.Common; import me.melontini.andromeda.modules.mechanics.throwable_items.data.ItemBehaviorData; import me.melontini.andromeda.util.JsonOps; @@ -32,7 +31,7 @@ public class ThrowableItems extends Module { Common.bootstrap(this, Content.class, ItemBehaviorData.class); } - public static class Config extends BasicConfig { + public static class Config extends BaseConfig { @SpecialEnvironment(Environment.SERVER) public boolean canZombiesThrowItems = true; diff --git a/src/main/java/me/melontini/andromeda/modules/mechanics/trading_goat_horn/GoatHorn.java b/src/main/java/me/melontini/andromeda/modules/mechanics/trading_goat_horn/GoatHorn.java index 1a04cbd6..431e1e5f 100644 --- a/src/main/java/me/melontini/andromeda/modules/mechanics/trading_goat_horn/GoatHorn.java +++ b/src/main/java/me/melontini/andromeda/modules/mechanics/trading_goat_horn/GoatHorn.java @@ -4,10 +4,9 @@ import me.melontini.andromeda.base.Environment; import me.melontini.andromeda.base.Module; import me.melontini.andromeda.base.annotations.ModuleInfo; import me.melontini.andromeda.base.annotations.OldConfigKey; -import me.melontini.andromeda.base.config.BasicConfig; @OldConfigKey("tradingGoatHorn") @ModuleInfo(name = "trading_goat_horn", category = "mechanics", environment = Environment.SERVER) -public class GoatHorn extends Module { +public class GoatHorn extends Module { } diff --git a/src/main/java/me/melontini/andromeda/modules/mechanics/villager_gifting/VillagerGifting.java b/src/main/java/me/melontini/andromeda/modules/mechanics/villager_gifting/VillagerGifting.java index 51b01625..ed9cf75a 100644 --- a/src/main/java/me/melontini/andromeda/modules/mechanics/villager_gifting/VillagerGifting.java +++ b/src/main/java/me/melontini/andromeda/modules/mechanics/villager_gifting/VillagerGifting.java @@ -4,12 +4,11 @@ import me.melontini.andromeda.base.Environment; import me.melontini.andromeda.base.Module; import me.melontini.andromeda.base.annotations.ModuleInfo; import me.melontini.andromeda.base.annotations.OldConfigKey; -import me.melontini.andromeda.base.config.BasicConfig; import me.melontini.andromeda.common.registries.Common; @OldConfigKey("villagerGifting") @ModuleInfo(name = "villager_gifting", category = "mechanics", environment = Environment.SERVER) -public class VillagerGifting extends Module { +public class VillagerGifting extends Module { @Override public void onMain() { diff --git a/src/main/java/me/melontini/andromeda/modules/misc/damage_backport/DamageBackport.java b/src/main/java/me/melontini/andromeda/modules/misc/damage_backport/DamageBackport.java index 65c4a096..8364a9fa 100644 --- a/src/main/java/me/melontini/andromeda/modules/misc/damage_backport/DamageBackport.java +++ b/src/main/java/me/melontini/andromeda/modules/misc/damage_backport/DamageBackport.java @@ -5,13 +5,12 @@ import me.melontini.andromeda.base.Module; import me.melontini.andromeda.base.annotations.ModuleInfo; import me.melontini.andromeda.base.annotations.OldConfigKey; import me.melontini.andromeda.base.annotations.Unscoped; -import me.melontini.andromeda.base.config.BasicConfig; import me.melontini.andromeda.common.registries.Common; @Unscoped @OldConfigKey("damageBackport") @ModuleInfo(name = "damage_backport", category = "misc", environment = Environment.SERVER) -public class DamageBackport extends Module { +public class DamageBackport extends Module { @Override public void onMain() { diff --git a/src/main/java/me/melontini/andromeda/modules/misc/minor_inconvenience/MinorInconvenience.java b/src/main/java/me/melontini/andromeda/modules/misc/minor_inconvenience/MinorInconvenience.java index 24bc8411..f9fbdbb5 100644 --- a/src/main/java/me/melontini/andromeda/modules/misc/minor_inconvenience/MinorInconvenience.java +++ b/src/main/java/me/melontini/andromeda/modules/misc/minor_inconvenience/MinorInconvenience.java @@ -3,11 +3,10 @@ package me.melontini.andromeda.modules.misc.minor_inconvenience; import me.melontini.andromeda.base.Module; import me.melontini.andromeda.base.annotations.ModuleInfo; import me.melontini.andromeda.base.annotations.OldConfigKey; -import me.melontini.andromeda.base.config.BasicConfig; @OldConfigKey("minorInconvenience") @ModuleInfo(name = "minor_inconvenience", category = "misc") -public class MinorInconvenience extends Module { +public class MinorInconvenience extends Module { @Override public void onMain() { diff --git a/src/main/java/me/melontini/andromeda/modules/misc/recipe_advancements_generation/AdvancementGeneration.java b/src/main/java/me/melontini/andromeda/modules/misc/recipe_advancements_generation/AdvancementGeneration.java index b66e712b..5081734a 100644 --- a/src/main/java/me/melontini/andromeda/modules/misc/recipe_advancements_generation/AdvancementGeneration.java +++ b/src/main/java/me/melontini/andromeda/modules/misc/recipe_advancements_generation/AdvancementGeneration.java @@ -5,7 +5,6 @@ import com.google.gson.JsonObject; import me.melontini.andromeda.base.Environment; import me.melontini.andromeda.base.Module; import me.melontini.andromeda.base.annotations.ModuleInfo; -import me.melontini.andromeda.base.config.BasicConfig; import me.melontini.andromeda.common.registries.Common; import me.melontini.andromeda.util.JsonOps; @@ -48,7 +47,7 @@ public class AdvancementGeneration extends Module Common.bootstrap(this, Helper.class); } - public static class Config extends BasicConfig { + public static class Config extends BaseConfig { public boolean requireAllItems = true; diff --git a/src/main/java/me/melontini/andromeda/modules/misc/translations/Translations.java b/src/main/java/me/melontini/andromeda/modules/misc/translations/Translations.java index 06a724dd..a77400de 100644 --- a/src/main/java/me/melontini/andromeda/modules/misc/translations/Translations.java +++ b/src/main/java/me/melontini/andromeda/modules/misc/translations/Translations.java @@ -4,11 +4,10 @@ import me.melontini.andromeda.base.Environment; import me.melontini.andromeda.base.Module; import me.melontini.andromeda.base.annotations.ModuleInfo; import me.melontini.andromeda.base.annotations.OldConfigKey; -import me.melontini.andromeda.base.config.BasicConfig; @OldConfigKey("autoUpdateTranslations") @ModuleInfo(name = "translations", category = "misc", environment = Environment.CLIENT) -public class Translations extends Module { +public class Translations extends Module { @Override public void onClient() { diff --git a/src/main/java/me/melontini/andromeda/modules/misc/unknown/Unknown.java b/src/main/java/me/melontini/andromeda/modules/misc/unknown/Unknown.java index 733f0fef..613d4179 100644 --- a/src/main/java/me/melontini/andromeda/modules/misc/unknown/Unknown.java +++ b/src/main/java/me/melontini/andromeda/modules/misc/unknown/Unknown.java @@ -4,12 +4,11 @@ import me.melontini.andromeda.base.Module; import me.melontini.andromeda.base.annotations.ModuleInfo; import me.melontini.andromeda.base.annotations.OldConfigKey; import me.melontini.andromeda.base.annotations.Unscoped; -import me.melontini.andromeda.base.config.BasicConfig; @Unscoped @OldConfigKey("unknown") @ModuleInfo(name = "unknown", category = "misc") -public class Unknown extends Module { +public class Unknown extends Module { public static String DEBUG_SPLASH; } diff --git a/src/main/java/me/melontini/andromeda/modules/world/auto_planting/AutoPlanting.java b/src/main/java/me/melontini/andromeda/modules/world/auto_planting/AutoPlanting.java index 838efb8b..2aa701e1 100644 --- a/src/main/java/me/melontini/andromeda/modules/world/auto_planting/AutoPlanting.java +++ b/src/main/java/me/melontini/andromeda/modules/world/auto_planting/AutoPlanting.java @@ -7,7 +7,6 @@ import me.melontini.andromeda.base.Environment; import me.melontini.andromeda.base.Module; import me.melontini.andromeda.base.annotations.ModuleInfo; import me.melontini.andromeda.base.annotations.Origin; -import me.melontini.andromeda.base.config.BasicConfig; import me.melontini.andromeda.util.JsonOps; import java.util.ArrayList; @@ -35,7 +34,7 @@ public class AutoPlanting extends Module { } } - public static class Config extends BasicConfig { + public static class Config extends BaseConfig { public boolean blacklistMode = true; diff --git a/src/main/java/me/melontini/andromeda/modules/world/crop_temperature/PlantTemperature.java b/src/main/java/me/melontini/andromeda/modules/world/crop_temperature/PlantTemperature.java index 0e680313..d91409f4 100644 --- a/src/main/java/me/melontini/andromeda/modules/world/crop_temperature/PlantTemperature.java +++ b/src/main/java/me/melontini/andromeda/modules/world/crop_temperature/PlantTemperature.java @@ -4,7 +4,6 @@ import me.melontini.andromeda.base.Environment; import me.melontini.andromeda.base.Module; import me.melontini.andromeda.base.annotations.ModuleInfo; import me.melontini.andromeda.base.annotations.OldConfigKey; -import me.melontini.andromeda.base.config.BasicConfig; import me.melontini.andromeda.common.registries.Common; @OldConfigKey("temperatureBasedCropGrowthSpeed") @@ -16,7 +15,7 @@ public class PlantTemperature extends Module { Common.bootstrap(this, PlantTemperatureData.class); } - public static class Config extends BasicConfig { + public static class Config extends BaseConfig { public boolean affectBoneMeal = true; } } diff --git a/src/main/java/me/melontini/andromeda/modules/world/falling_beenests/CanBeeNestsFall.java b/src/main/java/me/melontini/andromeda/modules/world/falling_beenests/CanBeeNestsFall.java index bd034978..9df8a810 100644 --- a/src/main/java/me/melontini/andromeda/modules/world/falling_beenests/CanBeeNestsFall.java +++ b/src/main/java/me/melontini/andromeda/modules/world/falling_beenests/CanBeeNestsFall.java @@ -4,10 +4,9 @@ import me.melontini.andromeda.base.Environment; import me.melontini.andromeda.base.Module; import me.melontini.andromeda.base.annotations.ModuleInfo; import me.melontini.andromeda.base.annotations.OldConfigKey; -import me.melontini.andromeda.base.config.BasicConfig; @OldConfigKey("canBeeNestsFall") @ModuleInfo(name = "falling_beenests", category = "world", environment = Environment.SERVER) -public class CanBeeNestsFall extends Module { +public class CanBeeNestsFall extends Module { } diff --git a/src/main/java/me/melontini/andromeda/modules/world/moist_control/MoistControl.java b/src/main/java/me/melontini/andromeda/modules/world/moist_control/MoistControl.java index 6747221d..e401ae34 100644 --- a/src/main/java/me/melontini/andromeda/modules/world/moist_control/MoistControl.java +++ b/src/main/java/me/melontini/andromeda/modules/world/moist_control/MoistControl.java @@ -3,12 +3,11 @@ package me.melontini.andromeda.modules.world.moist_control; import me.melontini.andromeda.base.Environment; import me.melontini.andromeda.base.Module; import me.melontini.andromeda.base.annotations.ModuleInfo; -import me.melontini.andromeda.base.config.BasicConfig; @ModuleInfo(name = "moist_control", category = "world", environment = Environment.SERVER) public class MoistControl extends Module { - public static class Config extends BasicConfig { + public static class Config extends BaseConfig { public int customMoisture = 4; } } \ No newline at end of file diff --git a/src/main/java/me/melontini/andromeda/modules/world/quick_fire/QuickFire.java b/src/main/java/me/melontini/andromeda/modules/world/quick_fire/QuickFire.java index 781c6e1c..2cb3be9a 100644 --- a/src/main/java/me/melontini/andromeda/modules/world/quick_fire/QuickFire.java +++ b/src/main/java/me/melontini/andromeda/modules/world/quick_fire/QuickFire.java @@ -4,10 +4,9 @@ import me.melontini.andromeda.base.Environment; import me.melontini.andromeda.base.Module; import me.melontini.andromeda.base.annotations.ModuleInfo; import me.melontini.andromeda.base.annotations.OldConfigKey; -import me.melontini.andromeda.base.config.BasicConfig; @OldConfigKey("quickFire") @ModuleInfo(name = "quick_fire", category = "world", environment = Environment.SERVER) -public class QuickFire extends Module { +public class QuickFire extends Module { } diff --git a/src/main/java/me/melontini/andromeda/util/CrashHandler.java b/src/main/java/me/melontini/andromeda/util/CrashHandler.java index f3530196..b5313632 100644 --- a/src/main/java/me/melontini/andromeda/util/CrashHandler.java +++ b/src/main/java/me/melontini/andromeda/util/CrashHandler.java @@ -4,7 +4,7 @@ import com.google.common.collect.Sets; import com.google.gson.JsonArray; import com.google.gson.JsonObject; import me.melontini.andromeda.base.Bootstrap; -import me.melontini.andromeda.base.config.Config; +import me.melontini.andromeda.base.AndromedaConfig; import me.melontini.andromeda.util.exceptions.AndromedaException; import me.melontini.dark_matter.api.base.util.classes.Context; import me.melontini.dark_matter.api.crash_handler.Crashlytics; @@ -41,7 +41,7 @@ public class CrashHandler { } public static void handleCrash(Throwable cause, Context context) { - if (FabricLoader.getInstance().isDevelopmentEnvironment() || !Config.get().sendCrashReports) return; + if (FabricLoader.getInstance().isDevelopmentEnvironment() || !AndromedaConfig.get().sendCrashReports) return; if (context.get(IMixinInfo.class, Crashlytics.Keys.MIXIN_INFO).map(info -> info.getClassName().startsWith("me.melontini.andromeda")).orElse(false) || findAndromedaInTrace(cause)) { AndromedaLog.warn("Found Andromeda in trace, collecting and uploading crash report..."); JsonObject object = new JsonObject(); diff --git a/src/main/java/me/melontini/andromeda/util/Debug.java b/src/main/java/me/melontini/andromeda/util/Debug.java index 32864ecb..30779cfb 100644 --- a/src/main/java/me/melontini/andromeda/util/Debug.java +++ b/src/main/java/me/melontini/andromeda/util/Debug.java @@ -1,7 +1,7 @@ package me.melontini.andromeda.util; import lombok.CustomLog; -import me.melontini.andromeda.base.config.BasicConfig; +import me.melontini.andromeda.base.Module; import me.melontini.andromeda.util.mixin.ErrorHandler; import me.melontini.dark_matter.api.base.config.ConfigManager; import net.fabricmc.loader.api.FabricLoader; @@ -64,7 +64,7 @@ public class Debug { */ public static final String ENABLE_ALL_MODULES = "enableAllModules"; /** - * Forces all configs to be in {@link BasicConfig.Scope#DIMENSION}. + * Forces all configs to be in {@link Module.BaseConfig.Scope#DIMENSION}. */ public static final String FORCE_DIMENSION_SCOPE = "forceDimensionScope"; /** -- 2.51.2 From c53edb67adefe46712b387dd42eeda5f5b019b19 Mon Sep 17 00:00:00 2001 From: melontini <104443436+melontini@users.noreply.github.com> Date: Fri, 5 Jan 2024 22:22:13 +0700 Subject: [PATCH 04/15] Revert "Revert "Maybe not."" This reverts commit 3db266106ecca021566ee40bf617fe5fd436d559. --- CHANGELOG.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5663ac0b..9b48338a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,8 +2,7 @@ ## Alpha warning! -- **1.19.3 is no longer supported!** -- **1.18.2 will no longer receive alpha updates!** +- **1.19.3 & 1.18.2 will no longer receive alpha updates!** *** -- 2.51.2 From b343e31a952902b2ee51af1fb838083ce5a1340b Mon Sep 17 00:00:00 2001 From: melontini <104443436+melontini@users.noreply.github.com> Date: Sat, 6 Jan 2024 19:44:55 +0700 Subject: [PATCH 05/15] Overcomplicate crash handling (again?) --- .../melontini/andromeda/base/Bootstrap.java | 87 +++++++++---------- .../andromeda/base/MixinProcessor.java | 2 +- .../common/config/ScopedConfigs.java | 11 +-- .../common/mixin/CrashReportMixin.java | 21 +++++ .../andromeda/common/registries/Common.java | 3 +- .../andromeda/modules/ModuleDiscovery.java | 3 +- .../misc/translations/TranslationUpdater.java | 2 +- .../andromeda/util/CrashHandler.java | 52 +++++++++-- .../me/melontini/andromeda/util/Debug.java | 1 + .../util/exceptions/AndromedaException.java | 85 ++++++++++-------- 10 files changed, 164 insertions(+), 103 deletions(-) create mode 100644 src/main/java/me/melontini/andromeda/common/mixin/CrashReportMixin.java diff --git a/src/main/java/me/melontini/andromeda/base/Bootstrap.java b/src/main/java/me/melontini/andromeda/base/Bootstrap.java index d67c4eb5..2676862d 100644 --- a/src/main/java/me/melontini/andromeda/base/Bootstrap.java +++ b/src/main/java/me/melontini/andromeda/base/Bootstrap.java @@ -26,10 +26,10 @@ import org.spongepowered.asm.mixin.Mixins; import java.io.IOException; import java.nio.file.Files; import java.util.*; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.ForkJoinPool; import java.util.concurrent.atomic.AtomicReference; +import static me.melontini.andromeda.util.exceptions.AndromedaException.run; + /** * Bootstrap is responsible for bootstrapping the bulk of Andromeda. *

This includes, but not limited to:
@@ -45,41 +45,38 @@ import java.util.concurrent.atomic.AtomicReference; public class Bootstrap { static ModuleManager INSTANCE; - static volatile Status STATUS = Status.PRE_INIT; @Environment(EnvType.CLIENT) public static void onClient() { - updateStatus(Status.CLIENT); + Status.update(Status.CLIENT); if (Debug.hasKey(Debug.Keys.VERIFY_MIXINS)) MixinEnvironment.getCurrentEnvironment().audit(); for (Module module : ModuleManager.get().loaded()) { - AndromedaException.run(module::onClient, () -> - new AndromedaException.Builder().message("Failed to execute Module.onClient!").add("module", module.meta().id())); + run(module::onClient, (b) -> b.message("Failed to execute Module.onClient!").add("module", module.meta().id())); } - AndromedaClient.init(); + run(AndromedaClient::init, b -> b.message("Failed to initialize AndromedaClient!")); } @Environment(EnvType.SERVER) public static void onServer() { - updateStatus(Status.SERVER); + Status.update(Status.SERVER); if (Debug.hasKey(Debug.Keys.VERIFY_MIXINS)) MixinEnvironment.getCurrentEnvironment().audit(); for (Module module : ModuleManager.get().loaded()) { - AndromedaException.run(module::onServer, () -> - new AndromedaException.Builder().message("Failed to execute Module.onServer!").add("module", module.meta().id())); + run(module::onServer, (b) -> b.message("Failed to execute Module.onServer!").add("module", module.meta().id())); } } public static void onMain() { - updateStatus(Status.MAIN); + Status.update(Status.MAIN); if (Mixins.getUnvisitedCount() > 0) { for (org.spongepowered.asm.mixin.transformer.Config config : Mixins.getConfigs()) { if (!config.isVisited() && config.getName().startsWith("andromeda_dynamic$$")) - throw new AndromedaException.Builder() + throw AndromedaException.builder() .message("Mixin failed to consume Andromeda's late configs!") .add("mixin_config", config.getName()) .build(); @@ -87,18 +84,15 @@ public class Bootstrap { } for (Module module : ModuleManager.get().loaded()) { - AndromedaException.run(module::onMain, () -> - new AndromedaException.Builder().message("Failed to execute Module.onMain!").add("module", module.meta().id())); + run(module::onMain, (b) -> b.message("Failed to execute Module.onMain!").add("module", module.meta().id())); } - Andromeda.init(); + run(Andromeda::init, b -> b.message("Failed to initialize Andromeda!")); } public static void onPreLaunch() { LOGGER.info("Andromeda({}) on {}({})", CommonValues.version(), CommonValues.platform(), CommonValues.platform().version()); - Crashlytics.addHandler("andromeda", CrashHandler::handleCrash); - AtomicReference oldCfg = new AtomicReference<>(); var oldCfgPath = FabricLoader.getInstance().getConfigDir().resolve("andromeda.json"); if (Files.exists(oldCfgPath)) { @@ -115,14 +109,14 @@ public class Bootstrap { AndromedaConfig.load(); - updateStatus(Status.DISCOVERY); + Status.update(Status.DISCOVERY); List> list = new ArrayList<>(40); - AndromedaException.run(() -> { + run(() -> { //This should probably be removed. ServiceLoader.load(Module.class).stream().map(ServiceLoader.Provider::get).forEach(list::add); EntrypointRunner.run("andromeda:modules", ModuleManager.ModuleSupplier.class, s -> list.addAll(s.get())); - }, () -> new AndromedaException.Builder().message("Failed during module discovery!")); + }, (b) -> b.message("Failed during module discovery!")); if (list.isEmpty()) { LOGGER.error("Andromeda couldn't discover any modules! This should not happen!"); @@ -137,27 +131,27 @@ public class Bootstrap { return i >= 0 ? i : ModuleManager.CATEGORIES.size(); })).toList(); - updateStatus(Status.SETUP); + Status.update(Status.SETUP); ModuleManager m; try { m = new ModuleManager(sorted, oldCfg.get()); } catch (Throwable t) {//Manager constructor does a lot of heavy-lifting, so we want to catch any errors. - throw new AndromedaException.Builder() + throw AndromedaException.builder() .cause(t).message("Failed to initialize ModuleManager!!!") .build(); } m.print(); //Scan for mixins. m.loaded().forEach(module -> getModuleClassPath().addUrl(module.getClass().getProtectionDomain().getCodeSource().getLocation())); - MixinProcessor.addMixins(m); + run(() -> MixinProcessor.addMixins(m), (b) -> b.message("Failed to inject dynamic mixin configs!")); FabricLoader.getInstance().getObjectShare().put("andromeda:module_manager", m); - updateStatus(Status.PRE_LAUNCH); + Status.update(Status.PRE_LAUNCH); + Crashlytics.addHandler("andromeda", CrashHandler::handleCrash); for (Module module : ModuleManager.get().loaded()) { - AndromedaException.run(module::onPreLaunch, () -> - new AndromedaException.Builder().message("Failed to execute Module.onPreLaunch!").add("module", module.meta().id())); + run(module::onPreLaunch, (b) -> b.message("Failed to execute Module.onPreLaunch!").add("module", module.meta().id())); } } @@ -169,11 +163,17 @@ public class Bootstrap { var id = ids.put(module.meta().id(), module); if (id != null) - throw new IllegalStateException("Duplicate module IDs! ID: %s, Duplicate: %s, Module: %s".formatted(module.meta().id(), module.getClass(), id.getClass())); + throw AndromedaException.builder() + .message("Duplicate module IDs!") + .add("identifier", module.meta().id()).add("module", id.getClass()).add("duplicate", module.getClass()) + .build(); var pkg = packages.put(module.getClass().getPackageName(), module); if (pkg != null) - throw new IllegalStateException("Duplicate module packages! Package: %s, Duplicate: %s, Module: %s".formatted(module.getClass().getPackageName(), module.getClass(), pkg.getClass())); + throw AndromedaException.builder() + .message("Duplicate module packages!") + .add("package", module.getClass().getPackageName()).add("module", pkg.getClass()).add("duplicate", module.getClass()) + .build(); } } @@ -189,10 +189,6 @@ public class Bootstrap { return AndromedaMixins.getClassPath(); } - public static ExecutorService getPreLaunchService() { - return ForkJoinPool.commonPool(); - } - public static boolean testModVersion(Module m, String modId, String predicate) { Optional mod = FabricLoader.getInstance().getModContainer(modId); if (mod.isPresent() && !Debug.skipIntegration(m.meta().id(), modId)) { @@ -210,22 +206,19 @@ public class Bootstrap { return !Debug.skipIntegration(m.meta().id(), modId) && FabricLoader.getInstance().isModLoaded(modId); } - public static Status getStatus() { - return STATUS; - } + public enum Status { + PRE_INIT, DISCOVERY, SETUP, + PRE_LAUNCH, MAIN, CLIENT, SERVER; - private static void updateStatus(Status status) { - STATUS = status; - LOGGER.debug("Status updated to {}", status); - } + private static volatile Status CURRENT = PRE_INIT; - public enum Status { - PRE_INIT, - DISCOVERY, - SETUP, - PRE_LAUNCH, - MAIN, - CLIENT, - SERVER + public static void update(Status status) { + Status.CURRENT = status; + LOGGER.debug("Status updated to {}", status); + } + + public static Status get() { + return CURRENT; + } } } diff --git a/src/main/java/me/melontini/andromeda/base/MixinProcessor.java b/src/main/java/me/melontini/andromeda/base/MixinProcessor.java index 5a660ba5..01690ea7 100644 --- a/src/main/java/me/melontini/andromeda/base/MixinProcessor.java +++ b/src/main/java/me/melontini/andromeda/base/MixinProcessor.java @@ -47,7 +47,7 @@ public class MixinProcessor { Mixins.addConfiguration(cfg); manager.mixinConfigs.put(cfg, module); } catch (IOException e) { - throw new AndromedaException.Builder() + throw AndromedaException.builder() .message("Couldn't inject mixin config for module '%s'".formatted(module.meta().id())) .add("mixin_config", cfg).add("module", module.meta().id()).build(); } finally { diff --git a/src/main/java/me/melontini/andromeda/common/config/ScopedConfigs.java b/src/main/java/me/melontini/andromeda/common/config/ScopedConfigs.java index ff7973f5..4893a600 100644 --- a/src/main/java/me/melontini/andromeda/common/config/ScopedConfigs.java +++ b/src/main/java/me/melontini/andromeda/common/config/ScopedConfigs.java @@ -5,6 +5,7 @@ import lombok.SneakyThrows; import me.melontini.andromeda.base.Module; import me.melontini.andromeda.base.ModuleManager; import me.melontini.andromeda.util.AndromedaLog; +import me.melontini.andromeda.util.exceptions.AndromedaException; import me.melontini.dark_matter.api.base.util.Utilities; import me.melontini.dark_matter.api.minecraft.world.PersistentStateHelper; import me.melontini.dark_matter.api.minecraft.world.interfaces.DeserializableState; @@ -29,7 +30,10 @@ public class ScopedConfigs { case DIMENSION -> get(sw).get(module); }; } - AndromedaLog.error("Scoped configs requested on client! Returning un-scoped! Module: %s".formatted(module.meta().id())); + AndromedaLog.error("Scoped configs requested on client! Returning un-scoped!", AndromedaException.builder() + .add("module", module.meta().id()) + .add("world", world.getRegistryKey()) + .build()); return module.config(); } @@ -81,10 +85,7 @@ public class ScopedConfigs { } default T am$get(Module module) { - if (this instanceof ServerWorld w) { - return ScopedConfigs.get(w, module); - } - return module.config(); + return ScopedConfigs.get((World) this, module); } default void am$save(Class> cls) { diff --git a/src/main/java/me/melontini/andromeda/common/mixin/CrashReportMixin.java b/src/main/java/me/melontini/andromeda/common/mixin/CrashReportMixin.java new file mode 100644 index 00000000..311730a7 --- /dev/null +++ b/src/main/java/me/melontini/andromeda/common/mixin/CrashReportMixin.java @@ -0,0 +1,21 @@ +package me.melontini.andromeda.common.mixin; + +import me.melontini.andromeda.util.CrashHandler; +import net.minecraft.util.crash.CrashReport; +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; + +@Mixin(CrashReport.class) +abstract class CrashReportMixin { + + @Inject(at = @At("TAIL"), method = "", require = 0) + private void andromeda$init(String message, Throwable cause, CallbackInfo ci) { + try { + var sec = ((CrashReport) (Object) this).addElement("Andromeda Statuses"); + CrashHandler.traverse(sec::add, ((CrashReport) (Object) this).getCause(), 0); + } catch (Exception ignored) { + } + } +} diff --git a/src/main/java/me/melontini/andromeda/common/registries/Common.java b/src/main/java/me/melontini/andromeda/common/registries/Common.java index 1c4fa9ec..3f3791c5 100644 --- a/src/main/java/me/melontini/andromeda/common/registries/Common.java +++ b/src/main/java/me/melontini/andromeda/common/registries/Common.java @@ -38,8 +38,7 @@ public class Common { Reflect.findMethod(cls, "init", module.getClass()).ifPresent(m -> Exceptions.run(() -> m.invoke(null, module))); Reflect.findMethod(cls, "init").ifPresent(m -> Exceptions.run(() -> m.invoke(null))); } - }, () -> new AndromedaException.Builder() - .message("Failed to bootstrap module!") + }, (b) -> b.message("Failed to bootstrap module!") .add("module", module.meta().id()).add("classes", Arrays.toString(classes))); } diff --git a/src/main/java/me/melontini/andromeda/modules/ModuleDiscovery.java b/src/main/java/me/melontini/andromeda/modules/ModuleDiscovery.java index 1bec2c8d..f52f44ed 100644 --- a/src/main/java/me/melontini/andromeda/modules/ModuleDiscovery.java +++ b/src/main/java/me/melontini/andromeda/modules/ModuleDiscovery.java @@ -14,6 +14,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Objects; import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ForkJoinPool; public class ModuleDiscovery implements ModuleManager.ModuleSupplier { @Override @@ -36,7 +37,7 @@ public class ModuleDiscovery implements ModuleManager.ModuleSupplier { .newInstance()); } return null; - }, Bootstrap.getPreLaunchService()))); + }, ForkJoinPool.commonPool()))); return CompletableFuture.allOf(futures.toArray(CompletableFuture[]::new)) .handle((unused, throwable) -> futures).join().stream() .map(CompletableFuture::join).filter(Objects::nonNull).toList(); diff --git a/src/main/java/me/melontini/andromeda/modules/misc/translations/TranslationUpdater.java b/src/main/java/me/melontini/andromeda/modules/misc/translations/TranslationUpdater.java index 7a93b569..5e7c1e13 100644 --- a/src/main/java/me/melontini/andromeda/modules/misc/translations/TranslationUpdater.java +++ b/src/main/java/me/melontini/andromeda/modules/misc/translations/TranslationUpdater.java @@ -105,7 +105,7 @@ public class TranslationUpdater { return languageCode; } } - throw new AndromedaException.Builder() + throw AndromedaException.builder() .report(false).message("Mo valid language option found!") .build(); } catch (Throwable e) { diff --git a/src/main/java/me/melontini/andromeda/util/CrashHandler.java b/src/main/java/me/melontini/andromeda/util/CrashHandler.java index b5313632..2cd8fc06 100644 --- a/src/main/java/me/melontini/andromeda/util/CrashHandler.java +++ b/src/main/java/me/melontini/andromeda/util/CrashHandler.java @@ -3,8 +3,8 @@ package me.melontini.andromeda.util; import com.google.common.collect.Sets; import com.google.gson.JsonArray; import com.google.gson.JsonObject; -import me.melontini.andromeda.base.Bootstrap; import me.melontini.andromeda.base.AndromedaConfig; +import me.melontini.andromeda.base.Bootstrap; import me.melontini.andromeda.util.exceptions.AndromedaException; import me.melontini.dark_matter.api.base.util.classes.Context; import me.melontini.dark_matter.api.crash_handler.Crashlytics; @@ -20,6 +20,7 @@ import java.io.PrintWriter; import java.io.StringWriter; import java.util.Base64; import java.util.Set; +import java.util.function.BiConsumer; public class CrashHandler { @@ -34,14 +35,36 @@ public class CrashHandler { if (cls.startsWith("me.melontini.andromeda.")) return true; if (cls.startsWith("net.minecraft.")) { String mthd = element.getMethodName(); - return (mthd.contains("$andromeda$") || mthd.contains(".andromeda$")); + if ((mthd.contains("$andromeda$") || mthd.contains(".andromeda$"))) + return true; } } return cause.getCause() != null && findAndromedaInTrace(cause.getCause()); } + private static boolean hasInstance(Throwable cause) { + if (cause instanceof AndromedaException) return true; + return cause.getCause() != null && hasInstance(cause.getCause()); + } + + public static void traverse(BiConsumer acceptor, Throwable cause, int depth) { + if (cause instanceof AndromedaException e) { + String s = "-".repeat(Math.max(0, depth)); + + e.getStatuses().forEach((string, string2) -> acceptor.accept(s + string, string2)); + + if (cause.getCause() != null) traverse(acceptor, cause.getCause(), depth + 1); + return; + } + if (cause.getCause() != null) traverse(acceptor, cause.getCause(), depth); + } + public static void handleCrash(Throwable cause, Context context) { - if (FabricLoader.getInstance().isDevelopmentEnvironment() || !AndromedaConfig.get().sendCrashReports) return; + if (!Debug.hasKey(Debug.Keys.FORCE_CRASH_REPORT_UPLOAD)) { + if (FabricLoader.getInstance().isDevelopmentEnvironment() || !AndromedaConfig.get().sendCrashReports) + return; + } + if (context.get(IMixinInfo.class, Crashlytics.Keys.MIXIN_INFO).map(info -> info.getClassName().startsWith("me.melontini.andromeda")).orElse(false) || findAndromedaInTrace(cause)) { AndromedaLog.warn("Found Andromeda in trace, collecting and uploading crash report..."); JsonObject object = new JsonObject(); @@ -57,9 +80,15 @@ public class CrashHandler { stackTrace.add(string); object.add("stackTrace", stackTrace); - MIXPANEL.attachProps(object, Prop.ENVIRONMENT, Prop.OS, Prop.JAVA_VERSION, Prop.JAVA_VENDOR); - object.addProperty("platform", CommonValues.platform().toString().toLowerCase()); - object.addProperty("bootstrap_status", Bootstrap.getStatus().toString()); + JsonObject statuses = new JsonObject(); + if (!hasInstance(cause)) { + MIXPANEL.attachProps(statuses, Prop.ENVIRONMENT, Prop.OS, Prop.JAVA_VERSION, Prop.JAVA_VENDOR); + statuses.addProperty("platform", CommonValues.platform().toString().toLowerCase()); + statuses.addProperty("bootstrap_status", Bootstrap.Status.get().toString()); + } else { + traverse(statuses::addProperty, cause, 0); + } + object.add("statuses", statuses); JsonArray mods = new JsonArray(); Set importantMods = Sets.newHashSet("andromeda", "minecraft", "fabric-api", "fabricloader", "connectormod", "forge"); @@ -79,8 +108,7 @@ public class CrashHandler { } private static String getFromCrashReport(Context context) { - return context.get(Object.class, Crashlytics.Keys.CRASH_REPORT) - .map(CrashReport.class::cast).map(CrashReport::getMessage).orElse("null"); + return CrashReportProcessor.accept(context); } private static String getCauseAsString(Throwable cause, String message) { @@ -109,4 +137,12 @@ public class CrashHandler { } return throwable; } + + private static class CrashReportProcessor { + + public static String accept(Context context) { + CrashReport report = context.get(CrashReport.class, Crashlytics.Keys.CRASH_REPORT).orElseThrow(); + return report.getMessage(); + } + } } diff --git a/src/main/java/me/melontini/andromeda/util/Debug.java b/src/main/java/me/melontini/andromeda/util/Debug.java index 30779cfb..00a40b2f 100644 --- a/src/main/java/me/melontini/andromeda/util/Debug.java +++ b/src/main/java/me/melontini/andromeda/util/Debug.java @@ -75,5 +75,6 @@ public class Debug { * Prints missing option tooltips for the currently selected language after client resources are loaded. */ public static final String PRINT_MISSING_TOOLTIPS = "printMissingTooltips"; + public static final String FORCE_CRASH_REPORT_UPLOAD = "forceCrashReportUpload"; } } diff --git a/src/main/java/me/melontini/andromeda/util/exceptions/AndromedaException.java b/src/main/java/me/melontini/andromeda/util/exceptions/AndromedaException.java index 05a3591b..481cff55 100644 --- a/src/main/java/me/melontini/andromeda/util/exceptions/AndromedaException.java +++ b/src/main/java/me/melontini/andromeda/util/exceptions/AndromedaException.java @@ -2,23 +2,24 @@ package me.melontini.andromeda.util.exceptions; import com.google.common.base.Strings; import me.melontini.andromeda.base.Bootstrap; +import me.melontini.andromeda.util.CommonValues; +import me.melontini.andromeda.util.CrashHandler; +import me.melontini.dark_matter.api.base.util.classes.Context; import me.melontini.dark_matter.api.base.util.classes.ThrowingRunnable; +import me.melontini.dark_matter.api.crash_handler.Crashlytics; import me.melontini.dark_matter.api.crash_handler.Prop; -import java.util.Collections; -import java.util.LinkedHashMap; -import java.util.Map; -import java.util.function.Supplier; +import java.util.*; +import java.util.function.Consumer; public class AndromedaException extends RuntimeException { private final boolean report; private final Map statuses; - private boolean appendStatuses = true; @SuppressWarnings("unused") private AndromedaException() { - this(false, "Empty ctx called! This must never happen!!!", null, Collections.emptyMap()); + this(false, "Empty ctx called! This must never happen!!!", null, new HashMap<>()); } private AndromedaException(boolean report, String message, Throwable cause, Map statuses) { @@ -29,54 +30,56 @@ public class AndromedaException extends RuntimeException { @Override public String getMessage() { - return buildMessage(report, super.getMessage(), appendStatuses ? statuses : Collections.emptyMap()); + StringBuilder b = new StringBuilder(); + b.append("(Andromeda) "); + if (Strings.isNullOrEmpty(super.getMessage())) b.append("Something went very wrong!"); + else b.append(super.getMessage()); + return b.toString(); } - public boolean shouldReport() { - return report; + public Map getStatuses() { + return Collections.unmodifiableMap(statuses); } - protected static String buildMessage(boolean report, String message, Map statuses) { - StringBuilder b = new StringBuilder(); - b.append("(Andromeda) "); - if (Strings.isNullOrEmpty(message)) b.append("Something went very wrong!"); - else b.append(message); - - if (!statuses.isEmpty()) { - var statusesList = statuses.entrySet().stream().toList(); - for (int i = 0; i < statusesList.size(); i += 2) { - var e1 = statusesList.get(i); - b.append("\n ").append('\'').append(e1.getKey()).append("': ").append('\'').append(e1.getValue()).append("', "); - - if (i + 1 < statusesList.size()) { - var e2 = statusesList.get(i + 1); - b.append('\'').append(e2.getKey()).append("': ").append('\'').append(e2.getValue()).append("'"); - } - } - } - - if (report) - b.append('\n').append("If you have \"Send Crash Reports\" enabled this crash report would've been sent to the developer. Sorry!"); - return b.toString(); + public boolean shouldReport() { + return report; } - public static void run(ThrowingRunnable runnable, Supplier builder) { + public static void run(ThrowingRunnable runnable, Consumer consumer) { try { runnable.run(); } catch (Throwable e) { - throw builder.get().cause(e).build(); + var builder = AndromedaException.builder(); + consumer.accept(builder); + throw builder.cause(e).build(); } } + public static Builder builder() { + return new Builder(); + } + public static class Builder { + + private static final Set DEFAULT_KEYS = Set.of( + "bootstrap_status", "platform", + prop(Prop.ENVIRONMENT), prop(Prop.OS), prop(Prop.JAVA_VERSION), prop(Prop.JAVA_VENDOR) + ); + + private static String prop(Prop prop) { + return prop.name().toLowerCase(); + } + private String message; private Throwable cause; private boolean report = true; private final Map statuses = new LinkedHashMap<>(); - public Builder() { - add("bootstrap_status", Bootstrap.getStatus()); + private Builder() { + add(Prop.ENVIRONMENT, Prop.OS, Prop.JAVA_VERSION, Prop.JAVA_VENDOR); + add("platform", CommonValues.platform()); + add("bootstrap_status", Bootstrap.Status.get()); } public Builder message(String message) { @@ -109,8 +112,9 @@ public class AndromedaException extends RuntimeException { private void disableInHierarchy(Throwable cause) { if (cause == null) return; if (cause instanceof AndromedaException e) { - e.appendStatuses = false; - e.statuses.forEach(this.statuses::putIfAbsent); + for (String defaultKey : DEFAULT_KEYS) { + e.statuses.remove(defaultKey); + } } disableInHierarchy(cause.getCause()); } @@ -118,9 +122,14 @@ public class AndromedaException extends RuntimeException { public AndromedaException build() { disableInHierarchy(cause); - return new AndromedaException(report, + var e = new AndromedaException(report, Strings.isNullOrEmpty(message) ? "Something went very wrong!" : message, cause, statuses); + + //CrashHandler can't automatically handle preLaunch errors, so this is what we have to do. + if (!Crashlytics.hasHandler("andromeda")) CrashHandler.handleCrash(e, Context.of()); + + return e; } } } -- 2.51.2 From 854753639fd66c08e2c8ef55d507b0bbfc1d0b5c Mon Sep 17 00:00:00 2001 From: melontini <104443436+melontini@users.noreply.github.com> Date: Sat, 6 Jan 2024 19:46:10 +0700 Subject: [PATCH 06/15] Don't search for the fabrication field every second. --- .../mixin/FurnaceMinecartIntakeMixin.java | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/main/java/me/melontini/andromeda/modules/entities/better_furnace_minecart/mixin/FurnaceMinecartIntakeMixin.java b/src/main/java/me/melontini/andromeda/modules/entities/better_furnace_minecart/mixin/FurnaceMinecartIntakeMixin.java index 96dc434c..64d0e022 100644 --- a/src/main/java/me/melontini/andromeda/modules/entities/better_furnace_minecart/mixin/FurnaceMinecartIntakeMixin.java +++ b/src/main/java/me/melontini/andromeda/modules/entities/better_furnace_minecart/mixin/FurnaceMinecartIntakeMixin.java @@ -18,13 +18,24 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import java.lang.reflect.Field; import java.util.Comparator; +import java.util.Optional; + +import static me.melontini.dark_matter.api.base.util.Exceptions.supply; @Mixin(FurnaceMinecartEntity.class) abstract class FurnaceMinecartIntakeMixin extends AbstractMinecartEntity { @Unique private static final BetterFurnaceMinecart am$bfm = ModuleManager.quick(BetterFurnaceMinecart.class); + //stfu IDEA. + @SuppressWarnings({"OptionalUsedAsFieldOrParameterType", "JavaReflectionMemberAccess"}) + @Unique + private static final Optional fb$pauseFuel = Support.getWeak("fabrication", () -> () -> + FurnaceMinecartEntity.class.getDeclaredField("fabrication$pauseFuel")); + + @Shadow public int fuel; protected FurnaceMinecartIntakeMixin(EntityType entityType, World world) { @@ -37,8 +48,7 @@ abstract class FurnaceMinecartIntakeMixin extends AbstractMinecartEntity { if (!this.world.isClient() && this.fuel < 100) { if (world.getTime() % 20 == 0) { - if (Support.getWeak("fabrication", () -> () -> - getClass().getField("fabrication$pauseFuel").getInt(this) > 0).orElse(false)) return; + if (fb$pauseFuel.map(f -> supply(() -> f.getInt(this)) > 0).orElse(false)) return; AbstractMinecartEntity entity = this.world .getEntitiesByClass(AbstractMinecartEntity.class, this.getBoundingBox().expand(1.5, 0, 1.5), minecart -> minecart instanceof Inventory) -- 2.51.2 From ea38402373ec3a93171dfaf96abfb21ee012244d Mon Sep 17 00:00:00 2001 From: melontini <104443436+melontini@users.noreply.github.com> Date: Sat, 6 Jan 2024 21:36:46 +0700 Subject: [PATCH 07/15] Final crash handling stuff. --- .../common/mixin/CrashReportMixin.java | 8 +++-- .../andromeda/common/registries/Common.java | 31 ++++++++++--------- .../andromeda/util/CrashHandler.java | 24 ++++++++++++-- 3 files changed, 43 insertions(+), 20 deletions(-) diff --git a/src/main/java/me/melontini/andromeda/common/mixin/CrashReportMixin.java b/src/main/java/me/melontini/andromeda/common/mixin/CrashReportMixin.java index 311730a7..d8a41349 100644 --- a/src/main/java/me/melontini/andromeda/common/mixin/CrashReportMixin.java +++ b/src/main/java/me/melontini/andromeda/common/mixin/CrashReportMixin.java @@ -12,10 +12,12 @@ abstract class CrashReportMixin { @Inject(at = @At("TAIL"), method = "", require = 0) private void andromeda$init(String message, Throwable cause, CallbackInfo ci) { - try { + if (CrashHandler.hasInstance(cause)) { var sec = ((CrashReport) (Object) this).addElement("Andromeda Statuses"); - CrashHandler.traverse(sec::add, ((CrashReport) (Object) this).getCause(), 0); - } catch (Exception ignored) { + sec.trimStackTraceEnd(sec.getStackTrace().length); + CrashHandler.traverse(sec::add, cause, 0); } + + CrashHandler.sanitizeTrace(cause); } } diff --git a/src/main/java/me/melontini/andromeda/common/registries/Common.java b/src/main/java/me/melontini/andromeda/common/registries/Common.java index 3f3791c5..90f2d8c0 100644 --- a/src/main/java/me/melontini/andromeda/common/registries/Common.java +++ b/src/main/java/me/melontini/andromeda/common/registries/Common.java @@ -12,7 +12,6 @@ import org.jetbrains.annotations.NotNull; import java.lang.reflect.Field; import java.lang.reflect.Modifier; -import java.util.Arrays; import java.util.function.Supplier; import static me.melontini.andromeda.util.CommonValues.MODID; @@ -22,10 +21,10 @@ public class Common { //DO NOT CALL THIS FROM THE WRONG MODULE!!! public static void bootstrap(Module module, Class... classes) { - AndromedaException.run(() -> { - MakeSure.notNull(module); + MakeSure.notNull(module); - for (Class cls : classes) { + for (Class cls : classes) { + AndromedaException.run(() -> { Reflect.findField(cls, "MODULE").ifPresent(field -> Exceptions.run(() -> { MakeSure.isTrue(field.getType() == module.getClass(), "Illegal module field type '%s'! Must be '%s'".formatted(field.getType(), module.getClass())); field.setAccessible(true); @@ -37,9 +36,9 @@ public class Common { Reflect.findMethod(cls, "init", module.getClass()).ifPresent(m -> Exceptions.run(() -> m.invoke(null, module))); Reflect.findMethod(cls, "init").ifPresent(m -> Exceptions.run(() -> m.invoke(null))); - } - }, (b) -> b.message("Failed to bootstrap module!") - .add("module", module.meta().id()).add("classes", Arrays.toString(classes))); + }, (b) -> b.message("Failed to bootstrap module!") + .add("module", module.meta().id()).add("class", cls.getName())); + } } private static void initKeepers(@NotNull Class reg) { @@ -47,14 +46,16 @@ public class Common { if (field.getType() != Keeper.class || !Modifier.isStatic(field.getModifiers())) continue; Keeper keeper = (Keeper) Exceptions.supply(() -> field.get(reg)); - if (keeper.initialized()) throw new IllegalStateException("Registry object bootstrapped before the registry itself!"); + if (keeper.initialized()) + throw AndromedaException.builder() + .message("Keeper initialized before the Common.bootstrap call!") + .add("field", field.getName()) + .build(); - try { + AndromedaException.run(() -> { LOGGER.debug("Initializing Keeper {} for class {}", field.getName(), reg.getName()); keeper.init(field); - } catch (Throwable t) { - throw new IllegalStateException("Failed to bootstrap registry object %s!".formatted(field.getName()), t); - } + }, b -> b.message("Failed to initialize Keeper").add("field", field.getName())); } } @@ -72,8 +73,10 @@ public class Common { private static void bootstrap(Class... classes) { for (Class cls : classes) { - Reflect.findMethod(cls, "init").ifPresent(m -> Exceptions.run(() -> m.invoke(null))); - initKeepers(cls); + AndromedaException.run(() -> { + Reflect.findMethod(cls, "init").ifPresent(m -> Exceptions.run(() -> m.invoke(null))); + initKeepers(cls); + }, (b) -> b.message("Failed to bootstrap module!").add("class", cls.getName())); } } } diff --git a/src/main/java/me/melontini/andromeda/util/CrashHandler.java b/src/main/java/me/melontini/andromeda/util/CrashHandler.java index 2cd8fc06..54105640 100644 --- a/src/main/java/me/melontini/andromeda/util/CrashHandler.java +++ b/src/main/java/me/melontini/andromeda/util/CrashHandler.java @@ -18,8 +18,7 @@ import org.spongepowered.asm.mixin.extensibility.IMixinInfo; import java.io.IOException; import java.io.PrintWriter; import java.io.StringWriter; -import java.util.Base64; -import java.util.Set; +import java.util.*; import java.util.function.BiConsumer; public class CrashHandler { @@ -42,7 +41,7 @@ public class CrashHandler { return cause.getCause() != null && findAndromedaInTrace(cause.getCause()); } - private static boolean hasInstance(Throwable cause) { + public static boolean hasInstance(Throwable cause) { if (cause instanceof AndromedaException) return true; return cause.getCause() != null && hasInstance(cause.getCause()); } @@ -59,6 +58,22 @@ public class CrashHandler { if (cause.getCause() != null) traverse(acceptor, cause.getCause(), depth); } + private static final Set BAD_PREFIXES = Set.of( + "me.melontini.andromeda.util.exceptions.AndromedaException", //run and Builder.build + "jdk.internal.reflect.", //Most likely, accessors + "com.sun.proxy.jdk.", //No source, useless + "java.lang.invoke.MethodHandleProxies$" //Internal class + ); + + public static void sanitizeTrace(Throwable cause) { + List e = new ArrayList<>(Arrays.asList(cause.getStackTrace())); + + e.removeIf(el -> BAD_PREFIXES.stream().anyMatch(s -> el.getClassName().startsWith(s))); + + cause.setStackTrace(e.toArray(StackTraceElement[]::new)); + if (cause.getCause() != null) sanitizeTrace(cause.getCause()); + } + public static void handleCrash(Throwable cause, Context context) { if (!Debug.hasKey(Debug.Keys.FORCE_CRASH_REPORT_UPLOAD)) { if (FabricLoader.getInstance().isDevelopmentEnvironment() || !AndromedaConfig.get().sendCrashReports) @@ -67,8 +82,11 @@ public class CrashHandler { if (context.get(IMixinInfo.class, Crashlytics.Keys.MIXIN_INFO).map(info -> info.getClassName().startsWith("me.melontini.andromeda")).orElse(false) || findAndromedaInTrace(cause)) { AndromedaLog.warn("Found Andromeda in trace, collecting and uploading crash report..."); + JsonObject object = new JsonObject(); + sanitizeTrace(cause); + String message = "Something terrible happened!"; if (context.get(Object.class, Crashlytics.Keys.CRASH_REPORT).isPresent()) { message = getFromCrashReport(context); -- 2.51.2 From 9790eccae62e5791647fdafe046f253e888b6401 Mon Sep 17 00:00:00 2001 From: melontini <104443436+melontini@users.noreply.github.com> Date: Sat, 6 Jan 2024 22:07:32 +0700 Subject: [PATCH 08/15] String MixinPredicate along --- .../andromeda/util/mixin/AndromedaMixins.java | 23 +++++++++++++------ 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/src/main/java/me/melontini/andromeda/util/mixin/AndromedaMixins.java b/src/main/java/me/melontini/andromeda/util/mixin/AndromedaMixins.java index ca09903b..a2a82d88 100644 --- a/src/main/java/me/melontini/andromeda/util/mixin/AndromedaMixins.java +++ b/src/main/java/me/melontini/andromeda/util/mixin/AndromedaMixins.java @@ -10,6 +10,8 @@ import me.melontini.andromeda.util.Debug; import me.melontini.andromeda.util.exceptions.MixinVerifyError; import me.melontini.dark_matter.api.base.util.Exceptions; import me.melontini.dark_matter.api.base.util.mixin.AsmUtil; +import me.melontini.dark_matter.api.base.util.mixin.ExtendablePlugin; +import me.melontini.dark_matter.api.base.util.mixin.IPluginPlugin; import net.fabricmc.api.EnvType; import org.objectweb.asm.ClassReader; import org.objectweb.asm.tree.AnnotationNode; @@ -24,6 +26,8 @@ public class AndromedaMixins { private static final ClassPath CLASS_PATH = Exceptions.supply(ClassPath::from); + private static final IPluginPlugin MIXIN_PREDICATE = ExtendablePlugin.DefaultPlugins.mixinPredicatePlugin(); + public static ClassPath getClassPath() { return CLASS_PATH; } @@ -44,21 +48,26 @@ public class AndromedaMixins { public static boolean checkNode(ClassNode n) { if (Debug.hasKey(Debug.Keys.VERIFY_MIXINS)) verifyMixin(n, n.name); - boolean load = true; AnnotationNode envNode = Annotations.getVisible(n, SpecialEnvironment.class); if (envNode != null) { Environment value = AsmUtil.getAnnotationValue(envNode, "value", Environment.BOTH); if (value != null) { - return switch (value) { - case SERVER -> CommonValues.environment().equals(EnvType.SERVER); - case CLIENT -> CommonValues.environment().equals(EnvType.CLIENT); - case ANY -> true; + switch (value) { + case SERVER -> { + if (!CommonValues.environment().equals(EnvType.SERVER)) return false; + } + case CLIENT -> { + if (!CommonValues.environment().equals(EnvType.CLIENT)) return false; + } + case ANY -> { + } default -> throw new IllegalStateException(value.toString()); - }; + } } } - return load; + //MixinPredicate only uses the node. + return MIXIN_PREDICATE.shouldApplyMixin(null, null, n, null); } private static void verifyMixin(ClassNode mixinNode, String mixinClassName) { -- 2.51.2 From 6ffc710aaa907384708cd84bef9dbd99d43c6136 Mon Sep 17 00:00:00 2001 From: melontini <104443436+melontini@users.noreply.github.com> Date: Sat, 6 Jan 2024 22:09:01 +0700 Subject: [PATCH 09/15] Fix AutoConfigScreen loading even when CC is not loaded. --- .../client/config/AutoConfigScreen.java | 135 +++++++++--------- .../client/config/ModMenuIntegration.java | 7 +- .../mixin/SubCategoryListEntryMixin.java | 3 + 3 files changed, 77 insertions(+), 68 deletions(-) diff --git a/src/main/java/me/melontini/andromeda/common/client/config/AutoConfigScreen.java b/src/main/java/me/melontini/andromeda/common/client/config/AutoConfigScreen.java index f9f96e53..7c09fb05 100644 --- a/src/main/java/me/melontini/andromeda/common/client/config/AutoConfigScreen.java +++ b/src/main/java/me/melontini/andromeda/common/client/config/AutoConfigScreen.java @@ -1,18 +1,17 @@ package me.melontini.andromeda.common.client.config; +import me.melontini.andromeda.base.AndromedaConfig; import me.melontini.andromeda.base.Environment; import me.melontini.andromeda.base.Module; import me.melontini.andromeda.base.ModuleManager; import me.melontini.andromeda.base.annotations.Origin; import me.melontini.andromeda.base.annotations.SpecialEnvironment; -import me.melontini.andromeda.base.AndromedaConfig; import me.melontini.andromeda.common.client.OrderedTextUtil; import me.melontini.andromeda.util.AndromedaLog; import me.melontini.andromeda.util.CommonValues; import me.melontini.dark_matter.api.base.reflect.Reflect; import me.melontini.dark_matter.api.base.util.Exceptions; import me.melontini.dark_matter.api.base.util.MakeSure; -import me.melontini.dark_matter.api.base.util.Support; import me.melontini.dark_matter.api.base.util.Utilities; import me.melontini.dark_matter.api.minecraft.util.TextUtil; import me.shedaniel.autoconfig.annotation.ConfigEntry; @@ -24,6 +23,7 @@ import me.shedaniel.clothconfig2.api.AbstractConfigListEntry; import me.shedaniel.clothconfig2.api.ConfigBuilder; import me.shedaniel.clothconfig2.api.ConfigCategory; import me.shedaniel.clothconfig2.gui.entries.TooltipListEntry; +import net.fabricmc.loader.api.FabricLoader; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.resource.language.I18n; import net.minecraft.text.MutableText; @@ -39,83 +39,88 @@ import java.util.function.Consumer; public class AutoConfigScreen { @SuppressWarnings("OptionalUsedAsFieldOrParameterType") - private static final Optional saveCallback = Reflect.findField(AbstractConfigEntry.class, "saveCallback"); + private static Optional saveCallback; private static final ThreadLocal> saveQueue = ThreadLocal.withInitial(HashSet::new); + static { + if (!FabricLoader.getInstance().isModLoaded("cloth-config")) { + AndromedaLog.error("AutoConfigScreen class loaded without Cloth Config!"); + } + } + public static void register() { AndromedaLog.info("Loading ClothConfig support!"); + saveCallback = Reflect.findField(AbstractConfigEntry.class, "saveCallback"); } - public static Optional get(Screen screen) { - return Support.get("cloth-config", () -> () -> { - ConfigBuilder builder = ConfigBuilder.create() - .setParentScreen(screen) - .setTitle(TextUtil.translatable("config.andromeda.title", CommonValues.version().split("-")[0])) - .setSavingRunnable(AutoConfigScreen::powerSave) - .setDefaultBackgroundTexture(Identifier.tryParse("minecraft:textures/block/amethyst_block.png")); - - var eb = builder.entryBuilder(); - - GuiRegistry registry = DefaultGuiTransformers.apply(DefaultGuiProviders.apply(new GuiRegistry())); - - ModuleManager.get().all().forEach(module -> { - List fields = new ArrayList<>(MakeSure.notEmpty(Arrays.asList(ModuleManager.get().getConfigClass(module.getClass()).getFields()))); - fields.removeIf(field -> field.isAnnotationPresent(ConfigEntry.Gui.Excluded.class)); - fields.sort(Comparator.comparingInt(value -> !"enabled".equals(value.getName()) ? 1 : 0)); - - var category = getOrCreateCategoryForField(module, builder); - String moduleText = "config.andromeda.%s".formatted(module.meta().dotted()); - - if (fields.size() <= 1) { - registry.getAndTransform(moduleText, fields.get(0), module.config(), module.defaultConfig(), registry) - .forEach(e -> { - if (checkOptionManager(e, module, fields.get(0))) { - setModuleTooltip(e, module); - appendEnvInfo(e, module.meta().environment()); - } - appendOrigin(e, module); - wrapTooltip(e); - wrapSaveCallback(e, module::save); - category.addEntry(e); - }); - } else { - List> list = new ArrayList<>(); - fields.forEach((field) -> { - String opt = "enabled".equals(field.getName()) ? "config.andromeda.option.enabled" : "config.andromeda.%s.option.%s".formatted(module.meta().dotted(), field.getName()); - registry.getAndTransform(opt, field, module.config(), module.defaultConfig(), registry).forEach(e -> { - if (checkOptionManager(e, module, field)) { - setOptionTooltip(e, opt + ".@Tooltip"); - appendEnvInfo(e, field); + public static Screen get(Screen screen) { + ConfigBuilder builder = ConfigBuilder.create() + .setParentScreen(screen) + .setTitle(TextUtil.translatable("config.andromeda.title", CommonValues.version().split("-")[0])) + .setSavingRunnable(AutoConfigScreen::powerSave) + .setDefaultBackgroundTexture(Identifier.tryParse("minecraft:textures/block/amethyst_block.png")); + + var eb = builder.entryBuilder(); + + GuiRegistry registry = DefaultGuiTransformers.apply(DefaultGuiProviders.apply(new GuiRegistry())); + + ModuleManager.get().all().forEach(module -> { + List fields = new ArrayList<>(MakeSure.notEmpty(Arrays.asList(ModuleManager.get().getConfigClass(module.getClass()).getFields()))); + fields.removeIf(field -> field.isAnnotationPresent(ConfigEntry.Gui.Excluded.class)); + fields.sort(Comparator.comparingInt(value -> !"enabled".equals(value.getName()) ? 1 : 0)); + + var category = getOrCreateCategoryForField(module, builder); + String moduleText = "config.andromeda.%s".formatted(module.meta().dotted()); + + if (fields.size() <= 1) { + registry.getAndTransform(moduleText, fields.get(0), module.config(), module.defaultConfig(), registry) + .forEach(e -> { + if (checkOptionManager(e, module, fields.get(0))) { + setModuleTooltip(e, module); + appendEnvInfo(e, module.meta().environment()); } + appendOrigin(e, module); wrapTooltip(e); wrapSaveCallback(e, module::save); - list.add(e); + category.addEntry(e); }); + } else { + List> list = new ArrayList<>(); + fields.forEach((field) -> { + String opt = "enabled".equals(field.getName()) ? "config.andromeda.option.enabled" : "config.andromeda.%s.option.%s".formatted(module.meta().dotted(), field.getName()); + registry.getAndTransform(opt, field, module.config(), module.defaultConfig(), registry).forEach(e -> { + if (checkOptionManager(e, module, field)) { + setOptionTooltip(e, opt + ".@Tooltip"); + appendEnvInfo(e, field); + } + wrapTooltip(e); + wrapSaveCallback(e, module::save); + list.add(e); }); - var e = eb.startSubCategory(TextUtil.translatable("config.andromeda.%s".formatted(module.meta().dotted())), Utilities.cast(list)); - var built = e.build(); - setModuleTooltip(built, module); - appendOrigin(built, module); - appendEnvInfo(built, module.meta().environment()); - wrapTooltip(built); - category.addEntry(built); - } - }); - - ConfigCategory misc = builder.getOrCreateCategory(TextUtil.translatable("config.andromeda.category.misc")); - Arrays.stream(AndromedaConfig.Config.class.getFields()).forEach((field) -> { - String opt = "config.andromeda.base.option." + field.getName(); - registry.getAndTransform(opt, field, AndromedaConfig.get(), AndromedaConfig.getDefault(), registry).forEach(e -> { - setOptionTooltip(e, opt + ".@Tooltip"); - appendEnvInfo(e, field); - wrapTooltip(e); - wrapSaveCallback(e, AndromedaConfig::save); - misc.addEntry(e); }); - }); + var e = eb.startSubCategory(TextUtil.translatable("config.andromeda.%s".formatted(module.meta().dotted())), Utilities.cast(list)); + var built = e.build(); + setModuleTooltip(built, module); + appendOrigin(built, module); + appendEnvInfo(built, module.meta().environment()); + wrapTooltip(built); + category.addEntry(built); + } + }); - return builder.build(); + ConfigCategory misc = builder.getOrCreateCategory(TextUtil.translatable("config.andromeda.category.misc")); + Arrays.stream(AndromedaConfig.Config.class.getFields()).forEach((field) -> { + String opt = "config.andromeda.base.option." + field.getName(); + registry.getAndTransform(opt, field, AndromedaConfig.get(), AndromedaConfig.getDefault(), registry).forEach(e -> { + setOptionTooltip(e, opt + ".@Tooltip"); + appendEnvInfo(e, field); + wrapTooltip(e); + wrapSaveCallback(e, AndromedaConfig::save); + misc.addEntry(e); + }); }); + + return builder.build(); } private static void wrapSaveCallback(AbstractConfigEntry e, Runnable saveFunc) { diff --git a/src/main/java/me/melontini/andromeda/common/client/config/ModMenuIntegration.java b/src/main/java/me/melontini/andromeda/common/client/config/ModMenuIntegration.java index b3855c33..a1992cd4 100644 --- a/src/main/java/me/melontini/andromeda/common/client/config/ModMenuIntegration.java +++ b/src/main/java/me/melontini/andromeda/common/client/config/ModMenuIntegration.java @@ -30,8 +30,9 @@ public class ModMenuIntegration implements ModMenuApi { @Override public ConfigScreenFactory getModConfigScreenFactory() { - return parent -> AutoConfigScreen.get(parent).map(screen1 -> { - ScreenEvents.AFTER_INIT.register((client, screen, scaledWidth, scaledHeight) -> { + return parent -> Support.get("cloth-config", () -> () -> { + Screen screen = AutoConfigScreen.get(parent); + ScreenEvents.AFTER_INIT.register((client, screen1, scaledWidth, scaledHeight) -> { if (screen == screen1) { addDrawableChild(screen, new TexturedButtonWidget(screen.width - 40, 13, 20, 20, 0, 0, 20, WIKI_BUTTON_TEXTURE, 32, 64, button -> { if (InputUtil.isKeyPressed(client.getWindow().getHandle(), InputUtil.GLFW_KEY_LEFT_SHIFT)) { @@ -46,7 +47,7 @@ public class ModMenuIntegration implements ModMenuApi { })); } }); - return screen1; + return screen; }).orElse(null); } diff --git a/src/main/java/me/melontini/andromeda/common/mixin/SubCategoryListEntryMixin.java b/src/main/java/me/melontini/andromeda/common/mixin/SubCategoryListEntryMixin.java index a0a3769e..a81bd4ef 100644 --- a/src/main/java/me/melontini/andromeda/common/mixin/SubCategoryListEntryMixin.java +++ b/src/main/java/me/melontini/andromeda/common/mixin/SubCategoryListEntryMixin.java @@ -4,11 +4,14 @@ import com.llamalad7.mixinextras.injector.wrapoperation.Operation; import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; import me.melontini.andromeda.base.Environment; import me.melontini.andromeda.base.annotations.SpecialEnvironment; +import me.melontini.dark_matter.api.base.util.mixin.annotations.MixinPredicate; +import me.melontini.dark_matter.api.base.util.mixin.annotations.Mod; import me.shedaniel.clothconfig2.api.AbstractConfigListEntry; import me.shedaniel.clothconfig2.gui.entries.SubCategoryListEntry; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; +@MixinPredicate(mods = @Mod("cloth-config")) @SpecialEnvironment(Environment.CLIENT) @Mixin(SubCategoryListEntry.class) abstract class SubCategoryListEntryMixin { -- 2.51.2 From 9780752f524404cdd5a85a93b03197cc3e192825 Mon Sep 17 00:00:00 2001 From: melontini <104443436+melontini@users.noreply.github.com> Date: Sat, 6 Jan 2024 23:27:23 +0700 Subject: [PATCH 10/15] Update DM --- gradle.properties | 2 +- .../java/me/melontini/andromeda/base/AndromedaConfig.java | 2 +- src/main/java/me/melontini/andromeda/base/ModuleManager.java | 4 ++-- .../andromeda/modules/blocks/bed/unsafe/Unsafe.java | 2 +- .../modules/gui/item_frame_tooltips/ItemFrameTooltips.java | 2 +- .../andromeda/modules/gui/name_tooltips/NameTooltips.java | 2 +- src/main/java/me/melontini/andromeda/util/CrashHandler.java | 5 +++-- src/main/java/me/melontini/andromeda/util/Debug.java | 2 +- 8 files changed, 11 insertions(+), 10 deletions(-) diff --git a/gradle.properties b/gradle.properties index ffd75779..09856f36 100644 --- a/gradle.properties +++ b/gradle.properties @@ -17,5 +17,5 @@ modmenu_version=4.2.0-beta.2 fabric_version=0.76.0+1.19.2 cloth_version=8.3.103 fabric_asm_version=2.3 -dark_matter=0dd04d98ed +dark_matter=38aa3a5f2e mixin_extras_version=0.3.1 \ No newline at end of file diff --git a/src/main/java/me/melontini/andromeda/base/AndromedaConfig.java b/src/main/java/me/melontini/andromeda/base/AndromedaConfig.java index d839e3e1..2884b35d 100644 --- a/src/main/java/me/melontini/andromeda/base/AndromedaConfig.java +++ b/src/main/java/me/melontini/andromeda/base/AndromedaConfig.java @@ -9,7 +9,7 @@ import net.fabricmc.loader.api.FabricLoader; public class AndromedaConfig { private static final ConfigManager MANAGER = ConfigManager.of(Config.class, "andromeda/mod", Config::new) - .exceptionHandler((e, stage) -> LOGGER.error("Failed to %s main Andromeda config (mod.json)!".formatted(stage.toString().toLowerCase()), e)); + .exceptionHandler((e, stage, path) -> LOGGER.error("Failed to %s main Andromeda config (mod.json)!".formatted(stage.toString().toLowerCase()), e)); private static Config CONFIG; private static Config DEFAULT; diff --git a/src/main/java/me/melontini/andromeda/base/ModuleManager.java b/src/main/java/me/melontini/andromeda/base/ModuleManager.java index 95caa1e3..d8ed5da6 100644 --- a/src/main/java/me/melontini/andromeda/base/ModuleManager.java +++ b/src/main/java/me/melontini/andromeda/base/ModuleManager.java @@ -125,7 +125,7 @@ public class ModuleManager { private void setUpConfigs(Collection> modules) { doWork(modules, m -> { var config = ConfigManager.of(getConfigClass(m.getClass()), "andromeda/" + m.meta().id()); - config.onLoad(config1 -> { + config.onLoad((config1, path) -> { if (AndromedaConfig.get().sideOnlyMode) { switch (m.meta().environment()) { case BOTH -> config1.enabled = false; @@ -140,7 +140,7 @@ public class ModuleManager { } } }); - config.exceptionHandler((e, stage) -> LOGGER.error("Failed to %s config for module: %s".formatted(stage.toString().toLowerCase(), m.meta().id()), e)); + config.exceptionHandler((e, stage, path) -> LOGGER.error("Failed to %s config for module: %s".formatted(stage.toString().toLowerCase(), m.meta().id()), e)); m.manager = Utilities.cast(config); m.onConfig(Utilities.cast(config)); }); diff --git a/src/main/java/me/melontini/andromeda/modules/blocks/bed/unsafe/Unsafe.java b/src/main/java/me/melontini/andromeda/modules/blocks/bed/unsafe/Unsafe.java index 1ebb1ad2..6b93cf43 100644 --- a/src/main/java/me/melontini/andromeda/modules/blocks/bed/unsafe/Unsafe.java +++ b/src/main/java/me/melontini/andromeda/modules/blocks/bed/unsafe/Unsafe.java @@ -16,7 +16,7 @@ public class Unsafe extends Module { @Override public void onConfig(ConfigManager manager) { - manager.onSave(config -> { + manager.onSave((config, path) -> { if (ModuleManager.get().getDiscovered(Safe.class).filter(Module::enabled).isPresent()) { config.enabled = false; } diff --git a/src/main/java/me/melontini/andromeda/modules/gui/item_frame_tooltips/ItemFrameTooltips.java b/src/main/java/me/melontini/andromeda/modules/gui/item_frame_tooltips/ItemFrameTooltips.java index b9065592..8881ba97 100644 --- a/src/main/java/me/melontini/andromeda/modules/gui/item_frame_tooltips/ItemFrameTooltips.java +++ b/src/main/java/me/melontini/andromeda/modules/gui/item_frame_tooltips/ItemFrameTooltips.java @@ -20,7 +20,7 @@ public class ItemFrameTooltips extends Module { @Override public void onConfig(ConfigManager manager) { - manager.onLoad(config -> { + manager.onSave((config, path) -> { if (iceberg.getAsBoolean()) config.enabled = false; }); } diff --git a/src/main/java/me/melontini/andromeda/modules/gui/name_tooltips/NameTooltips.java b/src/main/java/me/melontini/andromeda/modules/gui/name_tooltips/NameTooltips.java index 24c17129..dd1827da 100644 --- a/src/main/java/me/melontini/andromeda/modules/gui/name_tooltips/NameTooltips.java +++ b/src/main/java/me/melontini/andromeda/modules/gui/name_tooltips/NameTooltips.java @@ -20,7 +20,7 @@ public class NameTooltips extends Module { @Override public void onConfig(ConfigManager manager) { - manager.onLoad(config -> { + manager.onSave((config, path) -> { if (iceberg.getAsBoolean()) config.enabled = false; }); } diff --git a/src/main/java/me/melontini/andromeda/util/CrashHandler.java b/src/main/java/me/melontini/andromeda/util/CrashHandler.java index 54105640..d33c5ede 100644 --- a/src/main/java/me/melontini/andromeda/util/CrashHandler.java +++ b/src/main/java/me/melontini/andromeda/util/CrashHandler.java @@ -10,6 +10,7 @@ import me.melontini.dark_matter.api.base.util.classes.Context; import me.melontini.dark_matter.api.crash_handler.Crashlytics; import me.melontini.dark_matter.api.crash_handler.Prop; import me.melontini.dark_matter.api.crash_handler.uploading.Mixpanel; +import me.melontini.dark_matter.api.crash_handler.uploading.Uploader; import net.fabricmc.loader.api.FabricLoader; import net.fabricmc.loader.impl.util.StringUtil; import net.minecraft.util.crash.CrashReport; @@ -117,11 +118,11 @@ public class CrashHandler { object.add("mods", mods); - MIXPANEL.upload(new Mixpanel.Context("Crash", object)).handle((unused, throwable) -> { + Uploader.SERVICE.submit(() -> MIXPANEL.upload(new Mixpanel.Context("Crash", object)).handle((unused, throwable) -> { if (throwable != null) AndromedaLog.error("Failed to upload crash report! {}: {}", throwable.getClass().getSimpleName(), throwable.getMessage()); return null; - }); + })); } } diff --git a/src/main/java/me/melontini/andromeda/util/Debug.java b/src/main/java/me/melontini/andromeda/util/Debug.java index 00a40b2f..fdf2bdef 100644 --- a/src/main/java/me/melontini/andromeda/util/Debug.java +++ b/src/main/java/me/melontini/andromeda/util/Debug.java @@ -13,7 +13,7 @@ import java.util.*; public class Debug { private static final ConfigManager MANAGER = ConfigManager.of(Holder.class, "andromeda/debug", Holder::new) - .exceptionHandler((e, stage) -> LOGGER.error("Failed to %s debug config!".formatted(stage.toString().toLowerCase()), e)); + .exceptionHandler((e, stage, path) -> LOGGER.error("Failed to %s debug config!".formatted(stage.toString().toLowerCase()), e)); private static Holder CONFIG; -- 2.51.2 From f0c6baaedd471f0c70efd433889d0f10a7e6bc94 Mon Sep 17 00:00:00 2001 From: melontini <104443436+melontini@users.noreply.github.com> Date: Sat, 6 Jan 2024 23:29:47 +0700 Subject: [PATCH 11/15] Revert "Revert "Revert "Maybe not.""" This reverts commit c53edb67adefe46712b387dd42eeda5f5b019b19. --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9b48338a..5663ac0b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,8 @@ ## Alpha warning! -- **1.19.3 & 1.18.2 will no longer receive alpha updates!** +- **1.19.3 is no longer supported!** +- **1.18.2 will no longer receive alpha updates!** *** -- 2.51.2 From b35ff49f0daf554de565e1b6a34f89e81f6f1ade Mon Sep 17 00:00:00 2001 From: melontini <104443436+melontini@users.noreply.github.com> Date: Sat, 6 Jan 2024 23:30:38 +0700 Subject: [PATCH 12/15] Final decision. --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5663ac0b..e748171e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ ## Alpha warning! -- **1.19.3 is no longer supported!** +- [**1.19.3 is no longer supported!**](https://github.com/melontini/dark-matter/wiki#version-support) - **1.18.2 will no longer receive alpha updates!** *** -- 2.51.2 From 188bb86b522976c09fb8f2f76097a37df11bb26a Mon Sep 17 00:00:00 2001 From: Rad <99306685+Rad586@users.noreply.github.com> Date: Sun, 7 Jan 2024 00:31:42 +0800 Subject: [PATCH 13/15] Update zh_cn.json (#92) --- src/main/resources/assets/andromeda/lang/zh_cn.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/assets/andromeda/lang/zh_cn.json b/src/main/resources/assets/andromeda/lang/zh_cn.json index 839a67e9..c92f58f5 100644 --- a/src/main/resources/assets/andromeda/lang/zh_cn.json +++ b/src/main/resources/assets/andromeda/lang/zh_cn.json @@ -324,7 +324,7 @@ "config.andromeda.base.option.sideOnlyMode": "仅客户端模式", "config.andromeda.base.option.sideOnlyMode.@Tooltip": "禁用所有要求服务端的特性。", "config.andromeda.base.option.sendCrashReports": "上传错误报告", - "config.andromeda.base.option.sendCrashReports.@Tooltip": "在客户端崩溃时上传的数据:\n栈跟踪,加载的模组,环境(客户端/服务端)\n错误报告不会附加特征信息。", + "config.andromeda.base.option.sendCrashReports.@Tooltip": "崩溃时上传的数据:\n- 环境(如客户端),\n- 系统版本(如Windows 11),\n- 平台(如Fabric),\n- Java(如甲骨文Java17),\n- Bootstrap状态(如Discovery),\n- 部分载入的模组。\n错误报告不会附加特征信息。", "config.andromeda.base.option.debugMessages": "启用调试信息", "config.andromeda.base.option.debugMessages.@Tooltip": "开启后,日志文件将被数不清的条目淹没。" } -- 2.51.2 From d6e4457da7972f86d37e690f2a88a4d0f1c5c6ea Mon Sep 17 00:00:00 2001 From: melontini <104443436+melontini@users.noreply.github.com> Date: Sat, 6 Jan 2024 23:32:52 +0700 Subject: [PATCH 14/15] CHANGELOG.md --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e748171e..020cdacd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -30,4 +30,5 @@ [`general`]: * Improved crash reporting. -* A bunch of other improvements. \ No newline at end of file +* A bunch of other improvements. +* Updated Chinese translation. Courtesy of [Rad586](https://github.com/Rad586). \ No newline at end of file -- 2.51.2 From 1b25747d84289ecd0808261befe1e4d071bf0bc2 Mon Sep 17 00:00:00 2001 From: melontini <104443436+melontini@users.noreply.github.com> Date: Sun, 7 Jan 2024 03:09:48 +0700 Subject: [PATCH 15/15] Bump DM. --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 09856f36..5fe4daa4 100644 --- a/gradle.properties +++ b/gradle.properties @@ -17,5 +17,5 @@ modmenu_version=4.2.0-beta.2 fabric_version=0.76.0+1.19.2 cloth_version=8.3.103 fabric_asm_version=2.3 -dark_matter=38aa3a5f2e +dark_matter=3.0.0-1.19.2 mixin_extras_version=0.3.1 \ No newline at end of file