diff --git a/src/main/resources/assets/andromeda/lang/en_us.json b/src/main/resources/assets/andromeda/lang/en_us.json index a52ac59a..678994a5 100644 --- a/src/main/resources/assets/andromeda/lang/en_us.json +++ b/src/main/resources/assets/andromeda/lang/en_us.json @@ -1,6 +1,6 @@ { "modmenu.nameTranslation.andromeda": "Andromeda", - "modmenu.descriptionTranslation.andromeda": "A galaxy is a collection of things and systems. So is this mod.", + "modmenu.descriptionTranslation.andromeda": "Highly configurable, modular tweaks/additions mod!", "itemGroup.andromeda.items": "Andromeda", diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 83f5fc42..68b20bf5 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -3,7 +3,7 @@ "id": "andromeda", "version": "${version}", "name": "Andromeda", - "description": "", + "description": "Highly configurable, modular tweaks/additions mod!", "authors": [], "contact": {}, "license": "MIT", -- 2.51.2 From cf79b65178626a91bbf6e519ccca6db095fa156e Mon Sep 17 00:00:00 2001 From: zenfyr Date: Thu, 4 Jun 2026 22:47:49 +0700 Subject: [PATCH 02/15] docs: drop unused translation keys --- .../assets/andromeda/lang/en_us.json | 62 +---------------- .../assets/andromeda/lang/zh_cn.json | 69 ++----------------- 2 files changed, 7 insertions(+), 124 deletions(-) diff --git a/src/main/resources/assets/andromeda/lang/en_us.json b/src/main/resources/assets/andromeda/lang/en_us.json index 678994a5..6f83e913 100644 --- a/src/main/resources/assets/andromeda/lang/en_us.json +++ b/src/main/resources/assets/andromeda/lang/en_us.json @@ -4,8 +4,6 @@ "itemGroup.andromeda.items": "Andromeda", - "andromeda.game_rule.category": " (Andromeda)", - "config.andromeda.title": "Andromeda (%s)", "config.andromeda.option.enabled": "Enabled", "config.andromeda.option.available": "Available", @@ -21,13 +19,11 @@ "andromeda.config.option_manager.reason.andromeda.module_conflict": "Conflicting module enabled!", "andromeda.config.option_manager.reason.andromeda.iceberg": "Conflicts with Iceberg versions <1.1.13.", "andromeda.config.option_manager.reason.andromeda.side_only_enabled": "Module disabled in side-only mode!", - "andromeda.config.option_manager.reason.andromeda.missing_commander": "This module requires Commander!", "andromeda.config.tooltip.environment.client": "[E] Client", "andromeda.config.tooltip.environment.server": "[E] Server", "andromeda.config.tooltip.environment.both": "[E] Client and Server", "andromeda.config.tooltip.origin": "[@] Taken from or based on %s by %s", - "andromeda.config.tooltip.game_rule": "This option is a default for a game rule!", "andromeda.config.tooltip.deprecated": "[!!!] This feature is deprecated and will be removed in a future version!", "andromeda.config.tooltip.withheld": "[!!!] This feature has been withheld!\nIt may be available in a future update.", @@ -76,14 +72,6 @@ "config.andromeda.blocks.cactus_bottle_filling": "Cactus Bottle Filling", "config.andromeda.blocks.cactus_bottle_filling.@Tooltip": "Lets you fill glass bottles with water using cacti. \nThe top cactus will break and drop a dead bush after 3 uses.", - "config.andromeda.blocks.incubator": "Incubator Settings", - "config.andromeda.blocks.incubator.@Tooltip": "Various Incubator settings.", - "config.andromeda.blocks.incubator.option.randomness": "Random Incubator Hatch Times", - "config.andromeda.blocks.incubator.option.randomness.@Tooltip": "Incubator hatch times will be more random.", - "block.andromeda.incubator": "Incubator", - "tooltip.andromeda.incubator[0]": "A handy little device that is helpful for hatching eggs.", - "tooltip.andromeda.incubator[1]": "Courtesy of \"Bad Software & Hardware LLC\"®", - "config.andromeda.blocks.fletching_table_tweaks": "Fletching Table Tweaks", "config.andromeda.blocks.fletching_table_tweaks.@Tooltip": "Gives the fletching table a GUI where you can tighten the string of your bow for improved accuracy.", "config.andromeda.blocks.fletching_table_tweaks.option.divergenceModifier": "Divergence Modifier", @@ -335,9 +323,6 @@ "config.andromeda.bugfixes.advancement_shadow": "Frame-Independent Advancement Shadow", "config.andromeda.bugfixes.advancement_shadow.@Tooltip": "You know that shadow in the advancements menu when you hover over any advancement? \nNow it won't speed up/slowdown when your frame rate changes.", - "config.andromeda.bugfixes.aligned_alternatives": "Properly Aligned Recipe Alternatives", - "config.andromeda.bugfixes.aligned_alternatives.@Tooltip": "Recipe groups won't look janky when there are a lot of recipes in a group.", - "config.andromeda.category.mechanics": "Mechanics", "config.andromeda.mechanics.linkart": "Linkart", @@ -366,17 +351,6 @@ "config.andromeda.mechanics.dragon_fight.option.shorterSpikes": "Shorter Spikes", "config.andromeda.mechanics.dragon_fight.option.shorterSpikes.@Tooltip": "Newly generated obsidian spikes will be shorter.", - "config.andromeda.mechanics.throwable_items": "Throwable Items", - "config.andromeda.mechanics.throwable_items.@Tooltip": "Allows throwing certain items, which would otherwise be useless*", - "config.andromeda.mechanics.throwable_items.option.blacklist": "Throwable Items Blacklist", - "config.andromeda.mechanics.throwable_items.option.blacklist.@Tooltip": "Block all behaviors of items with following IDs", - "config.andromeda.mechanics.throwable_items.option.canZombiesThrowItems": "Can Zombies Throw Items?", - "config.andromeda.mechanics.throwable_items.option.canZombiesThrowItems.@Tooltip": "Allows zombies to throw items with behaviors.", - "config.andromeda.mechanics.throwable_items.option.zombieThrowInterval": "Throw Interval", - "config.andromeda.mechanics.throwable_items.option.zombieThrowInterval.@Tooltip": "In addition to the cooldown, zombies have an interval between throws.", - "config.andromeda.mechanics.throwable_items.option.tooltip": "Show tooltip", - "tooltip.andromeda.throwable_item": "This item can be thrown.", - "config.andromeda.mechanics.trading_goat_horn": "Wandering Trader Horn", "config.andromeda.mechanics.trading_goat_horn.@Tooltip": "By default, every 2 days you can blow the \"sing\" horn to summon a wandering trader. \nPlease note, wandering traders will still spawn naturally. \nYou can disable the \"doTraderSpawning\" gamerule if you don't want them to.", "config.andromeda.mechanics.trading_goat_horn.option.cooldown": "Cooldown", @@ -433,7 +407,6 @@ "config.andromeda.misc.minor_inconvenience": "Minor Inconvenience", "config.andromeda.misc.minor_inconvenience.@Tooltip": "Players will explode after taking any damage.", "death.attack.andromeda_agony": "%s died from agony", - "death.attack.andromeda_bricked": "%1$s was bricked by %2$s", "config.andromeda.misc.unknown": "???", "tooltip.andromeda.rose_of_the_valley": "The smell reminds you of a valley...", @@ -464,38 +437,5 @@ "config.andromeda.base.option.itemGroup": "Item Group", "config.andromeda.base.option.itemGroup.@Tooltip": "Enable Andromeda's display item group.\nYou can still find items in vanilla groups even if this is disabled.", "config.andromeda.base.option.sendCrashReports": "Send Crash Reports", - "config.andromeda.base.option.sendCrashReports.@Tooltip": "Data sent at crash: \n- Environment (e.g. client), \n- OS version (e.g. Windows 11), \n- Platform (e.g. Fabric), \n- Java (e.g. 17 Oracle Corp), \n- Bootstrap status (e.g Discovery), \n- Certain loaded mods. \nCrash reports don't have a unique profile attached.", - "config.andromeda.base.option.debugMessages": "Enable debug messages?", - "config.andromeda.base.option.debugMessages.@Tooltip": "If enabled, log messages could get spammy.", - - "config.andromeda.lab.title": "Andromeda Lab 🧪", - "config.andromeda.button.lab.tooltip": "Try experimental features!", - "config.andromeda.lab.option.scopedConfigs": "Scoped Configs", - "config.andromeda.lab.option.scopedConfigs.@Tooltip": "Separate module configs on a per-world/dimension basis.\nConfigs can be overridden by data packs and interacted with via KubeJS.\nConsult the wiki for more info!", - "config.andromeda.lab.option.persistentScopedConfigs": "Persistent Scoped Configs", - "config.andromeda.lab.option.persistentScopedConfigs.@Tooltip": "Save scoped module configs to dimension directories.\nPer-dimension configs are not affected by changes to the main config.", - "config.andromeda.lab.option.showAvailableOption": "Show 'Available' Option", - "config.andromeda.lab.option.showAvailableOption.@Tooltip": "Show the 'Available' option for modules with 'game' configs.\nThe option is always visible if Commander is installed!", - "config.andromeda.lab.option.hideSidedModulesInSideOnly": "Hide Sided Modules in Side-Only", - "config.andromeda.lab.option.hideSidedModulesInSideOnly.@Tooltip": "Hide modules which require Andromeda to be present on the other side, if side-only mode is enabled.", - - "commands.andromeda.damage.invulnerable": "Target is invulnerable to the given damage type.", - "commands.andromeda.damage.success": "Applied %s damage to %s", - - "andromeda.bootstrap.no_modules": "Andromeda couldn't discover any modules! This should not happen!", - "andromeda.bootstrap.loading": "Andromeda(%s) on %s(%s)", - - "andromeda.module_manager.invalid_scope": "%s Module '%s' has an invalid scope (%s), must be %s", - "andromeda.module_manager.removed_unlinked_config": "Removed %s as it doesn't belong to any module!", - "andromeda.module_manager.loading_modules": "Loading %s modules:", - "andromeda.module_manager.custom_modules": "Custom modules/categories not provided by Andromeda.", - "andromeda.module_manager.no_modules": "No modules loaded!", - - "andromeda.exception.scoped_configs.no_reloader": "Couldn't get Scoped Configs reloader! Have you restarted the game as you were asked to?", - - "andromeda.exception.mixin_processor.config_notice": "## Mixin configs are internal mod components and are not the same as user configs! ##", - "andromeda.exception.mixin_processor.handler_failed": "Andromeda module caught a mixin handler exception! There's no guarantee that this is Andromeda's fault.", - - "andromeda.exception.module_manager.scoped_configs_disabled": "Module '%s' has an invalid scope (%s), enable the 'scopedConfigs' experiment first!", - "andromeda.exception.module_manager.requires_commander": "This module requires Commander to be installed! Get it here: %s" + "config.andromeda.base.option.sendCrashReports.@Tooltip": "Data sent at crash: \n- Environment (e.g. client), \n- OS version (e.g. Windows 11), \n- Platform (e.g. Fabric), \n- Java (e.g. 17 Oracle Corp), \n- Bootstrap status (e.g Discovery), \n- Certain loaded mods. \nCrash reports don't have a unique profile attached." } \ No newline at end of file diff --git a/src/main/resources/assets/andromeda/lang/zh_cn.json b/src/main/resources/assets/andromeda/lang/zh_cn.json index 3f72cd12..a93c061f 100644 --- a/src/main/resources/assets/andromeda/lang/zh_cn.json +++ b/src/main/resources/assets/andromeda/lang/zh_cn.json @@ -21,7 +21,6 @@ "andromeda.config.option_manager.reason.andromeda.module_conflict": "启用了冲突的特性!", "andromeda.config.option_manager.reason.andromeda.iceberg": "与低于 1.1.13 的 Iceberg 前置冲突。", "andromeda.config.option_manager.reason.andromeda.side_only_enabled": "此特性因启用了“客户端模式”被禁用!", - "andromeda.config.option_manager.reason.andromeda.missing_commander": "此特性依赖于命令官模组!", "andromeda.config.tooltip.environment.client": "[E] 客户端", "andromeda.config.tooltip.environment.server": "[E] 服务端", @@ -76,14 +75,6 @@ "config.andromeda.blocks.cactus_bottle_filling": "仙人掌取水", "config.andromeda.blocks.cactus_bottle_filling.@Tooltip": "手持空瓶对仙人掌右键来取出其中的水。\n顶部的仙人掌在被取三次水后会被破坏,掉落枯萎的灌木。", - "config.andromeda.blocks.incubator": "孵蛋器设置", - "config.andromeda.blocks.incubator.@Tooltip": "一些关于孵蛋器的设置 :)", - "config.andromeda.blocks.incubator.option.randomness": "孵化时间随机化", - "config.andromeda.blocks.incubator.option.randomness.@Tooltip": "孵蛋器的孵蛋时间将更加随机。", - "block.andromeda.incubator": "孵蛋器", - "tooltip.andromeda.incubator[0]": "一个方便的,用于孵蛋的小装置。", - "tooltip.andromeda.incubator[1]": "感谢“Bad Software & Hardware LLC”®。", - "config.andromeda.blocks.fletching_table_tweaks": "实用的制箭台", "config.andromeda.blocks.fletching_table_tweaks.@Tooltip": "赋予制箭台功能界面,使你能够通过强化弓弦提高射击准度。", "config.andromeda.blocks.fletching_table_tweaks.option.divergenceModifier": "射击偏差", @@ -305,7 +296,7 @@ "config.andromeda.items.mending_tweaks": "更平衡的经验修补", "config.andromeda.items.mending_tweaks.@Tooltip": "通过移除“过于昂贵”的特性,让经验修补不是那么不可或缺,\n让玩家不再一味地用经验来修补工具。\n同时,将附魔等级上限设置为了 40(不完全如此!)\n这个特性受到了 TheMisterEpic 的视频“This Minecraft Enchantment has been BROKEN for 3 YEARS...”的启发。", - + "config.andromeda.items.minecart_block_picking": "矿车方块采集", "config.andromeda.items.minecart_block_picking.@Tooltip": "允许玩家通过矿车“采集”方块。", "config.andromeda.items.minecart_block_picking.option.spawnerPicking": "矿车采集刷怪笼", @@ -331,10 +322,8 @@ "config.andromeda.bugfixes.advancement_shadow": "独立成就阴影渲染", "config.andromeda.bugfixes.advancement_shadow.@Tooltip": "还记得当鼠标移动到成就上时显示的阴影吗?\n现在它不会再因为帧率变动而改变动画速度了。", - "config.andromeda.bugfixes.aligned_alternatives": "对齐配方界面", - "config.andromeda.bugfixes.aligned_alternatives.@Tooltip": "在组内配方繁多时,配方组别不会再看上去那么小块了。", - "config.andromeda.category.mechanics": "机制", + "config.andromeda.mechanics.villager_gifting": "友好送礼", "config.andromeda.mechanics.villager_gifting.@Tooltip": "使玩家能够通过给村民送礼来恢复一定的声望值!", @@ -348,17 +337,6 @@ "config.andromeda.mechanics.dragon_fight.option.shorterSpikes": "更短的黑曜石柱", "config.andromeda.mechanics.dragon_fight.option.shorterSpikes.@Tooltip": "让新生成的黑曜石柱更短。", - "config.andromeda.mechanics.throwable_items": "可投掷物品", - "config.andromeda.mechanics.throwable_items.@Tooltip": "使一些本来可能用不上*的物品变得可投掷。", - "config.andromeda.mechanics.throwable_items.option.blacklist": "投掷物黑名单", - "config.andromeda.mechanics.throwable_items.option.blacklist.@Tooltip": "禁用以下 ID 的物品被投掷。", - "config.andromeda.mechanics.throwable_items.option.canZombiesThrowItems": "僵尸能否投掷物品?", - "config.andromeda.mechanics.throwable_items.option.canZombiesThrowItems.@Tooltip": "使僵尸也能够投掷物品。", - "config.andromeda.mechanics.throwable_items.option.zombieThrowInterval": "僵尸投掷冷却", - "config.andromeda.mechanics.throwable_items.option.zombieThrowInterval.@Tooltip": "在原本冷却的基础上,额外增加的投掷冷却时间。", - "config.andromeda.mechanics.throwable_items.option.tooltip": "显示“可投掷”工具提示", - "tooltip.andromeda.throwable_item": "可投掷", - "config.andromeda.mechanics.trading_goat_horn": "流浪商人号角", "config.andromeda.mechanics.trading_goat_horn.@Tooltip": "每两天,你都能使用“歌颂”号角来召唤一位流浪商人。\n值得注意的是,流浪商人仍然会自然生成。\n你可以通过禁用\"doTraderSpawning\"的游戏规则来禁用流浪商人自然生成。", "config.andromeda.mechanics.trading_goat_horn.option.cooldown": "冷却时间", @@ -400,8 +378,6 @@ "config.andromeda.misc.damage_backport.@Tooltip": "对高版本 /damage 指令的非完全复刻!", "config.andromeda.misc.translations": "翻译更新", "config.andromeda.misc.translations.@Tooltip": "尝试从 github 下载最新版的翻译文件。", - "andromeda.misc.translations.exception.no_valid_lang": "无法找到有效的语言选项!", - "andromeda.misc.translations.failed_lang_acquire": "无法使用所选语言!", "config.andromeda.misc.recipe_advancements_generation": "自动生成配方成就", "config.andromeda.misc.recipe_advancements_generation.@Tooltip": "尝试为绝大部分配方生成配方成就。", @@ -417,11 +393,11 @@ "config.andromeda.misc.minor_inconvenience": "小麻烦", "config.andromeda.misc.minor_inconvenience.@Tooltip": "使玩家在受到伤害后爆炸。", "death.attack.andromeda_agony": "%s死于痛苦", - "death.attack.andromeda_bricked": "%1$s被%2$s用砖块砸晕了", "config.andromeda.misc.unknown": "???", "tooltip.andromeda.rose_of_the_valley": "它的芬芳令你如临深谷", "block.andromeda.rose_of_the_valley": "山谷玫瑰", + "item.andromeda.rose_of_the_valley": "山谷玫瑰", "config.andromeda.misc.tiny_storage": "[实验性] 微存储", "config.andromeda.misc.tiny_storage.@Tooltip": "允许玩家在背包的 2x2 合成位存放至多四组物品。\n目前处于测试阶段,谨慎启用!", @@ -429,44 +405,11 @@ "config.andromeda.misc.tiny_storage.option.transferMode.@Tooltip": "其中物品应当死亡保留,还是死亡掉落。", "config.andromeda.misc.tiny_storage.option.TransferMode.FOLLOW_GAMERULE": "与游戏规则一致", "config.andromeda.misc.tiny_storage.option.TransferMode.ALWAYS_TRANSFER": "总是保留", - + "config.andromeda.base.option.sideOnlyMode": "仅客户端模式", "config.andromeda.base.option.sideOnlyMode.@Tooltip": "禁用所有要求服务端的特性。", - "config.andromeda.base.option.sendCrashReports": "上传错误报告", - "config.andromeda.base.option.sendCrashReports.@Tooltip": "崩溃时上传的数据:\n- 环境(如客户端),\n- 系统版本(如 Windows 11),\n- 平台(如 Fabric),\n- Java(如 Oracle Java17),\n- Bootstrap 状态(如 Discovery),\n- 部分载入的模组。\n错误报告不会附加特征信息。", - "config.andromeda.base.option.debugMessages": "启用调试信息", - "config.andromeda.base.option.debugMessages.@Tooltip": "开启后,日志内容将被数不清的调试信息淹没。", - - "config.andromeda.lab.title": "群星实验室 🧪", - "config.andromeda.button.lab.tooltip": "试试那些实验性功能!", "config.andromeda.base.option.itemGroup": "专有物品组别", "config.andromeda.base.option.itemGroup.@Tooltip": "群星的物品将被单独放到一个组别里。\n即使禁用,你也可以在原版的物品组别里找到这些物品。", - "config.andromeda.lab.option.scopedConfigs": "分化配置", - "config.andromeda.lab.option.scopedConfigs.@Tooltip": "使你能够逐世界、逐维度应用配置。\n这些配置可以通过数据包覆盖,也可以用 KubeJS 更改。\n欲知更多内容,请查阅维基!", - "config.andromeda.lab.option.persistentScopedConfigs": "持久型分化配置", - "config.andromeda.lab.option.persistentScopedConfigs.@Tooltip": "将分化配置保存到维度的目录中。\n维度的配置不受主配置影响。", - "config.andromeda.lab.option.showAvailableOption": "显示“可用”选项", - "config.andromeda.lab.option.showAvailableOption.@Tooltip": "一同展示“可用”选项与“游戏内”配置。\n若安装了命令官模组,该选项将保持可见状态!", - "config.andromeda.lab.option.hideSidedModulesInSideOnly": "在仅客户端模式隐藏服务端特性", - "config.andromeda.lab.option.hideSidedModulesInSideOnly.@Tooltip": "若启用了仅客户端模式,隐藏所有需要服务端的特性。", - - "commands.andromeda.damage.invulnerable": "目标免疫所给予的伤害类型", - "commands.andromeda.damage.success": "已将%s伤害施加于%s", - - "andromeda.bootstrap.no_modules": "群星无法发现任何特性!一般情况下,这不该发生!", - "andromeda.bootstrap.loading": "群星(%s)正在 %s(%s)上运行", - - "andromeda.module_manager.invalid_scope": "%s 特性 “%s” 存在无效分化(%s),它需要是 %s", - "andromeda.module_manager.removed_unlinked_config": "已移除 %s,因为它不是任何特性的配置文件!", - "andromeda.module_manager.loading_modules": "%s 个特性载入中:", - "andromeda.module_manager.custom_modules": "群星模组不支持自定义特性或类别。", - "andromeda.module_manager.no_modules": "未载入特性!", - - "andromeda.exception.scoped_configs.no_reloader": "无法获取分化配置重载器!你确定已经重启了游戏?", - - "andromeda.exception.mixin_processor.config_notice": "## Mixin 配置不同于用户配置,是模组的一部分! ##", - "andromeda.exception.mixin_processor.handler_failed": "群星模组发现了一处 mixin 冲突!无法确定是否是群星模组的问题。", - - "andromeda.exception.module_manager.scoped_configs_disabled": "“%s”特性存在无效的分化配置,请先启用“分化配置”!", - "andromeda.exception.module_manager.requires_commander": "这一特性依赖于命令官模组!下载:%s" + "config.andromeda.base.option.sendCrashReports": "上传错误报告", + "config.andromeda.base.option.sendCrashReports.@Tooltip": "崩溃时上传的数据:\n- 环境(如客户端),\n- 系统版本(如 Windows 11),\n- 平台(如 Fabric),\n- Java(如 Oracle Java17),\n- Bootstrap 状态(如 Discovery),\n- 部分载入的模组。\n错误报告不会附加特征信息。" } -- 2.51.2 From bdd5e2fbbbf8bf14bda055b224551d9ae84601a1 Mon Sep 17 00:00:00 2001 From: zenfyr Date: Thu, 4 Jun 2026 23:01:47 +0700 Subject: [PATCH 03/15] docs: more unused stuff --- src/main/resources/assets/andromeda/lang/en_us.json | 3 +-- src/main/resources/assets/andromeda/lang/zh_cn.json | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/main/resources/assets/andromeda/lang/en_us.json b/src/main/resources/assets/andromeda/lang/en_us.json index 6f83e913..9ca1af84 100644 --- a/src/main/resources/assets/andromeda/lang/en_us.json +++ b/src/main/resources/assets/andromeda/lang/en_us.json @@ -388,8 +388,7 @@ "config.andromeda.gui.smooth_tooltips.option.deltaY": "Vertical delta", "config.andromeda.category.misc": "Misc", - "config.andromeda.misc.damage_backport": "/damage backport", - "config.andromeda.misc.damage_backport.@Tooltip": "A backport of the /damage command. Not a 1-1 copy!", + "config.andromeda.misc.translations": "Auto Update Translations", "config.andromeda.misc.translations.@Tooltip": "Try to download latest translations from GitHub.", diff --git a/src/main/resources/assets/andromeda/lang/zh_cn.json b/src/main/resources/assets/andromeda/lang/zh_cn.json index a93c061f..d180d693 100644 --- a/src/main/resources/assets/andromeda/lang/zh_cn.json +++ b/src/main/resources/assets/andromeda/lang/zh_cn.json @@ -374,8 +374,7 @@ "config.andromeda.gui.smooth_tooltips.option.deltaY": "垂直移速系数", "config.andromeda.category.misc": "杂项", - "config.andromeda.misc.damage_backport": "/damage 指令复刻", - "config.andromeda.misc.damage_backport.@Tooltip": "对高版本 /damage 指令的非完全复刻!", + "config.andromeda.misc.translations": "翻译更新", "config.andromeda.misc.translations.@Tooltip": "尝试从 github 下载最新版的翻译文件。", -- 2.51.2 From 254ef86a88f9a8875daea3399323fca0ed082c22 Mon Sep 17 00:00:00 2001 From: zenfyr Date: Thu, 4 Jun 2026 23:06:13 +0700 Subject: [PATCH 04/15] feat: custom translations URL --- .../modules/misc/translations/Client.java | 14 ++++++++++++-- .../modules/misc/translations/Translations.java | 11 +++++++++++ .../resources/assets/andromeda/lang/en_us.json | 2 ++ 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/src/main/java/dev/zenfyr/andromeda/modules/misc/translations/Client.java b/src/main/java/dev/zenfyr/andromeda/modules/misc/translations/Client.java index 8b1b8d5b..83d33251 100644 --- a/src/main/java/dev/zenfyr/andromeda/modules/misc/translations/Client.java +++ b/src/main/java/dev/zenfyr/andromeda/modules/misc/translations/Client.java @@ -2,6 +2,7 @@ package dev.zenfyr.andromeda.modules.misc.translations; import com.google.common.collect.Sets; import dev.zenfyr.andromeda.bootstrap.ModuleManager; +import dev.zenfyr.andromeda.common.client.AndromedaClient; import dev.zenfyr.andromeda.util.DataRefreshUtil; import dev.zenfyr.andromeda.util.NetUtils; import dev.zenfyr.andromeda.util.Util; @@ -84,11 +85,20 @@ public final class Client { } } + private static String normalizeBaseUrl(String baseUrl) { + return baseUrl.endsWith("/") ? baseUrl : baseUrl + '/'; + } + private static String downloadLang(String language, Translations module) { try { + var config = AndromedaClient.CLIENT.get(Translations.CONFIG); + String baseUrl = normalizeBaseUrl( + "default".equals(config.baseUrl) + ? URL + Translations.BRANCH + "/src/main/resources/assets/andromeda/lang/" + : config.baseUrl); + HttpRequest request = HttpRequest.newBuilder() - .uri(URI.create(URL + Translations.BRANCH + "/src/main/resources/assets/andromeda/lang/" - + language + ".json")) + .uri(URI.create(baseUrl + language + ".json")) .GET() .build(); diff --git a/src/main/java/dev/zenfyr/andromeda/modules/misc/translations/Translations.java b/src/main/java/dev/zenfyr/andromeda/modules/misc/translations/Translations.java index 02ad94fa..6f5c1a23 100644 --- a/src/main/java/dev/zenfyr/andromeda/modules/misc/translations/Translations.java +++ b/src/main/java/dev/zenfyr/andromeda/modules/misc/translations/Translations.java @@ -2,6 +2,9 @@ package dev.zenfyr.andromeda.modules.misc.translations; import dev.zenfyr.andromeda.bootstrap.Module; import dev.zenfyr.andromeda.bootstrap.ModuleInfo; +import dev.zenfyr.andromeda.bootstrap.config.BaseConfig; +import dev.zenfyr.andromeda.bootstrap.config.ConfigDefinition; +import dev.zenfyr.andromeda.bootstrap.config.RegisterConfigEvent; import dev.zenfyr.andromeda.bootstrap.event.CreateBootstrapConfigEvent; import dev.zenfyr.andromeda.bootstrap.event.InitEvents; import dev.zenfyr.andromeda.bootstrap.event.PostBootstrapEvent; @@ -20,12 +23,20 @@ public final class Translations extends Module implements PostBootstrapEvent { public static final Path EN_US = LANG_PATH.resolve("en_us.json"); public static final Path OPTIONS = FabricLoader.getInstance().getGameDir().resolve("options.txt"); + public static final ConfigDefinition CONFIG = new ConfigDefinition<>(() -> Config.class); + Translations() { CreateBootstrapConfigEvent.get(this).listen(() -> true); + RegisterConfigEvent.get(this, RegisterConfigEvent.CLIENT).listen(() -> CONFIG); } @Override public void postBootstrap() { InitEvents.CLIENT.listen(() -> Client::init); } + + public static final class Config extends BaseConfig { + + public String baseUrl = "default"; + } } diff --git a/src/main/resources/assets/andromeda/lang/en_us.json b/src/main/resources/assets/andromeda/lang/en_us.json index 9ca1af84..942cd02a 100644 --- a/src/main/resources/assets/andromeda/lang/en_us.json +++ b/src/main/resources/assets/andromeda/lang/en_us.json @@ -391,6 +391,8 @@ "config.andromeda.misc.translations": "Auto Update Translations", "config.andromeda.misc.translations.@Tooltip": "Try to download latest translations from GitHub.", + "config.andromeda.misc.translations.option.baseUrl": "Base URL", + "config.andromeda.misc.translations.option.baseUrl.@Tooltip": "By default, the mod will download translations from GitHub, this option allows setting a different base URL. \nThe full url must end with [lang code].json, e.g. baseUrl + 'en_us.json'", "config.andromeda.misc.recipe_advancements_generation": "Auto-generate Recipe Advancements", "config.andromeda.misc.recipe_advancements_generation.@Tooltip": "Tries to automatically generate recipe advancements for most recipes.", -- 2.51.2 From b6a8830cbd24478a41105e7c9a36889452a107ec Mon Sep 17 00:00:00 2001 From: zenfyr Date: Thu, 4 Jun 2026 23:39:06 +0700 Subject: [PATCH 05/15] fix: slimes merging would sometimes result in the bigger slime actually shrinking --- .../slimes/mixin/merge/SlimeEntityMixin.java | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/main/java/dev/zenfyr/andromeda/modules/entities/slimes/mixin/merge/SlimeEntityMixin.java b/src/main/java/dev/zenfyr/andromeda/modules/entities/slimes/mixin/merge/SlimeEntityMixin.java index 1ef06b98..1eaa845c 100644 --- a/src/main/java/dev/zenfyr/andromeda/modules/entities/slimes/mixin/merge/SlimeEntityMixin.java +++ b/src/main/java/dev/zenfyr/andromeda/modules/entities/slimes/mixin/merge/SlimeEntityMixin.java @@ -34,13 +34,12 @@ abstract class SlimeEntityMixin extends Mob { @Inject(at = @At("TAIL"), method = "registerGoals") private void andromeda$newGoal(CallbackInfo ci) { - var config = this.level.am$get(Slimes.CONFIG); this.targetSelector.addGoal( 2, new NearestAttackableTargetGoal<>( (Slime) (Object) this, Slime.class, 5, true, false, (livingEntity, level) -> { - if (!config.available) return false; - if (!config.merge) return false; + var config = this.level.am$get(Slimes.CONFIG); + if (!config.available || !config.merge) return false; if (this.andromeda$mergeCD > 0) return false; float d = livingEntity.distanceTo(this); return d <= 6 @@ -51,12 +50,11 @@ abstract class SlimeEntityMixin extends Mob { @Inject(at = @At("TAIL"), method = "push") private void andromeda$push(Entity entity, CallbackInfo ci) { var config = this.level.am$get(Slimes.CONFIG); - if (!config.available) return; - - if (!config.merge) return; + if (!config.available || !config.merge) return; if (getTarget() instanceof Slime slime && slime == entity && this.andromeda$mergeCD == 0) { - int size = (int) Math.round(slime.getSize() * 0.75 + getSize() * 0.75); + int largest = Math.max(slime.getSize(), getSize()); + int size = (int) Math.max(largest, Math.round(slime.getSize() * 0.75 + getSize() * 0.75)); slime.discard(); this.setSize(size, true); -- 2.51.2 From 710dda1fe419f11085dcd43d03662f528a0f20c5 Mon Sep 17 00:00:00 2001 From: zenfyr Date: Fri, 5 Jun 2026 00:02:07 +0700 Subject: [PATCH 06/15] feat: drop isPlant check for plant tempt. --- .../crop_temperature/PlantTemperatureData.java | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/src/main/java/dev/zenfyr/andromeda/modules/world/crop_temperature/PlantTemperatureData.java b/src/main/java/dev/zenfyr/andromeda/modules/world/crop_temperature/PlantTemperatureData.java index 2f0debd1..d357fc65 100644 --- a/src/main/java/dev/zenfyr/andromeda/modules/world/crop_temperature/PlantTemperatureData.java +++ b/src/main/java/dev/zenfyr/andromeda/modules/world/crop_temperature/PlantTemperatureData.java @@ -80,15 +80,13 @@ public final class PlantTemperatureData { ReloaderType.create(Andromeda.id("crop_temperatures")); public static boolean roll(BlockPos pos, BlockState state, float temp, ServerLevel world) { - if (isPlant(state.getBlock())) { - float[] data = world.getServer().pulsar$getReloader(RELOADER).get(state.getBlock()); - if (data != null) { - if (!world.am$get(PlantTemperature.CONFIG).available) return true; - - if ((temp > data[2] && temp <= data[3]) || (temp < data[1] && temp >= data[0])) { - return MathUtil.nextInt(0, 1) != 0; - } else return !(temp > data[3]) && !(temp < data[0]); - } + float[] data = world.getServer().pulsar$getReloader(RELOADER).get(state.getBlock()); + if (data != null) { + if (!world.am$get(PlantTemperature.CONFIG).available) return true; + + if ((temp > data[2] && temp <= data[3]) || (temp < data[1] && temp >= data[0])) { + return MathUtil.nextInt(0, 1) != 0; + } else return !(temp > data[3]) && !(temp < data[0]); } return true; } -- 2.51.2 From f9b5744ac4f325c6b782bc5e4b6efae54c389720 Mon Sep 17 00:00:00 2001 From: zenfyr Date: Fri, 5 Jun 2026 00:06:56 +0700 Subject: [PATCH 07/15] fix: this is a massive bug and a crash makes more sense. --- .../dev/zenfyr/andromeda/common/config/DataConfigs.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/main/java/dev/zenfyr/andromeda/common/config/DataConfigs.java b/src/main/java/dev/zenfyr/andromeda/common/config/DataConfigs.java index 8a25df14..3e136df2 100644 --- a/src/main/java/dev/zenfyr/andromeda/common/config/DataConfigs.java +++ b/src/main/java/dev/zenfyr/andromeda/common/config/DataConfigs.java @@ -128,10 +128,8 @@ public final class DataConfigs extends JsonCodecDataLoader { public interface WorldExtension { default T am$get(ConfigDefinition definition) { - log.error( - "Scoped configs requested on client in world '{}'! Returning un-scoped!", - ((Level) this).dimension().location()); - return Andromeda.MAIN.get(definition); // Stub implementation. DNI + throw new IllegalStateException("Game configs requested in client world '%s'!" + .formatted(((Level) this).dimension().location())); } } -- 2.51.2 From 5fddfcd9c27b9a012d21c5fe16a3d3eeb0d82d8f Mon Sep 17 00:00:00 2001 From: zenfyr Date: Fri, 5 Jun 2026 00:15:08 +0700 Subject: [PATCH 08/15] feat: add more debug options --- .../zenfyr/andromeda/bootstrap/ModuleManager.java | 2 +- .../dev/zenfyr/andromeda/common/Andromeda.java | 6 ++++++ .../andromeda/modules/items/pouches/Main.java | 4 ++-- .../modules/items/pouches/items/PouchItem.java | 4 ++-- .../crop_temperature/PlantTemperatureData.java | 4 ++-- src/main/java/dev/zenfyr/andromeda/util/Debug.java | 14 ++++++++++++++ 6 files changed, 27 insertions(+), 7 deletions(-) diff --git a/src/main/java/dev/zenfyr/andromeda/bootstrap/ModuleManager.java b/src/main/java/dev/zenfyr/andromeda/bootstrap/ModuleManager.java index f73c2f7a..fb7655d3 100644 --- a/src/main/java/dev/zenfyr/andromeda/bootstrap/ModuleManager.java +++ b/src/main/java/dev/zenfyr/andromeda/bootstrap/ModuleManager.java @@ -95,7 +95,7 @@ public class ModuleManager implements PreLaunchEntrypoint { ModuleHelper.runAndDropBus( value, BootstrapConfigEvent.ID, event -> event.bootstrapConfig(config)); - if (config.enabled || Debug.get().enableAllModules) { + if (config.enabled || Debug.get().isEnableAllModules()) { this.modules.put(value.getClass(), value); this.modulesByName.put(ModuleHelper.id(value.meta()), value); } diff --git a/src/main/java/dev/zenfyr/andromeda/common/Andromeda.java b/src/main/java/dev/zenfyr/andromeda/common/Andromeda.java index 22a6d81c..7fd86a23 100644 --- a/src/main/java/dev/zenfyr/andromeda/common/Andromeda.java +++ b/src/main/java/dev/zenfyr/andromeda/common/Andromeda.java @@ -15,6 +15,7 @@ import dev.zenfyr.andromeda.common.util.GsonCodecContext; import dev.zenfyr.andromeda.common.util.Keeper; import dev.zenfyr.andromeda.common.util.condition.ItemsRegisteredCondition; import dev.zenfyr.andromeda.common.util.condition.ModulesLoadedCondition; +import dev.zenfyr.andromeda.util.Debug; import lombok.Getter; import net.fabricmc.api.ModInitializer; import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents; @@ -30,6 +31,7 @@ import net.minecraft.world.item.CreativeModeTab; import net.minecraft.world.item.Item; import net.minecraft.world.level.block.Block; import org.jetbrains.annotations.Nullable; +import org.spongepowered.asm.mixin.MixinEnvironment; public class Andromeda implements ModInitializer { @@ -95,6 +97,10 @@ public class Andromeda implements ModInitializer { // Init the data pack config system DataConfigs.init(manager); + + if (Debug.get().isMixinAudit()) { + MixinEnvironment.getCurrentEnvironment().audit(); + } } public void onMergedEntryPoint() { diff --git a/src/main/java/dev/zenfyr/andromeda/modules/items/pouches/Main.java b/src/main/java/dev/zenfyr/andromeda/modules/items/pouches/Main.java index ce590712..ce841376 100644 --- a/src/main/java/dev/zenfyr/andromeda/modules/items/pouches/Main.java +++ b/src/main/java/dev/zenfyr/andromeda/modules/items/pouches/Main.java @@ -9,7 +9,7 @@ import dev.zenfyr.andromeda.common.util.Keeper; import dev.zenfyr.andromeda.modules.items.pouches.entities.CustomPouchComponent; import dev.zenfyr.andromeda.modules.items.pouches.entities.PouchEntity; import dev.zenfyr.andromeda.modules.items.pouches.items.PouchItem; -import dev.zenfyr.andromeda.util.Util; +import dev.zenfyr.andromeda.util.Debug; import dev.zenfyr.pulsar.itemstack.ItemStackUtil; import dev.zenfyr.pulsar.util.ExceptionUtil; import java.lang.reflect.Field; @@ -194,7 +194,7 @@ public final class Main { } } - if (Util.isDev()) { + if (Debug.get().isVerbose()) { StringBuilder b = new StringBuilder(); b.append("Viewable block entities:"); Main.VIEWABLE_VIEW.forEach((blockEntityType, field) -> { diff --git a/src/main/java/dev/zenfyr/andromeda/modules/items/pouches/items/PouchItem.java b/src/main/java/dev/zenfyr/andromeda/modules/items/pouches/items/PouchItem.java index 5d756bb8..6e446b35 100644 --- a/src/main/java/dev/zenfyr/andromeda/modules/items/pouches/items/PouchItem.java +++ b/src/main/java/dev/zenfyr/andromeda/modules/items/pouches/items/PouchItem.java @@ -3,7 +3,7 @@ package dev.zenfyr.andromeda.modules.items.pouches.items; import dev.zenfyr.andromeda.common.util.LootContextBuilder; import dev.zenfyr.andromeda.modules.items.pouches.Main; import dev.zenfyr.andromeda.modules.items.pouches.entities.PouchEntity; -import dev.zenfyr.andromeda.util.Util; +import dev.zenfyr.andromeda.util.Debug; import dev.zenfyr.pulsar.util.TextUtil; import java.util.function.Consumer; import lombok.Getter; @@ -50,7 +50,7 @@ public class PouchItem extends Item implements ProjectileItem { TooltipDisplay display, Consumer consumer, TooltipFlag flag) { - if (flag.isAdvanced() && Util.isDev()) { + if (flag.isAdvanced() && Debug.get().isVerbose()) { consumer.accept( TextUtil.literal("Loot: " + this.getType().getLootId(stack).location()) .withStyle(ChatFormatting.GRAY)); diff --git a/src/main/java/dev/zenfyr/andromeda/modules/world/crop_temperature/PlantTemperatureData.java b/src/main/java/dev/zenfyr/andromeda/modules/world/crop_temperature/PlantTemperatureData.java index d357fc65..4ff29a5a 100644 --- a/src/main/java/dev/zenfyr/andromeda/modules/world/crop_temperature/PlantTemperatureData.java +++ b/src/main/java/dev/zenfyr/andromeda/modules/world/crop_temperature/PlantTemperatureData.java @@ -7,7 +7,7 @@ import com.mojang.serialization.DataResult; import com.mojang.serialization.codecs.RecordCodecBuilder; import dev.zenfyr.andromeda.bootstrap.ModuleManager; import dev.zenfyr.andromeda.common.Andromeda; -import dev.zenfyr.andromeda.util.Util; +import dev.zenfyr.andromeda.util.Debug; import dev.zenfyr.pulsar.codec.ExtraCodecs; import dev.zenfyr.pulsar.codec.JsonCodecDataLoader; import dev.zenfyr.pulsar.resources.ReloaderType; @@ -171,7 +171,7 @@ public final class PlantTemperatureData { result.putAll(replace); this.map = result; - if (Util.isDev()) verifyPostLoad(module, this); + if (Debug.get().isVerbose()) verifyPostLoad(module, this); } } } diff --git a/src/main/java/dev/zenfyr/andromeda/util/Debug.java b/src/main/java/dev/zenfyr/andromeda/util/Debug.java index ef66ab36..637e91bd 100644 --- a/src/main/java/dev/zenfyr/andromeda/util/Debug.java +++ b/src/main/java/dev/zenfyr/andromeda/util/Debug.java @@ -21,6 +21,8 @@ public class Debug extends BaseConfig { public boolean enableAllModules = false; public Map> skipModIntegration = new HashMap<>(); + public boolean verbose = false; + public boolean mixinAudit = false; public boolean skipIntegration(Module module, String mod) { var set = this.skipModIntegration.get(ModuleHelper.id(module)); @@ -45,6 +47,18 @@ public class Debug extends BaseConfig { return false; } + public boolean isEnableAllModules() { + return this.enableAllModules; + } + + public boolean isVerbose() { + return this.verbose || Util.isDev(); + } + + public boolean isMixinAudit() { + return this.mixinAudit || Util.isDev(); + } + public static Debug get() { return ModuleManager.get().modConfig().get(KEY); } -- 2.51.2 From b10c8c38434b2be1646303e7055aa710c3512ae2 Mon Sep 17 00:00:00 2001 From: zenfyr Date: Fri, 5 Jun 2026 00:26:18 +0700 Subject: [PATCH 09/15] fix: use NetUtils in translations, guard onResourceReload. --- .../andromeda/modules/misc/translations/Client.java | 8 +++----- src/main/java/dev/zenfyr/andromeda/util/NetUtils.java | 1 + 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/main/java/dev/zenfyr/andromeda/modules/misc/translations/Client.java b/src/main/java/dev/zenfyr/andromeda/modules/misc/translations/Client.java index 83d33251..7c53965d 100644 --- a/src/main/java/dev/zenfyr/andromeda/modules/misc/translations/Client.java +++ b/src/main/java/dev/zenfyr/andromeda/modules/misc/translations/Client.java @@ -8,7 +8,6 @@ import dev.zenfyr.andromeda.util.NetUtils; import dev.zenfyr.andromeda.util.Util; import java.io.IOException; import java.net.URI; -import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; import java.nio.file.Files; @@ -26,8 +25,6 @@ public final class Client { private static final String URL = DataRefreshUtil.RAW_URL + "/" + DataRefreshUtil.OWNER + "/" + DataRefreshUtil.REPO + "/"; - private static final HttpClient CLIENT = - HttpClient.newBuilder().followRedirects(HttpClient.Redirect.NORMAL).build(); private static String languageCode = "en_us"; @@ -62,7 +59,7 @@ public final class Client { } public static void onResourceReload(String code, Translations module) { - if (!languageCode.equals(code)) { + if (NetUtils.get().allow && !languageCode.equals(code)) { languageCode = code; Set languages = Sets.newHashSet("en_us"); languages.add(code); @@ -102,7 +99,8 @@ public final class Client { .GET() .build(); - HttpResponse response = CLIENT.send(request, HttpResponse.BodyHandlers.ofString()); + HttpResponse response = + NetUtils.get().getClient().send(request, HttpResponse.BodyHandlers.ofString()); if (response.statusCode() != 200) { module diff --git a/src/main/java/dev/zenfyr/andromeda/util/NetUtils.java b/src/main/java/dev/zenfyr/andromeda/util/NetUtils.java index 1645c049..e1670dd9 100644 --- a/src/main/java/dev/zenfyr/andromeda/util/NetUtils.java +++ b/src/main/java/dev/zenfyr/andromeda/util/NetUtils.java @@ -10,6 +10,7 @@ public final class NetUtils extends BaseConfig { public static final ModConfigHandler.Key KEY = new ModConfigHandler.Key<>("connections", NetUtils.class); + private static final HttpClient CLIENT = HttpClient.newBuilder() .followRedirects(HttpClient.Redirect.NORMAL) .connectTimeout(Duration.ofSeconds(5)) -- 2.51.2 From 47da959fb3188dc75e739e331b90b2b9375b605f Mon Sep 17 00:00:00 2001 From: zenfyr Date: Fri, 5 Jun 2026 00:52:48 +0700 Subject: [PATCH 10/15] refactor: move manager config stuff to the manager --- .../andromeda/bootstrap/ModuleManager.java | 27 +++- .../bootstrap/config/ModInitConfig.java | 5 - .../config/handler/ModConfigHandler.java | 4 +- .../andromeda/{ => bootstrap}/util/Debug.java | 8 +- .../andromeda/bootstrap/util/NetUtils.java | 70 +++++++++++ .../zenfyr/andromeda/common/Andromeda.java | 3 +- .../FletchingScreenHandler.java | 6 +- .../ItemFrameTooltips.java | 7 +- .../gui/name_tooltips/NameTooltips.java | 7 +- .../andromeda/modules/items/pouches/Main.java | 6 +- .../items/pouches/items/PouchItem.java | 4 +- .../modules/misc/translations/Client.java | 30 ++--- .../mixin/MinecraftClientMixin.java | 4 +- .../PlantTemperatureData.java | 12 +- .../andromeda/util/DataRefreshUtil.java | 117 ------------------ .../dev/zenfyr/andromeda/util/NetUtils.java | 32 ----- 16 files changed, 138 insertions(+), 204 deletions(-) rename src/main/java/dev/zenfyr/andromeda/{ => bootstrap}/util/Debug.java (91%) create mode 100644 src/main/java/dev/zenfyr/andromeda/bootstrap/util/NetUtils.java delete mode 100644 src/main/java/dev/zenfyr/andromeda/util/DataRefreshUtil.java delete mode 100644 src/main/java/dev/zenfyr/andromeda/util/NetUtils.java diff --git a/src/main/java/dev/zenfyr/andromeda/bootstrap/ModuleManager.java b/src/main/java/dev/zenfyr/andromeda/bootstrap/ModuleManager.java index fb7655d3..edc99cf2 100644 --- a/src/main/java/dev/zenfyr/andromeda/bootstrap/ModuleManager.java +++ b/src/main/java/dev/zenfyr/andromeda/bootstrap/ModuleManager.java @@ -1,11 +1,14 @@ package dev.zenfyr.andromeda.bootstrap; +import dev.zenfyr.andromeda.bootstrap.config.ModInitConfig; import dev.zenfyr.andromeda.bootstrap.config.handler.BootstrapConfigHandler; import dev.zenfyr.andromeda.bootstrap.config.handler.ModConfigHandler; import dev.zenfyr.andromeda.bootstrap.event.BootstrapConfigEvent; import dev.zenfyr.andromeda.bootstrap.event.PostBootstrapEvent; import dev.zenfyr.andromeda.bootstrap.event.PostModuleInitEvent; +import dev.zenfyr.andromeda.bootstrap.util.Debug; import dev.zenfyr.andromeda.bootstrap.util.Environment; +import dev.zenfyr.andromeda.bootstrap.util.NetUtils; import dev.zenfyr.andromeda.bootstrap.util.mixin.MixinHandler; import dev.zenfyr.andromeda.modules.ModuleDiscovery; import dev.zenfyr.andromeda.util.*; @@ -29,7 +32,16 @@ public class ModuleManager implements PreLaunchEntrypoint { FabricLoader.getInstance().getModContainer(AndromedaConstants.MODID).orElseThrow(); @Getter - private final ModConfigHandler modConfig = ModConfigHandler.load(); + private final ModConfigHandler modConfig; + + @Getter + private final ModInitConfig modInitConfig; + + @Getter + private final NetUtils netUtils; + + @Getter + private final Debug debug; @Getter private final BootstrapConfigHandler configHandler = new BootstrapConfigHandler(); @@ -48,11 +60,18 @@ public class ModuleManager implements PreLaunchEntrypoint { private static ModuleManager instance; + public ModuleManager() { + this.modConfig = ModConfigHandler.load(); + this.modInitConfig = this.modConfig().get(ModInitConfig.KEY); + this.netUtils = this.modConfig().get(NetUtils.KEY); + this.debug = this.modConfig().get(Debug.KEY); + } + @Override public void onPreLaunch() { instance = this; - this.modConfig.save(); - DataRefreshUtil.initialize(this); + this.modConfig().save(); + this.netUtils().initialize(this); List> moduleClasses = new ModuleDiscovery() .discoverModules().stream() @@ -95,7 +114,7 @@ public class ModuleManager implements PreLaunchEntrypoint { ModuleHelper.runAndDropBus( value, BootstrapConfigEvent.ID, event -> event.bootstrapConfig(config)); - if (config.enabled || Debug.get().isEnableAllModules()) { + if (config.enabled || this.debug().isEnableAllModules()) { this.modules.put(value.getClass(), value); this.modulesByName.put(ModuleHelper.id(value.meta()), value); } diff --git a/src/main/java/dev/zenfyr/andromeda/bootstrap/config/ModInitConfig.java b/src/main/java/dev/zenfyr/andromeda/bootstrap/config/ModInitConfig.java index f59e0de4..2501ad40 100644 --- a/src/main/java/dev/zenfyr/andromeda/bootstrap/config/ModInitConfig.java +++ b/src/main/java/dev/zenfyr/andromeda/bootstrap/config/ModInitConfig.java @@ -1,6 +1,5 @@ package dev.zenfyr.andromeda.bootstrap.config; -import dev.zenfyr.andromeda.bootstrap.ModuleManager; import dev.zenfyr.andromeda.bootstrap.config.handler.ModConfigHandler; public class ModInitConfig extends BaseConfig { @@ -9,8 +8,4 @@ public class ModInitConfig extends BaseConfig { new ModConfigHandler.Key<>("init", ModInitConfig.class); public boolean sideOnlyMode = false; - - public static ModInitConfig get() { - return ModuleManager.get().modConfig().get(KEY); - } } diff --git a/src/main/java/dev/zenfyr/andromeda/bootstrap/config/handler/ModConfigHandler.java b/src/main/java/dev/zenfyr/andromeda/bootstrap/config/handler/ModConfigHandler.java index fa5bd56e..d305eb59 100644 --- a/src/main/java/dev/zenfyr/andromeda/bootstrap/config/handler/ModConfigHandler.java +++ b/src/main/java/dev/zenfyr/andromeda/bootstrap/config/handler/ModConfigHandler.java @@ -7,8 +7,8 @@ import com.google.gson.GsonBuilder; import com.google.gson.JsonObject; import dev.zenfyr.andromeda.bootstrap.config.BaseConfig; import dev.zenfyr.andromeda.bootstrap.config.ModInitConfig; -import dev.zenfyr.andromeda.util.Debug; -import dev.zenfyr.andromeda.util.NetUtils; +import dev.zenfyr.andromeda.bootstrap.util.Debug; +import dev.zenfyr.andromeda.bootstrap.util.NetUtils; import dev.zenfyr.andromeda.util.Util; import java.io.IOException; import java.lang.reflect.InvocationTargetException; diff --git a/src/main/java/dev/zenfyr/andromeda/util/Debug.java b/src/main/java/dev/zenfyr/andromeda/bootstrap/util/Debug.java similarity index 91% rename from src/main/java/dev/zenfyr/andromeda/util/Debug.java rename to src/main/java/dev/zenfyr/andromeda/bootstrap/util/Debug.java index 637e91bd..bcf7d52b 100644 --- a/src/main/java/dev/zenfyr/andromeda/util/Debug.java +++ b/src/main/java/dev/zenfyr/andromeda/bootstrap/util/Debug.java @@ -1,10 +1,10 @@ -package dev.zenfyr.andromeda.util; +package dev.zenfyr.andromeda.bootstrap.util; import dev.zenfyr.andromeda.bootstrap.Module; import dev.zenfyr.andromeda.bootstrap.ModuleHelper; -import dev.zenfyr.andromeda.bootstrap.ModuleManager; import dev.zenfyr.andromeda.bootstrap.config.BaseConfig; import dev.zenfyr.andromeda.bootstrap.config.handler.ModConfigHandler; +import dev.zenfyr.andromeda.util.Util; import java.util.HashMap; import java.util.Map; import java.util.Optional; @@ -58,8 +58,4 @@ public class Debug extends BaseConfig { public boolean isMixinAudit() { return this.mixinAudit || Util.isDev(); } - - public static Debug get() { - return ModuleManager.get().modConfig().get(KEY); - } } diff --git a/src/main/java/dev/zenfyr/andromeda/bootstrap/util/NetUtils.java b/src/main/java/dev/zenfyr/andromeda/bootstrap/util/NetUtils.java new file mode 100644 index 00000000..e727bf2c --- /dev/null +++ b/src/main/java/dev/zenfyr/andromeda/bootstrap/util/NetUtils.java @@ -0,0 +1,70 @@ +package dev.zenfyr.andromeda.bootstrap.util; + +import dev.zenfyr.andromeda.bootstrap.ModuleManager; +import dev.zenfyr.andromeda.bootstrap.config.BaseConfig; +import dev.zenfyr.andromeda.bootstrap.config.handler.ModConfigHandler; +import dev.zenfyr.andromeda.util.AndromedaConstants; +import dev.zenfyr.andromeda.util.Util; +import dev.zenfyr.pulsar.util.ExceptionUtil; +import java.net.http.HttpClient; +import java.time.Duration; +import lombok.CustomLog; +import net.fabricmc.loader.api.Version; + +@CustomLog +public final class NetUtils extends BaseConfig { + + public static final ModConfigHandler.Key KEY = + new ModConfigHandler.Key<>("connections", NetUtils.class); + + public static final String OWNER = "constellation-mc"; + public static final String REPO = AndromedaConstants.MODID; + public static final String RAW_URL = "https://raw.githubusercontent.com"; + + private static final HttpClient CLIENT = HttpClient.newBuilder() + .followRedirects(HttpClient.Redirect.NORMAL) + .connectTimeout(Duration.ofSeconds(5)) + .build(); + + public boolean allow = true; + private transient boolean updated = false; + + public HttpClient getClient() { + if (!allow) + throw Util.create( + "HttpClient requested when connections.allow is set to false!", + IllegalStateException::new); + return CLIENT; + } + + public boolean modUpdated() { + return this.updated; + } + + public void initialize(ModuleManager manager) { + this.updated = checkUpdate(manager); + } + + private static boolean checkUpdate(ModuleManager manager) { + Version current = manager.modContainer().getMetadata().getVersion(); + if (manager.dataHolder().hasData("last_version")) { + Version version = ExceptionUtil.supply( + () -> Version.parse(manager.dataHolder().getData("last_version").getAsString())); + if (current.compareTo(version) != 0) { + log.warn( + "Andromeda version changed! was [{}], now [{}]", + version.getFriendlyString(), + current.getFriendlyString()); + manager + .dataHolder() + .putData("last_version", current.getFriendlyString()) + .save(); + return true; + } + return false; + } else { + manager.dataHolder().putData("last_version", current.getFriendlyString()).save(); + return true; + } + } +} diff --git a/src/main/java/dev/zenfyr/andromeda/common/Andromeda.java b/src/main/java/dev/zenfyr/andromeda/common/Andromeda.java index 7fd86a23..e76f7fa1 100644 --- a/src/main/java/dev/zenfyr/andromeda/common/Andromeda.java +++ b/src/main/java/dev/zenfyr/andromeda/common/Andromeda.java @@ -15,7 +15,6 @@ import dev.zenfyr.andromeda.common.util.GsonCodecContext; import dev.zenfyr.andromeda.common.util.Keeper; import dev.zenfyr.andromeda.common.util.condition.ItemsRegisteredCondition; import dev.zenfyr.andromeda.common.util.condition.ModulesLoadedCondition; -import dev.zenfyr.andromeda.util.Debug; import lombok.Getter; import net.fabricmc.api.ModInitializer; import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents; @@ -98,7 +97,7 @@ public class Andromeda implements ModInitializer { // Init the data pack config system DataConfigs.init(manager); - if (Debug.get().isMixinAudit()) { + if (manager.debug().isMixinAudit()) { MixinEnvironment.getCurrentEnvironment().audit(); } } diff --git a/src/main/java/dev/zenfyr/andromeda/modules/blocks/fletching_table_tweaks/FletchingScreenHandler.java b/src/main/java/dev/zenfyr/andromeda/modules/blocks/fletching_table_tweaks/FletchingScreenHandler.java index 7cc41694..1c8527e4 100644 --- a/src/main/java/dev/zenfyr/andromeda/modules/blocks/fletching_table_tweaks/FletchingScreenHandler.java +++ b/src/main/java/dev/zenfyr/andromeda/modules/blocks/fletching_table_tweaks/FletchingScreenHandler.java @@ -7,7 +7,6 @@ import com.google.common.collect.Sets; import com.mojang.serialization.Codec; import dev.zenfyr.andromeda.bootstrap.ModuleManager; import dev.zenfyr.andromeda.common.util.Keeper; -import dev.zenfyr.andromeda.util.Debug; import java.util.*; import java.util.function.Function; import net.minecraft.core.Registry; @@ -117,7 +116,8 @@ public class FletchingScreenHandler extends ItemCombinerMenu { } static void init() { - var module = ModuleManager.get().get(FletchingTableTweaks.class).orElseThrow(); + var manager = ModuleManager.get(); + var module = manager.get(FletchingTableTweaks.class).orElseThrow(); FletchingScreenHandler.FLETCHING.init(Registry.register( BuiltInRegistries.MENU, id("fletching"), @@ -132,7 +132,7 @@ public class FletchingScreenHandler extends ItemCombinerMenu { Set tightable = Sets.newHashSet(Items.BOW, Items.CROSSBOW); - if (Debug.get().isModLoaded(module, "additionaladditions")) { + if (manager.debug().isModLoaded(module, "additionaladditions")) { BuiltInRegistries.ITEM .getOptional(ResourceLocation.tryBuild("additionaladditions", "crossbow_with_spyglass")) .ifPresent(item -> { diff --git a/src/main/java/dev/zenfyr/andromeda/modules/gui/item_frame_tooltips/ItemFrameTooltips.java b/src/main/java/dev/zenfyr/andromeda/modules/gui/item_frame_tooltips/ItemFrameTooltips.java index 3a1101df..8303439f 100644 --- a/src/main/java/dev/zenfyr/andromeda/modules/gui/item_frame_tooltips/ItemFrameTooltips.java +++ b/src/main/java/dev/zenfyr/andromeda/modules/gui/item_frame_tooltips/ItemFrameTooltips.java @@ -2,18 +2,19 @@ package dev.zenfyr.andromeda.modules.gui.item_frame_tooltips; import dev.zenfyr.andromeda.bootstrap.Module; import dev.zenfyr.andromeda.bootstrap.ModuleInfo; +import dev.zenfyr.andromeda.bootstrap.ModuleManager; import dev.zenfyr.andromeda.bootstrap.event.BootstrapConfigEvent; import dev.zenfyr.andromeda.bootstrap.event.InitEvents; import dev.zenfyr.andromeda.bootstrap.event.PostBootstrapEvent; import dev.zenfyr.andromeda.bootstrap.util.Environment; -import dev.zenfyr.andromeda.util.Debug; @ModuleInfo(name = "item_frame_tooltips", category = "gui", env = Environment.CLIENT) public final class ItemFrameTooltips extends Module implements PostBootstrapEvent { ItemFrameTooltips() { - boolean loaded = Debug.get().testModVersion(this, "minecraft", ">=1.20") - && Debug.get().testModVersion(this, "iceberg", "<1.1.13"); + var debug = ModuleManager.get().debug(); + boolean loaded = debug.testModVersion(this, "minecraft", ">=1.20") + && debug.testModVersion(this, "iceberg", "<1.1.13"); if (loaded) { BootstrapConfigEvent.get(this).listen(config -> config.enabled = false); diff --git a/src/main/java/dev/zenfyr/andromeda/modules/gui/name_tooltips/NameTooltips.java b/src/main/java/dev/zenfyr/andromeda/modules/gui/name_tooltips/NameTooltips.java index bd79e364..d192830d 100644 --- a/src/main/java/dev/zenfyr/andromeda/modules/gui/name_tooltips/NameTooltips.java +++ b/src/main/java/dev/zenfyr/andromeda/modules/gui/name_tooltips/NameTooltips.java @@ -2,16 +2,17 @@ package dev.zenfyr.andromeda.modules.gui.name_tooltips; import dev.zenfyr.andromeda.bootstrap.Module; import dev.zenfyr.andromeda.bootstrap.ModuleInfo; +import dev.zenfyr.andromeda.bootstrap.ModuleManager; import dev.zenfyr.andromeda.bootstrap.event.BootstrapConfigEvent; import dev.zenfyr.andromeda.bootstrap.util.Environment; -import dev.zenfyr.andromeda.util.Debug; @ModuleInfo(name = "name_tooltips", category = "gui", env = Environment.CLIENT) public final class NameTooltips extends Module { NameTooltips() { - boolean loaded = Debug.get().testModVersion(this, "minecraft", ">=1.20") - && Debug.get().testModVersion(this, "iceberg", "<1.1.13"); + var debug = ModuleManager.get().debug(); + boolean loaded = debug.testModVersion(this, "minecraft", ">=1.20") + && debug.testModVersion(this, "iceberg", "<1.1.13"); if (loaded) { BootstrapConfigEvent.get(this).listen(config -> config.enabled = false); diff --git a/src/main/java/dev/zenfyr/andromeda/modules/items/pouches/Main.java b/src/main/java/dev/zenfyr/andromeda/modules/items/pouches/Main.java index ce841376..a59437c5 100644 --- a/src/main/java/dev/zenfyr/andromeda/modules/items/pouches/Main.java +++ b/src/main/java/dev/zenfyr/andromeda/modules/items/pouches/Main.java @@ -9,7 +9,6 @@ import dev.zenfyr.andromeda.common.util.Keeper; import dev.zenfyr.andromeda.modules.items.pouches.entities.CustomPouchComponent; import dev.zenfyr.andromeda.modules.items.pouches.entities.PouchEntity; import dev.zenfyr.andromeda.modules.items.pouches.items.PouchItem; -import dev.zenfyr.andromeda.util.Debug; import dev.zenfyr.pulsar.itemstack.ItemStackUtil; import dev.zenfyr.pulsar.util.ExceptionUtil; import java.lang.reflect.Field; @@ -174,7 +173,8 @@ public final class Main { } static void testBlocks() { - var module = ModuleManager.get().get(Pouches.class).orElseThrow(); + var manager = ModuleManager.get(); + var module = manager.get(Pouches.class).orElseThrow(); for (BlockEntityType type : BuiltInRegistries.BLOCK_ENTITY_TYPE) { var o = type.validBlocks.stream().findAny(); if (o.isPresent()) { @@ -194,7 +194,7 @@ public final class Main { } } - if (Debug.get().isVerbose()) { + if (manager.debug().isVerbose()) { StringBuilder b = new StringBuilder(); b.append("Viewable block entities:"); Main.VIEWABLE_VIEW.forEach((blockEntityType, field) -> { diff --git a/src/main/java/dev/zenfyr/andromeda/modules/items/pouches/items/PouchItem.java b/src/main/java/dev/zenfyr/andromeda/modules/items/pouches/items/PouchItem.java index 6e446b35..842b0434 100644 --- a/src/main/java/dev/zenfyr/andromeda/modules/items/pouches/items/PouchItem.java +++ b/src/main/java/dev/zenfyr/andromeda/modules/items/pouches/items/PouchItem.java @@ -1,9 +1,9 @@ package dev.zenfyr.andromeda.modules.items.pouches.items; +import dev.zenfyr.andromeda.bootstrap.ModuleManager; import dev.zenfyr.andromeda.common.util.LootContextBuilder; import dev.zenfyr.andromeda.modules.items.pouches.Main; import dev.zenfyr.andromeda.modules.items.pouches.entities.PouchEntity; -import dev.zenfyr.andromeda.util.Debug; import dev.zenfyr.pulsar.util.TextUtil; import java.util.function.Consumer; import lombok.Getter; @@ -50,7 +50,7 @@ public class PouchItem extends Item implements ProjectileItem { TooltipDisplay display, Consumer consumer, TooltipFlag flag) { - if (flag.isAdvanced() && Debug.get().isVerbose()) { + if (flag.isAdvanced() && ModuleManager.get().debug().isVerbose()) { consumer.accept( TextUtil.literal("Loot: " + this.getType().getLootId(stack).location()) .withStyle(ChatFormatting.GRAY)); diff --git a/src/main/java/dev/zenfyr/andromeda/modules/misc/translations/Client.java b/src/main/java/dev/zenfyr/andromeda/modules/misc/translations/Client.java index 7c53965d..c10f8585 100644 --- a/src/main/java/dev/zenfyr/andromeda/modules/misc/translations/Client.java +++ b/src/main/java/dev/zenfyr/andromeda/modules/misc/translations/Client.java @@ -2,9 +2,8 @@ package dev.zenfyr.andromeda.modules.misc.translations; import com.google.common.collect.Sets; import dev.zenfyr.andromeda.bootstrap.ModuleManager; +import dev.zenfyr.andromeda.bootstrap.util.NetUtils; import dev.zenfyr.andromeda.common.client.AndromedaClient; -import dev.zenfyr.andromeda.util.DataRefreshUtil; -import dev.zenfyr.andromeda.util.NetUtils; import dev.zenfyr.andromeda.util.Util; import java.io.IOException; import java.net.URI; @@ -24,18 +23,20 @@ import net.fabricmc.api.Environment; public final class Client { private static final String URL = - DataRefreshUtil.RAW_URL + "/" + DataRefreshUtil.OWNER + "/" + DataRefreshUtil.REPO + "/"; + NetUtils.RAW_URL + "/" + NetUtils.OWNER + "/" + NetUtils.REPO + "/"; private static String languageCode = "en_us"; static void init() { var manager = ModuleManager.get(); var module = manager.get(Translations.class).orElseThrow(); + if (shouldUpdate(manager)) { Set languages = Sets.newHashSet("en_us"); Client.getSelectedLanguage(module).ifPresent(languages::add); CompletableFuture.runAsync( - () -> Client.downloadTranslations(languages, module), ForkJoinPool.commonPool()) + () -> Client.downloadTranslations(languages, manager, module), + ForkJoinPool.commonPool()) .handle((unused, throwable) -> { if (throwable != null) module.logger().error("Failed to download translations!", throwable); @@ -45,31 +46,32 @@ public final class Client { } static boolean shouldUpdate(ModuleManager manager) { - if (!NetUtils.get().allow) return false; + if (!manager.netUtils().allow) return false; if (Files.exists(Translations.EN_US)) { try { if (ChronoUnit.HOURS.between( Files.getLastModifiedTime(Translations.EN_US).toInstant(), Instant.now()) >= 24) return true; } catch (Exception ignored) { - return DataRefreshUtil.modUpdated(); + return manager.netUtils().modUpdated(); } } else return true; - return DataRefreshUtil.modUpdated(); + return manager.netUtils().modUpdated(); } - public static void onResourceReload(String code, Translations module) { - if (NetUtils.get().allow && !languageCode.equals(code)) { + public static void onResourceReload(String code, ModuleManager manager) { + if (manager.netUtils().allow && !languageCode.equals(code)) { languageCode = code; Set languages = Sets.newHashSet("en_us"); languages.add(code); - downloadTranslations(languages, module); + downloadTranslations(languages, manager, manager.get(Translations.class).orElseThrow()); } } - public static void downloadTranslations(Set languages, Translations module) { + public static void downloadTranslations( + Set languages, ModuleManager manager, Translations module) { for (String language : languages) { - String file = downloadLang(language, module); + String file = downloadLang(language, manager, module); if (!file.isEmpty()) { try { if (!Files.exists(Translations.LANG_PATH)) @@ -86,7 +88,7 @@ public final class Client { return baseUrl.endsWith("/") ? baseUrl : baseUrl + '/'; } - private static String downloadLang(String language, Translations module) { + private static String downloadLang(String language, ModuleManager manager, Translations module) { try { var config = AndromedaClient.CLIENT.get(Translations.CONFIG); String baseUrl = normalizeBaseUrl( @@ -100,7 +102,7 @@ public final class Client { .build(); HttpResponse response = - NetUtils.get().getClient().send(request, HttpResponse.BodyHandlers.ofString()); + manager.netUtils().getClient().send(request, HttpResponse.BodyHandlers.ofString()); if (response.statusCode() != 200) { module diff --git a/src/main/java/dev/zenfyr/andromeda/modules/misc/translations/mixin/MinecraftClientMixin.java b/src/main/java/dev/zenfyr/andromeda/modules/misc/translations/mixin/MinecraftClientMixin.java index f9395762..ee543595 100644 --- a/src/main/java/dev/zenfyr/andromeda/modules/misc/translations/mixin/MinecraftClientMixin.java +++ b/src/main/java/dev/zenfyr/andromeda/modules/misc/translations/mixin/MinecraftClientMixin.java @@ -2,7 +2,6 @@ package dev.zenfyr.andromeda.modules.misc.translations.mixin; import dev.zenfyr.andromeda.bootstrap.ModuleManager; import dev.zenfyr.andromeda.modules.misc.translations.Client; -import dev.zenfyr.andromeda.modules.misc.translations.Translations; import java.util.concurrent.CompletableFuture; import net.minecraft.client.Minecraft; import net.minecraft.client.Options; @@ -29,7 +28,6 @@ abstract class MinecraftClientMixin { method = "reloadResourcePacks(ZLnet/minecraft/client/Minecraft$GameLoadCookie;)Ljava/util/concurrent/CompletableFuture;") private void andromeda$downloadLangFiles(CallbackInfoReturnable> cir) { - Client.onResourceReload( - this.options.languageCode, ModuleManager.get().get(Translations.class).orElseThrow()); + Client.onResourceReload(this.options.languageCode, ModuleManager.get()); } } diff --git a/src/main/java/dev/zenfyr/andromeda/modules/world/crop_temperature/PlantTemperatureData.java b/src/main/java/dev/zenfyr/andromeda/modules/world/crop_temperature/PlantTemperatureData.java index 4ff29a5a..b2130103 100644 --- a/src/main/java/dev/zenfyr/andromeda/modules/world/crop_temperature/PlantTemperatureData.java +++ b/src/main/java/dev/zenfyr/andromeda/modules/world/crop_temperature/PlantTemperatureData.java @@ -7,7 +7,6 @@ import com.mojang.serialization.DataResult; import com.mojang.serialization.codecs.RecordCodecBuilder; import dev.zenfyr.andromeda.bootstrap.ModuleManager; import dev.zenfyr.andromeda.common.Andromeda; -import dev.zenfyr.andromeda.util.Debug; import dev.zenfyr.pulsar.codec.ExtraCodecs; import dev.zenfyr.pulsar.codec.JsonCodecDataLoader; import dev.zenfyr.pulsar.resources.ReloaderType; @@ -102,9 +101,10 @@ public final class PlantTemperatureData { } public static void init() { - var module = ModuleManager.get().get(PlantTemperature.class).orElseThrow(); + var manager = ModuleManager.get(); + var module = manager.get(PlantTemperature.class).orElseThrow(); ServerReloadersEvent.EVENT.register( - context -> context.register(RELOADER.location(), new Reloader(module))); + context -> context.register(RELOADER.location(), new Reloader(manager, module))); } private static void verifyPostLoad(PlantTemperature module, Reloader reloader) { @@ -147,10 +147,12 @@ public final class PlantTemperatureData { @Nullable private IdentityHashMap map; + private final ModuleManager manager; private final PlantTemperature module; - protected Reloader(PlantTemperature module) { + protected Reloader(ModuleManager manager, PlantTemperature module) { super(RELOADER.location(), MERGED_CODEC); + this.manager = manager; this.module = module; } @@ -171,7 +173,7 @@ public final class PlantTemperatureData { result.putAll(replace); this.map = result; - if (Debug.get().isVerbose()) verifyPostLoad(module, this); + if (this.manager.debug().isVerbose()) verifyPostLoad(module, this); } } } diff --git a/src/main/java/dev/zenfyr/andromeda/util/DataRefreshUtil.java b/src/main/java/dev/zenfyr/andromeda/util/DataRefreshUtil.java deleted file mode 100644 index aac90761..00000000 --- a/src/main/java/dev/zenfyr/andromeda/util/DataRefreshUtil.java +++ /dev/null @@ -1,117 +0,0 @@ -package dev.zenfyr.andromeda.util; - -import static dev.zenfyr.andromeda.util.AndromedaConstants.idString; - -import com.google.common.collect.Sets; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; -import dev.zenfyr.andromeda.bootstrap.ModuleManager; -import dev.zenfyr.pulsar.util.ExceptionUtil; -import java.net.URI; -import java.net.http.HttpRequest; -import java.net.http.HttpResponse; -import java.time.Instant; -import java.time.format.DateTimeFormatter; -import java.time.temporal.ChronoUnit; -import java.util.Set; -import lombok.CustomLog; -import net.fabricmc.loader.api.FabricLoader; -import net.fabricmc.loader.api.Version; - -@CustomLog -public class DataRefreshUtil { - - private static final Set PRESERVE_KEYS = - Sets.newHashSet("default_branch", "stargazers_count"); - - public static final String OWNER = "constellation-mc"; - public static final String REPO = AndromedaConstants.MODID; - - public static final String RAW_URL = "https://raw.githubusercontent.com"; - public static final String API_URL = "https://api.github.com"; - - public static String defaultBranch(ModuleManager manager) { - JsonObject object = manager.dataHolder().getData("git_tracker").getAsJsonObject(); - if (object.has("default_branch")) return object.get("default_branch").getAsString(); - return "1.20-fabric"; - } - - public static boolean modUpdated() { - return (boolean) FabricLoader.getInstance().getObjectShare().get(idString("updated")); - } - - public static void initialize(ModuleManager manager) { - FabricLoader.getInstance().getObjectShare().put(idString("updated"), checkUpdate(manager)); - if (shouldUpdate(manager)) tryUpdateGitInfo(manager); - } - - private static boolean checkUpdate(ModuleManager manager) { - Version current = manager.modContainer().getMetadata().getVersion(); - if (manager.dataHolder().hasData("last_version")) { - Version version = ExceptionUtil.supply( - () -> Version.parse(manager.dataHolder().getData("last_version").getAsString())); - if (current.compareTo(version) != 0) { - log.warn( - "Andromeda version changed! was [{}], now [{}]", - version.getFriendlyString(), - current.getFriendlyString()); - manager - .dataHolder() - .putData("last_version", current.getFriendlyString()) - .save(); - return true; - } - return false; - } else { - manager.dataHolder().putData("last_version", current.getFriendlyString()).save(); - return true; - } - } - - private static boolean shouldUpdate(ModuleManager manager) { - if (!NetUtils.get().allow) return false; - if (manager.dataHolder().hasData("git_timestamp")) { - try { - if (ChronoUnit.HOURS.between( - DateTimeFormatter.ISO_INSTANT.parse( - manager.dataHolder().getData("git_timestamp").getAsString(), Instant::from), - Instant.now()) - >= 24) return true; - } catch (Exception ignored) { - return modUpdated(); - } - } else return true; - return modUpdated(); - } - - private static void tryUpdateGitInfo(ModuleManager manager) { - HttpRequest request = HttpRequest.newBuilder() - .GET() - .uri(URI.create(API_URL + "/repos/" + OWNER + "/" + REPO)) - .header("Accept", "application/vnd.github+json") - .build(); - - try { - HttpResponse response = - NetUtils.get().getClient().send(request, HttpResponse.BodyHandlers.ofString()); - - if (response.statusCode() != 200) - throw new RuntimeException( - "Status Code: " + response.statusCode() + " Body: " + response.body()); - - JsonObject jsonResponse = (JsonObject) JsonParser.parseString(response.body()); - - Set.copyOf(jsonResponse.keySet()).stream() - .filter(s -> !PRESERVE_KEYS.contains(s)) - .forEach(jsonResponse::remove); - - manager - .dataHolder() - .putData("git_timestamp", DateTimeFormatter.ISO_INSTANT.format(Instant.now())) - .putData("git_tracker", jsonResponse) - .save(); - } catch (Exception e) { - log.warn("Couldn't update git info", e); - } - } -} diff --git a/src/main/java/dev/zenfyr/andromeda/util/NetUtils.java b/src/main/java/dev/zenfyr/andromeda/util/NetUtils.java deleted file mode 100644 index e1670dd9..00000000 --- a/src/main/java/dev/zenfyr/andromeda/util/NetUtils.java +++ /dev/null @@ -1,32 +0,0 @@ -package dev.zenfyr.andromeda.util; - -import dev.zenfyr.andromeda.bootstrap.ModuleManager; -import dev.zenfyr.andromeda.bootstrap.config.BaseConfig; -import dev.zenfyr.andromeda.bootstrap.config.handler.ModConfigHandler; -import java.net.http.HttpClient; -import java.time.Duration; - -public final class NetUtils extends BaseConfig { - - public static final ModConfigHandler.Key KEY = - new ModConfigHandler.Key<>("connections", NetUtils.class); - - private static final HttpClient CLIENT = HttpClient.newBuilder() - .followRedirects(HttpClient.Redirect.NORMAL) - .connectTimeout(Duration.ofSeconds(5)) - .build(); - - public boolean allow = true; - - public HttpClient getClient() { - if (!allow) - throw Util.create( - "HttpClient requested when connections.allow is set to false!", - IllegalStateException::new); - return CLIENT; - } - - public static NetUtils get() { - return ModuleManager.get().modConfig().get(KEY); - } -} -- 2.51.2 From 298ff2a45f1eb2d2b45b0157a7233b690d876298 Mon Sep 17 00:00:00 2001 From: zenfyr Date: Fri, 5 Jun 2026 01:02:49 +0700 Subject: [PATCH 11/15] refactor: remove some manager.get calls --- .../dev/zenfyr/andromeda/common/Andromeda.java | 16 +++++----------- .../zenfyr/andromeda/common/AndromedaServer.java | 4 ++-- .../andromeda/common/client/AndromedaClient.java | 5 ++--- .../common/client/config/AutoConfigScreen.java | 9 +++++---- 4 files changed, 14 insertions(+), 20 deletions(-) diff --git a/src/main/java/dev/zenfyr/andromeda/common/Andromeda.java b/src/main/java/dev/zenfyr/andromeda/common/Andromeda.java index e76f7fa1..d5cbd3f0 100644 --- a/src/main/java/dev/zenfyr/andromeda/common/Andromeda.java +++ b/src/main/java/dev/zenfyr/andromeda/common/Andromeda.java @@ -45,19 +45,15 @@ public class Andromeda implements ModInitializer { private @Nullable MinecraftServer currentServer; static { + var manager = ModuleManager.get(); + GsonBuilderEvent.BUS.listen(Andromeda::appendCommonGsonTypes); MAIN = new MultiConfigHandler( - ModuleManager.get(), - FabricLoader.getInstance().getConfigDir(), - "main", - RegisterConfigEvent.MAIN); + manager, FabricLoader.getInstance().getConfigDir(), "main", RegisterConfigEvent.MAIN); GAME = new MultiConfigHandler( - ModuleManager.get(), - FabricLoader.getInstance().getConfigDir(), - "game", - RegisterConfigEvent.GAME); + manager, FabricLoader.getInstance().getConfigDir(), "game", RegisterConfigEvent.GAME); } public static ResourceLocation id(String path) { @@ -102,9 +98,7 @@ public class Andromeda implements ModInitializer { } } - public void onMergedEntryPoint() { - var manager = ModuleManager.get(); - + public void onMergedEntryPoint(ModuleManager manager) { GAME.loadAll(); GAME.saveAll(); diff --git a/src/main/java/dev/zenfyr/andromeda/common/AndromedaServer.java b/src/main/java/dev/zenfyr/andromeda/common/AndromedaServer.java index 20865496..b086c922 100644 --- a/src/main/java/dev/zenfyr/andromeda/common/AndromedaServer.java +++ b/src/main/java/dev/zenfyr/andromeda/common/AndromedaServer.java @@ -8,9 +8,9 @@ public class AndromedaServer implements DedicatedServerModInitializer { @Override public void onInitializeServer() { - Andromeda.get().onMergedEntryPoint(); - var manager = ModuleManager.get(); + + Andromeda.get().onMergedEntryPoint(manager); InitEvents.SERVER.invoker().onModuleServerInit().runEntrypoint(); } } diff --git a/src/main/java/dev/zenfyr/andromeda/common/client/AndromedaClient.java b/src/main/java/dev/zenfyr/andromeda/common/client/AndromedaClient.java index 580c4119..1db1801e 100644 --- a/src/main/java/dev/zenfyr/andromeda/common/client/AndromedaClient.java +++ b/src/main/java/dev/zenfyr/andromeda/common/client/AndromedaClient.java @@ -28,10 +28,9 @@ public class AndromedaClient implements ClientModInitializer { @Override public void onInitializeClient() { - Andromeda.get().onMergedEntryPoint(); - instance = this; - var manager = ModuleManager.get(); + Andromeda.get().onMergedEntryPoint(manager); + instance = this; CLIENT.loadAll(); CLIENT.saveAll(); diff --git a/src/main/java/dev/zenfyr/andromeda/common/client/config/AutoConfigScreen.java b/src/main/java/dev/zenfyr/andromeda/common/client/config/AutoConfigScreen.java index 58dc2f53..9a49db99 100644 --- a/src/main/java/dev/zenfyr/andromeda/common/client/config/AutoConfigScreen.java +++ b/src/main/java/dev/zenfyr/andromeda/common/client/config/AutoConfigScreen.java @@ -83,6 +83,8 @@ public class AutoConfigScreen { } public Screen getScreen(Screen parent) { + var manager = ModuleManager.get(); + Map saveQueue = new IdentityHashMap<>(); ConfigBuilder builder = ConfigBuilder.create() @@ -102,11 +104,10 @@ public class AutoConfigScreen { .setDefaultBackgroundTexture( ResourceLocation.tryBuild("minecraft", "textures/block/amethyst_block.png")); - var bootstrapHandler = ModuleManager.get().configHandler(); + var bootstrapHandler = manager.configHandler(); - for (Module module : ModuleManager.get().all().stream() - .sorted(Comparator.comparing(ModuleHelper::id)) - .toList()) { + for (Module module : + manager.all().stream().sorted(Comparator.comparing(ModuleHelper::id)).toList()) { var category = builder.getOrCreateCategory(TextUtil.translatable( "config.andromeda.category.%s".formatted(module.meta().category()))); -- 2.51.2 From c5e224d964f1c3fff27133299c8c4be6d3bcd866 Mon Sep 17 00:00:00 2001 From: zenfyr Date: Fri, 5 Jun 2026 01:05:09 +0700 Subject: [PATCH 12/15] chore: update and apply the formatter (yuuuuup) --- build.gradle | 2 +- .../zenfyr/andromeda/bootstrap/ModuleManager.java | 8 +++++--- .../mixin/GameModeSelectionScreenMixin.java | 12 +++++++----- 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/build.gradle b/build.gradle index 09b7668e..9bccbc66 100644 --- a/build.gradle +++ b/build.gradle @@ -56,7 +56,7 @@ dependencies { spotless { java { removeUnusedImports() - palantirJavaFormat('2.47.0').style("GOOGLE") + palantirJavaFormat('2.91.0').style("GOOGLE") trimTrailingWhitespace() formatAnnotations() } diff --git a/src/main/java/dev/zenfyr/andromeda/bootstrap/ModuleManager.java b/src/main/java/dev/zenfyr/andromeda/bootstrap/ModuleManager.java index edc99cf2..a249fc37 100644 --- a/src/main/java/dev/zenfyr/andromeda/bootstrap/ModuleManager.java +++ b/src/main/java/dev/zenfyr/andromeda/bootstrap/ModuleManager.java @@ -161,9 +161,11 @@ public class ModuleManager implements PreLaunchEntrypoint { } private void printModuleStats() { - Map> categories = Utilities.supply(new LinkedHashMap<>(), map -> loaded() - .forEach(m -> - map.computeIfAbsent(m.meta().category(), s -> new LinkedHashSet<>()).add(m))); + Map> categories = Utilities.supply( + new LinkedHashMap<>(), + map -> loaded() + .forEach(m -> map.computeIfAbsent(m.meta().category(), s -> new LinkedHashSet<>()) + .add(m))); StringBuilder builder = new StringBuilder(); categories.forEach((s, strings) -> { diff --git a/src/main/java/dev/zenfyr/andromeda/modules/gui/gui_particles/mixin/GameModeSelectionScreenMixin.java b/src/main/java/dev/zenfyr/andromeda/modules/gui/gui_particles/mixin/GameModeSelectionScreenMixin.java index 772fc6d4..2c173c2a 100644 --- a/src/main/java/dev/zenfyr/andromeda/modules/gui/gui_particles/mixin/GameModeSelectionScreenMixin.java +++ b/src/main/java/dev/zenfyr/andromeda/modules/gui/gui_particles/mixin/GameModeSelectionScreenMixin.java @@ -50,11 +50,13 @@ abstract class GameModeSelectionScreenMixin extends Screen { @Unique private static final Map> ANDROMEDA$GAME_MODE_STACKS = Utilities.supply(new EnumMap<>(GameModeSwitcherScreen.GameModeIcon.class), map -> { - map.put(GameModeSwitcherScreen.GameModeIcon.CREATIVE, () -> BuiltInRegistries.ITEM - .getRandom(RandomSource.create()) - .orElseThrow() - .value() - .getDefaultInstance()); + map.put( + GameModeSwitcherScreen.GameModeIcon.CREATIVE, + () -> BuiltInRegistries.ITEM + .getRandom(RandomSource.create()) + .orElseThrow() + .value() + .getDefaultInstance()); map.put( GameModeSwitcherScreen.GameModeIcon.ADVENTURE, () -> Utilities.pickAtRandom(ANDROMEDA$ADVENTURE)); -- 2.51.2 From bf5be2b64c83d3c6442db3dbfeb7542dfeb977ff Mon Sep 17 00:00:00 2001 From: zenfyr Date: Fri, 5 Jun 2026 01:17:26 +0700 Subject: [PATCH 13/15] chore: bump version --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 4cb346cb..2d33def2 100644 --- a/gradle.properties +++ b/gradle.properties @@ -5,6 +5,6 @@ org.gradle.jvmargs=-Xmx1G minecraft_version=1.21.10 loader_version=0.16.9 # Mod Properties -mod_version=2.0.2 +mod_version=2.1.0 maven_group=dev.zenfyr archives_base_name=andromeda -- 2.51.2 From d0112cf439efb545385c838a75062efeff9a4cd0 Mon Sep 17 00:00:00 2001 From: zenfyr Date: Fri, 5 Jun 2026 01:20:40 +0700 Subject: [PATCH 14/15] chore: spotless --- .../modules/items/infinite_totem/client/Client.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/dev/zenfyr/andromeda/modules/items/infinite_totem/client/Client.java b/src/main/java/dev/zenfyr/andromeda/modules/items/infinite_totem/client/Client.java index 4aa15157..cc8312dd 100644 --- a/src/main/java/dev/zenfyr/andromeda/modules/items/infinite_totem/client/Client.java +++ b/src/main/java/dev/zenfyr/andromeda/modules/items/infinite_totem/client/Client.java @@ -14,7 +14,8 @@ public class Client { public static void init() { ClientPlayNetworking.registerGlobalReceiver( - UsedCustomTotemPayload.ID, (payload, context) -> context.client().execute(() -> { + UsedCustomTotemPayload.ID, + (payload, context) -> context.client().execute(() -> { var world = MakeSure.notNull(context.client().level, "client.world"); Entity entity = world.getEntities().get(payload.uuid()); @@ -39,7 +40,8 @@ public class Client { })); ClientPlayNetworking.registerGlobalReceiver( - NotifyClientPayload.ID, (payload, context) -> context.client().execute(() -> { + NotifyClientPayload.ID, + (payload, context) -> context.client().execute(() -> { ItemEntity entity = (ItemEntity) MakeSure.notNull(context.client().level, "client.world") .getEntities() .get(payload.entity()); -- 2.51.2 From 5650fbb432463b39129a151346a5a0424df0043d Mon Sep 17 00:00:00 2001 From: zenfyr Date: Fri, 5 Jun 2026 01:24:52 +0700 Subject: [PATCH 15/15] chore: CHANGELOG.md --- CHANGELOG.md | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4920c9f7..8ee5eb9b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,6 @@ # What's New: -- Updated to Minecraft 1.21.10! This is the first release, there Will be bugs! - -**This update changes the boat identifiers!** -e.g. What was `acacia_boat_with_furnace` is now `acacia_furnace_boat`. -Before this update all boat types were the same entity type, but now every boat is its own entity type. \ No newline at end of file +- Fixed slimes sometimes shrinking on merge. +- Dropped unused translation keys. Added tag translations. +- The translations module now supports custom URLs. Fixed the module possibly not respecting `connections.allow` on reloads. +- All random tick block are now supported in `world/crop_temperature`, not sure about the performance impact here. \ No newline at end of file