diff --git a/src/main/resources/assets/andromeda/lang/zh_cn.json b/src/main/resources/assets/andromeda/lang/zh_cn.json index cbfb16da..00db253e 100644 --- a/src/main/resources/assets/andromeda/lang/zh_cn.json +++ b/src/main/resources/assets/andromeda/lang/zh_cn.json @@ -15,12 +15,12 @@ "death.attack.andromeda_bricked": "%1$s被%2$s用砖块砸晕了", "andromeda.container.guarded": "这个箱子被守护着,无法打开!", - "andromeda.disconnected.module_mismatch": "Andromeda module mismatch!\nDisable: %s\n Enable: %s\nTo join this server!", + "andromeda.disconnected.module_mismatch": "群星模组配置不同步!\n请禁用%s\n启用%s\n以加入此服务器!", - "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.spawner_enabled": "Spawner minecart must be enabled to use this!", - "andromeda.config.option_manager.reason.andromeda.side_only_enabled": "Module disabled in side-only mode!", + "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.spawner_enabled": "需启用刷怪笼矿车以使用!", + "andromeda.config.option_manager.reason.andromeda.side_only_enabled": "此特性因启用了“客户端模式”被禁用!", "andromeda.config.tooltip.environment.client": "仅客户端特性", "andromeda.config.tooltip.environment.server": "仅服务端特性。", @@ -123,7 +123,7 @@ "config.andromeda.category.blocks": "方块", "config.andromeda.blocks.guarded_loot": "宝藏守卫", - "config.andromeda.blocks.guarded_loot.@Tooltip": "如果在设定距离内有怪物,阻止玩家打开未生成战利品的箱子。", + "config.andromeda.blocks.guarded_loot.@Tooltip": "设定距离内有怪物时,阻止玩家打开未生成战利品的箱子。", "config.andromeda.blocks.guarded_loot.option.range": "检测距离", "config.andromeda.blocks.falling_propagule": "胎生苗掉落", "config.andromeda.blocks.falling_propagule.@Tooltip": "成熟后,悬挂的红树胎生苗会掉下来。", @@ -165,7 +165,7 @@ "config.andromeda.entities.zombie.clean_pickup.@Tooltip[1]": "“有用”的物品包括:工具,护甲以及可投掷物品(若有启用这个特性)", "config.andromeda.entities.zombie.clean_pickup.@Tooltip[2]": "还有“andromeda:zombies_pickup”标签。", "config.andromeda.entities.zombie.all_pick_up": "所有僵尸均可拾起物品", - "config.andromeda.entities.zombie.all_pick_up.@Tooltip": "允许所有僵尸拾起物品,无论难度设置。", + "config.andromeda.entities.zombie.all_pick_up.@Tooltip": "无视难度设置,允许所有僵尸拾起物品。", "config.andromeda.entities.snowball_tweaks": "雪球调整", "config.andromeda.entities.snowball_tweaks.option.freeze": "冻结实体", "config.andromeda.entities.snowball_tweaks.option.freeze.@Tooltip": "使得雪球能够对实体造成冰冻伤害。", @@ -193,7 +193,7 @@ "config.andromeda.entities.bee_flower_duplication.option.tallFlowers": "蜜蜂催生花丛", "config.andromeda.entities.bee_flower_duplication.option.tallFlowers.@Tooltip": "允许蜜蜂催生花朵的效果应用于花丛的同时,禁用骨粉催生花丛", "config.andromeda.entities.villagers_follow_emeralds": "村民跟随绿宝石块", - "config.andromeda.entities.villagers_follow_emeralds.@Tooltip": "让村民跟随手持绿宝石块的玩家", + "config.andromeda.entities.villagers_follow_emeralds.@Tooltip": "村民跟随手持绿宝石块的玩家", "config.andromeda.entities.better_furnace_minecart": "更好的动力矿车", "config.andromeda.entities.better_furnace_minecart.@Tooltip[0]": "一些让动力矿车更好一些的调整选项。", "config.andromeda.entities.better_furnace_minecart.@Tooltip[1]": "- 燃料现在作为整数保存,你可以在下面改变燃料量上限。", @@ -229,8 +229,8 @@ "config.andromeda.category.items": "物品", "config.andromeda.items.tooltips": "工具提示", - "config.andromeda.items.tooltips.option.clock": "时钟工具提示附加", - "config.andromeda.items.tooltips.option.clock.@Tooltip": "为时钟附加基于游戏时间的工具提示显示", + "config.andromeda.items.tooltips.option.clock": "时钟时间显示", + "config.andromeda.items.tooltips.option.clock.@Tooltip": "为时钟附加基于游戏时间的工具提示", "config.andromeda.items.tooltips.option.compass": "指南针距离追踪", "config.andromeda.items.tooltips.option.compass.@Tooltip": "显示指南针到目标的距离。", "config.andromeda.items.tooltips.option.recoveryCompass": "死亡指南针", @@ -328,8 +328,8 @@ "config.andromeda.misc.minor_inconvenience.@Tooltip": "使玩家在受到任何伤害后爆炸", "config.andromeda.misc.unknown": "???", - "config.andromeda.base.option.sideOnlyMode": "Side-Only Mode", - "config.andromeda.base.option.sideOnlyMode.@Tooltip": "Disables all modules which require Andromeda to be present on server.", + "config.andromeda.base.option.sideOnlyMode": "仅客户端模式", + "config.andromeda.base.option.sideOnlyMode.@Tooltip": "禁用所有要求服务端的特性。", "config.andromeda.base.option.sendCrashReports": "上传错误报告", "config.andromeda.base.option.sendCrashReports.@Tooltip[0]": "在客户端崩溃时上传的数据:", "config.andromeda.base.option.sendCrashReports.@Tooltip[1]": "栈跟踪,加载的模组,环境(客户端/服务端)", -- 2.51.2 From e66cc9540d1054cb7493806f58b1c81dfcda1c62 Mon Sep 17 00:00:00 2001 From: melontini <104443436+melontini@users.noreply.github.com> Date: Thu, 7 Dec 2023 22:16:01 +0700 Subject: [PATCH 02/23] Rework init a bit. --- .../melontini/andromeda/base/Bootstrap.java | 48 +++++++----- .../me/melontini/andromeda/base/Module.java | 2 +- .../andromeda/base/ModuleManager.java | 77 +++++++++++-------- .../util/mixin/AndromedaMixinPlugin.java | 4 +- 4 files changed, 77 insertions(+), 54 deletions(-) diff --git a/src/main/java/me/melontini/andromeda/base/Bootstrap.java b/src/main/java/me/melontini/andromeda/base/Bootstrap.java index 3f3c84e1..e5d4c8b3 100644 --- a/src/main/java/me/melontini/andromeda/base/Bootstrap.java +++ b/src/main/java/me/melontini/andromeda/base/Bootstrap.java @@ -7,7 +7,8 @@ import me.melontini.andromeda.common.Andromeda; import me.melontini.andromeda.common.client.AndromedaClient; import me.melontini.andromeda.util.AndromedaLog; import me.melontini.andromeda.util.CommonValues; -import me.melontini.andromeda.util.mixin.ErrorHandler; +import me.melontini.andromeda.util.exceptions.AndromedaException; +import me.melontini.dark_matter.api.base.util.EntrypointRunner; import me.melontini.dark_matter.api.base.util.Utilities; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; @@ -17,12 +18,16 @@ import org.spongepowered.asm.mixin.Mixins; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.ServiceLoader; @SuppressWarnings("UnstableApiUsage") @CustomLog public class Bootstrap { - public static ModuleManager INSTANCE; + static ModuleManager INSTANCE; private static final ClassPath CLASS_PATH = Utilities.supplyUnchecked(() -> ClassPath.from(MixinProcessor.class.getClassLoader())); @Environment(EnvType.CLIENT) @@ -49,26 +54,12 @@ public class Bootstrap { } public static void onPreLaunch() { - Config.get(); - - ModuleManager m = (INSTANCE = new ModuleManager()); - - m.prepare(); - m.print(); - - MixinProcessor.addMixins(m); - for (Module module : m.loaded()) { module.onPreLaunch(); } - } - - public static void onPluginLoad() { LOGGER.info("Andromeda({}) on {}({})", CommonValues.version(), CommonValues.platform(), CommonValues.platform().version()); if (CommonValues.platform() == CommonValues.Platform.CONNECTOR) { LOGGER.warn("v1.0.x Alphas may not work on Connector! (If #568 and #557 are open on Connector's GitHub)"); } - Mixins.registerErrorHandlerClass(ErrorHandler.class.getName()); - Path newCfg = FabricLoader.getInstance().getConfigDir().resolve("andromeda.json"); if (Files.exists(newCfg) && !Files.exists(CommonValues.configPath())) { try { @@ -79,8 +70,29 @@ public class Bootstrap { } } - if (FabricLoader.getInstance().isDevelopmentEnvironment()) - LOGGER.warn("Will be verifying mixins!"); + Config.get(); + + List> list = new ArrayList<>(Arrays.asList(ServiceLoader.load(Module.class) + .stream().map(ServiceLoader.Provider::get).toArray(Module[]::new))); + + EntrypointRunner.run("andromeda:modules", ModuleManager.ModuleSupplier.class, s -> list.addAll(s.get())); + + if (list.isEmpty()) { + LOGGER.error("Andromeda couldn't discover any modules! This should not happen!"); + } + + list.removeIf(m -> (m.meta().environment() == me.melontini.andromeda.base.Environment.CLIENT && CommonValues.environment() == EnvType.SERVER)); + + ModuleManager m; + try { + m = new ModuleManager(list); + } catch (Throwable t) { + throw new AndromedaException("Failed to initialize ModuleManager!!!", t); + } + m.print(); + + MixinProcessor.addMixins(m); + for (Module module : m.loaded()) { module.onPreLaunch(); } } public static ClassPath getKnotClassPath() { diff --git a/src/main/java/me/melontini/andromeda/base/Module.java b/src/main/java/me/melontini/andromeda/base/Module.java index be2c5c28..4ec663d4 100644 --- a/src/main/java/me/melontini/andromeda/base/Module.java +++ b/src/main/java/me/melontini/andromeda/base/Module.java @@ -50,7 +50,7 @@ public abstract class Module { public final ConfigManager manager() { return manager.get(); } public final T config() { return manager().getConfig(); } - public boolean enabled() { return manager().get(boolean.class, "enabled"); } + public final boolean enabled() { return manager().get(boolean.class, "enabled"); } public record Metadata(Module module, String name, String category, Environment environment) { diff --git a/src/main/java/me/melontini/andromeda/base/ModuleManager.java b/src/main/java/me/melontini/andromeda/base/ModuleManager.java index 4f50581a..4e38d9ca 100644 --- a/src/main/java/me/melontini/andromeda/base/ModuleManager.java +++ b/src/main/java/me/melontini/andromeda/base/ModuleManager.java @@ -1,12 +1,13 @@ package me.melontini.andromeda.base; +import com.google.common.collect.ImmutableMap; import lombok.CustomLog; import me.melontini.andromeda.base.config.BasicConfig; import me.melontini.andromeda.base.config.Config; import me.melontini.andromeda.util.CommonValues; -import me.melontini.dark_matter.api.base.util.EntrypointRunner; import me.melontini.dark_matter.api.base.util.MakeSure; import me.melontini.dark_matter.api.base.util.Utilities; +import me.melontini.dark_matter.api.base.util.classes.Lazy; import me.melontini.dark_matter.api.config.ConfigBuilder; import me.melontini.dark_matter.api.config.ConfigManager; import net.fabricmc.api.EnvType; @@ -26,27 +27,20 @@ public class ModuleManager { private static final List categories = List.of("world", "blocks", "entities", "items", "bugfixes", "mechanics", "gui", "misc"); - private final Set> discoveredModules = new LinkedHashSet<>(); - private final Map, Module> modules = new LinkedHashMap<>(); - private final Map> moduleNames = new HashMap<>(); - private final Map, ConfigManager> configs = new HashMap<>(); - final Map mixinConfigs = new HashMap<>(); - - public void prepare() { - List> list = new ArrayList<>(Arrays.asList(ServiceLoader.load(Module.class) - .stream().map(ServiceLoader.Provider::get).toArray(Module[]::new))); + private final ImmutableMap, Module> discoveredModules; + private final ImmutableMap> discoveredModuleNames; - EntrypointRunner.run("andromeda:modules", ModuleSupplier.class, s -> list.addAll(s.get())); + private final ImmutableMap, Module> modules; + private final ImmutableMap> moduleNames; + private final ImmutableMap, Lazy>> configs; - if (list.isEmpty()) { - LOGGER.error("Andromeda couldn't discover any modules! This should not happen!"); - return; - } + final Map mixinConfigs = new HashMap<>(); - list.removeIf(m -> (m.meta().environment() == Environment.CLIENT && CommonValues.environment() == EnvType.SERVER)); + ModuleManager(List> discovered) { + Bootstrap.INSTANCE = this; Set ids = new HashSet<>(); - for (Module module : list) { + for (Module module : discovered) { 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()); @@ -55,21 +49,33 @@ public class ModuleManager { ids.add(module.meta().id()); } - list.sort(Comparator.comparingInt(m-> { + List> sorted = discovered.stream().sorted(Comparator.comparingInt(m-> { int i = categories.indexOf(m.meta().category()); return i >= 0 ? i : categories.size(); - })); - list.forEach(m -> modules.put(m.getClass(), m)); - list.forEach(m -> moduleNames.put(m.meta().id(), m)); - discoveredModules.addAll(modules.values()); + })).toList(); + + Map, Module> modules = new LinkedHashMap<>(); + sorted.forEach(m -> modules.put(m.getClass(), m)); - setUpConfigs(list); - list.forEach(m -> m.manager().getOptionManager().processOptions()); + this.discoveredModules = ImmutableMap.copyOf(Utilities.consume(new LinkedHashMap<>(), (map) -> + sorted.forEach(m -> map.put(m.getClass(), m)))); + this.discoveredModuleNames = ImmutableMap.copyOf(Utilities.consume(new HashMap<>(), (map) -> + sorted.forEach(m -> map.put(m.meta().id(), m)))); + + this.configs = ImmutableMap.copyOf(setUpConfigs(sorted)); + + sorted.forEach(Module::manager); modules.values().removeIf(m -> !m.enabled()); - list.forEach(m -> m.manager().save()); + + this.modules = ImmutableMap.copyOf(modules); + this.moduleNames = ImmutableMap.copyOf(Utilities.consume(new HashMap<>(), (map) -> + sorted.forEach(m -> map.put(m.meta().id(), m)))); + + cleanConfigs(); } - public void setUpConfigs(List> list) { + public Map, Lazy>> setUpConfigs(List> list) { + Map, Lazy>> configs = new HashMap<>(); list.forEach(m -> { var config = ConfigBuilder.create(m.configClass(), CommonValues.mod(), "andromeda/" + m.meta().id()); config.processors((registry, mod) -> { @@ -88,12 +94,15 @@ public class ModuleManager { }, mod); m.onProcessors(Utilities.cast(registry), mod); }); - configs.put(m.getClass(), config.build(false)); + configs.put(m.getClass(), Lazy.of(() -> () -> config.build(false))); }); + return configs; + } + private void cleanConfigs() { Set paths = new HashSet<>(); paths.add(FabricLoader.getInstance().getConfigDir().resolve("andromeda/mod.json")); - configs.values().forEach(m -> paths.add(m.getSerializer().getPath())); + configs.values().forEach(m -> paths.add(m.get().getSerializer().getPath())); Utilities.runUnchecked(() -> Files.walkFileTree(FabricLoader.getInstance().getConfigDir().resolve("andromeda"), new SimpleFileVisitor<>() { @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { @@ -107,24 +116,26 @@ public class ModuleManager { } public ConfigManager getConfig(Class cls) { - return configs.get(cls); + return MakeSure.notNull(configs.get(cls)).get(); } @SuppressWarnings("unchecked") public > Optional getModule(Class cls) { - return (Optional) Optional.ofNullable(modules.get(cls)).filter(Module::enabled); + return (Optional) Optional.ofNullable(modules!=null?modules.get(cls):discoveredModules.get(cls)) + .filter(Module::enabled); } @SuppressWarnings("unchecked") public > Optional getModule(String name) { - return (Optional) Optional.ofNullable(moduleNames.get(name)).filter(Module::enabled); + return (Optional) Optional.ofNullable(moduleNames!=null?moduleNames.get(name):discoveredModuleNames.get(name)) + .filter(Module::enabled); } public Optional> moduleFromConfig(String name) { return Optional.ofNullable(mixinConfigs.get(name)).flatMap(this::getModule); } - public Set> all() { - return Collections.unmodifiableSet(discoveredModules); + public Collection> all() { + return discoveredModules.values(); } public Collection> loaded() { return Collections.unmodifiableCollection(modules.values()); diff --git a/src/main/java/me/melontini/andromeda/util/mixin/AndromedaMixinPlugin.java b/src/main/java/me/melontini/andromeda/util/mixin/AndromedaMixinPlugin.java index ce9a67a0..a4cbd6c2 100644 --- a/src/main/java/me/melontini/andromeda/util/mixin/AndromedaMixinPlugin.java +++ b/src/main/java/me/melontini/andromeda/util/mixin/AndromedaMixinPlugin.java @@ -1,8 +1,8 @@ package me.melontini.andromeda.util.mixin; import lombok.CustomLog; -import me.melontini.andromeda.base.Bootstrap; import me.melontini.dark_matter.api.base.util.mixin.ExtendablePlugin; +import org.spongepowered.asm.mixin.Mixins; @SuppressWarnings("UnstableApiUsage") @CustomLog @@ -16,6 +16,6 @@ public class AndromedaMixinPlugin extends ExtendablePlugin { LOGGER.error("Failed to patch the mixin framework!", e); } - Bootstrap.onPluginLoad(); + Mixins.registerErrorHandlerClass(ErrorHandler.class.getName()); } } -- 2.51.2 From db802e53d231879034fb1159fa01cab25727af5f Mon Sep 17 00:00:00 2001 From: melontini <104443436+melontini@users.noreply.github.com> Date: Thu, 7 Dec 2023 22:19:47 +0700 Subject: [PATCH 03/23] Use direct access in `enabled()` --- src/main/java/me/melontini/andromeda/base/Module.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/me/melontini/andromeda/base/Module.java b/src/main/java/me/melontini/andromeda/base/Module.java index 4ec663d4..5201d1df 100644 --- a/src/main/java/me/melontini/andromeda/base/Module.java +++ b/src/main/java/me/melontini/andromeda/base/Module.java @@ -50,7 +50,7 @@ public abstract class Module { public final ConfigManager manager() { return manager.get(); } public final T config() { return manager().getConfig(); } - public final boolean enabled() { return manager().get(boolean.class, "enabled"); } + public final boolean enabled() { return manager().getConfig().enabled; } public record Metadata(Module module, String name, String category, Environment environment) { -- 2.51.2 From e3dd6e74e92bab9d800e0fe9fb03a0e752a5a574 Mon Sep 17 00:00:00 2001 From: melontini <104443436+melontini@users.noreply.github.com> Date: Thu, 7 Dec 2023 22:21:48 +0700 Subject: [PATCH 04/23] Replace `enabled` check with `isPresent` --- .../melontini/andromeda/modules/blocks/bed/unsafe/Unsafe.java | 2 +- .../andromeda/modules/blocks/incubator/IncubatorBlock.java | 2 +- .../entities/bee_flower_duplication/mixin/BeeEntityMixin.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) 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 4ab1db89..b8061d5c 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 @@ -21,7 +21,7 @@ public class Unsafe extends BasicModule { @Override public void onProcessors(OptionProcessorRegistry registry, ModContainer mod) { registry.register(CommonValues.MODID + ":module_conflict", manager -> { - if (ModuleManager.get().getModule(Safe.class).map(m->m.config().enabled).orElse(false)) { + if (ModuleManager.get().getModule(Safe.class).isPresent()) { return Map.of("enabled", false); } return null; diff --git a/src/main/java/me/melontini/andromeda/modules/blocks/incubator/IncubatorBlock.java b/src/main/java/me/melontini/andromeda/modules/blocks/incubator/IncubatorBlock.java index 80378540..0877fa9f 100644 --- a/src/main/java/me/melontini/andromeda/modules/blocks/incubator/IncubatorBlock.java +++ b/src/main/java/me/melontini/andromeda/modules/blocks/incubator/IncubatorBlock.java @@ -61,7 +61,7 @@ public class IncubatorBlock extends BlockWithEntity { @Override public void appendTooltip(ItemStack stack, @Nullable BlockView world, List tooltip, TooltipContext options) { - if (ModuleManager.get().getModule(Unknown.class).map(m->m.config().enabled).orElse(false)) + if (ModuleManager.get().getModule(Unknown.class).isPresent()) tooltip.add(AndromedaTexts.INCUBATOR_SECRET); } diff --git a/src/main/java/me/melontini/andromeda/modules/entities/bee_flower_duplication/mixin/BeeEntityMixin.java b/src/main/java/me/melontini/andromeda/modules/entities/bee_flower_duplication/mixin/BeeEntityMixin.java index f945596e..943ffb3e 100644 --- a/src/main/java/me/melontini/andromeda/modules/entities/bee_flower_duplication/mixin/BeeEntityMixin.java +++ b/src/main/java/me/melontini/andromeda/modules/entities/bee_flower_duplication/mixin/BeeEntityMixin.java @@ -69,7 +69,7 @@ abstract class BeeEntityMixin extends AnimalEntity { BlockPos pos = new BlockPos(flowerPos.getX() + i, flowerPos.getY() + b, flowerPos.getZ() + c); if (world.getBlockState(pos).getBlock() instanceof AirBlock && flowerBlock.canPlaceAt(flowerState, world, pos)) { if (world.random.nextInt(12) == 0) { - if (ModuleManager.get().getModule(Unknown.class).map(m->m.config().enabled).orElse(false) && world.random.nextInt(100) == 0) { + if (ModuleManager.get().getModule(Unknown.class).isPresent() && world.random.nextInt(100) == 0) { world.setBlockState(pos, Content.ROSE_OF_THE_VALLEY_BLOCK.get().getDefaultState()); } else { world.setBlockState(pos, flowerState); -- 2.51.2 From 0318f023e39f251bb4a927afd3e4d66d410ddd87 Mon Sep 17 00:00:00 2001 From: melontini <104443436+melontini@users.noreply.github.com> Date: Thu, 7 Dec 2023 23:16:16 +0700 Subject: [PATCH 05/23] Store module references and not strings --- src/main/java/me/melontini/andromeda/base/MixinProcessor.java | 2 +- src/main/java/me/melontini/andromeda/base/ModuleManager.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/me/melontini/andromeda/base/MixinProcessor.java b/src/main/java/me/melontini/andromeda/base/MixinProcessor.java index 2907a76f..2c64fd47 100644 --- a/src/main/java/me/melontini/andromeda/base/MixinProcessor.java +++ b/src/main/java/me/melontini/andromeda/base/MixinProcessor.java @@ -71,7 +71,7 @@ public class MixinProcessor { try (ByteArrayInputStream bais = new ByteArrayInputStream(config.toString().getBytes())) { CONFIG.set(bais); Mixins.addConfiguration(cfg); - manager.mixinConfigs.put(cfg, module.meta().id()); + manager.mixinConfigs.put(cfg, module); } catch (IOException e) { throw new IllegalStateException("Couldn't inject mixin config for module '%s'".formatted(module.meta().id())); } finally { diff --git a/src/main/java/me/melontini/andromeda/base/ModuleManager.java b/src/main/java/me/melontini/andromeda/base/ModuleManager.java index 4e38d9ca..e72bd957 100644 --- a/src/main/java/me/melontini/andromeda/base/ModuleManager.java +++ b/src/main/java/me/melontini/andromeda/base/ModuleManager.java @@ -34,7 +34,7 @@ public class ModuleManager { private final ImmutableMap> moduleNames; private final ImmutableMap, Lazy>> configs; - final Map mixinConfigs = new HashMap<>(); + final Map> mixinConfigs = new HashMap<>(); ModuleManager(List> discovered) { Bootstrap.INSTANCE = this; @@ -131,7 +131,7 @@ public class ModuleManager { } public Optional> moduleFromConfig(String name) { - return Optional.ofNullable(mixinConfigs.get(name)).flatMap(this::getModule); + return Optional.ofNullable(mixinConfigs.get(name)); } public Collection> all() { -- 2.51.2 From cb46232b22be45211aa56b8b07aba7cb2dfb85a7 Mon Sep 17 00:00:00 2001 From: melontini <104443436+melontini@users.noreply.github.com> Date: Thu, 7 Dec 2023 23:23:35 +0700 Subject: [PATCH 06/23] Share manager over ObjectShare --- src/main/java/me/melontini/andromeda/base/Bootstrap.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/me/melontini/andromeda/base/Bootstrap.java b/src/main/java/me/melontini/andromeda/base/Bootstrap.java index e5d4c8b3..dc64cd71 100644 --- a/src/main/java/me/melontini/andromeda/base/Bootstrap.java +++ b/src/main/java/me/melontini/andromeda/base/Bootstrap.java @@ -90,8 +90,9 @@ public class Bootstrap { throw new AndromedaException("Failed to initialize ModuleManager!!!", t); } m.print(); - MixinProcessor.addMixins(m); + FabricLoader.getInstance().getObjectShare().put("andromeda:module_manager", m); + for (Module module : m.loaded()) { module.onPreLaunch(); } } -- 2.51.2 From 7b97d7fc53c4f59e3353f28393212f3e319d6fc8 Mon Sep 17 00:00:00 2001 From: melontini <104443436+melontini@users.noreply.github.com> Date: Fri, 8 Dec 2023 00:36:46 +0700 Subject: [PATCH 07/23] More config text clean-ups --- .../base/config/AndromedaConfig.java | 2 +- .../common/client/OrderedTextUtil.java | 48 ++++++++ .../client/config/AutoConfigScreen.java | 110 +++++++++++------- .../BetterFurnaceMinecart.java | 2 +- .../mechanics/dragon_fight/DragonFight.java | 2 +- .../assets/andromeda/lang/en_us.json | 56 +++------ 6 files changed, 132 insertions(+), 88 deletions(-) create mode 100644 src/main/java/me/melontini/andromeda/common/client/OrderedTextUtil.java diff --git a/src/main/java/me/melontini/andromeda/base/config/AndromedaConfig.java b/src/main/java/me/melontini/andromeda/base/config/AndromedaConfig.java index 85e3ebdf..079b5bc9 100644 --- a/src/main/java/me/melontini/andromeda/base/config/AndromedaConfig.java +++ b/src/main/java/me/melontini/andromeda/base/config/AndromedaConfig.java @@ -8,7 +8,7 @@ public class AndromedaConfig { @ConfigEntry.Gui.RequiresRestart public boolean sideOnlyMode = false; - @ConfigEntry.Gui.Tooltip(count = 3) + @ConfigEntry.Gui.Tooltip public boolean sendCrashReports = true; @ConfigEntry.Gui.Tooltip diff --git a/src/main/java/me/melontini/andromeda/common/client/OrderedTextUtil.java b/src/main/java/me/melontini/andromeda/common/client/OrderedTextUtil.java new file mode 100644 index 00000000..910c27cb --- /dev/null +++ b/src/main/java/me/melontini/andromeda/common/client/OrderedTextUtil.java @@ -0,0 +1,48 @@ +package me.melontini.andromeda.common.client; + +import me.melontini.dark_matter.api.minecraft.util.TextUtil; +import net.minecraft.client.MinecraftClient; +import net.minecraft.text.CharacterVisitor; +import net.minecraft.text.MutableText; +import net.minecraft.text.OrderedText; +import net.minecraft.text.Text; + +public class OrderedTextUtil { + + public static Text[] wrap(Text text, int length) { + return MinecraftClient.getInstance().textRenderer.wrapLines(text, length) + .stream().map(OrderedTextUtil::orderedToNormal).toArray(Text[]::new); + } + + //MIT License + // + //Copyright (c) 2019 kyrptonaught + // + //Permission is hereby granted, free of charge, to any person obtaining a copy + //of this software and associated documentation files (the "Software"), to deal + //in the Software without restriction, including without limitation the rights + //to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + //copies of the Software, and to permit persons to whom the Software is + //furnished to do so, subject to the following conditions: + // + //The above copyright notice and this permission notice shall be included in all + //copies or substantial portions of the Software. + // + //THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + //IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + //FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + //AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + //LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + //OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + //SOFTWARE. + public static Text orderedToNormal(OrderedText orderedText) { + MutableText text = TextUtil.literal(""); + CharacterVisitor characterVisitor = (index, style, codePoint) -> { + String str = new String(Character.toChars(codePoint)); + text.append(TextUtil.literal(str).setStyle(style)); + return true; + }; + orderedText.accept(characterVisitor); + return text; + } +} 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 97330cf5..9a476852 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,11 +1,13 @@ package me.melontini.andromeda.common.client.config; +import me.melontini.andromeda.base.Environment; import me.melontini.andromeda.base.Module; import me.melontini.andromeda.base.ModuleManager; import me.melontini.andromeda.base.annotations.FeatureEnvironment; import me.melontini.andromeda.base.annotations.ModuleTooltip; import me.melontini.andromeda.base.config.AndromedaConfig; import me.melontini.andromeda.base.config.Config; +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.util.Support; @@ -24,13 +26,13 @@ import me.shedaniel.clothconfig2.api.ConfigCategory; import me.shedaniel.clothconfig2.gui.entries.TooltipListEntry; import net.minecraft.client.gui.screen.Screen; import net.minecraft.text.Text; +import net.minecraft.util.Formatting; import net.minecraft.util.Identifier; import org.apache.commons.lang3.ArrayUtils; import java.lang.reflect.Field; import java.util.*; import java.util.function.Supplier; -import java.util.stream.IntStream; @SuppressWarnings("UnstableApiUsage") public class AutoConfigScreen { @@ -43,39 +45,34 @@ public class AutoConfigScreen { Holder.OURS.registerPredicateTransformer((list, s, field, o, o1, guiRegistryAccess) -> { list.forEach(gui -> { gui.setEditable(false); - if (gui instanceof TooltipListEntry tooltipGui) { - var tuple = CONTEXT.get().manager().getOptionManager().blameProcessors(new FieldOption(field)); - Set texts = new HashSet<>(); - for (OptionManager.ProcessorEntry processor : tuple.right()) { - CONTEXT.get().manager().getOptionManager().getReason(processor.id(), tuple.left()).ifPresent(textEntry -> { - if (textEntry.isTranslatable()) { - texts.add(TextUtil.translatable(textEntry.get(), textEntry.args())); - } else { - texts.add(TextUtil.literal(textEntry.get())); + if (gui instanceof TooltipListEntry tooltipGui) checkOM(field, tooltipGui); + }); + return list; + }, field -> CONTEXT.get() != null && CONTEXT.get().manager() + .getOptionManager().isModified(new FieldOption(field))); + + Holder.OURS.registerPredicateTransformer((guis, s, field, o, o1, guiRegistryAccess) -> { + guis.forEach(e -> { + if (e instanceof TooltipListEntry t) { + if (t.getTooltipSupplier() != null) { + Optional optional = t.getTooltipSupplier().get().map(texts1 -> { + List list = new ArrayList<>(); + for (Text text : texts1) { + list.addAll(Arrays.asList(OrderedTextUtil.wrap(text, 250))); } + return list.toArray(Text[]::new); }); + t.setTooltipSupplier(() -> optional); } - Text[] texts1 = texts.toArray(Text[]::new); - tooltipGui.setTooltipSupplier(() -> Optional.of(texts1)); } }); - return list; - }, field -> CONTEXT.get() != null && CONTEXT.get().manager() - .getOptionManager().isModified(new FieldOption(field))); + return guis; + }, field -> true); Holder.OURS.registerAnnotationTransformer((list, s, field, o, o1, guiRegistryAccess) -> { list.forEach(gui -> { if (gui instanceof TooltipListEntry tooltipGui) { - FeatureEnvironment environment = field.getAnnotation(FeatureEnvironment.class); - - if (tooltipGui.getTooltipSupplier() != null) { - Optional optional = tooltipGui.getTooltipSupplier().get(); - Text[] text = optional.map(texts -> ArrayUtils.add(texts, TextUtil.translatable("andromeda.config.tooltip.environment." + environment.value().toString().toLowerCase()))).orElseGet(() -> new Text[]{TextUtil.translatable("andromeda.config.tooltip.environment." + environment.value().toString().toLowerCase())}); - tooltipGui.setTooltipSupplier(() -> Optional.of(text)); - } else { - Text[] text = new Text[]{TextUtil.translatable("andromeda.config.tooltip.environment." + environment.value().toString().toLowerCase())}; - tooltipGui.setTooltipSupplier(() -> Optional.of(text)); - } + checkEnv(tooltipGui, field.getAnnotation(FeatureEnvironment.class).value()); } }); return list; @@ -98,30 +95,23 @@ public class AutoConfigScreen { List fields = Arrays.asList(module.configClass().getFields()); fields.sort(Comparator.comparingInt(value -> !"enabled".equals(value.getName()) ? 1 : 0)); - Supplier> supplier = Optional::empty; - if (module.getClass().isAnnotationPresent(ModuleTooltip.class)) { - ModuleTooltip tooltip = module.getClass().getAnnotation(ModuleTooltip.class); - if (tooltip.value() == 1) { - Text[] text = new Text[]{TextUtil.translatable("config.andromeda.%s.@Tooltip".formatted(module.meta().dotted()))}; - supplier = () -> Optional.of(text); - } else if (tooltip.value() > 1) { - Text[] text = IntStream.range(0, tooltip.value()).boxed() - .map(i -> "config.andromeda.%s.@Tooltip[%s]".formatted(module.meta().dotted(), i)) - .map(TextUtil::translatable).toArray(Text[]::new); - supplier = () -> Optional.of(text); - } - } + Optional tooltip = !module.getClass().isAnnotationPresent(ModuleTooltip.class) ? Optional.empty() : Utilities.supply(() -> { + Text[] text = OrderedTextUtil.wrap(TextUtil.translatable("config.andromeda.%s.@Tooltip".formatted(module.meta().dotted())), 250); + return Optional.of(text); + }); + Supplier> supplier = () -> tooltip; if (fields.size() == 1) { Field f = fields.get(0); if (!"enabled".equals(f.getName())) throw new IllegalStateException(); - var e = eb.startBooleanToggle(TextUtil.translatable("config.andromeda.%s".formatted(module.meta().dotted())), Utilities.supplyUnchecked(() -> f.getBoolean(module.config()))); - e.setTooltipSupplier(supplier); - e.setDefaultValue(() -> Utilities.supplyUnchecked(() -> f.getBoolean(module.manager().getDefaultConfig()))); - e.setSaveConsumer(b -> Utilities.runUnchecked(() -> f.setBoolean(module.config(), b))); - e.requireRestart(); - getOrCreateCategoryForField(module, builder).addEntry(e.build()); + Holder.COMPOSED.getAndTransform("config.andromeda.%s".formatted(module.meta().dotted()), f, module.config(), module.manager().getDefaultConfig(), Holder.COMPOSED).forEach(e -> { + if (e instanceof TooltipListEntry t) { + t.setTooltipSupplier(supplier); + checkEnv(t, module.meta().environment()); + } + getOrCreateCategoryForField(module, builder).addEntry(e); + }); } else { List> list = new ArrayList<>(); fields.forEach((field) -> { @@ -130,7 +120,7 @@ public class AutoConfigScreen { }); var e = eb.startSubCategory(TextUtil.translatable("config.andromeda.%s".formatted(module.meta().dotted())), Utilities.cast(list)); e.setTooltipSupplier(supplier); - getOrCreateCategoryForField(module, builder).addEntry(e.build()); + getOrCreateCategoryForField(module, builder).addEntry(Utilities.consume(e.build(), entry -> checkEnv(entry, module.meta().environment()))); } } finally { CONTEXT.remove(); @@ -146,6 +136,36 @@ public class AutoConfigScreen { }); } + private static void checkEnv(TooltipListEntry tooltipGui, Environment environment) { + Text envText = TextUtil.translatable("andromeda.config.tooltip.environment." + environment.toString().toLowerCase()).formatted(Formatting.YELLOW); + + if (tooltipGui.getTooltipSupplier() != null) { + Optional optional = tooltipGui.getTooltipSupplier().get(); + Text[] text = optional.map(texts -> ArrayUtils.add(texts, envText)) + .orElseGet(() -> new Text[]{envText}); + tooltipGui.setTooltipSupplier(() -> Optional.of(text)); + } else { + Text[] text = new Text[]{envText}; + tooltipGui.setTooltipSupplier(() -> Optional.of(text)); + } + } + + private static void checkOM(Field field, TooltipListEntry tooltipGui) { + var tuple = CONTEXT.get().manager().getOptionManager().blameProcessors(new FieldOption(field)); + Set texts = new HashSet<>(); + for (OptionManager.ProcessorEntry processor : tuple.right()) { + CONTEXT.get().manager().getOptionManager().getReason(processor.id(), tuple.left()).ifPresent(textEntry -> { + if (textEntry.isTranslatable()) { + texts.add(TextUtil.translatable(textEntry.get(), textEntry.args()).formatted(Formatting.RED)); + } else { + texts.add(TextUtil.literal(textEntry.get()).formatted(Formatting.RED)); + } + }); + } + Text[] texts1 = texts.toArray(Text[]::new); + tooltipGui.setTooltipSupplier(() -> Optional.of(texts1)); + } + //TODO private static void powerSave() { Config.save(); 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 d386e76a..8aedb92d 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 @@ -20,7 +20,7 @@ public class BetterFurnaceMinecart extends Module @ConfigEntry.Gui.Tooltip public int maxFuel = 45000; - @ConfigEntry.Gui.Tooltip(count = 3) + @ConfigEntry.Gui.Tooltip public boolean takeFuelWhenLow = 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 cce4ff1b..55fcc91e 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 @@ -21,7 +21,7 @@ public class DragonFight extends Module { public boolean respawnCrystals = true; @ConfigEntry.Category("mechanics") - @ConfigEntry.Gui.Tooltip(count = 2) + @ConfigEntry.Gui.Tooltip public boolean scaleHealthByMaxPlayers = false; @ConfigEntry.Category("mechanics") diff --git a/src/main/resources/assets/andromeda/lang/en_us.json b/src/main/resources/assets/andromeda/lang/en_us.json index 99d0230b..001c0a85 100644 --- a/src/main/resources/assets/andromeda/lang/en_us.json +++ b/src/main/resources/assets/andromeda/lang/en_us.json @@ -107,15 +107,13 @@ "config.andromeda.category.world": "World", "config.andromeda.world.auto_planting": "Self Planting Crops", - "config.andromeda.world.auto_planting.@Tooltip[0]": "If possible, crops will plant themselves after some time.", - "config.andromeda.world.auto_planting.@Tooltip[1]": "Taken from TinyTweaks by HephaestusDev", + "config.andromeda.world.auto_planting.@Tooltip": "If possible, crops will plant themselves after some time. \nTaken from TinyTweaks by HephaestusDev", "config.andromeda.world.auto_planting.option.blacklistMode": "Blacklist Mode", "config.andromeda.world.auto_planting.option.blacklistMode.@Tooltip": "Should the list below act as blacklist", "config.andromeda.world.auto_planting.option.idList": "Item List", "config.andromeda.world.auto_planting.option.idList.@Tooltip": "Block/Allow the following items to auto-plant.", "config.andromeda.world.falling_beenests": "Can Bee Nests Fall?", - "config.andromeda.world.falling_beenests.@Tooltip[0]": "Pretty self-explanatory. Makes Bee Nests fall after some time,", - "config.andromeda.world.falling_beenests.@Tooltip[1]": "you can also shoot them with an arrow", + "config.andromeda.world.falling_beenests.@Tooltip": "Pretty self-explanatory. Makes Bee Nests fall after some time, \nyou can also shoot them with an arrow", "config.andromeda.world.crop_temperature": "Temperature-Based Crop Growth Speed", "config.andromeda.world.crop_temperature.@Tooltip": "TODO: give this perfectly complete feature a proper description", "config.andromeda.world.quick_fire": "Fast Fire Spread", @@ -128,26 +126,21 @@ "config.andromeda.blocks.falling_propagule": "Falling Propagule", "config.andromeda.blocks.falling_propagule.@Tooltip": "Fully grown, hanging propagule will fall after some time.", "config.andromeda.blocks.cactus_bottle_filling": "Cactus Bottle Filling", - "config.andromeda.blocks.cactus_bottle_filling.@Tooltip[0]": "Allows filling glass bottles using cacti.", - "config.andromeda.blocks.cactus_bottle_filling.@Tooltip[1]": "The top cactus breaks and drops a dead bush after 3 usages.", + "config.andromeda.blocks.cactus_bottle_filling.@Tooltip": "Allows filling glass bottles using cacti. \nThe top cactus breaks and drops a dead bush after 3 usages.", "config.andromeda.blocks.incubator": "Incubator Settings", - "config.andromeda.blocks.incubator.@Tooltip[0]": "Various Incubator settings", - "config.andromeda.blocks.incubator.@Tooltip[1]": "Some options say they require a restart, when they actually don't", - "config.andromeda.blocks.incubator.@Tooltip[2]": "I'm not sure what's going on with that", + "config.andromeda.blocks.incubator.@Tooltip": "Various Incubator settings \nSome options say they require a restart, when they actually don't \nI'm not sure what's going on with that", "config.andromeda.blocks.incubator.option.randomness": "Random Incubator Hatch Times", "config.andromeda.blocks.incubator.option.randomness.@Tooltip": "Makes incubator hatch times more random", "config.andromeda.blocks.better_fletching_table": "Useful Fletching Table", "config.andromeda.blocks.better_fletching_table.@Tooltip": "Gives the Fletching Table a GUI where you can tighten the string of your bow for improved accuracy.", "config.andromeda.blocks.bed.unsafe": "Beds Explode Everywhere", - "config.andromeda.blocks.bed.unsafe.@Tooltip[0]": "Makes beds explode in every dimension.", - "config.andromeda.blocks.bed.unsafe.@Tooltip[1]": "Conflicts with Safe Beds!", + "config.andromeda.blocks.bed.unsafe.@Tooltip": "Makes beds explode in every dimension. \nConflicts with Safe Beds!", "config.andromeda.blocks.bed.power": "Bed Explosion Power", "config.andromeda.blocks.bed.power.@Tooltip": "Enables the setting below.", "config.andromeda.blocks.bed.power.option.power": "Power", "config.andromeda.blocks.bed.power.option.power.@Tooltip": "Configurable bed explosion power. Default is 5.0", "config.andromeda.blocks.bed.safe": "Safe Beds", - "config.andromeda.blocks.bed.safe.@Tooltip[0]": "Makes beds not explode when outside the Overworld.", - "config.andromeda.blocks.bed.safe.@Tooltip[1]": "Conflicts with Beds Explode Everywhere!", + "config.andromeda.blocks.bed.safe.@Tooltip": "Makes beds not explode when outside the Overworld. \nConflicts with Beds Explode Everywhere!", "config.andromeda.blocks.campfire_effects": "Campfire Effects", "config.andromeda.blocks.campfire_effects.@Tooltip": "Makes campfires emit potion effects within a certain range.", "config.andromeda.blocks.campfire_effects.option.affectsPassive": "Apply Effects to Passive Entities?", @@ -156,14 +149,11 @@ "config.andromeda.blocks.campfire_effects.option.effectsRange": "Campfire Effects Range", "config.andromeda.blocks.campfire_effects.option.effectsRange.@Tooltip": "Sets a range for campfire to emit effects", "config.andromeda.blocks.leaf_slowdown": "Leaf Slowdown", - "config.andromeda.blocks.leaf_slowdown.@Tooltip[0]": "Makes entities slower while standing on leaves.", - "config.andromeda.blocks.leaf_slowdown.@Tooltip[1]": "This should discourage players from running above all the fun things", + "config.andromeda.blocks.leaf_slowdown.@Tooltip": "Makes entities slower while standing on leaves. \nThis should discourage players from running above all the fun things", "config.andromeda.category.entities": "Entities", "config.andromeda.entities.zombie.clean_pickup": "Zombies Don't Pick up Garbage", - "config.andromeda.entities.zombie.clean_pickup.@Tooltip[0]": "Prevents zombies from picking up garbage with no use.", - "config.andromeda.entities.zombie.clean_pickup.@Tooltip[1]": "Useful items include: tools, armor, any throwable item (if enabled)", - "config.andromeda.entities.zombie.clean_pickup.@Tooltip[2]": "and the \"andromeda:zombies_pickup\" tag.", + "config.andromeda.entities.zombie.clean_pickup.@Tooltip": "Prevents zombies from picking up garbage with no use. \nUseful items include: tools, armor, any throwable item (if enabled) and the \"andromeda:zombies_pickup\" tag.", "config.andromeda.entities.zombie.all_pick_up": "All Zombies Can Pick up Items", "config.andromeda.entities.zombie.all_pick_up.@Tooltip": "Allows all zombies to pick up items, no matter the difficulty.", "config.andromeda.entities.snowball_tweaks": "Snowball Tweaks", @@ -188,22 +178,17 @@ "config.andromeda.entities.slimes.option.slowness": "Slime Slowdown", "config.andromeda.entities.slimes.option.slowness.@Tooltip": "Small slimes slow their enemies on attack.", "config.andromeda.entities.bee_flower_duplication": "Bee Flower Duplication", - "config.andromeda.entities.bee_flower_duplication.@Tooltip[0]": "When a bee pollinates a flower, the flower has a chance to spread, similar to grass.", - "config.andromeda.entities.bee_flower_duplication.@Tooltip[1]": "This won't happen every pollination, since there's a 3-6 minute cooldown.", + "config.andromeda.entities.bee_flower_duplication.@Tooltip": "When a bee pollinates a flower, the flower has a chance to spread, similar to grass. \nThis won't happen every pollination, since there's a 3-6 minute cooldown.", "config.andromeda.entities.bee_flower_duplication.option.tallFlowers": "Affect Tall Flowers", "config.andromeda.entities.bee_flower_duplication.option.tallFlowers.@Tooltip": "Enables bee flower duplication for tall flowers, and disables bonemealing tall flowers.", "config.andromeda.entities.villagers_follow_emeralds": "Villagers Follow Emerald Blocks", "config.andromeda.entities.villagers_follow_emeralds.@Tooltip": "Makes villagers follow if you have an emerald block in hand.", "config.andromeda.entities.better_furnace_minecart": "Better Furnace Minecart", - "config.andromeda.entities.better_furnace_minecart.@Tooltip[0]": "A few tweaks to make furnace minecarts just a bit better:", - "config.andromeda.entities.better_furnace_minecart.@Tooltip[1]": "- Carts can now store more fuel. You can change the fuel limit below.", - "config.andromeda.entities.better_furnace_minecart.@Tooltip[2]": "- You can now use any type of fuel, such as lava buckets, coal blocks, etc.", + "config.andromeda.entities.better_furnace_minecart.@Tooltip": "A few tweaks to make furnace minecarts just a bit better: \n- Carts can now store more fuel. You can change the fuel limit below. \n- You can now use any type of fuel, such as lava buckets, coal blocks, etc.", "config.andromeda.entities.better_furnace_minecart.option.maxFuel": "Max Fuel", "config.andromeda.entities.better_furnace_minecart.option.maxFuel.@Tooltip": "Set the maximum allowed fuel for the furnace minecart. The default is 45000, and the maximum limit is 2147483647.", "config.andromeda.entities.better_furnace_minecart.option.takeFuelWhenLow": "Take Fuel When Low", - "config.andromeda.entities.better_furnace_minecart.option.takeFuelWhenLow.@Tooltip[0]": "Makes furnace minecarts take fuel from nearby inventory carts,", - "config.andromeda.entities.better_furnace_minecart.option.takeFuelWhenLow.@Tooltip[1]": "such as minecarts with chests, hoppers and possibly modded ones.", - "config.andromeda.entities.better_furnace_minecart.option.takeFuelWhenLow.@Tooltip[2]": "If a cart has stopped, you have to push it with your hand before it moves.", + "config.andromeda.entities.better_furnace_minecart.option.takeFuelWhenLow.@Tooltip": "Makes furnace minecarts take fuel from nearby inventory carts, \nsuch as minecarts with chests, hoppers and possibly modded ones. \nIf a cart has stopped, you have to push it with your hand before it moves.", "config.andromeda.entities.minecarts": "New Minecarts", "config.andromeda.entities.minecarts.@Tooltip": "Enable or disable new minecarts with blocks!", "config.andromeda.entities.minecarts.option.isAnvilMinecartOn": "Anvil Minecart", @@ -250,10 +235,7 @@ "config.andromeda.items.infinite_totem.option.enableAscension": "Enable Totem Ascension", "config.andromeda.items.infinite_totem.option.enableAscension.@Tooltip": "Enables ascension of \"Totem of Undying\" to infinity. Otherwise, there's no way to make IToUs.", "config.andromeda.items.balanced_mending": "Balanced Mending", - "config.andromeda.items.balanced_mending.@Tooltip[0]": "Makes mending a bit less overpowered by making it remove the \"Too Expensive\" error", - "config.andromeda.items.balanced_mending.@Tooltip[1]": "instead of repairing items via XP.", - "config.andromeda.items.balanced_mending.@Tooltip[2]": "Also sets anvil's XP cap to 40 levels (but not really!)", - "config.andromeda.items.balanced_mending.@Tooltip[3]": "Inspired by TheMisterEpic's \"This Minecraft Enchantment has been BROKEN for 3 YEARS...\" video.", + "config.andromeda.items.balanced_mending.@Tooltip": "Makes mending a bit less overpowered by making it remove the \"Too Expensive\" error instead of repairing items via XP. \nAlso sets anvil's XP cap to 40 levels (but not really!). \nInspired by TheMisterEpic's \"This Minecraft Enchantment has been BROKEN for 3 YEARS...\" video.", "config.andromeda.items.minecart_block_picking": "Minecart Block Picking", "config.andromeda.items.minecart_block_picking.@Tooltip": "Allows players to \"pick\" blocks via minecarts", "config.andromeda.items.minecart_block_picking.option.spawnerPicking": "Spawner Picking", @@ -261,8 +243,7 @@ "config.andromeda.category.bugfixes": "Bugfixes", "config.andromeda.bugfixes.advancement_shadow": "Frame-Independent Advancement Shadow", - "config.andromeda.bugfixes.advancement_shadow.@Tooltip[0]": "You know that shadow in the advancements menu when you hover over any advancement?", - "config.andromeda.bugfixes.advancement_shadow.@Tooltip[1]": "Now it won't speed up/slowdown when your frame rate changes.", + "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.", @@ -273,8 +254,7 @@ "config.andromeda.mechanics.dragon_fight.option.respawnCrystals": "Respawn Crystals", "config.andromeda.mechanics.dragon_fight.option.respawnCrystals.@Tooltip": "Makes the End Crystals respawn after exploding (~1,6 - 3 minutes)", "config.andromeda.mechanics.dragon_fight.option.scaleHealthByMaxPlayers": "Scale Health by Max Players", - "config.andromeda.mechanics.dragon_fight.option.scaleHealthByMaxPlayers.@Tooltip[0]": "Changes dragons health according to the maximum amount of players in the end", - "config.andromeda.mechanics.dragon_fight.option.scaleHealthByMaxPlayers.@Tooltip[1]": "The formula is floor((sqrt(500 * i)) * 10), where i is max players", + "config.andromeda.mechanics.dragon_fight.option.scaleHealthByMaxPlayers.@Tooltip": "Changes dragons health according to the maximum amount of players in the end. \nThe formula is floor((sqrt(500 * i)) * 10), where i is max players", "config.andromeda.mechanics.dragon_fight.option.shorterCrystalTrackRange": "Shorter Crystal Tracking Range", "config.andromeda.mechanics.dragon_fight.option.shorterCrystalTrackRange.@Tooltip": "Changes the crystal tracking range from 32 to 24 blocks", "config.andromeda.mechanics.dragon_fight.option.shorterSpikes": "Shorter Spikes", @@ -289,9 +269,7 @@ "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", "config.andromeda.mechanics.trading_goat_horn": "Wandering Trader Horn", - "config.andromeda.mechanics.trading_goat_horn.@Tooltip[0]": "Every 2 days you can blow the \"sing\" horn to summon a wandering trader.", - "config.andromeda.mechanics.trading_goat_horn.@Tooltip[1]": "Please note, wandering traders will still spawn naturally", - "config.andromeda.mechanics.trading_goat_horn.@Tooltip[2]": "You can disable the \"doTraderSpawning\" gamerule if you don't want them to", + "config.andromeda.mechanics.trading_goat_horn.@Tooltip": "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.category.gui": "GUI", "config.andromeda.gui.name_tooltips": "Tooltip, not Name", @@ -331,9 +309,7 @@ "config.andromeda.base.option.sideOnlyMode": "Side-Only Mode", "config.andromeda.base.option.sideOnlyMode.@Tooltip": "Disables all modules which require Andromeda to be present on server.", "config.andromeda.base.option.sendCrashReports": "Send Crash Reports", - "config.andromeda.base.option.sendCrashReports.@Tooltip[0]": "Data sent at crash:", - "config.andromeda.base.option.sendCrashReports.@Tooltip[1]": "Stacktrace, Loaded mods, Environment (server/client)", - "config.andromeda.base.option.sendCrashReports.@Tooltip[2]": "Crash reports don't have a unique profile attached.", + "config.andromeda.base.option.sendCrashReports.@Tooltip": "Data sent at crash: \nStacktrace, Loaded mods, Environment (server/client) \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." } \ No newline at end of file -- 2.51.2 From 0a769b4dc7c721677bc906c05752d1d553478f4e Mon Sep 17 00:00:00 2001 From: melontini <104443436+melontini@users.noreply.github.com> Date: Fri, 8 Dec 2023 14:29:56 +0700 Subject: [PATCH 08/23] Fixes --- gradle.properties | 2 +- .../me/melontini/andromeda/base/Module.java | 6 +++--- .../andromeda/base/ModuleManager.java | 18 +++++++++++------- .../common/client/OrderedTextUtil.java | 2 +- .../common/client/config/AutoConfigScreen.java | 1 + .../modules/blocks/bed/unsafe/Unsafe.java | 18 +++++++++--------- .../item_frame_tooltips/ItemFrameTooltips.java | 9 ++++----- .../gui/name_tooltips/NameTooltips.java | 9 ++++----- .../MinecartBlockPicking.java | 9 ++++----- 9 files changed, 38 insertions(+), 36 deletions(-) diff --git a/gradle.properties b/gradle.properties index 753805f2..6b0f2e2d 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=v2.0.0-1.19.2 +dark_matter=ee9aa79709 mixin_extras_version=0.3.0 \ No newline at end of file diff --git a/src/main/java/me/melontini/andromeda/base/Module.java b/src/main/java/me/melontini/andromeda/base/Module.java index 5201d1df..2457c323 100644 --- a/src/main/java/me/melontini/andromeda/base/Module.java +++ b/src/main/java/me/melontini/andromeda/base/Module.java @@ -6,9 +6,8 @@ import me.melontini.andromeda.base.config.BasicConfig; import me.melontini.andromeda.common.registries.Common; import me.melontini.dark_matter.api.base.util.Utilities; import me.melontini.dark_matter.api.base.util.classes.Lazy; +import me.melontini.dark_matter.api.config.ConfigBuilder; import me.melontini.dark_matter.api.config.ConfigManager; -import me.melontini.dark_matter.api.config.OptionProcessorRegistry; -import net.fabricmc.loader.api.ModContainer; @SuppressWarnings("UnstableApiUsage") public abstract class Module { @@ -35,7 +34,8 @@ public abstract class Module { } catch (ClassNotFoundException ignored) { } } public void onPreLaunch() { } - public void onProcessors(OptionProcessorRegistry registry, ModContainer mod) { } + + public void onConfig(ConfigBuilder builder) { } public final Metadata meta() { return info; diff --git a/src/main/java/me/melontini/andromeda/base/ModuleManager.java b/src/main/java/me/melontini/andromeda/base/ModuleManager.java index e72bd957..52a3e3a8 100644 --- a/src/main/java/me/melontini/andromeda/base/ModuleManager.java +++ b/src/main/java/me/melontini/andromeda/base/ModuleManager.java @@ -45,11 +45,12 @@ public class ModuleManager { 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()); - if (ids.contains(module.meta().id())) throw new IllegalStateException("Duplicate module IDs! ID: %s, Module: %s".formatted(module.meta().id(), module.getClass())); + if (ids.contains(module.meta().id())) + throw new IllegalStateException("Duplicate module IDs! ID: %s, Module: %s".formatted(module.meta().id(), module.getClass())); ids.add(module.meta().id()); } - List> sorted = discovered.stream().sorted(Comparator.comparingInt(m-> { + List> sorted = discovered.stream().sorted(Comparator.comparingInt(m -> { int i = categories.indexOf(m.meta().category()); return i >= 0 ? i : categories.size(); })).toList(); @@ -64,7 +65,7 @@ public class ModuleManager { this.configs = ImmutableMap.copyOf(setUpConfigs(sorted)); - sorted.forEach(Module::manager); + sorted.forEach(module -> module.manager().getOptionManager().processOptions()); modules.values().removeIf(m -> !m.enabled()); this.modules = ImmutableMap.copyOf(modules); @@ -76,6 +77,7 @@ public class ModuleManager { public Map, Lazy>> setUpConfigs(List> list) { Map, Lazy>> configs = new HashMap<>(); + list.forEach(m -> { var config = ConfigBuilder.create(m.configClass(), CommonValues.mod(), "andromeda/" + m.meta().id()); config.processors((registry, mod) -> { @@ -92,8 +94,8 @@ public class ModuleManager { } return null; }, mod); - m.onProcessors(Utilities.cast(registry), mod); }); + m.onConfig(Utilities.cast(config)); configs.put(m.getClass(), Lazy.of(() -> () -> config.build(false))); }); return configs; @@ -121,12 +123,13 @@ public class ModuleManager { @SuppressWarnings("unchecked") public > Optional getModule(Class cls) { - return (Optional) Optional.ofNullable(modules!=null?modules.get(cls):discoveredModules.get(cls)) + return (Optional) Optional.ofNullable(discoveredModules.get(cls)) .filter(Module::enabled); } + @SuppressWarnings("unchecked") public > Optional getModule(String name) { - return (Optional) Optional.ofNullable(moduleNames!=null?moduleNames.get(name):discoveredModuleNames.get(name)) + return (Optional) Optional.ofNullable(discoveredModuleNames.get(name)) .filter(Module::enabled); } @@ -137,11 +140,12 @@ public class ModuleManager { public Collection> all() { return discoveredModules.values(); } + public Collection> loaded() { return Collections.unmodifiableCollection(modules.values()); } - public static > T quick(Class cls) { + public static > T quick(Class cls) { return get().getModule(cls).orElseThrow(() -> new IllegalStateException("Module %s requested quickly, but is not loaded.".formatted(cls))); } diff --git a/src/main/java/me/melontini/andromeda/common/client/OrderedTextUtil.java b/src/main/java/me/melontini/andromeda/common/client/OrderedTextUtil.java index 910c27cb..8a9f02ec 100644 --- a/src/main/java/me/melontini/andromeda/common/client/OrderedTextUtil.java +++ b/src/main/java/me/melontini/andromeda/common/client/OrderedTextUtil.java @@ -36,7 +36,7 @@ public class OrderedTextUtil { //OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE //SOFTWARE. public static Text orderedToNormal(OrderedText orderedText) { - MutableText text = TextUtil.literal(""); + MutableText text = TextUtil.empty(); CharacterVisitor characterVisitor = (index, style, codePoint) -> { String str = new String(Character.toChars(codePoint)); text.append(TextUtil.literal(str).setStyle(style)); 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 9a476852..b9bc9723 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 @@ -109,6 +109,7 @@ public class AutoConfigScreen { if (e instanceof TooltipListEntry t) { t.setTooltipSupplier(supplier); checkEnv(t, module.meta().environment()); + checkOM(f, t); } getOrCreateCategoryForField(module, builder).addEntry(e); }); 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 b8061d5c..216db0a0 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 @@ -8,8 +8,7 @@ import me.melontini.andromeda.base.annotations.ModuleTooltip; import me.melontini.andromeda.base.config.BasicConfig; import me.melontini.andromeda.modules.blocks.bed.safe.Safe; import me.melontini.andromeda.util.CommonValues; -import me.melontini.dark_matter.api.config.OptionProcessorRegistry; -import net.fabricmc.loader.api.ModContainer; +import me.melontini.dark_matter.api.config.ConfigBuilder; import java.util.Map; @@ -19,12 +18,13 @@ import java.util.Map; public class Unsafe extends BasicModule { @Override - public void onProcessors(OptionProcessorRegistry registry, ModContainer mod) { - registry.register(CommonValues.MODID + ":module_conflict", manager -> { - if (ModuleManager.get().getModule(Safe.class).isPresent()) { - return Map.of("enabled", false); - } - return null; - }, mod); + public void onConfig(ConfigBuilder builder) { + builder.processors((registry, mod) -> + registry.register(CommonValues.MODID + ":module_conflict", manager -> { + if (ModuleManager.get().getModule(Safe.class).isPresent()) { + return Map.of("enabled", false); + } + return null; + }, mod)); } } 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 a1372f9e..d51400d0 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 @@ -6,8 +6,7 @@ import me.melontini.andromeda.base.annotations.ModuleInfo; import me.melontini.andromeda.base.annotations.ModuleTooltip; import me.melontini.andromeda.base.config.BasicConfig; import me.melontini.andromeda.util.CommonValues; -import me.melontini.dark_matter.api.config.OptionProcessorRegistry; -import net.fabricmc.loader.api.ModContainer; +import me.melontini.dark_matter.api.config.ConfigBuilder; import java.util.Map; @@ -19,13 +18,13 @@ import static me.melontini.andromeda.util.MiscUtil.testModVersion; public class ItemFrameTooltips extends BasicModule { @Override - public void onProcessors(OptionProcessorRegistry registry, ModContainer mod) { - registry.register(CommonValues.MODID + ":iceberg", manager -> { + public void onConfig(ConfigBuilder builder) { + builder.processors((registry, mod) -> registry.register(CommonValues.MODID + ":iceberg", manager -> { if (testModVersion("minecraft", ">=1.20") && testModVersion("iceberg", "<1.1.13")) { return Map.of("enabled", false); } return null; - }, mod); + }, mod)); } } 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 495e9916..c31ec31e 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 @@ -6,8 +6,7 @@ import me.melontini.andromeda.base.annotations.ModuleInfo; import me.melontini.andromeda.base.annotations.ModuleTooltip; import me.melontini.andromeda.base.config.BasicConfig; import me.melontini.andromeda.util.CommonValues; -import me.melontini.dark_matter.api.config.OptionProcessorRegistry; -import net.fabricmc.loader.api.ModContainer; +import me.melontini.dark_matter.api.config.ConfigBuilder; import java.util.Map; @@ -19,13 +18,13 @@ import static me.melontini.andromeda.util.MiscUtil.testModVersion; public class NameTooltips extends BasicModule { @Override - public void onProcessors(OptionProcessorRegistry registry, ModContainer mod) { - registry.register(CommonValues.MODID + ":iceberg", manager -> { + public void onConfig(ConfigBuilder builder) { + builder.processors((registry, mod) -> registry.register(CommonValues.MODID + ":iceberg", manager -> { if (testModVersion("minecraft", ">=1.20") && testModVersion("iceberg", "<1.1.13")) { return Map.of("enabled", false); } return null; - }, mod); + }, mod)); } } 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 c7150c32..a0a38734 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 @@ -7,9 +7,8 @@ import me.melontini.andromeda.base.annotations.ModuleTooltip; import me.melontini.andromeda.base.config.BasicConfig; import me.melontini.andromeda.modules.entities.minecarts.Minecarts; import me.melontini.andromeda.util.CommonValues; -import me.melontini.dark_matter.api.config.OptionProcessorRegistry; +import me.melontini.dark_matter.api.config.ConfigBuilder; import me.shedaniel.autoconfig.annotation.ConfigEntry; -import net.fabricmc.loader.api.ModContainer; import java.util.Map; @@ -19,14 +18,14 @@ import java.util.Map; public class MinecartBlockPicking extends Module { @Override - public void onProcessors(OptionProcessorRegistry registry, ModContainer mod) { - registry.register(CommonValues.MODID + ":spawner_enabled", manager -> { + public void onConfig(ConfigBuilder builder) { + builder.processors((registry, mod) -> registry.register(CommonValues.MODID + ":spawner_enabled", manager -> { if (ModuleManager.get().getModule(Minecarts.class) .map(m->!m.config().isSpawnerMinecartOn).orElse(true)) { return Map.of("spawnerPicking", false); } return null; - }, mod); + }, mod)); } @Override -- 2.51.2 From 3473c6643a0ec17a877566329b6288e331273135 Mon Sep 17 00:00:00 2001 From: melontini <104443436+melontini@users.noreply.github.com> Date: Fri, 8 Dec 2023 21:38:08 +0700 Subject: [PATCH 09/23] More config stuff --- gradle.properties | 2 +- .../me/melontini/andromeda/base/Module.java | 1 + .../andromeda/base/ModuleManager.java | 25 ++++++++++--------- .../modules/blocks/bed/unsafe/Unsafe.java | 6 +++++ .../MinecartBlockPicking.java | 6 +++++ 5 files changed, 27 insertions(+), 13 deletions(-) diff --git a/gradle.properties b/gradle.properties index 6b0f2e2d..feac48de 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=ee9aa79709 +dark_matter=e4cc536fcf mixin_extras_version=0.3.0 \ No newline at end of file diff --git a/src/main/java/me/melontini/andromeda/base/Module.java b/src/main/java/me/melontini/andromeda/base/Module.java index 2457c323..e047e74a 100644 --- a/src/main/java/me/melontini/andromeda/base/Module.java +++ b/src/main/java/me/melontini/andromeda/base/Module.java @@ -36,6 +36,7 @@ public abstract class Module { public void onPreLaunch() { } public void onConfig(ConfigBuilder builder) { } + public void postConfig() { } public final Metadata meta() { return info; diff --git a/src/main/java/me/melontini/andromeda/base/ModuleManager.java b/src/main/java/me/melontini/andromeda/base/ModuleManager.java index 52a3e3a8..4e3c7b67 100644 --- a/src/main/java/me/melontini/andromeda/base/ModuleManager.java +++ b/src/main/java/me/melontini/andromeda/base/ModuleManager.java @@ -30,8 +30,6 @@ public class ModuleManager { private final ImmutableMap, Module> discoveredModules; private final ImmutableMap> discoveredModuleNames; - private final ImmutableMap, Module> modules; - private final ImmutableMap> moduleNames; private final ImmutableMap, Lazy>> configs; final Map> mixinConfigs = new HashMap<>(); @@ -55,9 +53,6 @@ public class ModuleManager { return i >= 0 ? i : categories.size(); })).toList(); - Map, Module> modules = new LinkedHashMap<>(); - sorted.forEach(m -> modules.put(m.getClass(), m)); - this.discoveredModules = ImmutableMap.copyOf(Utilities.consume(new LinkedHashMap<>(), (map) -> sorted.forEach(m -> map.put(m.getClass(), m)))); this.discoveredModuleNames = ImmutableMap.copyOf(Utilities.consume(new HashMap<>(), (map) -> @@ -65,12 +60,8 @@ public class ModuleManager { this.configs = ImmutableMap.copyOf(setUpConfigs(sorted)); - sorted.forEach(module -> module.manager().getOptionManager().processOptions()); - modules.values().removeIf(m -> !m.enabled()); - - this.modules = ImmutableMap.copyOf(modules); - this.moduleNames = ImmutableMap.copyOf(Utilities.consume(new HashMap<>(), (map) -> - sorted.forEach(m -> map.put(m.meta().id(), m)))); + sorted.forEach(Module::postConfig); + sorted.forEach(module -> module.manager().save()); cleanConfigs(); } @@ -133,6 +124,16 @@ public class ModuleManager { .filter(Module::enabled); } + @SuppressWarnings("unchecked") + public > Optional getDiscovered(Class cls) { + return (Optional) Optional.ofNullable(discoveredModules.get(cls)); + } + + @SuppressWarnings("unchecked") + public > Optional getDiscovered(String name) { + return (Optional) Optional.ofNullable(discoveredModuleNames.get(name)); + } + public Optional> moduleFromConfig(String name) { return Optional.ofNullable(mixinConfigs.get(name)); } @@ -142,7 +143,7 @@ public class ModuleManager { } public Collection> loaded() { - return Collections.unmodifiableCollection(modules.values()); + return discoveredModules.values().stream().filter(Module::enabled).toList(); } public static > T quick(Class cls) { 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 216db0a0..18ce9369 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 @@ -27,4 +27,10 @@ public class Unsafe extends BasicModule { return null; }, mod)); } + + @Override + public void postConfig() { + ModuleManager.get().getDiscovered(Safe.class) + .ifPresent(m -> m.manager().postSave(manager -> this.manager().save())); + } } 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 a0a38734..2760e63f 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 @@ -28,6 +28,12 @@ public class MinecartBlockPicking extends Module { }, mod)); } + @Override + public void postConfig() { + ModuleManager.get().getDiscovered(Minecarts.class) + .ifPresent(m -> m.manager().postSave(manager -> this.manager().save())); + } + @Override public Class configClass() { return Config.class; -- 2.51.2 From 4db6bb667b4e5972f3d1428025352669e6bd955f Mon Sep 17 00:00:00 2001 From: melontini <104443436+melontini@users.noreply.github.com> Date: Fri, 8 Dec 2023 23:00:06 +0700 Subject: [PATCH 10/23] Clean up AutoConfigScreen --- .../common/client/OrderedTextUtil.java | 6 +- .../client/config/AutoConfigScreen.java | 214 +++++++++--------- 2 files changed, 107 insertions(+), 113 deletions(-) diff --git a/src/main/java/me/melontini/andromeda/common/client/OrderedTextUtil.java b/src/main/java/me/melontini/andromeda/common/client/OrderedTextUtil.java index 8a9f02ec..c51fc7b4 100644 --- a/src/main/java/me/melontini/andromeda/common/client/OrderedTextUtil.java +++ b/src/main/java/me/melontini/andromeda/common/client/OrderedTextUtil.java @@ -7,11 +7,13 @@ import net.minecraft.text.MutableText; import net.minecraft.text.OrderedText; import net.minecraft.text.Text; +import java.util.List; + public class OrderedTextUtil { - public static Text[] wrap(Text text, int length) { + public static List wrap(Text text, int length) { return MinecraftClient.getInstance().textRenderer.wrapLines(text, length) - .stream().map(OrderedTextUtil::orderedToNormal).toArray(Text[]::new); + .stream().map(OrderedTextUtil::orderedToNormal).toList(); } //MIT License 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 b9bc9723..e2af318c 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,25 +1,21 @@ package me.melontini.andromeda.common.client.config; -import me.melontini.andromeda.base.Environment; import me.melontini.andromeda.base.Module; import me.melontini.andromeda.base.ModuleManager; import me.melontini.andromeda.base.annotations.FeatureEnvironment; import me.melontini.andromeda.base.annotations.ModuleTooltip; -import me.melontini.andromeda.base.config.AndromedaConfig; import me.melontini.andromeda.base.config.Config; 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.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.config.OptionManager; +import me.melontini.dark_matter.api.config.interfaces.Option; import me.melontini.dark_matter.api.minecraft.util.TextUtil; -import me.melontini.dark_matter.impl.config.FieldOption; import me.shedaniel.autoconfig.gui.DefaultGuiProviders; import me.shedaniel.autoconfig.gui.DefaultGuiTransformers; -import me.shedaniel.autoconfig.gui.registry.ComposedGuiRegistryAccess; import me.shedaniel.autoconfig.gui.registry.GuiRegistry; -import me.shedaniel.autoconfig.gui.registry.api.GuiRegistryAccess; import me.shedaniel.clothconfig2.api.AbstractConfigListEntry; import me.shedaniel.clothconfig2.api.ConfigBuilder; import me.shedaniel.clothconfig2.api.ConfigCategory; @@ -32,51 +28,12 @@ import org.apache.commons.lang3.ArrayUtils; import java.lang.reflect.Field; import java.util.*; -import java.util.function.Supplier; @SuppressWarnings("UnstableApiUsage") public class AutoConfigScreen { - private static final ThreadLocal> CONTEXT = new ThreadLocal<>(); - public static void register() { AndromedaLog.info("Loading ClothConfig support!"); - - Holder.OURS.registerPredicateTransformer((list, s, field, o, o1, guiRegistryAccess) -> { - list.forEach(gui -> { - gui.setEditable(false); - if (gui instanceof TooltipListEntry tooltipGui) checkOM(field, tooltipGui); - }); - return list; - }, field -> CONTEXT.get() != null && CONTEXT.get().manager() - .getOptionManager().isModified(new FieldOption(field))); - - Holder.OURS.registerPredicateTransformer((guis, s, field, o, o1, guiRegistryAccess) -> { - guis.forEach(e -> { - if (e instanceof TooltipListEntry t) { - if (t.getTooltipSupplier() != null) { - Optional optional = t.getTooltipSupplier().get().map(texts1 -> { - List list = new ArrayList<>(); - for (Text text : texts1) { - list.addAll(Arrays.asList(OrderedTextUtil.wrap(text, 250))); - } - return list.toArray(Text[]::new); - }); - t.setTooltipSupplier(() -> optional); - } - } - }); - return guis; - }, field -> true); - - Holder.OURS.registerAnnotationTransformer((list, s, field, o, o1, guiRegistryAccess) -> { - list.forEach(gui -> { - if (gui instanceof TooltipListEntry tooltipGui) { - checkEnv(tooltipGui, field.getAnnotation(FeatureEnvironment.class).value()); - } - }); - return list; - }, FeatureEnvironment.class); } public static Optional get(Screen screen) { @@ -88,83 +45,124 @@ public class AutoConfigScreen { .setDefaultBackgroundTexture(Identifier.tryParse("minecraft:textures/block/amethyst_block.png")); var eb = builder.entryBuilder(); - ModuleManager.get().all().forEach(module -> { - try { - CONTEXT.set(module); - - List fields = Arrays.asList(module.configClass().getFields()); - fields.sort(Comparator.comparingInt(value -> !"enabled".equals(value.getName()) ? 1 : 0)); - Optional tooltip = !module.getClass().isAnnotationPresent(ModuleTooltip.class) ? Optional.empty() : Utilities.supply(() -> { - Text[] text = OrderedTextUtil.wrap(TextUtil.translatable("config.andromeda.%s.@Tooltip".formatted(module.meta().dotted())), 250); - return Optional.of(text); - }); - Supplier> supplier = () -> tooltip; + GuiRegistry registry = DefaultGuiTransformers.apply(DefaultGuiProviders.apply(new GuiRegistry())); - if (fields.size() == 1) { - Field f = fields.get(0); - if (!"enabled".equals(f.getName())) throw new IllegalStateException(); - - Holder.COMPOSED.getAndTransform("config.andromeda.%s".formatted(module.meta().dotted()), f, module.config(), module.manager().getDefaultConfig(), Holder.COMPOSED).forEach(e -> { - if (e instanceof TooltipListEntry t) { - t.setTooltipSupplier(supplier); - checkEnv(t, module.meta().environment()); - checkOM(f, t); + ModuleManager.get().all().forEach(module -> { + List fields = MakeSure.notEmpty(Arrays.asList(module.configClass().getFields())); + 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.manager().getConfig(), module.manager().getDefaultConfig(), registry) + .forEach(e -> { + if (checkOptionManager(e, module, fields.get(0))) { + setModuleTooltip(e, module); + wrapTooltip(e); + appendEnvInfo(e, module); + } + 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.manager().getDefaultConfig(), registry).forEach(e -> { + if (checkOptionManager(e, module, field)) { + wrapTooltip(e); + appendEnvInfo(e, field); } - getOrCreateCategoryForField(module, builder).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()); - Holder.COMPOSED.getAndTransform(opt, field, module.config(), module.manager().getDefaultConfig(), Holder.COMPOSED).forEach(list::add); + list.add(e); }); - var e = eb.startSubCategory(TextUtil.translatable("config.andromeda.%s".formatted(module.meta().dotted())), Utilities.cast(list)); - e.setTooltipSupplier(supplier); - getOrCreateCategoryForField(module, builder).addEntry(Utilities.consume(e.build(), entry -> checkEnv(entry, module.meta().environment()))); - } - } finally { - CONTEXT.remove(); + }); + var e = eb.startSubCategory(TextUtil.translatable("config.andromeda.%s".formatted(module.meta().dotted())), Utilities.cast(list)); + var built = e.build(); + setModuleTooltip(built, module); + wrapTooltip(built); + appendEnvInfo(built, module); + category.addEntry(built); } }); - ConfigCategory misc = builder.getOrCreateCategory(TextUtil.translatable("config.andromeda.category.misc")); - Arrays.stream(AndromedaConfig.class.getFields()).forEach((field) -> { - String opt = "config.andromeda.base.option." + field.getName(); - Holder.COMPOSED.getAndTransform(opt, field, Config.get(), Config.getDefault(), Holder.COMPOSED).forEach(misc::addEntry); - }); return builder.build(); }); } - private static void checkEnv(TooltipListEntry tooltipGui, Environment environment) { - Text envText = TextUtil.translatable("andromeda.config.tooltip.environment." + environment.toString().toLowerCase()).formatted(Formatting.YELLOW); + private static boolean checkOptionManager(AbstractConfigListEntry e, Module module, Field field) { + var opManager = module.manager().getOptionManager(); + Option opt = Option.ofField(field); + if (opManager.isModified(opt)) { + e.setEditable(false); + + if (e instanceof TooltipListEntry t) { + var tuple = opManager.blameProcessors(opt); + Set texts = new LinkedHashSet<>(); + tuple.right().forEach(entry -> opManager.getReason(entry.id(), tuple.left()).ifPresent(textEntry -> { + if (textEntry.isTranslatable()) { + texts.add(TextUtil.translatable(textEntry.get(), textEntry.args()).formatted(Formatting.RED)); + } else { + texts.add(TextUtil.literal(textEntry.get()).formatted(Formatting.RED)); + } + })); + + Optional optional = Optional.of(texts.toArray(Text[]::new)); + t.setTooltipSupplier(() -> optional); + } + return false; + } + return true; + } - if (tooltipGui.getTooltipSupplier() != null) { - Optional optional = tooltipGui.getTooltipSupplier().get(); - Text[] text = optional.map(texts -> ArrayUtils.add(texts, envText)) - .orElseGet(() -> new Text[]{envText}); - tooltipGui.setTooltipSupplier(() -> Optional.of(text)); + private static void appendEnvInfo(AbstractConfigListEntry e, Module module) { + if (e instanceof TooltipListEntry t) { + Text text = TextUtil.translatable("andromeda.config.tooltip.environment." + module.meta().environment().toString().toLowerCase()).formatted(Formatting.YELLOW); + appendText(t, text); + } + } + + private static void appendEnvInfo(AbstractConfigListEntry e, Field f) { + if (f.isAnnotationPresent(FeatureEnvironment.class) && e instanceof TooltipListEntry t) { + FeatureEnvironment env = f.getAnnotation(FeatureEnvironment.class); + Text text = TextUtil.translatable("andromeda.config.tooltip.environment." + env.value().toString().toLowerCase()).formatted(Formatting.YELLOW); + appendText(t, text); + } + } + + private static void appendText(TooltipListEntry t, Text text) { + var supplier = t.getTooltipSupplier(); + Optional tooltip; + if (supplier != null) { + tooltip = Optional.of(supplier.get().map(texts -> ArrayUtils.add(texts, text)) + .orElseGet(() -> new Text[]{text})); } else { - Text[] text = new Text[]{envText}; - tooltipGui.setTooltipSupplier(() -> Optional.of(text)); + tooltip = Optional.of(new Text[]{text}); } + t.setTooltipSupplier(() -> tooltip); } - private static void checkOM(Field field, TooltipListEntry tooltipGui) { - var tuple = CONTEXT.get().manager().getOptionManager().blameProcessors(new FieldOption(field)); - Set texts = new HashSet<>(); - for (OptionManager.ProcessorEntry processor : tuple.right()) { - CONTEXT.get().manager().getOptionManager().getReason(processor.id(), tuple.left()).ifPresent(textEntry -> { - if (textEntry.isTranslatable()) { - texts.add(TextUtil.translatable(textEntry.get(), textEntry.args()).formatted(Formatting.RED)); - } else { - texts.add(TextUtil.literal(textEntry.get()).formatted(Formatting.RED)); - } - }); + private static void setModuleTooltip(AbstractConfigListEntry e, Module module) { + if (module.getClass().isAnnotationPresent(ModuleTooltip.class) && e instanceof TooltipListEntry t) { + var opt = Optional.of(new Text[]{TextUtil.translatable("config.andromeda.%s.@Tooltip".formatted(module.meta().dotted()))}); + t.setTooltipSupplier(() -> opt); + } + } + + private static void wrapTooltip(AbstractConfigListEntry e) { + if (e instanceof TooltipListEntry t) { + var supplier = t.getTooltipSupplier(); + if (supplier != null) { + var opt = supplier.get().map(texts -> { + List wrapped = new ArrayList<>(); + for (Text text : texts) { + wrapped.addAll(OrderedTextUtil.wrap(text, 250)); + } + return wrapped.toArray(Text[]::new); + }); + t.setTooltipSupplier(() -> opt); + } } - Text[] texts1 = texts.toArray(Text[]::new); - tooltipGui.setTooltipSupplier(() -> Optional.of(texts1)); } //TODO @@ -177,10 +175,4 @@ public class AutoConfigScreen { Text key = TextUtil.translatable("config.andromeda.category.%s".formatted(info.meta().category())); return screenBuilder.getOrCreateCategory(key); } - - private static class Holder { - static final GuiRegistry OURS = new GuiRegistry(); - static final GuiRegistry DEFAULT_REGISTRY = DefaultGuiTransformers.apply(DefaultGuiProviders.apply(new GuiRegistry())); - static final GuiRegistryAccess COMPOSED = new ComposedGuiRegistryAccess(DEFAULT_REGISTRY, OURS); - } } -- 2.51.2 From bcc18948cd6b2bb62538efac0e1c4fb12800b529 Mon Sep 17 00:00:00 2001 From: melontini <104443436+melontini@users.noreply.github.com> Date: Fri, 8 Dec 2023 23:13:19 +0700 Subject: [PATCH 11/23] Wrap all tooltips. --- .../andromeda/common/client/config/AutoConfigScreen.java | 6 +++--- 1 file changed, 3 insertions(+), 3 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 e2af318c..77aca527 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 @@ -60,9 +60,9 @@ public class AutoConfigScreen { .forEach(e -> { if (checkOptionManager(e, module, fields.get(0))) { setModuleTooltip(e, module); - wrapTooltip(e); appendEnvInfo(e, module); } + wrapTooltip(e); category.addEntry(e); }); } else { @@ -71,17 +71,17 @@ public class AutoConfigScreen { 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.manager().getDefaultConfig(), registry).forEach(e -> { if (checkOptionManager(e, module, field)) { - wrapTooltip(e); appendEnvInfo(e, field); } + wrapTooltip(e); 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); - wrapTooltip(built); appendEnvInfo(built, module); + wrapTooltip(built); category.addEntry(built); } }); -- 2.51.2 From 6ad3f6d1b43f8170c810a5e14af2586e6659ad8f Mon Sep 17 00:00:00 2001 From: melontini <104443436+melontini@users.noreply.github.com> Date: Fri, 8 Dec 2023 23:18:56 +0700 Subject: [PATCH 12/23] Even more stuff. --- .../melontini/andromeda/base/ModuleManager.java | 16 +++++++++++----- .../modules/blocks/bed/unsafe/Unsafe.java | 3 ++- .../MinecartBlockPicking.java | 2 +- 3 files changed, 14 insertions(+), 7 deletions(-) diff --git a/src/main/java/me/melontini/andromeda/base/ModuleManager.java b/src/main/java/me/melontini/andromeda/base/ModuleManager.java index 4e3c7b67..f775ffcb 100644 --- a/src/main/java/me/melontini/andromeda/base/ModuleManager.java +++ b/src/main/java/me/melontini/andromeda/base/ModuleManager.java @@ -30,6 +30,9 @@ public class ModuleManager { private final ImmutableMap, Module> discoveredModules; private final ImmutableMap> discoveredModuleNames; + private final ImmutableMap, Module> modules; + private final ImmutableMap> moduleNames; + private final ImmutableMap, Lazy>> configs; final Map> mixinConfigs = new HashMap<>(); @@ -63,6 +66,11 @@ public class ModuleManager { sorted.forEach(Module::postConfig); sorted.forEach(module -> module.manager().save()); + this.modules = ImmutableMap.copyOf(Utilities.consume(new LinkedHashMap<>(), map -> + sorted.forEach(module -> {if (module.enabled()) map.put(module.getClass(), module);}))); + this.moduleNames = ImmutableMap.copyOf(Utilities.consume(new HashMap<>(), map -> + sorted.forEach(module -> {if (module.enabled()) map.put(module.meta().id(), module);}))); + cleanConfigs(); } @@ -114,14 +122,12 @@ public class ModuleManager { @SuppressWarnings("unchecked") public > Optional getModule(Class cls) { - return (Optional) Optional.ofNullable(discoveredModules.get(cls)) - .filter(Module::enabled); + return (Optional) Optional.ofNullable(modules.get(cls)); } @SuppressWarnings("unchecked") public > Optional getModule(String name) { - return (Optional) Optional.ofNullable(discoveredModuleNames.get(name)) - .filter(Module::enabled); + return (Optional) Optional.ofNullable(moduleNames.get(name)); } @SuppressWarnings("unchecked") @@ -143,7 +149,7 @@ public class ModuleManager { } public Collection> loaded() { - return discoveredModules.values().stream().filter(Module::enabled).toList(); + return modules.values(); } public static > T quick(Class cls) { 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 18ce9369..ea2b316d 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 @@ -2,6 +2,7 @@ package me.melontini.andromeda.modules.blocks.bed.unsafe; import me.melontini.andromeda.base.BasicModule; import me.melontini.andromeda.base.Environment; +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.ModuleTooltip; @@ -21,7 +22,7 @@ public class Unsafe extends BasicModule { public void onConfig(ConfigBuilder builder) { builder.processors((registry, mod) -> registry.register(CommonValues.MODID + ":module_conflict", manager -> { - if (ModuleManager.get().getModule(Safe.class).isPresent()) { + if (ModuleManager.get().getDiscovered(Safe.class).filter(Module::enabled).isPresent()) { return Map.of("enabled", false); } return null; 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 2760e63f..87436f15 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 @@ -20,7 +20,7 @@ public class MinecartBlockPicking extends Module { @Override public void onConfig(ConfigBuilder builder) { builder.processors((registry, mod) -> registry.register(CommonValues.MODID + ":spawner_enabled", manager -> { - if (ModuleManager.get().getModule(Minecarts.class) + if (ModuleManager.get().getDiscovered(Minecarts.class).filter(Module::enabled) .map(m->!m.config().isSpawnerMinecartOn).orElse(true)) { return Map.of("spawnerPicking", false); } -- 2.51.2 From 3eb665720ed9ac9747d42a78c93f6d32edf91e77 Mon Sep 17 00:00:00 2001 From: melontini <104443436+melontini@users.noreply.github.com> Date: Sat, 9 Dec 2023 00:28:57 +0700 Subject: [PATCH 13/23] Wrap saveCallback to selectively save configs. --- .../client/config/AutoConfigScreen.java | 31 ++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) 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 77aca527..49e71502 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 @@ -8,6 +8,7 @@ import me.melontini.andromeda.base.config.Config; 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.MakeSure; import me.melontini.dark_matter.api.base.util.Support; import me.melontini.dark_matter.api.base.util.Utilities; @@ -16,6 +17,7 @@ import me.melontini.dark_matter.api.minecraft.util.TextUtil; import me.shedaniel.autoconfig.gui.DefaultGuiProviders; import me.shedaniel.autoconfig.gui.DefaultGuiTransformers; import me.shedaniel.autoconfig.gui.registry.GuiRegistry; +import me.shedaniel.clothconfig2.api.AbstractConfigEntry; import me.shedaniel.clothconfig2.api.AbstractConfigListEntry; import me.shedaniel.clothconfig2.api.ConfigBuilder; import me.shedaniel.clothconfig2.api.ConfigCategory; @@ -28,10 +30,15 @@ import org.apache.commons.lang3.ArrayUtils; import java.lang.reflect.Field; import java.util.*; +import java.util.function.Consumer; @SuppressWarnings("UnstableApiUsage") public class AutoConfigScreen { + @SuppressWarnings("OptionalUsedAsFieldOrParameterType") + private static final Optional saveCallback = Reflect.findField(AbstractConfigEntry.class, "saveCallback"); + private static final ThreadLocal>> saveQueue = ThreadLocal.withInitial(HashSet::new); + public static void register() { AndromedaLog.info("Loading ClothConfig support!"); } @@ -63,6 +70,7 @@ public class AutoConfigScreen { appendEnvInfo(e, module); } wrapTooltip(e); + wrapSaveCallback(e, module); category.addEntry(e); }); } else { @@ -74,6 +82,7 @@ public class AutoConfigScreen { appendEnvInfo(e, field); } wrapTooltip(e); + wrapSaveCallback(e, module); list.add(e); }); }); @@ -90,6 +99,21 @@ public class AutoConfigScreen { }); } + private static void wrapSaveCallback(AbstractConfigEntry e, Module module) { + if (saveCallback.isPresent()) { + saveCallback.get().setAccessible(true); + Consumer original = (Consumer) Utilities.supplyUnchecked(() -> saveCallback.get().get(e)); + if (original != null) { + Utilities.runUnchecked(() -> saveCallback.get().set(e, (Consumer) o -> { + if (e.isEdited()) { + original.accept(o); + saveQueue.get().add(module); + } + })); + } + } + } + private static boolean checkOptionManager(AbstractConfigListEntry e, Module module, Field field) { var opManager = module.manager().getOptionManager(); Option opt = Option.ofField(field); @@ -168,7 +192,12 @@ public class AutoConfigScreen { //TODO private static void powerSave() { Config.save(); - ModuleManager.get().all().forEach(module -> module.manager().save()); + if (saveCallback.isPresent()) { + saveQueue.get().forEach(module -> module.manager().save()); + saveQueue.get().clear(); + } else { + ModuleManager.get().all().forEach(module -> module.manager().save()); + } } private static ConfigCategory getOrCreateCategoryForField(Module info, ConfigBuilder screenBuilder) { -- 2.51.2 From f5da13fc90dd690c42e663fb77e4499fd83c9533 Mon Sep 17 00:00:00 2001 From: melontini <104443436+melontini@users.noreply.github.com> Date: Sat, 9 Dec 2023 00:36:57 +0700 Subject: [PATCH 14/23] Add back AndromedaConfig. --- .../client/config/AutoConfigScreen.java | 44 ++++++++++++------- 1 file changed, 29 insertions(+), 15 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 49e71502..45af5047 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,9 +1,11 @@ package me.melontini.andromeda.common.client.config; +import me.melontini.andromeda.base.Environment; import me.melontini.andromeda.base.Module; import me.melontini.andromeda.base.ModuleManager; import me.melontini.andromeda.base.annotations.FeatureEnvironment; import me.melontini.andromeda.base.annotations.ModuleTooltip; +import me.melontini.andromeda.base.config.AndromedaConfig; import me.melontini.andromeda.base.config.Config; import me.melontini.andromeda.common.client.OrderedTextUtil; import me.melontini.andromeda.util.AndromedaLog; @@ -12,6 +14,7 @@ import me.melontini.dark_matter.api.base.reflect.Reflect; 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.config.OptionManager; import me.melontini.dark_matter.api.config.interfaces.Option; import me.melontini.dark_matter.api.minecraft.util.TextUtil; import me.shedaniel.autoconfig.gui.DefaultGuiProviders; @@ -37,7 +40,7 @@ public class AutoConfigScreen { @SuppressWarnings("OptionalUsedAsFieldOrParameterType") private static final Optional saveCallback = Reflect.findField(AbstractConfigEntry.class, "saveCallback"); - private static final ThreadLocal>> saveQueue = ThreadLocal.withInitial(HashSet::new); + private static final ThreadLocal> saveQueue = ThreadLocal.withInitial(HashSet::new); public static void register() { AndromedaLog.info("Loading ClothConfig support!"); @@ -65,12 +68,12 @@ public class AutoConfigScreen { if (fields.size() == 1) { registry.getAndTransform(moduleText, fields.get(0), module.manager().getConfig(), module.manager().getDefaultConfig(), registry) .forEach(e -> { - if (checkOptionManager(e, module, fields.get(0))) { + if (checkOptionManager(e, module.manager().getOptionManager(), fields.get(0))) { setModuleTooltip(e, module); - appendEnvInfo(e, module); + appendEnvInfo(e, module.meta().environment()); } wrapTooltip(e); - wrapSaveCallback(e, module); + wrapSaveCallback(e, () -> module.manager().save()); category.addEntry(e); }); } else { @@ -78,28 +81,41 @@ public class AutoConfigScreen { 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.manager().getDefaultConfig(), registry).forEach(e -> { - if (checkOptionManager(e, module, field)) { + if (checkOptionManager(e, module.manager().getOptionManager(), field)) { appendEnvInfo(e, field); } wrapTooltip(e); - wrapSaveCallback(e, module); + wrapSaveCallback(e, () -> module.manager().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); - appendEnvInfo(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.class.getFields()).forEach((field) -> { + String opt = "config.andromeda.base.option." + field.getName(); + registry.getAndTransform(opt, field, Config.get(), Config.getDefault(), registry).forEach(e -> { + if (checkOptionManager(e, Config.getOptionManager(), field)) { + appendEnvInfo(e, field); + } + wrapTooltip(e); + wrapSaveCallback(e, Config::save); + misc.addEntry(e); + }); + }); + return builder.build(); }); } - private static void wrapSaveCallback(AbstractConfigEntry e, Module module) { + private static void wrapSaveCallback(AbstractConfigEntry e, Runnable saveFunc) { if (saveCallback.isPresent()) { saveCallback.get().setAccessible(true); Consumer original = (Consumer) Utilities.supplyUnchecked(() -> saveCallback.get().get(e)); @@ -107,15 +123,14 @@ public class AutoConfigScreen { Utilities.runUnchecked(() -> saveCallback.get().set(e, (Consumer) o -> { if (e.isEdited()) { original.accept(o); - saveQueue.get().add(module); + saveQueue.get().add(saveFunc); } })); } } } - private static boolean checkOptionManager(AbstractConfigListEntry e, Module module, Field field) { - var opManager = module.manager().getOptionManager(); + private static boolean checkOptionManager(AbstractConfigListEntry e, OptionManager opManager, Field field) { Option opt = Option.ofField(field); if (opManager.isModified(opt)) { e.setEditable(false); @@ -139,9 +154,9 @@ public class AutoConfigScreen { return true; } - private static void appendEnvInfo(AbstractConfigListEntry e, Module module) { + private static void appendEnvInfo(AbstractConfigListEntry e, Environment env) { if (e instanceof TooltipListEntry t) { - Text text = TextUtil.translatable("andromeda.config.tooltip.environment." + module.meta().environment().toString().toLowerCase()).formatted(Formatting.YELLOW); + Text text = TextUtil.translatable("andromeda.config.tooltip.environment." + env.toString().toLowerCase()).formatted(Formatting.YELLOW); appendText(t, text); } } @@ -189,11 +204,10 @@ public class AutoConfigScreen { } } - //TODO private static void powerSave() { Config.save(); if (saveCallback.isPresent()) { - saveQueue.get().forEach(module -> module.manager().save()); + saveQueue.get().forEach(Runnable::run); saveQueue.get().clear(); } else { ModuleManager.get().all().forEach(module -> module.manager().save()); -- 2.51.2 From 170886c0c5f3d5d0370adb969f4cf5d6ac428746 Mon Sep 17 00:00:00 2001 From: melontini <104443436+melontini@users.noreply.github.com> Date: Sat, 9 Dec 2023 11:48:29 +0700 Subject: [PATCH 15/23] Update DM and publish.yml --- .github/workflows/publish.yml | 19 +++++++++++++++---- gradle.properties | 2 +- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 008c4f40..9aed3222 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -1,6 +1,17 @@ name: publish -on: [workflow_dispatch] +on: + workflow_dispatch: + inputs: + version_type: + description: "The type of this version. e.g alpha" + type: choice + default: beta + options: + - release + - beta + - alpha + required: false jobs: publish: @@ -19,14 +30,14 @@ jobs: run: chmod +x ./gradlew - name: build run: ./gradlew build - - name: Retrieve Version #https://stackoverflow.com/questions/71089787/how-to-get-version-name-from-android-gradle-file-in-github-actions + - name: retrieve version #https://stackoverflow.com/questions/71089787/how-to-get-version-name-from-android-gradle-file-in-github-actions run: | echo "VERSION_INFORMATION=$(${{github.workspace}}/gradlew -q printVersionName)" >> $GITHUB_ENV echo "VERSION_PLAIN=$(${{github.workspace}}/gradlew -q printVersion)" >> $GITHUB_ENV - - name: Publish Minecraft Mods + - name: publish minecraft mods uses: Kir-Antipov/mc-publish@v3.3 with: - version-type: alpha + version-type: ${{ inputs.version_type }} changelog-file: CHANGELOG.md name: ${{ env.VERSION_INFORMATION }} version: ${{ env.VERSION_PLAIN }} diff --git a/gradle.properties b/gradle.properties index feac48de..5261d6ce 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=e4cc536fcf +dark_matter=2.1.0-1.19.2 mixin_extras_version=0.3.0 \ No newline at end of file -- 2.51.2 From d29688a88eac0f882c05510bd4f5810027d6fb0c Mon Sep 17 00:00:00 2001 From: melontini <104443436+melontini@users.noreply.github.com> Date: Sat, 9 Dec 2023 11:59:33 +0700 Subject: [PATCH 16/23] Optimize assets --- src/main/resources/assets/andromeda/icon.png | Bin 46629 -> 12005 bytes .../andromeda/textures/gui/background.png | Bin 3923 -> 3401 bytes .../andromeda/textures/gui/fletching.png | Bin 2860 -> 1178 bytes .../assets/andromeda/textures/gui/galaxy.png | Bin 2282 -> 1773 bytes .../textures/gui/merchant_inventory.png | Bin 1332 -> 728 bytes .../textures/item/anvil_minecart.png | Bin 999 -> 668 bytes .../item/boats/acacia_boat_with_furnace.png | Bin 5967 -> 690 bytes .../item/boats/acacia_boat_with_hopper.png | Bin 5954 -> 686 bytes .../item/boats/acacia_boat_with_jukebox.png | Bin 6041 -> 682 bytes .../item/boats/acacia_boat_with_tnt.png | Bin 5992 -> 685 bytes .../item/boats/birch_boat_with_furnace.png | Bin 5956 -> 687 bytes .../item/boats/birch_boat_with_hopper.png | Bin 5924 -> 683 bytes .../item/boats/birch_boat_with_jukebox.png | Bin 6020 -> 679 bytes .../item/boats/birch_boat_with_tnt.png | Bin 6006 -> 681 bytes .../item/boats/dark_oak_boat_with_furnace.png | Bin 5892 -> 686 bytes .../item/boats/dark_oak_boat_with_hopper.png | Bin 5890 -> 682 bytes .../item/boats/dark_oak_boat_with_jukebox.png | Bin 5939 -> 679 bytes .../item/boats/dark_oak_boat_with_tnt.png | Bin 5988 -> 681 bytes .../item/boats/jungle_boat_with_furnace.png | Bin 5948 -> 690 bytes .../item/boats/jungle_boat_with_hopper.png | Bin 5934 -> 687 bytes .../item/boats/jungle_boat_with_jukebox.png | Bin 6014 -> 682 bytes .../item/boats/jungle_boat_with_tnt.png | Bin 6003 -> 685 bytes .../item/boats/mangrove_boat_with_furnace.png | Bin 5914 -> 660 bytes .../item/boats/mangrove_boat_with_hopper.png | Bin 5868 -> 656 bytes .../item/boats/mangrove_boat_with_jukebox.png | Bin 5939 -> 651 bytes .../item/boats/mangrove_boat_with_tnt.png | Bin 5983 -> 652 bytes .../item/boats/oak_boat_with_furnace.png | Bin 5992 -> 691 bytes .../item/boats/oak_boat_with_hopper.png | Bin 5949 -> 687 bytes .../item/boats/oak_boat_with_jukebox.png | Bin 6009 -> 682 bytes .../textures/item/boats/oak_boat_with_tnt.png | Bin 6038 -> 685 bytes .../item/boats/spruce_boat_with_furnace.png | Bin 5954 -> 682 bytes .../item/boats/spruce_boat_with_hopper.png | Bin 5899 -> 678 bytes .../item/boats/spruce_boat_with_jukebox.png | Bin 5986 -> 674 bytes .../item/boats/spruce_boat_with_tnt.png | Bin 5977 -> 677 bytes .../andromeda/textures/item/incubator.png | Bin 987 -> 666 bytes .../textures/item/infinite_totem.png | Bin 5787 -> 766 bytes .../textures/item/jukebox_minecart.png | Bin 1040 -> 646 bytes .../andromeda/textures/item/lockpick.png | Bin 5206 -> 532 bytes .../textures/item/note_block_minecart.png | Bin 1020 -> 643 bytes .../textures/item/spawner_minecart.png | Bin 1082 -> 676 bytes .../andromeda/textures/gui/fletching.png | Bin 2269 -> 703 bytes .../textures/gui/merchant_inventory.png | Bin 1343 -> 727 bytes 42 files changed, 0 insertions(+), 0 deletions(-) diff --git a/src/main/resources/assets/andromeda/icon.png b/src/main/resources/assets/andromeda/icon.png index 15b442ca43c1a1ece7ac7942f0e939cce31ba3d9..d3d12e28e54b79b60c2a1ddf68b71ddc565989db 100644 GIT binary patch literal 12005 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
  • $#=5-W}I-TLBL?jB~R?}pFWH*IyAXSnRMNaic4T8XMZpO)x>!-gh?`BO` zuw{%ed)Q~#A@OCI^MutLEy}{vteCEf#jkV@*zou0{>U&Nu2b`V{hjQvTHhgC^FrOV z<19Zv7&#cTzGeTp+xU;jN->^!ze-H+F)9j8lDwf)ykd&MTwkgDh9hskGw+gP__Sr- zfqUn-FQ1X09-;f`z-R5p#>q9G>is|5k{ABQ_iWnN@X0(kw3bWhHT+#`ugo~(X@d(# zl{(YZe5VVsU)R2gWQ~%U{!j$G3fOSG*n4w(5gGzO76p^FclC!l;DZ;;c6P zMh9yCnDBjKKVl!oU3g<5T`Ya$?tIhTJf<(#-(&j{$emV}Fr8t`SB54L zi97Rnru1^mnLOWhtDLuzqFHo}sQ85Rqka36S}Q#!%L~4_w{Ne1jj+w+W(@_k6RJiR z`emIw5AHSF>vclj`_s>d`_`Y!ujF|p|6`$S!5LQ16=pprO%A3^+Oe5osj5Ksl7z!o zUTfLzog2>4Q}%7y4vV`k4-cIUdbqf}@8c))^~wKl?J3jA6PsOhqc-LotmBlRawIS@WN>KEB+ozT^8Vxx76ag7e(cf_d**v7MO4a6*Ym zHa%gp>e)vYW?*ELvjFDU2gQAto?S)07z`mfomjz0grgJ0s}*AI;McG-Jy@HsLj zfBAox#j#aAf&Ya6#1{&`uJk8fmRW6*Lxcz*9f3=jvHQtVTzLg?> z{w=7BTmJ7e-=7}~rq}Vm?o?1znS7{ZlU3u&tc#JSt+f{Qd4KdPjXGbxEMi{%qW=%h z9Qc^-9WyU=$LCLaW#7}nF7aA0-JG*vgY<^Bzw>k*+q42qCnX;J;KO=o65HveO`r4Q zuKc{Irhmchd2OxjB!>`9g@p|r58k=5we4aoe0kD@MbUpjdDEXuEARJdR2}|nm*>dL zbpQRb~6`o1oLYNNCv?*J344+Ad)~LLX z`;(e|Y_h+8;irt&Z2dDE%MI4M&wHrJ9HGF%dqZE7X?3t{MmR&2Sf`YmVrstq{Um}Uzr&-L@+gP65wzpX_Eqdk5H%#jL z8Gk2U`(yTpUyozXd1Ee{{j|fAD`U=KV|G`!hG+a&hY3odYI99p11RrHxs zy8pEqx&9lfbKBm|6?th=_|sw91%_@u$9<^_f2A(HW0p|*>v>mqs=T!KKJB~3X@a~Yd z&iT2v$M08-sN>G4ClR`Oj+}|xY!7~m>-t&K^fD*Ohj(*%=#JCuH*6T*T#JvrFCKJv z*4gtRHxoZx*;C;EGC?R~?uE$#RTXp1t-6b>jQAUk5(2CZ7O_tJmizIjL!Et({QE2N zazA4IfB$oQzfZnnmwa*fgZHn$Omvo5r&qK_?^BgQ<}TBNIoVBHCfTT`1hw+XD^xJO zGP++RXMbK~ldtLQ^-OxZ3!3NtQfu5cdF$Ox+Gki}Y9$5i%|zDw7<2#2Srm9+ z#op?NnI%WQ8|u2;ub%KrrlH!o?vM29g1yk41WS8OXep<3QhaKZ$;H^Dn!)|7ZLJreSrAK6~L zg1vc@Fjt4oNT zANQP}`;VEE!LsTHyJHWleP4TfchUc~oK0^x&uuz+U^d69{nC@S>%5rHa%a1KUi-W& zq8aw*cTZ(J_}PldI>wh#U?#&cj(_VOA9nWtyKU>^!_4;Ywk#K9p69lV>EvXgh`wdl zQZASZw*39}P@#33iooT4ukB}PzhrvkyfdC#Z=J8fhbQ@p;+G9y{e3uL|Lv9bHXk$t z)_!mNF)5RM>m2Uz!dLBq4aqr5ch61c*`>;KH-K5r?cU{CuP3lP+Wzd=q6WjQKR((V zC{Ws9pXTxO!Tad<#~uIu2)6HgvRGlYeD$N#jrM*QE;IPm$A~DLZdzd~DNr1uG{M7Q zvx8EZo3|Fya;#OOJ?uZZc5(C59Q@?Z*!uIB+& ztw@!dj{+QGLgnlie73n#b+~Eg`@NUf9lRg+{(JME=Ieczud?i`41Oj0Z>Df{qTo{ zhC+;HkNKo(Q=NZ5G8DhE*Yn&oKgW_-veutNeOA~G`>+S?&HK*t90<@kaId=f!B)4Cz>HWpmkIEnasb_Vs&H3N`aK#DV(tkxa&1bS|>YHHy?~1(GkBg_B z7keJjTQL7uDpReRyUgc>9VrSLzvj3+2>u%BDB;8OQG3Un&ov4y@9r;?RyTPp^Q+EZ z#-Vm?A@YC z4%bh|I#ygaN?7u3UVP(kRi4V_EHB)ilyd(QIQ{>({ny21tN}WE_*rU}u-^DEQNBFx zz6+!mc5BsR z*~_oxfBaSa^IqMwK*e>=H{O47!Yzv(|M5*r7SWU!OQ`#EB>v2f4-!-2=ZH^u^Iln< z`MrWa2k#dTra}X&Lovo-AB+t+Qk6bnas!k zPi)hA_r3PdR?5pbzZ3ppJGF6c(;n8pzvY^luf?TZ^=Hz$@UTi+>VqmHfA{@Mk}sqz z0<-o`t8M&La6#Vh<2hy3iC?su?N{CV?o^lQ8u4f4{ix^LZQ_1x>F2HDy2yCfi;?S( z;?2Lg|55}l{FvOr_Dh{{%QU8qan-S>8#ZqF6fbw;{K4#FYm% z6Y|>+?kImyF2d2N=>M_NZ>}A~q`U*7A9tKQ;LGx6M!1X4>kbd5@W(rTKMj0cD>>0I zCrRV_PLJ7*>$HA2f8F=I{Fp;sSB5Yj*PlMedRJqHLbmu{*}W6Ly;|DX#unw>G($z9 zCEA2bVkOTD*&oi6j#zNEtyeK@v1qt=Q2y|j?`yxiTYOD^&Su4C*K5ao;d%2jshZNs z-)@ywujsx0$&p{{>#pzbjx&Ef|NF@E#P3z-9;npT9h8rJA8fAvsBF^u)haU%y*|X` zc)y&@VcDBqbr)*P7JPf)-Nyg_iz^lCYc4%J zD1Z4`H|M`~6YSqz*+1)md@eTgXIk>YNvExhd_)wn7+IC`}!(MsjpNsweemfxV&e!w8 zmSL}*%eT*uI%4abLu(z?`Of$I`8FqPK|>8X|ZpPH(K94>%;Og;^6&v+5*WY zw|GAtpYv6BO$2YrOlX|9#i| z*&I8vnCluGqjsY6`C$7W6_>W2&t_A&bo%}b2ANf_KDSIOtZEN*kbWTlW{0)K zv-NtJAEtlV$inyFwCta|iuLiHA8xoUJbb?P|6`YmpV>!b4K}UPpR|QL{}C@Q=ii4j ivi>>NW#(W1&wNzIt-U|vxC{dW1B0ilpUXO@geCxtYXX@7 diff --git a/src/main/resources/assets/andromeda/textures/gui/background.png b/src/main/resources/assets/andromeda/textures/gui/background.png index 287bdb708ae2ff6be42a4c1b0c37aaf726030ee1..12d543eb39d07452801f8554a95b84d0c2363e65 100644 GIT binary patch delta 3378 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 b{KxD$>n8WpE{jPF3=9mOu6{1-oD!M<6my9L delta 3904 zcmX>pby;qLMLmOLiEBhjaDG}zd16s2LwR|*US?i)adKios$PCk`s{Z$QVa}y4?JBQ zLn>}vjm}-OG(5C!-q!oY%RgV7$v2tNDr)r-=atta7HB!KB>(Zq@eokT6mC{Lcuc@2 zIqOH4q85vAy@cu7C4sZ1*q_SqU8STlAt6X)>z1W{+6nF(jO#D(>lx4eU3%`!-sf+g z_V4|6FZ+G*y3ZG9Zo7AK_V>N-EsNjnzE*W@^SrI!>_S3g&dE<&&+;LS!Jg+qmG!z! z$^CnCWe;RBoM-%@&v2jNgGB>-$k&;tf7MJs%&1b&bzm(+9p3@o^PeC86Fwl$@Mr0& zf3H>RBSQD8w7Y(B7IWO|bG+XCO@2)2$$7tpB}mUcoU5Uq+2Y3{ONIu9 z3h{>bdmGxmA1`LeV;6`EV3$}}`_$EBkG&jA!C~%44Bfwed7t=E)5G}ZS86ds1H*%N z;^!T-6w6wQ#9IFS>E!n8{A^ms-mt$;k>{*iSTmbw&ndwTOPW-9Z!Bz*l{!^l*t+{( z;eSP$Tcvi}<_5D**u!)no#D?L)$807id+RYD97HeHQKrC&gu91{4;nM&$ho@b3lCg zjrz^6I#0TCD^6lOu$*zv|_fs>2l;$itD<)dM<;JStKAY~H=sU^KAeOS^`-}PhU!LTO zzhRj4o~_{g(V2QjZ+!U?Br{?0yM=d^l%&rlalhHCx$E0Gy+<$qZ{@naZo!4`K3{gv zx5;OpP_y;wPi=jb`7e3awlSwLOyw?~TcQzY;gWDp^Qu*GTQb{KnUdUwiE-V@j(<*? z);`-rf+0VJ_mP*`MyudB)?16dgla6xUy2;4;_gSw~ zs86Iw}{=od6`NQ(tN)1mOUq4$HmGiBvZFhG4uA1x9-rQKgcs5ct zGwt!I*KJcu`nz{Wm1r`!cQA+uHmo}{rTzMs&Zln$3Xbpj*rH%z!QFDO$GG|Vy0Z`d zSg*Y|J=>}&B~f65ki2*XgQtOp+oeP6R(+f0xKCI5TODI(?W)WCv*zkDdAwu(pwdu# z@52|3tBm&~RsV}yE;QU{rCPt2f2y?9^N?-tgBha!PPSK6R+@V@;CaWlxUj9e_AUL$ z9{x33y_#i@x#WD_>DL%Vl0RjYv{rtvZnKX3AD_Hui%r6t^?IvL8WaaRS8S0f_i$jI z7xPPJ!_QqG4$hmHcbD&hvMke+*DgEko>w+is%=i-nfK1KGcV(&{6b-iH=phm*E7zN zx&9|^(X_*M2QMz#-Q=>{=*HoAZvGWoA|LDbiSPgAe3VhS@7|IL`k_tSeD_wiUH%j& z@n&+h`<5(yNrm1oUwz_bADJ>pCo|61yS3C+)W+1b=H}%r8^)_QmK+L`+5dBj-M<49 z@>-)i0~XKgZ8P3wKBMpB+kFN5bg~|cgtIBuFa58axzv{-tFXt+uW-q`^{S3a$7k66 zk5ryt)pM(YFY)<$Mh`xYm|v9|j=Zdl^WJKU?}%x42obxJuN*gL(Th{^j)rf~vvOQm z!yfbIB-_2XPn#yTTzi%FSTR83$PWiormpP_4CRjwe0Mz}+_K?GN#8cXM8g}(2bQ+# zR~m)0M$`u_ENbYsiTWCDc`$h17muZ6`d8i8LK2-l{&f| zP-6OGb79N=5@-JFZ=c51D|pAQ|8d2|{~fDK1jo8ChSH1qpY1m9o1x65nZ;sIb=9EY zr9*FphRXDb3Tw_~Ot`S{Q1_f8%x|Jn!Z}||Sn$flU$^qhr0XGmW{xqJAJ?z%n=pw@ zm(#6y-_oX6`x+(6#8+mgZ!9*oiSR70THui~tL($X`Re;tNm?1Yn7>!vtyX_LZ)0

    { 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 Sy3W@i<2+scT-G@yGywp%^VZ@3 literal 2860 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 Xs|5_|>H-2^fGRLgS3j3^P6BWUwBNS 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 diff --git a/src/main/resources/assets/andromeda/textures/gui/merchant_inventory.png b/src/main/resources/assets/andromeda/textures/gui/merchant_inventory.png index c4ed7cfbf37520f04b92b665afd72a23217007ac..1b82ad8c4b29b0df8f233e8c9aa8a98584f09292 100644 GIT binary patch delta 716 zcmdnOb%S++L_G^L0|Udln604<42%Vt&dvdu$;k{16}P5dwDxcclsW!!{jJ%H7B+RX zS%(Chg}5w^P;qQp(HQ3Z{UP_B@SWkAg*;KMZF1gW&fdjqdDl7$d}+wY&D6@`+gj^6yNuwiop&4V;l%KOH>bG-cV> z!fx&d$F$Eqs=vBeRYx>N=t1!3w1Xe53^oUz;C|2aH!JFz%zUQD%ZeS3e_yoz${(dU zLdSYHNb;Vye8;{dqdfGB8{VFbT?;MyuCC#n-tsjkaA}y{0_#K_cNcjHwF63y zP97Q}Cnqdzn9jo{B$mkZqki@oe#K|bB7r9+Il3mzld&>NlKaTMfAiK!!IK$w?D~7* zSIX`D#TWMRUfq;iFL$f#D~C;gLE@F?#iBE6+5LCkleTQQ=WDTh&G#v?7WbPDw(rR~ z#ZbXeZp67>{ep1&zU&uKqC5YtDXw9^D5Mj6@Sa`I(go#fPwuvsD*l~)zPv8J{v>zN z$p{ZWNd^W6&H|6fVg?31We{epSZZI!z`!6H;1lAyYSpU$|NkF5cC5R*J2W)Z+}xaj zfg$Fz&NBuE2F8*gzhDN3XE)Lq7#JRSx;TbZ+ z1&0IkS$r<;_Hy@qW)WpZW0kB4-8$`H}^fi)u6Xat^}&J zpA`^=O31tB^X_+~x z3=A3*YbV-z9Cna78Xvq>OO##Pqwqw)+%?Tz7SpuE4mxFOZ+Vqa^itd;(<3NGhV^<= zvwU|byLfu6Yz(X82j(MJk9uBo_4*SZlp*-~V4?lJyVZC0GPhLCT$vWm5@34TmJ7xL_CMGemi(R8{sKNm6ueVi&XS|73Z_xJO5(#rUMsrFYJHz?b@B= zFPSGSTQ@Dgq1icMkHgK^viI)ZzIS_n`mDcy8BTH+on(&Yy2QZ1z?S6g?!sWi5XNvn z=KtAy3=9mM1s;*b3=De8Ak0{?)V_>?fq}im)7O>#Ihz!xs5(ej@)Wnk16ovB4k_-iRPv3y>Mm}){24-$g7srr_TW{}P>|Jai;&AbK;3}@% z3mihVI|NoVPkH*&Y4zE4pA6f2WY1|nID3LKTtHJ_^PdJ|tw-O38_haPcl>+##CP^2 z4w)yXkNW3t%Pl@$^+5JOJY$88oL}p*r*o8*k|M>*nb_|z?)c#dN^2|(0t^lqj0Mcw zZ!umr3H>kp*y7l(b?=rs8ci@%IKeKXfvhsxU z7-0-`8YuW37-SeZ7z!NCm}Xx7BXjO^k+Q&+6K)F7fcbOcG(Tf5tJ(5a%k$BVmB9?( z#22)!-Tv&#xsMOGxMPVuxXA(x?hH%}F%#AvcxGbX{`m%%Pk9dOH%Oety!$pk`Hqs( z(kZ95;*aKP@0xxpT$gYR?RrGOma>FVdQ I&MBb@04N~53;+NC diff --git a/src/main/resources/assets/andromeda/textures/item/anvil_minecart.png b/src/main/resources/assets/andromeda/textures/item/anvil_minecart.png index de87f6c12d2d7cccf6a78694c6ea8c6d9c51c5e6..5945b28907c8a393c77ce4ab3e5133a415fbf2ba 100644 GIT binary patch delta 655 zcmaFPK8JOJWIZzj1A~Sxe=q|BV_~MVb3kTtG6O@!t*IBSJ)8n%j(=Pq6&Yx9Mc`sV zdzM!RS0+!liid#dg{&8LHI3i3zH90BIj+8NA^BuhM&`P$3r#ti@FWvh^_ze@zknN4p;G{Eo=It zV;Ics3dR1fj?>Lt`Cw8*9wOt#eeb-=(;j8o9f zX`#zB8P}Q=!wDNY1XM26C)IHn$}eki>eJB@`uybLM8VG;_CMyXojPk4%Ym!H4d2vn z*GaR!H@l*>?Qdnq?XAimY!0gO>_%)p?h48n{ROYO@T7#QpWd_r6q7#LQrTR(5fvMJMNG&FZ+=M|;r z7Y79eIr)crd3iZGIoUfo+t}EcnVIRC*%})g8yXtw>FKFz8z}4Ob8>QhwElaTfq{Xs zB*-tA!Qt7BGzJESN>3NZkcwONxu+b3nhiJ{0u5QXOxncW*I!dBG1@hO_p^LXc1UsT z%0u5p1j8cl&WN1p`uF~~yhBQ>?kWGy2zD#8Pjd45c3S9^$oqeWhgq0@Z+oY_P)$T8 ziH&25yko=BS9Y`6mIOH5<$NnMGiXs#uSIgS(Cb|)>(75?u6)ndsQEpOpMimafy2|) K&t;ucLK6T3g%lG2 delta 969 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 literal 5954 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 KelF{r5}E+%j#_{K diff --git a/src/main/resources/assets/andromeda/textures/item/boats/acacia_boat_with_jukebox.png b/src/main/resources/assets/andromeda/textures/item/boats/acacia_boat_with_jukebox.png index 5298e0a617b5f4ab1941602328a424683c678f73..bebec0ece7612fb63252f6227a9fbcebf6df3953 100644 GIT binary patch delta 669 zcmbQKzlwE&WIZzj1A~Sxe=q|BV_~MVb3kTtG6O@!t*IBSJ)8n%j(=PqB^hXPMc`rq zd$w0c*9u*oNeYfv99A#<{ekt~>N~5qSg@^ia_(1My>RKyYi-vQII0{>%uGeMw%mE= z=*7wN%U}NA^FRF0|M2ZtZ5g`#)-eb3t~3>i36DBOPyX(i&UdT+qoMNZFh!Brj*FY@ z@(LO6{5Tri@iOMZ$GtDKOZRgu zZ!J{LIi^(H_nT4kZpzY=S;wx(`ZL-2nwuQ|xXbk6rVaD7S6(^ITB6?jbj1s1XO>76 z7YWW*p~xbUkCTr&98z+c;85TF)A2~n3?VMdO)EUkOm=s7JEQ#XLHV|@tRxwR@N$M* z^K*XZO6<8Eu=>Wg=L>VM_Z|4mA?}uJ7vK7_{6mP8?R~~Cd53PME?)lTz)vwA8crdhxsR;j&?S3DvvIzO=0Lz>}*-~4j5C@$o6NPvKDJOkyM-2%N6=6*c1tmo(O>zF+ zWk0PM7#J8!g8YIR9G=}sV_;xttoL+r45_%4d)`y%umOk5#RgN0YaL8?{;zN>YFl+A zXV<^mg}e7ey<|6g_1W(2%$thS{$)KgkSexZ`fcWRg-mP3^ZB7#J8lUHx3vIVCg!04~NRF#rGn literal 6041 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 literal 5992 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 vX3+V&CQw5%+J5rsoSb*{hj)bk+kZs{;F diff --git a/src/main/resources/assets/andromeda/textures/item/boats/birch_boat_with_furnace.png b/src/main/resources/assets/andromeda/textures/item/boats/birch_boat_with_furnace.png index d0a740617d3448d0f7d4f71501fe8faa1f41462b..83dc90d8d6f70eb709c66eeb49ed368e3a80e0d2 100644 GIT binary patch delta 674 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 diff --git a/src/main/resources/assets/andromeda/textures/item/boats/birch_boat_with_jukebox.png b/src/main/resources/assets/andromeda/textures/item/boats/birch_boat_with_jukebox.png index 780070fb5b1b97b597c7fd68b853878707f0c95b..f1a601930d912b970f59f72797375ca2e083e3d7 100644 GIT binary patch delta 666 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 b7v;aJ$$o}^c1kA$0|SGntDnm{r-UW|7wIMe literal 6006 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!uT45~sRN`ey06$*;-(=u~X z6-p`#QWa7wGSe6sDsC+ek1SHv@#RzeV54E8ov09>BqP zDx~S`kN5X8{~hd~aq`Cmm1h#Vb#}jfSVcEJ5C3*Ma{v8X8^WJH+`ZG9W4?sy{ADg% z_wTd*{othNl|$<8m$odnD@$4b@99awxlPx*!uGCSyryr4Uwbh7)11@CbY6ZIdu5Tj zzf9@*`8Ct0A5Y!CMR?J5=4XkE4)*EZJF|-+u0CbQf=S=34_$be{O~}N`KwnvjFsZc ze^1}IXy>$7_oZwX6kWgb`~5RXUH_~@{*Ha+KfmoRe7LgtedUYKXX3WF_20j};pLha zn!jG>pVKRTFS%R8PU%XZd1-Fy^@MQ4qqCxTrinc?ZgOravX$&_xXK&yV%yEG|b;>Zh($JbZrrv6||+JB`YPw>MNTtJcl)pPg%5 zZFca?-GftP=IC<$`C(`;Yw+BQ_4%4R8xQU32-~o+r}a+NVV;g1D;;^Q4_yEJCwhmG z0FU-5ZC4|v=>Bf0JMBUr*k&b41k95uS-G0Ig(H|<=a``YLsnmN_c^siPh^-h8CE2` zJTgy9pg=L;xY9}EO&Sv~%#w1RbbFZy$9&#>&Sx529(2qRRtRC3_MP#MXWW5>LKZ&+ zoOm=nPAqikvul$`?(!D#e)PnbOLN&2m8T&sN4+O#c)Dzw;xkimmg4a_o1V<^J~)SU z9=Dsg#FU_wMPE&4NM)}ID%R!wlDV%{EIR8_k@j4x@)z#?wxut3PJhU@!sHK!a-T`c zlR&i#*bSR z7#3zGrX8*H=ib>m^Q=XVg@Bl(SlV6PBMl4W`wo?em$mUN;@-Lc&{>uL4bp!#i_#pw zJ3omltZt8rKOS(qW3En&&Ebh;yF`|d-;b;)a7EjxOhmtK40 zaXces-P+Q-z2?I67L?6W6T4Mfru9Vq_-P%rjb5&II-e|Q-s-_IS69j-G1SUT+Q?!t zGmB6CEuYuRZ+cIfm~}zS<-YIXw60JuHHPw+STrxXw}`4Hz)Y4+qkleJag32 zN?kbCrhRyH)7rJE;iM?OTQWnS zX6KDPALPUDNLSsFycq2q)T->~_bG+1;r zDuo4^o|~wA(3wNi zlfukrok~BJ`J3^jtK zI`~NLQ5E0!PM_Zxrtg2(5^lw`Q@h|}aFNU1*=riU1Z+>!zgvG%q07slzW=GQaH}&dhp35 z{ftW!mh7>RyZ z!DrVMI$YIJ7VYo6d1sYGjjO<24uz)3&Y4w8duKF0|FNsRe|>r2yr;GA&R<;q#Fy=d z%OlHW(qbRkK7LuYwD_Jn-{wh61m+9(OO`l3a$k2^Z-1elmClDV8zy?56>jf5n#6uu z_Ka7XmyN4TU`X$$)-|WOp6i~=T6!$%`xAYhr(36*T+ifF?o(Bn(83{UIwi2NRb#D` zrdrSz`OhEtE&r+POevar@WjRjtq_ks`9J)1<=J9t>UWj|@Nn$8@$EQ=z#Z0ErMLgt zZF~ES^Fck^x-HxG-(pC!^IX4u>j}XN`*~wxwwqS+@3_OrHoxTL1eufm!5ShB-;IAQ zlQAgZ{<3c8-mTvXe=(%2Sp8J`!2z9|8>y;bpKhp88yV>qrKIT=SLT%@R_NvxD}#)HnBkIIoLrPy zP?DLSrvNfDF)6>a#8yd(OF=;aYIsF%fv+#z_`G6hC?x0S>Q^Kd=o{)8=;!9@BkL$G zaV;ysucJ7mvLIDID784hv?w{%wJbHSL>bwLlw`R6g3_WKuy<0D^;2_Fb5rw5iuDck z3{k9f_w)^b>i`8odS-3`SXV`E0gB3!%rrz`q4)+Q1NIKGLn?9$;O3&JhWQ<=7#v1c zF8Rr&Am@3y*eZeSw@S%R&P=g_FbxbX6O$7yb(WMO2eYhav` zWNv9-mX?xaj%0*?QD%B(USbZit3XDjWTsdpS{S9KBpMj$rde8;>Y5~{ChI0zrWxv{ z7+Dw_TN)ahrx}@mjY>(ja?3BuO)Rlh%FInnPt`BTO9xAU0^G_mz|&UANY4Nv5|EQv zl9peTYpWEVnU|7ZUW||m$;?d+E=dH1r=gjtxq*ebfu*sLv5BcAlK!yNqTabj6&3fLkAm{f8`VqSV` zimehfNx{T3u|$_?ijh&WfoY0vYLbzWu8B#Cv2LPinx(FVWm<|+nx%1ynV}`B>BaeJ zCFO}lsgCKXc_p?=?wPp-VBaWcKm$_~RegCzDk!83jEr;*%ykXSLJWp=z~ilP^knl5L7DA5<}yGmR2Yzj9Nlc z_>KnGXmF7f0wgIOOYWU|=ut^mS!_#?HoS#d|Dp;~fSDCSgw( z#}JFtYbX1AOfHl;X8*om*S0rTcS>pIDb9@M<(c}=;Rwe@Z;2y(a$S0!jUL?{ZkL4I zFD#rIIDJI`_w06#Ig>6pzPWNxfY;G&8F#9lNcy=YZ(ILbowzq=cFBtOZ@=5vod5pw z(C6lQnM~~mMOG{aigKns?3{n;KF_D3#^tM1nUpWQ%oU2ZEO(#3C6{UXWyQW*LVGI2 z12?`~9zM}mm7!(%a}HnE%|0O;&n5|&bvw4y$OV=yaBHcN6P4!LarDZHcpla}NySFJ zr(X)py{BeqY3yBJtX&u@x;$<#`-6`W`d_!Y{hA%Uv+T3v!EOo4 zqSF2R`jVgLr2lYY4z+d)iPmAbQ~i&n;gM2pSkc)R&kdFZt>*e-`z0`B8+*fn6Bc2c z`J8l#Np!uoyU?aQMj$gm*(u03SgsZgKxowzLdgZ#*L|@fA`z{`JGSR=x z;NZDV@#lMkeXCM(Zs%MoI_VwzRG;tW>EiDWp6f1(eJS4l(W<>XGn4yQ;G}GwbM;I2 z?rm=tb({8>t8^*@-^a9+ph*mG(jxcBep%&q>(AUJ{>(d`R=OOXxL4=6=rv)@FRW5M ztx&}pOYPZgAdhsgnU`Up# zk@3N&+IyFXFZtQsyPI)Fyq7@l$(!>}=1sdgZE5T6kN;EanA2_?@loW@bO&{@Jzf1= J);T3K0RX@%b;tk! diff --git a/src/main/resources/assets/andromeda/textures/item/boats/dark_oak_boat_with_furnace.png b/src/main/resources/assets/andromeda/textures/item/boats/dark_oak_boat_with_furnace.png index 3898aeb858cd4c543be0ed504ddd0e9cd2914054..50e1d149a98ec9b5e3a44b61f27b08006273384c 100644 GIT binary patch delta 673 zcmZqCTgN&zIRiSDK2%gh!pCCx7=$=et$^(NKAHn4(B*$Hh%{ zd4-I3ejJVbv%YG}lBG@FOlen}B1`u0`Q(alAKLA(f7V3P4k3F1Oh7gzKrWGD%CcC@4ol*YxpnO|cR+0=ucsawZ z`8mIHCHCA7SbgK$^M$$B`wo2O5O+(qi*J2d{vkxl_CDj6yhArr7cYNv;HMamjYvu` z+X3bs!I~Aejq_N(#5!MJb>eOM+{e}(QxjiuefyTE!n-$H_uk!`b8g31@B93lseXxO z(eCDXH{LNYFmM)lL>4nJa0`PlBg3pY5)2Fs9sxcft_%ze6DLk=ZEc;MZ{3}t+L5Y~ zk&zJ_9o-nDRu&EZrl`Gylky-GD){GO?vmg>Uo7ndG!$zE49yMR4Y zRVepngN)S{v20VvYn&WwL&Ujin4DHNus^NsTEzLqFY$jzZkVZI!OMabQSB3WW28dj d*V><#-8MvrA;m+|Ten`|+9K;hHn2R=s=W=Po75 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 diff --git a/src/main/resources/assets/andromeda/textures/item/boats/dark_oak_boat_with_hopper.png b/src/main/resources/assets/andromeda/textures/item/boats/dark_oak_boat_with_hopper.png index d26111a5178ad94d58dff16b919f4ec53c611243..e188448d90b36a51fce17df2f7b6266ddd284149 100644 GIT binary patch delta 669 zcmZqDTg5s-vYwfNfk8u;KbV1mu`tuwIUqARnSr6=*3^sE9!`NW$3L!*k_zIRiSDK2%gh!pCCx7=$=et$^(NKAHn4(B*$Hh%{ zd4-I3ejJVbv%YG}lBG@FOlen}B1`u0`Q(alAKLA(f7V3P4k3F1Oh7gzKrWGD%CcC@4ol*YxpnO|cR+0=ucsawZ z`8mIHCHCA7SbgK$^M$$B`wo2O5O+(qi*J2d{vkxl_CDj6yhArr7cYNv;HMamjYvu` z+X3bs!I~Aejq_N(#5!MJb>eOM+{e}(QxjiuefyTE!n-$H_uk!`b8g31@B93lseXxO z(eCDXH{LNYFmM)lL>4nJa0`PlBg3pY5)2Fst^qzFt_%zev-7RHGgLcLRgw~u8iUlz zBII)dWrKr)y?ne<92M;B>?|xS{EWr@jKxe$Oq}$&4GawIHHGXng*BvjG{yO4g*mGg zDkn2AFff(``2{mLJiC#`z`)R0@9E+gQgJKyyth!Z0T1&9Cy^j)MG2Yj|J>IK|C*V3 z(QWbe%WsWVePW)xW#0LDj3H^YolGt)FEnq}OtV!jdU-)Bplqhl2EK|TJ{n5Jr?kD> zZ?&Fiy~$fkJ*KJIh1Q_*$qiA`E7G;RHlFk|s{JyW@~dx|RUdTH;s?H7CQ afBzNxg}2)lykcNrVDNPHb6Mw<&;$Taf*mCQ literal 5890 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 XfkTod*sY9#fq}u()z4*}Q$iB}QB)Z_ literal 5939 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 diff --git a/src/main/resources/assets/andromeda/textures/item/boats/dark_oak_boat_with_tnt.png b/src/main/resources/assets/andromeda/textures/item/boats/dark_oak_boat_with_tnt.png index 20a483b767057a51bcdd3827c05f5520f4a40b18..2aaeb99e1b8fc3470def13e9739addc3745b8f3f 100644 GIT binary patch delta 668 zcmaE&w~}>&WIZzj1A~Sxe=q|BV_~MVb3kTtG6O@!t*IBSJ)8n%j(=PqB^hXPMc`rq zd$w0c*9u*oNeYfv99A#<{ekt~>N~5qSg@^ia_(1My>RKyYi-vQII0{>%uGeMw%mE= z=*7wN%U}NA^FRF0|M2ZtZ5g`#)-eb3t~3>i36DBOPyX(i&UdT+qoMNZFh!Brj*FY@ z@(LO6{5Tri@iOMZ$GtDKOZRgu zZ!J{LIi^(H_nT4kZpzY=S;wx(`ZL-2nwuQ|xXbk6rVaD7S6(^ITB6?jbj1s1XO>76 z7YWW*p~xbUkCTr&98z+c;85TF)A2~n3?VMdO)EUkOm=s7JEQ#XLHV|@tRxwR@N$M* z^K*XZO6<8Eu=>Wg=L>VM_Z|4mA?}uJ7vK7_{6mP8?R~~Cd53PME?)lTz)vwA8crdhxsRg*<3L@-}<(TRCk7I zN2*F=kXl)Ud`_V3L|wrYM+HA)aX(`*Cw=Zjc^-RBAv;ZBX*DAaIc^Op9!+t6Sz%7w z*Os#w7#J8!g8YIR9G=}sV_;xtsP}Yn45_%4d)`~fY}m{@BLpPx@7)L zvs)Qo%67%NwbUm(wfl5)_NpMwPeOsEXIGxmykr>debSMwBxt`yT=3Q3E$$)n#h>Xi zRxr5EuU$7m$!y^fu7-jM!U~qtnlIZO>b?8>9dL literal 5988 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!uTl&eA_N`ey06$*;-(=u~X z6-p`#QWa7wGSe6sDsC+ekKFV`gXhn4kzy9*jV~<}6q51`j?X`GqHg^(@w-=J`;2z0 z7^ybi{qg?(%YO&^Z>WnW>3IfOec%>q(b9T)V}I4Yzk=tsoA#~#bm9FwMkn#bPwwiR zd=~%rU&Vwc+F2iGFIZ%DL5^Kz#-C3r9c2ekFA9CH=HVl7S?+_{f_J&Ho?iddnssvv2Y|_^N(fbZX5$VYRA~u)dfNY?5j`4SNp1 z{Ku&?>-3cmWtW(>%g^qAUw%G^b(7{FmZDv!xBoqNd^zL3uNTVCE{y1v`^{K)Pt11V z{(r^ajLzF8i<_!A%*_eD9(GRZndyp%Ro%^*oJPVmD;C7`KhXS;)vEo)xxdYQZv|8A zW%m2EUoZD>4q0ztc%fiQpkh$K7Ax*_p`f@wtzUn5&TO@=P`Nhw+kukXkNme5t+3uI zn()1KV^Lx&EKZ`9o!vq2Z!ChA)cE85=lODffKjVLLGE`HRW+MuFet9K-}d60Hgs zu(8$jTuD@6brVU|+7goN`R#c~S4&=dor#J^P0JLe#=^TEN2IFSPj zGYiW^FM75PCPlmfXBb^SGTqM?2AY5#D9ENRPmtq-xSO3D}GPd z8Gi5H#%tFNm#8OObBV8DSN>&S=e0EGdgAw>UGv%ObpQKZ$auMiH;FxBO?VmWJChyr zu1c1)ES~rGxV~5UpJzv=Ps+B>UOVODj>G-iimovpI%bv{qPHs7f6c02t8KL`XY(xj z$FyM8Vc+KFLjqxUSb{p=b$)JUux@wT+f5(x4?fM? zv!X;^Ny)f1lr3ggk@Uwmmm5QL55I4`qp|vgM6r4Ivw3rl-`soKf;&=QvT)9=SB)PG zE?j^6JpJ|E%|H9sd^)y<{py}x=T$F@yQL)$C(5NC4t(7taV6Z3r#$dj>f4~poqFsq zXNtc|>y+NPrS6^j53SsMVe#%p>jU?SK1EHs|Lseu?WViSFY+ER2`ax9U{c|q$CQ(O ziX6+_SK3shA;?W>9+~Q@Fid;yLfD(q-Cj z4sr0zzja~rv)L`rR;`_X;_$3;<-?|3Yu~m^`MYW2UVd9%<%y53&aCDU)HRncbq-tN z^_?yL;M%`=Av%X!A0GKXLDJOPY`>pTgjJ+R%bmVI1}b85jQ3@h8F2f}-?5vuPUOgq z7WO3)dJA4V+ekFcY`WERBxqmY!#ur$h`FVf4&TD39q7zDxp;b_9kctnJ3KC~2?svM z7^%O1(4hZcTdf~e5)Ym^O=qr=Wyn#>d|_~9 z8k^4B_T4-8d_OIIRX|Mt$gZ-_yesBkuL~AqTE|_}e&LXyzW6PXHC-ivFQaZXznN;W zN$1G*D$_~sqNTGm<8v2)Pxq?7h>15k2_itQnM?@YTXmp)6eHVm34i+ zZPC4#yn2bB8a(z2@A|1?CzS7BDx$Y*pAf_2Bbz&f z+U~UrZ20#XzUXJE)w}R_&CAW7dKGHi&gs3Yzjin>bH*N?D+~;bEt$^F0iMpzu>F9c)7OKcJq*)c5pR4VDDHwdGey}DL?ivxuA5c`ElKz-QRaqvvc%v1)p74=x|j>S+u|N z=ABg%HLe18ITV^AJ7-oY?VZv1{Ku~L{`KX7^PbkeJAZNc6JNF;E{`miNsE1C`}k$q z(&BsSe48gN5tuLBFInRF$bH>uz5RuHRyrTfY?$bIR=B6F06R*kh%nrcB?$Ys$ ze~Tf_&U5|tttSL8?B|V%*=}0NzvB)g+x(J~6J$>M2WyBld^i5JOva#q`^&nWd$)co z{Kb&6V)aw$2M+`!bc4R_I=;Kws`~eLpVj;2muMF4-esU##lXNTkr@(E65;D(m7Jfe zmza{Dl&V*eTfhJUHue<-iOJciB??KY>6v-9O7C~?S5nAKu~iB;^)>JvhzmDRN%7Rq= zpw#00(xT*4*Rs^S5@lo~Qj+2N3rdS}z}`to)=$kz%}vcKDb_dCGeoh{-P1P!t^*VV z>6y6&U|kit1t=;@GSd)&h2k5K4A?u!4ynj3fSZe=8s>MfVsIE)x#TC8f}H2+VygtQ z-zp_PIWxry%(O@{F|aUANz+X-OEb|mu}n(TO)|Gg(@iopOfyb4Pc*PdF-J1WGq1QL zF)uk4WK>0NfnH{2ij|RNvO%hGQmU?DTAGoriJ75+Zj!l4nyzVbN}{=uadNU*N-B~O z{zaMTnR$sh$gTnzm6DlaWnh??WMG_XqHAiHVxVi1oS3R>VVabxo0@E7X>637mTHt{ z1~w`s*~%@yC^xahRw*+#F+EkkATJ#(0Sa&{#{f@TB_llpgh)V6Vo6$lQLe30cxGNo zet9uMDkL*EHMk@Z6rP4=rsf6~=7t7FW(F1(W~K;5VW~yMnfZAjQw8UBUO3)+)6VJpF zUB+gnsTPLGsk)X%W=Xmx$w?NviK)q^x|Sv;MkZzkDXAt#NvNh5=ckpFCl;kTrl;nW z*ebba<`#f`qo4r|OifhvGHSI5*9@ZVoB^+LzorB{otx5k8+I4$0%`Uj*W8SLL;a)3q_12n| zvd8xCIe0-}%aq)E(_YWv+Wo=8C!%F$&OX0|EUBTpmvR^Gz4fd!xnpXt@7*m4zK?Fc zmT}xa_54&J@pHRA?5bYv!FayGqVU8$+t354&t4bxJ?0bM%BlbQs#*3=UY@kx7m4O( z-95MSl=g-^O?|dph0*1YU!mHq+r|%!m^b`c%jU3nv5>v3*V28S!MCqD=rwrlFzxwdJ~1+VK@ s7T$hX9eMk=vFjhdi|V`b|L?z|?;&u);!pCH&!FD5r>mdKI;Vst0PT}-`~Uy| diff --git a/src/main/resources/assets/andromeda/textures/item/boats/jungle_boat_with_furnace.png b/src/main/resources/assets/andromeda/textures/item/boats/jungle_boat_with_furnace.png index 491fb4bd2e6f6efeeb1ac197c743c1aeea34f94f..b8567673ac1a61c300884b37922fd2b1f8812d8f 100644 GIT binary patch delta 677 zcmdm^w~2LvWIZzj1A~Sxe=q|BV_~MVb3kTtG6O@!t*IBSJ)8n%j(=PqB^hXPMc`rq zd$w0c*9u*oNeYfv99A#<{ekt~>N~5qSg@^ia_(1My>RKyYi-vQII0{>%uGeMw%mE= z=*7wN%U}NA^FRF0|M2ZtZ5g`#)-eb3t~3>i36DBOPyX(i&UdT+qoMNZFh!Brj*FY@ z@(LO6{5Tri@iOMZ$GtDKOZRgu zZ!J{LIi^(H_nT4kZpzY=S;wx(`ZL-2nwuQ|xXbk6rVaD7S6(^ITB6?jbj1s1XO>76 z7YWW*p~xbUkCTr&98z+c;85TF)A2~n3?VMdO)EUkOm=s7JEQ#XLHV|@tRxwR@N$M* z^K*XZO6<8Eu=>Wg=L>VM_Z|4mA?}uJ7vK7_{6mP8?R~~Cd53PME?)lTz)vwA8crdhxsR6b0*4g>i zeJM`e8LAzrDj69WZE<$(kyf$M(Pa_xIf1ePetu~#Iw1}^LFOtp*49>5R_^-pPWs#$ za@?BY{MU1@oMvEPU@Qsp3ubV5R(~Unfq|jf)5S5Q;#Tf?Z=pj5Jj?+(w@frM|J~U4 z-*aQIopFPi)ZV#z^}*V;2ffaIx+iUHedN=WQ+r~Vi!GO$^;LFix{5YGvuO9oepNHO zfL+c~AlI{zN2W)xD*T|9uz=e;wI{DRId(F?o6@J*r1e1N=VRqv-5p&`oz1Z>x8;5> iNl^Nf^|SIH!xT%7UmKU-`M|)yz~JfX=d#Wzp$Pyws3s-= literal 5948 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 CnN}zO diff --git a/src/main/resources/assets/andromeda/textures/item/boats/jungle_boat_with_hopper.png b/src/main/resources/assets/andromeda/textures/item/boats/jungle_boat_with_hopper.png index 15c3ad30d4debc439694a2cb591d3df443da32b3..b280cbe4ccedba1fc838a0037fbb8b7303b10dd5 100644 GIT binary patch delta 674 zcmZ3dx1M!^WIZzj1A~Sxe=q|BV_~MVb3kTtG6O@!t*IBSJ)8n%j(=PqB^hXPMc`rq zd$w0c*9u*oNeYfv99A#<{ekt~>N~5qSg@^ia_(1My>RKyYi-vQII0{>%uGeMw%mE= z=*7wN%U}NA^FRF0|M2ZtZ5g`#)-eb3t~3>i36DBOPyX(i&UdT+qoMNZFh!Brj*FY@ z@(LO6{5Tri@iOMZ$GtDKOZRgu zZ!J{LIi^(H_nT4kZpzY=S;wx(`ZL-2nwuQ|xXbk6rVaD7S6(^ITB6?jbj1s1XO>76 z7YWW*p~xbUkCTr&98z+c;85TF)A2~n3?VMdO)EUkOm=s7JEQ#XLHV|@tRxwR@N$M* z^K*XZO6<8Eu=>Wg=L>VM_Z|4mA?}uJ7vK7_{6mP8?R~~Cd53PME?)lTz)vwA8crdhxsR&aOSuDk(9kEJ8jfP&POyIL$@J%f~CkLC4O{F34QP!otE`U*5#T#7Upqz`#IL zoPVo~)Ds2<2F8*gzhDN3XE)Lq>KPcCJzX3_DsJVT_Y`V2;BmPaA>sTuLayn;-+ZZ? zDJ#4#EPK6wZr=3ioBte8*?NC@I>S7TtKrONc$NegZOw7-$+@(!YJsegYl7^Dg4T;J z&mzJm@$KW@%$X|dux`PW*fh?cEJfe%UQ{ZSUX=1^&-4woN3B-Qk|_C@7r2#IQL02b guy*~w+J7uJ%-C0j{GR=ifq{X+)78&qol`;+04lE~r2qf` literal 5934 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 diff --git a/src/main/resources/assets/andromeda/textures/item/boats/jungle_boat_with_jukebox.png b/src/main/resources/assets/andromeda/textures/item/boats/jungle_boat_with_jukebox.png index 4592995bd86054c52409e4d826bd013ce6e61975..44ed6a449322072d675a3de59dcc164b04a16fbf 100644 GIT binary patch delta 649 zcmeyTw~BRwWIZzj1A~Sxe=q|BV_~MVb3kTtG6O@!t*IBSJ)8n%j(=PqB^hXPMc`rq zd$w0c*9u*oNeYfv99A#<{ekt~>N~5qSg@^ia_(1My>RKyYi-vQII0{>%uGeMw%mE= z=*7wN%U}NA^FRF0|M2ZtZ5g`#)-eb3t~3>i36DBOPyX(i&UdT+qoMNZFh!Brj*FY@ z@(LO6{5Tri@iOMZ$GtDKOZRgu zZ!J{LIi^(H_nT4kZpzY=S;wx(`ZL-2nwuQ|xXbk6rVaD7S6(^ITB6?jbj1s1XO>76 z7YWW*p~xbUkCTr&98z+c;85TF)A2~n3?VMdO)EUkOm=s7JEQ#XLHV|@tRxwR@N$M* z^K*XZO6<8Eu=>Wg=L>VM_Z|4mA?}uJ7vK7_{6mP8?R~~Cd53PME?)lTz)vwA8crdhxsR7(_C~y9CV^g6oSlE-1X(1^tl~1Bs4V?loX{j#rbbVe2HRUU|=i>@(X5gcy=R= zfq|jX)5S5Q;#Tf?PocvG94;3dOf9ZSu-y5-!m+4r)sdWC|4MHc?%osilHKgpXS=sE zZz@jvm-Wm*s@QVrx0#cQjb~nv^-j9A=|k;7<{c*$KHY3kvykvyGBe>SD~IDDk0+Yf zgawu`zMImo+NJhD=ICSXYpz$1By=^$UNt+GW8nIA@2~Gah1E}U@V}g$V8p<{z~JfX K=d#Wzp$Pyo@g%YU literal 6014 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 literal 6003 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 GLK6V`w0)8Q diff --git a/src/main/resources/assets/andromeda/textures/item/boats/mangrove_boat_with_furnace.png b/src/main/resources/assets/andromeda/textures/item/boats/mangrove_boat_with_furnace.png index c4506154f72643def3f8f5aec2c698a1c564ac90..075913cf3ed148dd1a6083c1317642742d9e0323 100644 GIT binary patch delta 627 zcmbQGH-&YAWIZzj1A~Sxe=q|BV_~MVb3kTtG6O@!t*IBSJ)8n%j(=PqB@t+HMc`rq zbGBDUoJpIjkV=PChG~iXz5~@$tEY+`Ul5w{Vq=Qw7L)6@E=aLB@^>6twrtU~3Ab%M zG#efNzdZbZ&i{vV?lYE~E`JqvTjGV=#U2*sAe)U!mGeJdahNZ_RH~3%XJzKaZ&v%E;n&)0xUyB%HJ(Df9ejQM76yp?h zb6V&!O~&<4is6I}9ReyB>XYgi4CR-#IQ8jh34MNYaiZYo4*MT-*G`=!!G7SXXu~)4 z+jY`x@6E1gZTnl9aeJ%s2b)8!7iXLgPkbh8Gu7>UIfL!&g0h=0G_4EvvHs;}y*Y*P z1H-!zt~mb%){J|vU)ZTt^gHtT55A<-h+R#4Yb89L&qsBamzzBQc75LaKl>Osravp% zwm;(8m&tELBmhIxE~MBO@a=I=bG;B*4$F+}to*Ti?do+RDl* zMo}SHTGm}iSVNB6SXk(6vyC$Y0|R48kY6x^!?PP{3=9mlo-U3d6}NKFJMuXha=2d9 zdaIq=c>G`Z>bK^zR+KwgFbkc!f94UlO3n9sjzNsoofE%D$E!XTD&AI?|E{->cio$< ztv{9|-sgMx%9QC`VdJT&(sK=~pEI6#^_k-jlgE6f?uG6`4INny_DZX!Me|Jwk({}d l#bA%jNgLyNe{23RxIbbmn`gM^IRgU&gQu&X%Q~loCIGZE61V^W literal 5914 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 literal 5868 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 diff --git a/src/main/resources/assets/andromeda/textures/item/boats/mangrove_boat_with_jukebox.png b/src/main/resources/assets/andromeda/textures/item/boats/mangrove_boat_with_jukebox.png index c34752e0ef12eebd3df657f388d778bc6da0bc5f..6cf596542ff892584e9c31508389253a83077583 100644 GIT binary patch delta 637 zcmdn2*UdUXvYwfNfk8u;KbV1mu`tuwIUqARnSr6=*3^sE9!`NW$3L!*k_a@pB5<*Q zIoqov&ZNy%NTow6!?Z+x-+}6>)lbvh>lW4|*4tr=^_zsA-U8C0LD|h0n$`vTSpV{~-kiet zf#F>USDgO>YsS6TFYMGR`W^ZF2VYWZ#IB~jwGy7r=cBsI%T1ntyFTyzpM4DV)1MV> z+aK}l3j+fKXMsm#F#`j)FbFd;%$g&?z`&pz;1lA?z`!si)^S$2Q+0r4y^~3~xnZ`p zew2wqjG}_0hD5Nmtfq#7yO6MwqLi_)ki;hzEd~Y##*!evU0AnK9F}U^YW3C|L1d;cES{OA0O{<3OCsO>jqU|?YIboFyt=akR{0N@l0f&c&j literal 5939 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 literal 5983 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 literal 5992 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 ga({LGe0#x9kih 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 b&d*o*&mmEf6dlUIz`)??>gTe~DWM4f`sN_( literal 6009 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 e`Rn_i)qN^BTB`LoHZw3VFnGH9xvXMv3&Vw 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 diff --git a/src/main/resources/assets/andromeda/textures/item/boats/spruce_boat_with_furnace.png b/src/main/resources/assets/andromeda/textures/item/boats/spruce_boat_with_furnace.png index baf112e080dd325f3fe826eb69a0e80d45665004..4900af5d89b2ac04c31248c61e04085345f61440 100644 GIT binary patch delta 669 zcmX@4w~BRwWIZzj1A~Sxe=q|BV_~MVb3kTtG6O@!t*IBSJ)8n%j(=PqB^hXPMc`rq zd$w0c*9u*oNeYfv99A#<{ekt~>N~5qSg@^ia_(1My>RKyYi-vQII0{>%uGeMw%mE= z=*7wN%U}NA^FRF0|M2ZtZ5g`#)-eb3t~3>i36DBOPyX(i&UdT+qoMNZFh!Brj*FY@ z@(LO6{5Tri@iOMZ$GtDKOZRgu zZ!J{LIi^(H_nT4kZpzY=S;wx(`ZL-2nwuQ|xXbk6rVaD7S6(^ITB6?jbj1s1XO>76 z7YWW*p~xbUkCTr&98z+c;85TF)A2~n3?VMdO)EUkOm=s7JEQ#XLHV|@tRxwR@N$M* z^K*XZO6<8Eu=>Wg=L>VM_Z|4mA?}uJ7vK7_{6mP8?R~~Cd53PME?)lTz)vwA8crdhxsRpfi@Ln?0Np1&=0$bf?-K-bs9S<6%K-~Zs&E2n#Q z>04Ld`}WEF%qLa__a}S9LsebsxK`_3Uvp~thlNXZmtK1$R4`#%3`^Ga+bz~FG9pvf z@(DQ@xV^i}dQ(lI=bE$1M^28l%Yqse*sAT@`$Tur40E1B0ilpUXO@geCy;C?KT( literal 5954 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 Hr-UW|{xDb{ diff --git a/src/main/resources/assets/andromeda/textures/item/boats/spruce_boat_with_hopper.png b/src/main/resources/assets/andromeda/textures/item/boats/spruce_boat_with_hopper.png index e33c5588e839a92a09f0799ba95722e43a352e11..d911ae98e9f0f5fa5bd1b03f4b542376367804fc 100644 GIT binary patch delta 665 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 C_&sd^ diff --git a/src/main/resources/assets/andromeda/textures/item/boats/spruce_boat_with_jukebox.png b/src/main/resources/assets/andromeda/textures/item/boats/spruce_boat_with_jukebox.png index fa7f9e5b476836f36441bdc2f459faed8dcc1c91..680ab5cb94cfd96378a520adc27ee4e1a2e4699a 100644 GIT binary patch delta 661 zcmaE)w}^FuWIZzj1A~Sxe=q|BV_~MVb3kTtG6O@!t*IBSJ)8n%j(=PqB^hXPMc`rq zd$w0c*9u*oNeYfv99A#<{ekt~>N~5qSg@^ia_(1My>RKyYi-vQII0{>%uGeMw%mE= z=*7wN%U}NA^FRF0|M2ZtZ5g`#)-eb3t~3>i36DBOPyX(i&UdT+qoMNZFh!Brj*FY@ z@(LO6{5Tri@iOMZ$GtDKOZRgu zZ!J{LIi^(H_nT4kZpzY=S;wx(`ZL-2nwuQ|xXbk6rVaD7S6(^ITB6?jbj1s1XO>76 z7YWW*p~xbUkCTr&98z+c;85TF)A2~n3?VMdO)EUkOm=s7JEQ#XLHV|@tRxwR@N$M* z^K*XZO6<8Eu=>Wg=L>VM_Z|4mA?}uJ7vK7_{6mP8?R~~Cd53PME?)lTz)vwA8crdhxsR;rs4Tp1V`X6IXXXQ)nzb?iu0X^1l` zi;%Alu*?aRP4m}J^wy1X(+Y9Wi84`eH&=Di=XTVPFwv0K)KE}Tl+qOE|H5Y9#lXP8 zSQ6wH%;50sMj8VHL%pYqV@SoV`rPxkg$^rluv`#Q&FV^O{Qv)2)63LlXZO8%Q+fM# zYR3=u2KOhM%>^?%z6c3vkEOlnlt=I`U zj82zKxbx?{WMO&Rz<#~9b0PPZW0n8A@{NiMIWh}oR6dW9bvkn|xBmS6J&W1Brrh95 S6J%guVDNPHb6Mw<&;$UozaD}B literal 5986 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!uTOshg7N`ey06$*;-(=u~X z6-p`#QWa7wGSe6sDsC+ekKFV`gXhn4kzy8=BV{tzI(8nEsTZ0MdwO+T+;-X24T4S@ z!9uCW>i_$F=GQCJajWrBY)>fkoOXtFZp!)4Zd&9<-eKkpq#P1b4<1|0EWx8`2WxO)3&n;Bnu&a^lu32=U`Kcof*^>g6 zJ54^8Cv7@I!-mJbWQO$azlJ+c%$yzlP$V4$t7QR8g~YmTZd>TH^2p$y`Qnf%Eo7#SD1oeNfwo~bM-Gm{~p@#UKqZ2^V% zI}dw^wQF?EsnG4!oVZP+`dE7Ndyh1SL%SPhcss0M&=KVS=i>Pw;N!XO?{+_4Og_Jl zMO@{FfD@0l=Cl`!X1qx5FkChx*;CK+ljf2cL8n%xoa6Jn{Cq;PpXKwQ4QY+fnr^Z( zEe%<>&g<*4HmU4YJEyVzGRfT6Di)o!bLzRfrBC|hs@|-89>>NTka^;Ra*xHO6N`NU za;=P0e@Ujz$$S=>cSYoy{&({LW!GNwAa8?vD;{R|Oy`Pvc|`vVgM_rAf}A*uf{Ff_ z93{cH6S`+|(p*~8C0>fB%@s>>2w>Ydza%mJhr+H2zqRl9OcB5H!+)YN_pW@U@1ooN zS9}d^yXE%AOtWdFIZ1Kli`iMUhC^bt`8EzI~^DWs`AVjd9G) zyPCNtO#gkp_Q&hN@wKl@!rXr8Zdmd1kshyt*}2;qdRt!|5$>~Xx^cty_hGZB1N&QR z^B#v^iceD(U2AtjXz$4dC+nnF7|Rr2-#(Mw>&m?3_0t@d8&BR?^f6jdqi@&Kvlrh! zOO0^yczc)C(b4jAmBW)gnzi}7y;J&yPT8_p9V<(@m#wApXyOUwFh|bN>kl)YKL1v; z@$Qys{Gwj7JT7@nxOd*Yg0C_4>(Ou979}kX43s)$79sWMvh-D^&hs0lHM8}3t(Cpm z@$1stfHk*yG9Tn>OWjmmvdz|c#j|Yfd2T0c=ilX<{+l;P;A`Ax%lv5)qU*hwJ(SsH zf1U`q)#c}DAyV_n?&~}AtbGR=R1P;U<;^~HQFx_lp?Kz^OOrF6+-YhGny|zs=*q1q zUopA2B?0pHLaiTt6gu~D;+1P$zt%;qO4Hc0;ZSgIyZepv`MC#Q-)USEer3r+@p?Cf z#ituD%dGNJYV}gMswyZGW)^WkV(Ojd{2AGi7yCb&O>EiNwdi%&uls-b+H@A2U&eZJ z>Gke}2UDKSEnOx3EcjXB(mRhbMfS}R54#ke*EDgh_DmIC!|vkho&ygYcU6?Hy_@xT z?Mmb4n>YI`DELzTqT}RC0YjdUl_g8OrcF1GD$XNIM;^j_q>81TzixvW<+X-40! zRR_L2*pRm{R_BhL*P)RSh91fLI_J0k^7fwEmQ^^iwj9+B6Zt8u80~U9s1KRlb%D0}` zE-Nl{sqx?3P4d<8Y-?Ze|43hAv(nFMsr6D= z#?^yQF6n1nny_St1=l)Oc6+hae0t}0S?%CzdcfYXc=F^$-BW(-Uvfd|So7n$J-ff} zsAlKrlw@sazw(|Y?0^{jM0oY^qZ^Q>@t z=g}ng)3Rs0+PrLBWdcKbKeeto&GlUOT-MTKQQx2F^E}-;)#Q36pK_n7%7hjUNz*BT zjjbAMr8L!ow#a|}z;F3aWoJs!)PpBBHfV)-^vVC>uPe_MQ&YdQB!Guw&y8=#IRx&o z&MLkA&u-h>XPgh}+172@w*MAGnw{tR?ORU>Uf9nY6SLj4l7Gh?Mz;ASCnw09^bgh$ zY4~pZYnhBe0r!`6JNIt=R``n{WyR{J(hnX8NazNA+jV?*wN>@+?>?*d%P-L^+P%v_ zwTgj(S0Xbcq9nrC$0|8LS1&OoKPgqOBDa761Z?ap3KEmEQ%e+*Qqwc@Y?a>c-mj#P znPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN*i1Q(;w+TacStlBiITo0C^;Rbi_H zHrFbz*a{@9ucQE0Qj%?}6yY17;GAESs$imLqGzD%T9H|1q-4jXU{jQmW)}AAQ`ZCkR4KyTL3o~MK#Rt zV8!4tvU15!E(JNy)5TT^WWQBPesX4t6_{y|l9*&_o@S_PW@u@wYm$^=sGDezlB}DQ zoR(yqW^RyTXlagQlxJRXNn&1dD#)mc+ycGK%oM9MvsA-0vy>#=#8i`HU6VA+RNcfR zOGDi>Q;Vd;#H6HTOVbo2Bm9dp(=+oDbC6vHGAboA#VW`6QX!eSslg?Qpzt&_Gc`A`FgLa^HZm|XG=X>=Y+_hy zQE_H|9>`Qf13hDi$)Jd_@-NCv%_~U+rBqubL$I+Gxdm3vMX8A;`9&f5`8l>qAR`ov z^b8Ha30%Pj5-lE?#U=Sgm3H7X4bC~isf7?8BopLhf~6D`zzNqXF&Sb>abj62Boq{2 zQpp*KdFiPswo1?>1ryK25?!XL7RCli#>Tn^sb)#KCWgrdx=AMHCb}l6sc9Bz<_3o5 zMrfuN=ckpFCl;kTrl;nW*ebba<`#f`qo4r|Oii%2;jSsqNCkzIfsv7}fw``MS%{&r zl>rDT>Dz&QWTOwt(=gxK=wpNjL;+GEV8^8Z5ess0v*WVS2bV;kQVC)ps8paO2D_S; z7J$qiwFDFjMB~xmB08u*3P*zr6beM+(cmIFs6Yxwg9{W2MB~xmB08u*3h@OO7oxk9 znwMg$RIX%iw>SLh9R>ylwj^(N7Y02L%-rr{&%nUIS>O>_%)r1c48n{Iv*t)JFfg!} zc>21sKVxTOV`kRXUT?v`!1&A4#WBR<^xDaHvx5pHj@!?xaV}}^dAQLu-t5dx74Eck z845gB7hJ=gw#@$5aQ7|$OMi}Clk|4IOnalIa!A)KqDd*aNq>rz>Cwuf=PFgZCL~*$ z?^^Nv)9(*||IB-T_;Yi;&gDwQsXeb4)|SmI-zmRrKjRtk&LSU`xr~;Am(G7Lvy+>x zH&?b~{`LV$B>&PJb5;ezx05&b+nUbi>}E5^ST{A#JD#Cg}4cfW~H ze2vAUgFzFVS(%JwlkDUfs@3foH$=4u{}%GIvVFv;&anFWnkB`dDj^J)X8QlIEt9*y z(aX`18vb@2nr7qf99Sv#Iru7z)^epusng!xwW{l%`}IV_>`9Yr*19jwoX5gY zlllGT1o4l%-Z13Y@>~uGdB>jLulT;0HOxut^u(W;4U8Lix>s&KY9#$hY1&N2f70AJ z@2~CL`e51Bx0{86jfTB>q)KVN$F?PaF3j2Ywh(}xaj ztTl1`n0@?9)$@#`z_y)NB`;*ms{Hy*I&V5_yYGVKy!!i&bhux+9>#ox*>BU*;BS0c z68sW>pZljV{`eES_@>x$``{zWeedrZ#9jNZ|CM_~%CQXVEAN~@J!wx@KbLh*2~7a5 Ct79_& diff --git a/src/main/resources/assets/andromeda/textures/item/boats/spruce_boat_with_tnt.png b/src/main/resources/assets/andromeda/textures/item/boats/spruce_boat_with_tnt.png index 280fda8b943bf8cd21973ea9ca05582410d26ed7..6c927ca5c62f0d6a7071f61fc7db67f554549868 100644 GIT binary patch delta 664 zcmcbqx0H2)WIZzj1A~Sxe=q|BV_~MVb3kTtG6O@!t*IBSJ)8n%j(=PqB^hXPMc`rq zd$w0c*9u*oNeYfv99A#<{ekt~>N~5qSg@^ia_(1My>RKyYi-vQII0{>%uGeMw%mE= z=*7wN%U}NA^FRF0|M2ZtZ5g`#)-eb3t~3>i36DBOPyX(i&UdT+qoMNZFh!Brj*FY@ z@(LO6{5Tri@iOMZ$GtDKOZRgu zZ!J{LIi^(H_nT4kZpzY=S;wx(`ZL-2nwuQ|xXbk6rVaD7S6(^ITB6?jbj1s1XO>76 z7YWW*p~xbUkCTr&98z+c;85TF)A2~n3?VMdO)EUkOm=s7JEQ#XLHV|@tRxwR@N$M* z^K*XZO6<8Eu=>Wg=L>VM_Z|4mA?}uJ7vK7_{6mP8?R~~Cd53PME?)lTz)vwA8crdhxsRg*<3L@-}<(TRCk7I zN2*FgoLO0fd`_Tjn!kRcw{Dc1)=&%A0^943x4!=U5jqmHPa$P#_Bb{qf zWqnsqd6B(CRZq>gth70s_qd#K;!i8;l9{o0x{v}h-?kkrOE0~#d*~?kdeJVi2EK$Y z(`#%e9|;?oGPq2h!?1Enx$bR|^8!iNw$!pl-%)H(^x17~wUkNX(Z9U^)&E#Nvat)E Vz8xjy#K6G7;OXk;vd$@?2>|+A8dU%Q literal 5977 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 T+mwNUfx*+&&xK{3Q$iB}hDWq% diff --git a/src/main/resources/assets/andromeda/textures/item/infinite_totem.png b/src/main/resources/assets/andromeda/textures/item/infinite_totem.png index 40a4bffbeaa5b0cc725e9f4af2d1a7746a8e18fa..2d5244d4581e0edc73879860533b3e98ce054779 100644 GIT binary patch delta 734 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 delta 1010 zcmZo;oxm|cvYw5BfkFQB|3n4`#+FQH=KxPubtBc(DKIs^;#^>-g3+Dg0o3 z^y0~q7fP!C^fkA1e0;D&{{1`KclQ{b79R@PoXr$qdfMY?a#Fq7b}hEJi_HeV44NB` z_}EU2J9D78=I-I+*LQ22|77?5xkSJxHRc+nk205eyDOS2(k@@Jd@tM{;ThC%zVkTm zE`^WE*Hfq8w-A>Vt4KR>V#%{k=OalQo1gNfsXD99Q|r@M<@VF*T59WOvGlD$$!n`W ziL-saL-R3FZp%D}+DmgMd3!k`C&ncIErC(mP)sAn(n^mS!_ z#wN$Z#k%1_QV;_JgJg+oM2T~LZfAaFLL$zf1&yC!+8f4M7V32u3eUMe7W%Y z+;0+A6W%fMWdGkZZI|H^FBkQ5m+EJpy)}1+iU$#_TPX0^{+$60edx( zId5m5kNVkd@UHK1{=tBPZTmMqd8`=w>~2|3K}(^u`Lvoh&rC(Ox4fU&WTd!p_Vpia zCYM|!c=*}xPb=kF+^(^!Lhujk-gDP;J9rIxw~_3QWD>l=3_Fsuzxoa$Hno>#d`FZ=Pg zYih4oXSW>cKPfv;;j|og0aMJ@TQO5st2{E?62uxBdNRexMJZ5hn)pR8QSCK0Gu-mG zzj0U_A<$swpd_bUUU4XNwePE&!F_yvkr8oQ4*mZ9-ooDY>AQDf8yXT*^duB^Pk;L2 zfkfoD4gTe~DWM4fGndmO diff --git a/src/main/resources/assets/andromeda/textures/item/lockpick.png b/src/main/resources/assets/andromeda/textures/item/lockpick.png index 6fd052267b6667f9981c1ee3563945db3e5debb6..5f0205526164aa3ed16d287059849fb1dab85319 100644 GIT binary patch delta 507 zcmcbnF@QzZPp>dW+5(%BUBul zRy2k=e}BlmCwymkW+6{hYnz;Rn6r2BTHdve0$&<3ax=BEICtJ{o+2diWxm~?^FQU! z{gf>T-?S=k>kkKWt~84W(~~}muKYXGtnEcg183ycPX|vpO<7j|wXmD}!7=S~kLs^3 zR@D)W5qc2(Iql#_D}&8}C%E4;{mqKHCNrPu@v>sa3Er?-5~30xYcx4=44$K6FaKH z35g{#{g{1*U-6l0`^sU{Uyyj^d9mn>T6X`P_oOWw?)h5mUh{p5ti}DNgYA2APBBz4lpArbSHB?K zzAyVll<3aCYl>^wFAC|z9=vDQvvfiE+LODjrHX%NpD(YAKgnHmGQz`8l7WGtgtNdS zvY3HEPZ@+6E0)@qF)%QAdAc};RNP9IsB&55^K7e6T;5ajvuMM!ef#1znKox^U|c+lQ`(^~jfEkzDREc29s~FJj#)uUdv7o> PFfe$!`njxgN@xNA4w&Ts literal 5206 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s-II2P-N`ey06$*;-(=u~X z6-p`#QWa7wGSe6sDsDXukM28c#`EX8W);iCE6rAYa$*;xzxoF+TENoZjlwe zGfZ5&ukd7Aru}|>KJVXwgGaLF^h*VCh_!p`6}BxZvp=dUeVwcyjijlo7;oP(?CzfSiuF5U#<(3ogGurYV|NHRNiB5CH zjXSz_*m_IaPvns-NabYfQxP;*;S1N#WXg9`4RTnP$$IJ=%V)XS(r*5J;nPwDm*gM* z*|#;iG3NE-D=#{0rye{xtIbp)JSx}Xsk8OZMI`y6g@&2>M7 zymX=_Y3^K9vugFeHmTLuLW&=&@$%kt>h_J!s$9&wbj!}O`H9`L^D+9v8rPo|c>QxUuY&dVtL8-@vti9Je<>xdSma!aCj$lsKcyn-OXi*<~ zakKFo_ZM8}JudMVN%0;#u;6w_?efXHkIs4c$9m7q6_d^XX%?pid{-)-Us-)5N_w}; z+@80&77kmR-W~q2Y^G`d+pjB4;w|@R{ogK}tI@tNQG11@rT+@UwWhq%>EUleHvCU9 zYyT8nIoHF;ckP4NW0fina`AHVa>DmMA6Zu%-E?w4)1_t41UZg>;N|&PdCTZ_JBROv z`)<#eT7I@1ac0>!?V0HDxI60}Sr_Zc%bV`=-MUEB`G$JczIX3EKIi<6zI`=irP%&O z=Jh=4R&Kjrc%19`82@5|wp)3`16A9L2iV>n4&?oLqW#muF!P&#&*X18KH-_SiG@68 zEB}U=07Lth=Prl$FdjdAb>{Y}$Ba_XcrE0-KC{X2Uo^-+@Nuo!PxXio`k70M+gpE{ zN%$|RWRP6Cacz`1)X>{k^-@clI*3RLxwO7S0l2dfMaIq9nE5 zTEF5hHY@xx=<)2FS!J_zhTHLvrTqNy?+@9m{=C!vc*7)P$p?a+%0A{gk9Z&5^!0we z$6qGF)l<<=KoiRGo`d^nDfQv)?=aV)mv37j!S|fA;O#o#QW= zCoEexEx)1JIbn~(&DXN`?%uw4dw=?@zkeA{au=QC?l>UIz`$FU84^(v;p=0SoS&ls47Yg zuJQ{>uF6ifOi{A8m(KO)W`OsL0L9E4HezRRWu9l~-&964qBz04piUwpEJo z4N!2-FG^J~(KFFA&~>fIEHhHF<5I9GN=dT{a&dziQIwKqtCUevQedU8UtV6WS8lAA zUzDzIXlZGwZ(yWvWTab^lBQc+nOBlnp_^B%3^D>@hD&O3a#3bMNoIbY0?5q7r2Ntn zTO}nf1qB7D;T5?BzP@nd^NOLNker{ZUy)d#Z>VRWpPQ?XtfRQZwX6icj^dEYf>iyW z)Z+ZoqU2Q9vedj1Wn?2#lHvLbN{e#9-bqQ;Pt8fqP0cGQ);H8MM6uG{(>DOF0~7@5 znYjgET@|?nC@M=b(-47$;v0|**gMD$smLvWn~S0v=6A4Sa2Q#+K5w6sVvMKa1Wuec;J zFF6%tR7GxqUS?*Bl|izRfvJgkvTmZGWs0sznsJJ*WtxShu2E{5QL>qtS(Y>;M=WN2V+YGeR* zO-izrTYgb)Vu`I%W^Q77s(wLUI#>b};8u0>P@GtnngaF)Tq-#uF)uwe#a0QLU}0J^u_T6M zvm{FcQ*$%jWQ)W!T@y1?OI^#<6k}bJ)Ffj|)1+h*Gh;JU(~I-dO3D+9QXSJ%^Ga-$ z+%t0vz+t7J0gWn6RQ2TH2r6@EiJ|d8ODhxY1|x?NMQuI$g*q`3I3L-U&UGB7YmmbgZgIOper+T;x2hGJ@pLV0FM zh61Re7~aSy&cMJh-P6S}#NzbT3x-^W3`80p{ulLEU|G0hXN8jZLFX&Kx0+A5wX~vf z%A^U7M@;>AMRK#7y7Q|W->Y-}xtmj7z5m{mx*Muu_VV91?2hxE))c#5^%Yxig<-&T zasGt0j|*(}CN|{oZGX#~E$dtSw?mzoIm|1uXJ+j@ormi#iyV#I$93dUpaN^VgO*%v l5*J$pN#Y4dKLe>krn#S*1-?eo699LhskbE*LBXix>g{B-$ass`+zOK58+p8x8 zF*X0Y-2UJ4|6$Ah%!exVn_bb`_O~+Q_EzN&Hiud-&Nv^Q_)OMjs$2dOhF@k6-)y=VT=t-bn@yf;lP2>6 z#ycxT_RMq0XZp2%VRh(}Z=273ls$54LkVm3Z-Z%V`?iX`f0uLa?Rwk$KWiE5JClkw z^v@0rWME+6EbxddW?;}$24TjErS@eE3=9SVJ|V6Q3=AvRt)I7K*_7!s8k#$^^NP~* zi>JgoRtH$xJ2^+0C^%|JDC_8JYA7fvN^x>>RXBZK!oa}5SQ6wH%;50sMj8VHL%yer zV@SoV+>?%cM+`Vv4hkgaoN@S<_y4x2hD_Kg51Cy%?(O^?`Z}iUkNx*e(@t5{E0zU! z{^~r{QJ}Ko?FpOP0R|FVdQ&MBb@0M1npb^rhX delta 990 zcmZo>{lh*%vYw5BfkFQB|3n4`#+FQH=KxPubtBc(DKIs^;#^>-g3+Dg0o3 z^y0~q7fP!C^fkA1e0;D&{{1`KclQ{b79R@PoXr$qdfMY?a#Fq7b}hEJi_HeV44NB` z_}EU2J9D78=I-I+*LQ22|77?5xkSJxHRc+nk205eyDOS2(k@@Jd@tM{;ThC%zVkTm zE`^WE*Hfq8w-A>Vt4KR>V#%{k=OalQo1gNfsXD99Q|r@M<@VF*T59WOvGlD$$!n`W ziL-saL-R3FZp%D}+DmgMd3!k`C&ncIErC(mP)sAn(n^mS!_ z#wN$ZDV(p_a)5z>L9)a(qQp5rH#aq}gu%HeHL)Z$MWH;iBtya7(>EZzkx!g~f$@r` zi(`nz>8+E`XGsN$wC@)T6mQeH)G4c}qO`56P4NkTWQ5K)$+iRq{e+mWoK9jl%dVzp zI9_7cIQC~L=fAW_3-*s-S zzndp+`&?yfP+$?C-txbWXVPX)k$RB3vGL~0#TB+DI_$i!*MC_Y`23J%W<9I#!nZIn{xKF<=hTla}T~Lsr>tN zI>YwuW;=KN$`n7->ips<*Gr!^>w1yxw^fCs5CcetE&kA*~)X~vjG+mo1OwKoXTlC_lsFfOwwGAmse*YfKI2|_oOZRh` zck&xI?9q6zcQ5~(xpNAttCcwq)}D;9aLF@2{_vmRrZ@FWvh^_ze@zknN4p;G{Eo=It zV;Ics3dR1fj?>Lt`Cw8*9wOt#eeb-=(;j8o9f zX`#zB8P}Q=!wDNY1XM26C)IHn$}eki>eJB@`uybLM8VG;_CMyXojPk4%Ym!H4d2vn z*GaR!H@l*>?Qdnq?XAimY!0gO>_%)p?h48n{ROYO@T7#QpWd_r6q7#RM4J@)?w!^(B*=Pg+_W%`W& zSqu%$o!NOs>G{PDNfl21q4rMBS}vh_X11!@2Fg16S}LXzI+k)0>YSWhDql`|GB7YO zmIV0)GdMiEk;cHl(CF#n7*cVoKKGQjShE3-bD%i$PtAi9Z~l+E&GO>qf?0dBPup5O zP2X7-@mI~BbJLUEu~sLpMN}|Le{a=kwUfG+r99pC`a3fQ<#^N00>Wk+EO(YG_;_?3 z?w=^NzJEc1L-VqqiJphscJ%qFO;@?RV_8G+lSyZjI?|S(RQ?ttKlA$kYUT`P_6-8x U)&Es7FfcH9y85}Sb4q9e09|Pw)&Kwi delta 1052 zcmZ3&x{G6iWIY=L1B3kM|A`C?j4heY&HPZRn6U-*YT}uQux96 z=*5#IFO*dO>1%H3`1oLl{QGyd@9r@=Ej|>oIh!fK^t8v( z@v)s4cjiEG&E3PtukY44|HL*^^f&z{n zQO)YRkMHiCyZ3MPva9#`JClkws6L!Gm4ShQEy>&6g#iqHI`6KZJdaVLp1s7=*OmPl zn*L?|D9_di?==tyx~b zAD>t+8XuIA35kk)SQ6kQgFqlJtH zB~x#2IQOl+G%^9xq~XowDGB=hkC4zH40!x%K}w$HkCa;!Eop zM2|1smk@mZw#B;k$5j%$PTk#Lci_>bP5cX3T=xWssA>q^_7$$4yKLU}mHIdCw3SL- zS17e%_;O_rze1U3q4U$@=cS{1r5L{M;qA9G{GG+@dRbHcO~MN;b;gNHmIW2h`l~!+ z*~!DdAD38H&hZqg{?`|_*v)W5-<6L)O0O!dWT`)y7T#W75MrmE9;q@_;q7Z}2Du-( zOZwcG?de(5dLk|SWTe>i>G#_hi!XEf^`AcxDK>ec0mI~p2Ajl`(j!wguRe3eFYv}q z_i4(18)jX8vZChPnKvTKkEhRA=6NT;bLq3n&EKY7e!O{}rP;!Od@I`qjsRU*t_J=M zTYfYhI%j9PJlRw4^Q60PZRgok-!c~OmbcuHdn-5m#qQSK6L!92nH@d*P2PLO(}MeC zYSK1uU_EgCmF48BrmU9}><%cfI80M^?yN6a{NHK&uKpB-zz6kL@-HV|`|nV|XaGuN Mp00i_>zopr0Arcy9smFU diff --git a/src/main/resources/resourcepacks/dark/assets/andromeda/textures/gui/fletching.png b/src/main/resources/resourcepacks/dark/assets/andromeda/textures/gui/fletching.png index 629f72dcdbe7080bd0bf6c362a4ec4fefc9c04af..263b9bfd6253a70d225bb84db99a8b62c20593b6 100644 GIT binary patch delta 691 zcmcaBxSw@`L_G^L0|Udln604<3=EtF9+AZi4BSE>%y{W;-5&-927>^f5LX5Uh8s6- zY}~kU+O%oe+1Z`x>S<|dyUh7RLqjwCpinTuNsC(pW_ z>(eLqjJa->%-ePE8Fuj4*7DBI*DJBw_lJ4IX|@+}_ZVVr4-~GS9mQbFdiUmaW|{8~ zm4i4JEMH*V{bMG><9a9YT*d>QF8khp7h1(W;hm16J^zQF!87*RZpr<@cl5ji*NQ^k z9SiTuv90|PJAvty4ZEJ>0%gsADn5*%_gJUDoxZTQfhYg)qXy5<4DD-!8+U{<>Aih0 zhie*xiRX6)3m!k#)vQ~ZgAeXv)QYflxMRgwCGB-$t=I)VtDjknc?GxXs~Gth7#JAr z7!rE+?#eu$d}jBOl;{7M;#^-}wp3Zhe*e}?>4fDB@eB(8)>~E?vw9Rd%x9>1YpmeP z7cz5q;pZ z#P5w44(u0K*x266W(^W#U|=|~m(foxOmdKI;Vst E0Mn2M;s5{u literal 2269 zcmeAS@N?(olHy`uVBq!ia0y~yU}OMc4rT@hhU_&FAq))63;{kNt_%zeVq#(%a@-ac z7M^CJ8Gds9{{Eq%p=oJp+1c6Clo@uJ^LM7JPn$Mv*(fz!8 z85kHOOI#yLg7ec#$`gxH8440J^GfvcQcDy}^bGV2Ew5bLl)}KkV(;nV7*Y}U_SWmD z)m9>IiPe{`g?|0Fe%jQ->fHLrL1T9?LtuT%g2;my5W zXE)BB({QcIbZur>zV6!pKlW)dFL?a={o`a|b36OTC2uc@M_pcH)4-R%faOEJz>TH3 zYcs=onR-~<#G)>*iDH$w_V!tx__iKK4}~@R#V^cCyQ=3PaN(Eg0@Jgvv>a}2-S1%? zAI{R@eedV}y1%~`H(WDWJ&kcs!?u`rjB7K)!WsANudjRb==}4;4`n_T@4jljXVubm z4W}5VMAxpo&-niR?YBQ`tYrCacYk^CT8jC{*Xh;bE94c{#WN*pYaghS=lqhI@#FuV zbu1Uw*Y8Q?OxW^DXg=$=-`N#1?iIJg<@z{Q@co_zLrWKDqeP`St z;PBr}BF}8+p?6YD2?ymHSBc$YKcK|$FV|msE9(I#hO2B03=A*!Y-R;z+Xd?9H^I*`u-wlX6=Cso87lD7xetU%6z$Q@4j579k#cE zUN$^7~si(yTwOUS{{X9NS zpw;^v5XJD~rZfiwLl@(V{>eesXRmaBpTc(G?Tv-Wxz%9RAOaNpAR3J8{?81`t>$8W zvCn(egT1n6uLM_nF~9JV)~Yc4pUV$c!oa|=;PW{#7@NUir?utIZz60LYNv-BthS!D za{0F@Y!{}Qg?vc*cUumo4DLXXKtoY^QPEpXo(paa3=9qDtfOrk-tAq+b?^RFAKR_V zO&adywsGxS_!p;zyLW;t%ur@v*ueWCkZHl~AJ21_F)`eAJAc>d=JofCR(C7&7gk)d z{LHY7+2L{yL&hv#2H(w$3o^|ZOwO`3EW62Y!9<#2R@xwte9RF0U0&s0;Ni6mZ`Odq N#?#f$Wt~$(696lb1H}LU diff --git a/src/main/resources/resourcepacks/dark/assets/andromeda/textures/gui/merchant_inventory.png b/src/main/resources/resourcepacks/dark/assets/andromeda/textures/gui/merchant_inventory.png index 475d4a282b6818a95a4649558ec7d68ad62c68e3..2037e2e7f1bb2d18731430e14f338b11924590b4 100644 GIT binary patch delta 715 zcmdnbb)9vBL_G^L0|Udln604<42%Vt&dvdu$;k{16}P5dwDxcclsW!!{jJ%H7B+RX zS%(Chg}5w^P;qQp(HQ3Z{UP_B@SWkAg*;KMZF1gW&fdjqdDl7$d}+wY&D6@`+gj^6yNuwiop&4V;l%KOH>bG-cV> z!fx&d$F$Eqs=vBeRYx>N=t1!3w1Xe53^oUz;C|2aH!JFz%zUQD%ZeS3e_yoz${(dU zLdSYHNb;Vye8;{dqdfGB8{VFbT?;MyuCC#n-tsjkaA}y{0_#K_cNcjHwF63y zP97Q}Cnqdzn9jo{B$mkZqki@oe#K|bB7r9+Il3mzld&>NlKaTMfAiK!!IK$w?D~7* zSIX`D#TWMRUfq;iFL$f#D~C;gLE@F?#iBE6+5LCkleTQQ=WDTh&G#v?7WbPDw(rR~ z#ZbXeZp67>{ep1&zU&uKqC5YtDXw9^D5Mj6@Sa`I(go#fPwuvsD*l~)zPv8J{v>zN z$p{ZWNd^W6&H|6fVg?31We{epSZZI!z`!6H;1lBd|NsBAw6xIBP=9}a3kwS|F);=P z2Kl2V`xzJ*7)yfuf*Bm1-AH3#V7Tw;;uunK>+MZzz9t8ewu>uYaK2*Fh+ufZ)Ukv4 z#l@z-`Uek19{4cBWm55~=(?x#@6-!SlX*5_jYjc~)|B@~?OAbx7g8^ny=0uqz{teH zA@D(+G1%mtjTw8-VgLP~1r!__K;m=E7w9jZ+wQ9Y;pT8w_*{Iw;PFnggpPIWvQVuG z4{{j48|{)Q2@#tJ(!?R4a6oBO2MY(p6tRi>7c#7lZ~+_0A&?+?yM<|&mF^X_+~x z3=A3*YbV-z9Cna78Xvq>OO##Pqwqw)+%?Tz7SpuE4mxFOZ+Vqa^itd;(<3NGhV^<= zvwU|byLfu6Yz(X82j(MJk9uBo_4*SZlp*-~V4?lJyVZC0GPhLCT$vWm5@34TmJ7xL_CMGemi(R8{sKNm6ueVi&XS|73Z_xJO5(#rUMsrFYJHz?b@B= zFPSGSTQ@Dgq1icMkHgK^viI)ZzIS_n`mDcy8BTH+on(&Yy2QZ1z?S6g?!sWi5XNvn z=KtAy3=9mM1s;*b3=De8Ak0{?)V_>?fq}im)7O>#Ihzz0hfc%u1%DVA7$i$vBTAg} zb8}PkN*J7rQWHy3QxwWGOEMJPJ$(bh8~MZ;7?{O8T^vIyZoR#GFn6_sh{Hv9k&8^# zTnj|Q@)Em>xHlJxmK?knIzhDSiA!9{fy6VGr}tO@Z`DLK3&Gr44H%5*mo|O zGKVd6N8Ea)4HNn0>#~gd7HePYt+D%e_-|dgmQ2*`ZG}5yl%DU|A*8XN>BB>IMg|rJ z0R{(9(nDi3aMeuXo3U)=5BrPXYtMYnImh|DB=&i5L@~oP@l8hzcnr^Pwp5?lY+W9?D_pw?*~+sr@xkTX z2<>ol;0&;V4Z>Bs_z&dYo?YBx`DS@%hw4%h!H>xwn|d9d$t0e8?6zQAuCkKS^F908 zZ$9QqsAcrJQIYKTQbxMbh8br_F)%VP7O*HV9N@gkk#g?g^9}OSjb|+X$VfN-dr7t# z^Os9EKIq6{DT4Uvzixg@PSU~Uh*96-!%Ma1G3J!BUbvHIzPyqD pzvp^}ux{mrm%i&U3>?UR#XU2ubL!{j{!<`Fc)I$ztaD0e0swF^$A Date: Sat, 9 Dec 2023 12:17:18 +0700 Subject: [PATCH 17/23] Fix minecart entity types not getting bootstrapped. --- .../andromeda/modules/entities/minecarts/Minecarts.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 9201b9b8..989f843e 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 @@ -15,7 +15,7 @@ public class Minecarts extends Module { @Override public void onMain() { - Common.bootstrap(MinecartItems.class); + Common.bootstrap(MinecartItems.class, MinecartEntities.class); } @Override -- 2.51.2 From 31bfa830c90f5d59a9b925c97dd934c6c7cdabd5 Mon Sep 17 00:00:00 2001 From: melontini <104443436+melontini@users.noreply.github.com> Date: Sat, 9 Dec 2023 12:32:14 +0700 Subject: [PATCH 18/23] Replace `get` with `orThrow` in places where the keeper must be present. --- .../andromeda/common/registries/Common.java | 2 +- .../andromeda/common/registries/Keeper.java | 40 ++++++++++++++----- .../FletchingScreenHandler.java | 2 +- .../mixin/BeeEntityMixin.java | 2 +- .../boats/entities/BoatEntityWithBlock.java | 2 +- .../boats/entities/FurnaceBoatEntity.java | 2 +- .../boats/entities/HopperBoatEntity.java | 2 +- .../boats/entities/JukeboxBoatEntity.java | 2 +- .../boats/entities/TNTBoatEntity.java | 2 +- .../entities/AnvilMinecartEntity.java | 6 +-- .../entities/JukeboxMinecartEntity.java | 6 +-- .../entities/NoteBlockMinecartEntity.java | 6 +-- .../infinite_totem/mixin/ItemEntityMixin.java | 2 +- .../mixin/LivingEntityMixin.java | 10 ++--- .../MerchantInventoryScreenHandler.java | 2 +- .../mixin/MinecartItemMixin.java | 8 ++-- .../throwable_items/FlyingItemEntity.java | 4 +- .../modules/misc/unknown/Content.java | 2 +- .../modules/misc/unknown/RoseOfTheValley.java | 2 +- 19 files changed, 63 insertions(+), 41 deletions(-) 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 77ffa259..ac41f012 100644 --- a/src/main/java/me/melontini/andromeda/common/registries/Common.java +++ b/src/main/java/me/melontini/andromeda/common/registries/Common.java @@ -29,7 +29,7 @@ public class Common { if (keeper.initialized()) throw new IllegalStateException("Registry object bootstrapped before the registry itself!"); try { - keeper.init(); + keeper.init(field); } catch (Throwable t) { throw new IllegalStateException("Failed to bootstrap registry object %s!".formatted(field.getName()), t); } diff --git a/src/main/java/me/melontini/andromeda/common/registries/Keeper.java b/src/main/java/me/melontini/andromeda/common/registries/Keeper.java index e6af2052..70435cb0 100644 --- a/src/main/java/me/melontini/andromeda/common/registries/Keeper.java +++ b/src/main/java/me/melontini/andromeda/common/registries/Keeper.java @@ -1,7 +1,9 @@ package me.melontini.andromeda.common.registries; import me.melontini.dark_matter.api.base.util.MakeSure; +import org.jetbrains.annotations.Nullable; +import java.lang.reflect.Field; import java.util.HashSet; import java.util.Set; import java.util.concurrent.Callable; @@ -12,6 +14,8 @@ public class Keeper { private Supplier> supplier; private T value; + private Field field; + private final Set> consumers = new HashSet<>(); public Keeper(Supplier> supplier) { @@ -23,30 +27,48 @@ public class Keeper { } public boolean isPresent() { - return value != null; + return this.value != null; } public void ifPresent(Consumer consumer) { - if (value != null) consumer.accept(value); + if (this.value != null) consumer.accept(this.value); } public boolean initialized() { - return supplier == null; + return this.supplier == null; } public Keeper afterInit(Consumer consumer) { - consumers.add(consumer); + this.consumers.add(consumer); return this; } - void init() throws Exception { - value = supplier.get().call(); - supplier = null; + public @Nullable Field getField() { + return this.field; + } + + void init(@Nullable Field f) throws Exception { + this.value = this.supplier.get().call(); + this.supplier = null; + this.field = f; - consumers.forEach(consumer -> consumer.accept(get())); + this.consumers.forEach(consumer -> consumer.accept(get())); } public T get() { - return value; + return this.value; + } + + public T orThrow() { + return orThrow("No value present! Keeper (%s) not bootstrapped?".formatted(field == null ? "UNKNOWN" : field.getName())); + } + + public T orThrow(String msg) { + return orThrow(() -> new IllegalStateException(msg)); + } + + public T orThrow(Supplier e) throws X { + if (this.value == null) throw e.get(); + return this.value; } } diff --git a/src/main/java/me/melontini/andromeda/modules/blocks/better_fletching_table/FletchingScreenHandler.java b/src/main/java/me/melontini/andromeda/modules/blocks/better_fletching_table/FletchingScreenHandler.java index 5f271c68..ece08a43 100644 --- a/src/main/java/me/melontini/andromeda/modules/blocks/better_fletching_table/FletchingScreenHandler.java +++ b/src/main/java/me/melontini/andromeda/modules/blocks/better_fletching_table/FletchingScreenHandler.java @@ -21,7 +21,7 @@ public class FletchingScreenHandler extends ForgingScreenHandler { } public FletchingScreenHandler(int syncId, PlayerInventory playerInventory, ScreenHandlerContext context) { - super(Content.FLETCHING.get(), syncId, playerInventory, context); + super(Content.FLETCHING.orThrow(), syncId, playerInventory, context); } @Override diff --git a/src/main/java/me/melontini/andromeda/modules/entities/bee_flower_duplication/mixin/BeeEntityMixin.java b/src/main/java/me/melontini/andromeda/modules/entities/bee_flower_duplication/mixin/BeeEntityMixin.java index 943ffb3e..4ed5beab 100644 --- a/src/main/java/me/melontini/andromeda/modules/entities/bee_flower_duplication/mixin/BeeEntityMixin.java +++ b/src/main/java/me/melontini/andromeda/modules/entities/bee_flower_duplication/mixin/BeeEntityMixin.java @@ -70,7 +70,7 @@ abstract class BeeEntityMixin extends AnimalEntity { if (world.getBlockState(pos).getBlock() instanceof AirBlock && flowerBlock.canPlaceAt(flowerState, world, pos)) { if (world.random.nextInt(12) == 0) { if (ModuleManager.get().getModule(Unknown.class).isPresent() && world.random.nextInt(100) == 0) { - world.setBlockState(pos, Content.ROSE_OF_THE_VALLEY_BLOCK.get().getDefaultState()); + world.setBlockState(pos, Content.ROSE_OF_THE_VALLEY_BLOCK.orThrow().getDefaultState()); } else { world.setBlockState(pos, flowerState); } diff --git a/src/main/java/me/melontini/andromeda/modules/entities/boats/entities/BoatEntityWithBlock.java b/src/main/java/me/melontini/andromeda/modules/entities/boats/entities/BoatEntityWithBlock.java index a65b3517..f7acafc5 100644 --- a/src/main/java/me/melontini/andromeda/modules/entities/boats/entities/BoatEntityWithBlock.java +++ b/src/main/java/me/melontini/andromeda/modules/entities/boats/entities/BoatEntityWithBlock.java @@ -4,7 +4,7 @@ import net.minecraft.entity.EntityType; import net.minecraft.entity.vehicle.BoatEntity; import net.minecraft.world.World; -public class BoatEntityWithBlock extends BoatEntity { +public abstract class BoatEntityWithBlock extends BoatEntity { protected final static float PIby180 = (float) (Math.PI / 180.0); protected final static float PIby2 = (float) (Math.PI / 2); public BoatEntityWithBlock(EntityType entityType, World world) { diff --git a/src/main/java/me/melontini/andromeda/modules/entities/boats/entities/FurnaceBoatEntity.java b/src/main/java/me/melontini/andromeda/modules/entities/boats/entities/FurnaceBoatEntity.java index 09ac2919..f30099cc 100644 --- a/src/main/java/me/melontini/andromeda/modules/entities/boats/entities/FurnaceBoatEntity.java +++ b/src/main/java/me/melontini/andromeda/modules/entities/boats/entities/FurnaceBoatEntity.java @@ -29,7 +29,7 @@ public class FurnaceBoatEntity extends BoatEntityWithBlock { } public FurnaceBoatEntity(World world, double x, double y, double z) { - this(BoatEntities.BOAT_WITH_FURNACE.get(), world); + this(BoatEntities.BOAT_WITH_FURNACE.orThrow(), world); this.setPosition(x, y, z); this.prevX = x; this.prevY = y; diff --git a/src/main/java/me/melontini/andromeda/modules/entities/boats/entities/HopperBoatEntity.java b/src/main/java/me/melontini/andromeda/modules/entities/boats/entities/HopperBoatEntity.java index 260c356c..81dc0cb8 100644 --- a/src/main/java/me/melontini/andromeda/modules/entities/boats/entities/HopperBoatEntity.java +++ b/src/main/java/me/melontini/andromeda/modules/entities/boats/entities/HopperBoatEntity.java @@ -28,7 +28,7 @@ public class HopperBoatEntity extends StorageBoatEntity implements Hopper { } public HopperBoatEntity(World world, double x, double y, double z) { - this(BoatEntities.BOAT_WITH_HOPPER.get(), world); + this(BoatEntities.BOAT_WITH_HOPPER.orThrow(), world); this.setPosition(x, y, z); this.prevX = x; this.prevY = y; diff --git a/src/main/java/me/melontini/andromeda/modules/entities/boats/entities/JukeboxBoatEntity.java b/src/main/java/me/melontini/andromeda/modules/entities/boats/entities/JukeboxBoatEntity.java index 7c41e07f..b79d6e55 100644 --- a/src/main/java/me/melontini/andromeda/modules/entities/boats/entities/JukeboxBoatEntity.java +++ b/src/main/java/me/melontini/andromeda/modules/entities/boats/entities/JukeboxBoatEntity.java @@ -37,7 +37,7 @@ public class JukeboxBoatEntity extends BoatEntityWithBlock implements Clearable } public JukeboxBoatEntity(World world, double x, double y, double z) { - this(BoatEntities.BOAT_WITH_JUKEBOX.get(), world); + this(BoatEntities.BOAT_WITH_JUKEBOX.orThrow(), world); this.setPosition(x, y, z); this.prevX = x; this.prevY = y; diff --git a/src/main/java/me/melontini/andromeda/modules/entities/boats/entities/TNTBoatEntity.java b/src/main/java/me/melontini/andromeda/modules/entities/boats/entities/TNTBoatEntity.java index e7baae2f..e1d3ae2c 100644 --- a/src/main/java/me/melontini/andromeda/modules/entities/boats/entities/TNTBoatEntity.java +++ b/src/main/java/me/melontini/andromeda/modules/entities/boats/entities/TNTBoatEntity.java @@ -36,7 +36,7 @@ public class TNTBoatEntity extends BoatEntityWithBlock { } public TNTBoatEntity(World world, double x, double y, double z) { - this(BoatEntities.BOAT_WITH_TNT.get(), world); + this(BoatEntities.BOAT_WITH_TNT.orThrow(), world); this.setPosition(x, y, z); this.prevX = x; this.prevY = y; diff --git a/src/main/java/me/melontini/andromeda/modules/entities/minecarts/entities/AnvilMinecartEntity.java b/src/main/java/me/melontini/andromeda/modules/entities/minecarts/entities/AnvilMinecartEntity.java index 3722512e..b145d753 100644 --- a/src/main/java/me/melontini/andromeda/modules/entities/minecarts/entities/AnvilMinecartEntity.java +++ b/src/main/java/me/melontini/andromeda/modules/entities/minecarts/entities/AnvilMinecartEntity.java @@ -26,7 +26,7 @@ public class AnvilMinecartEntity extends AbstractMinecartEntity { } public AnvilMinecartEntity(World world, double x, double y, double z) { - super(MinecartEntities.ANVIL_MINECART_ENTITY.get(), world, x, y, z); + super(MinecartEntities.ANVIL_MINECART_ENTITY.orThrow(), world, x, y, z); } @Override @@ -56,7 +56,7 @@ public class AnvilMinecartEntity extends AbstractMinecartEntity { @Override public Item getItem() { - return MinecartItems.ANVIL_MINECART.get(); + return MinecartItems.ANVIL_MINECART.orThrow(); } @Override @@ -71,6 +71,6 @@ public class AnvilMinecartEntity extends AbstractMinecartEntity { @Override public ItemStack getPickBlockStack() { - return new ItemStack(MinecartItems.ANVIL_MINECART.get()); + return new ItemStack(MinecartItems.ANVIL_MINECART.orThrow()); } } diff --git a/src/main/java/me/melontini/andromeda/modules/entities/minecarts/entities/JukeboxMinecartEntity.java b/src/main/java/me/melontini/andromeda/modules/entities/minecarts/entities/JukeboxMinecartEntity.java index feec66a8..c8d58490 100644 --- a/src/main/java/me/melontini/andromeda/modules/entities/minecarts/entities/JukeboxMinecartEntity.java +++ b/src/main/java/me/melontini/andromeda/modules/entities/minecarts/entities/JukeboxMinecartEntity.java @@ -38,7 +38,7 @@ public class JukeboxMinecartEntity extends AbstractMinecartEntity implements Cle } public JukeboxMinecartEntity(World world, double x, double y, double z) { - super(MinecartEntities.JUKEBOX_MINECART_ENTITY.get(), world, x, y, z); + super(MinecartEntities.JUKEBOX_MINECART_ENTITY.orThrow(), world, x, y, z); } @Override @@ -154,7 +154,7 @@ public class JukeboxMinecartEntity extends AbstractMinecartEntity implements Cle @Override public Item getItem() { - return MinecartItems.JUKEBOX_MINECART.get(); + return MinecartItems.JUKEBOX_MINECART.orThrow(); } @Override @@ -164,7 +164,7 @@ public class JukeboxMinecartEntity extends AbstractMinecartEntity implements Cle @Override public ItemStack getPickBlockStack() { - return new ItemStack(MinecartItems.JUKEBOX_MINECART.get()); + return new ItemStack(MinecartItems.JUKEBOX_MINECART.orThrow()); } @Override diff --git a/src/main/java/me/melontini/andromeda/modules/entities/minecarts/entities/NoteBlockMinecartEntity.java b/src/main/java/me/melontini/andromeda/modules/entities/minecarts/entities/NoteBlockMinecartEntity.java index 58ee0829..37c85ae7 100644 --- a/src/main/java/me/melontini/andromeda/modules/entities/minecarts/entities/NoteBlockMinecartEntity.java +++ b/src/main/java/me/melontini/andromeda/modules/entities/minecarts/entities/NoteBlockMinecartEntity.java @@ -35,7 +35,7 @@ public class NoteBlockMinecartEntity extends AbstractMinecartEntity { } public NoteBlockMinecartEntity(World world, double x, double y, double z) { - super(MinecartEntities.NOTEBLOCK_MINECART_ENTITY.get(), world, x, y, z); + super(MinecartEntities.NOTEBLOCK_MINECART_ENTITY.orThrow(), world, x, y, z); } @Override @@ -107,7 +107,7 @@ public class NoteBlockMinecartEntity extends AbstractMinecartEntity { @Override public Item getItem() { - return MinecartItems.NOTE_BLOCK_MINECART.get(); + return MinecartItems.NOTE_BLOCK_MINECART.orThrow(); } @Override @@ -117,7 +117,7 @@ public class NoteBlockMinecartEntity extends AbstractMinecartEntity { @Override public ItemStack getPickBlockStack() { - return new ItemStack(MinecartItems.NOTE_BLOCK_MINECART.get()); + return new ItemStack(MinecartItems.NOTE_BLOCK_MINECART.orThrow()); } public void cycleNote() { diff --git a/src/main/java/me/melontini/andromeda/modules/items/infinite_totem/mixin/ItemEntityMixin.java b/src/main/java/me/melontini/andromeda/modules/items/infinite_totem/mixin/ItemEntityMixin.java index 1209ff3f..dbec86c2 100644 --- a/src/main/java/me/melontini/andromeda/modules/items/infinite_totem/mixin/ItemEntityMixin.java +++ b/src/main/java/me/melontini/andromeda/modules/items/infinite_totem/mixin/ItemEntityMixin.java @@ -136,7 +136,7 @@ abstract class ItemEntityMixin extends Entity { ((ServerWorld) world).spawnParticles(ParticleTypes.END_ROD, this.getX(), this.getY(), this.getZ(), 15, 0, 0, 0, 0.4); - ItemEntity entity = new ItemEntity(world, this.getX(), this.getY(), this.getZ(), new ItemStack(Content.INFINITE_TOTEM.get())); + ItemEntity entity = new ItemEntity(world, this.getX(), this.getY(), this.getZ(), new ItemStack(Content.INFINITE_TOTEM.orThrow())); this.discard(); andromeda$itemEntity.discard(); world.spawnEntity(entity); diff --git a/src/main/java/me/melontini/andromeda/modules/items/infinite_totem/mixin/LivingEntityMixin.java b/src/main/java/me/melontini/andromeda/modules/items/infinite_totem/mixin/LivingEntityMixin.java index 1a3ec218..5496b0e8 100644 --- a/src/main/java/me/melontini/andromeda/modules/items/infinite_totem/mixin/LivingEntityMixin.java +++ b/src/main/java/me/melontini/andromeda/modules/items/infinite_totem/mixin/LivingEntityMixin.java @@ -42,24 +42,24 @@ abstract class LivingEntityMixin extends Entity { @ModifyExpressionValue(method = "tryUseTotem", at = @At(value = "INVOKE", target = "Lnet/minecraft/item/ItemStack;isOf(Lnet/minecraft/item/Item;)Z")) private boolean andromeda$infiniteFallback(boolean original, DamageSource source, @Local(index = 3) ItemStack itemStack) { - return original || itemStack.isOf(Content.INFINITE_TOTEM.get()); + return original || itemStack.isOf(Content.INFINITE_TOTEM.orThrow()); } @WrapWithCondition(method = "tryUseTotem", at = @At(value = "INVOKE", target = "Lnet/minecraft/item/ItemStack;decrement(I)V")) private boolean andromeda$infiniteFallback(ItemStack instance, int i) { - return !instance.isOf(Content.INFINITE_TOTEM.get()); + return !instance.isOf(Content.INFINITE_TOTEM.orThrow()); } @SuppressWarnings("InvalidInjectorMethodSignature") @Inject(at = @At(value = "INVOKE", target = "Lnet/minecraft/world/World;sendEntityStatus(Lnet/minecraft/entity/Entity;B)V", shift = At.Shift.BEFORE), locals = LocalCapture.CAPTURE_FAILSOFT, method = "tryUseTotem", cancellable = true) private void andromeda$useInfiniteTotem(DamageSource source, CallbackInfoReturnable cir, ItemStack itemStack) { if (am$itou.config().enabled) { - if (itemStack.isOf(Content.INFINITE_TOTEM.get())) { + if (itemStack.isOf(Content.INFINITE_TOTEM.orThrow())) { if (!world.isClient()) { PacketByteBuf buf = PacketByteBufs.create() .writeUuid(this.getUuid()) - .writeItemStack(new ItemStack(Content.INFINITE_TOTEM.get())); - buf.writeRegistryValue(Registry.PARTICLE_TYPE, Content.KNOCKOFF_TOTEM_PARTICLE.get()); + .writeItemStack(new ItemStack(Content.INFINITE_TOTEM.orThrow())); + buf.writeRegistryValue(Registry.PARTICLE_TYPE, Content.KNOCKOFF_TOTEM_PARTICLE.orThrow()); for (PlayerEntity player : PlayerUtil.findPlayersInRange(world, getBlockPos(), 120)) { ServerPlayNetworking.send((ServerPlayerEntity) player, AndromedaPackets.USED_CUSTOM_TOTEM, buf); diff --git a/src/main/java/me/melontini/andromeda/modules/items/lockpick/MerchantInventoryScreenHandler.java b/src/main/java/me/melontini/andromeda/modules/items/lockpick/MerchantInventoryScreenHandler.java index b3b6a8a5..6486c2c5 100644 --- a/src/main/java/me/melontini/andromeda/modules/items/lockpick/MerchantInventoryScreenHandler.java +++ b/src/main/java/me/melontini/andromeda/modules/items/lockpick/MerchantInventoryScreenHandler.java @@ -17,7 +17,7 @@ public class MerchantInventoryScreenHandler extends ScreenHandler { } public MerchantInventoryScreenHandler(int syncId, PlayerInventory playerInventory, Inventory inventory) { - super(Content.MERCHANT_INVENTORY.get(), syncId); + super(Content.MERCHANT_INVENTORY.orThrow(), syncId); this.inventory = inventory; inventory.onOpen(playerInventory.player); diff --git a/src/main/java/me/melontini/andromeda/modules/items/minecart_block_picking/mixin/MinecartItemMixin.java b/src/main/java/me/melontini/andromeda/modules/items/minecart_block_picking/mixin/MinecartItemMixin.java index 402d5d1c..d0f21e9c 100644 --- a/src/main/java/me/melontini/andromeda/modules/items/minecart_block_picking/mixin/MinecartItemMixin.java +++ b/src/main/java/me/melontini/andromeda/modules/items/minecart_block_picking/mixin/MinecartItemMixin.java @@ -181,7 +181,7 @@ abstract class MinecartItemMixin extends Item { if (!world.isClient()) { MobSpawnerBlockEntity mobSpawnerBlockEntity = (MobSpawnerBlockEntity) MakeSure.notNull(world.getBlockEntity(pos), "Block has no block entity. %s".formatted(pos)); if (!player.isCreative()) stack.decrement(1); - ItemStack spawnerMinecart = new ItemStack(MinecartItems.SPAWNER_MINECART.get(), 1); + ItemStack spawnerMinecart = new ItemStack(MinecartItems.SPAWNER_MINECART.orThrow(), 1); spawnerMinecart.setNbt(NbtBuilder.create().putString("Entity", String.valueOf(andromeda$getEntityId(mobSpawnerBlockEntity))).build()); @@ -196,7 +196,7 @@ abstract class MinecartItemMixin extends Item { NoteBlock noteBlock = (NoteBlock) state.getBlock(); if (!player.isCreative()) stack.decrement(1); int noteProp = noteBlock.getStateWithProperties(state).get(Properties.NOTE); - ItemStack noteBlockMinecart = new ItemStack(MinecartItems.NOTE_BLOCK_MINECART.get()); + ItemStack noteBlockMinecart = new ItemStack(MinecartItems.NOTE_BLOCK_MINECART.orThrow()); noteBlockMinecart.setNbt(NbtBuilder.create().putInt("Note", noteProp).build()); @@ -212,7 +212,7 @@ abstract class MinecartItemMixin extends Item { JukeboxBlockEntity jukeboxBlockEntity = (JukeboxBlockEntity) MakeSure.notNull(world.getBlockEntity(pos), "Block has no block entity. %s".formatted(pos)); ItemStack record = jukeboxBlockEntity.getRecord(); - ItemStack jukeboxMinecart = new ItemStack(MinecartItems.JUKEBOX_MINECART.get()); + ItemStack jukeboxMinecart = new ItemStack(MinecartItems.JUKEBOX_MINECART.orThrow()); if (!record.isEmpty()) { world.syncWorldEvent(WorldEvents.MUSIC_DISC_PLAYED, pos, 0); @@ -229,7 +229,7 @@ abstract class MinecartItemMixin extends Item { if (state.isOf(Blocks.ANVIL) && MinecartItems.ANVIL_MINECART.isPresent()) { if (!world.isClient()) { if (!player.isCreative()) stack.decrement(1); - ItemStack anvilMinecart = new ItemStack(MinecartItems.ANVIL_MINECART.get()); + ItemStack anvilMinecart = new ItemStack(MinecartItems.ANVIL_MINECART.orThrow()); player.getInventory().offerOrDrop(anvilMinecart); world.breakBlock(pos, false); } diff --git a/src/main/java/me/melontini/andromeda/modules/mechanics/throwable_items/FlyingItemEntity.java b/src/main/java/me/melontini/andromeda/modules/mechanics/throwable_items/FlyingItemEntity.java index ab9541e0..8da37b4a 100644 --- a/src/main/java/me/melontini/andromeda/modules/mechanics/throwable_items/FlyingItemEntity.java +++ b/src/main/java/me/melontini/andromeda/modules/mechanics/throwable_items/FlyingItemEntity.java @@ -18,12 +18,12 @@ public class FlyingItemEntity extends ThrownItemEntity { } public FlyingItemEntity(ItemStack stack, double d, double e, double f, World world) { - super(Content.FLYING_ITEM.get(), d, e, f, world); + super(Content.FLYING_ITEM.orThrow(), d, e, f, world); this.setItem(stack); } public FlyingItemEntity(ItemStack stack, Entity entity, World world) { - super(Content.FLYING_ITEM.get(), world); + super(Content.FLYING_ITEM.orThrow(), world); this.setOwner(entity); this.setItem(stack); } diff --git a/src/main/java/me/melontini/andromeda/modules/misc/unknown/Content.java b/src/main/java/me/melontini/andromeda/modules/misc/unknown/Content.java index f10dea86..43d0c0d2 100644 --- a/src/main/java/me/melontini/andromeda/modules/misc/unknown/Content.java +++ b/src/main/java/me/melontini/andromeda/modules/misc/unknown/Content.java @@ -20,5 +20,5 @@ public class Content { .item((block, id) -> ContentBuilder.ItemBuilder.create(id, () -> new RoseOfTheValley(block, new FabricItemSettings().rarity(Rarity.UNCOMMON)))) .register(() -> ModuleManager.quick(Unknown.class).config().enabled)); - public static final Keeper ROSE_OF_THE_VALLEY = Keeper.of(() -> () -> asItem(ROSE_OF_THE_VALLEY_BLOCK.get())); + public static final Keeper ROSE_OF_THE_VALLEY = Keeper.of(() -> () -> asItem(ROSE_OF_THE_VALLEY_BLOCK.orThrow())); } diff --git a/src/main/java/me/melontini/andromeda/modules/misc/unknown/RoseOfTheValley.java b/src/main/java/me/melontini/andromeda/modules/misc/unknown/RoseOfTheValley.java index e7e0d585..26adb53c 100644 --- a/src/main/java/me/melontini/andromeda/modules/misc/unknown/RoseOfTheValley.java +++ b/src/main/java/me/melontini/andromeda/modules/misc/unknown/RoseOfTheValley.java @@ -27,7 +27,7 @@ public class RoseOfTheValley extends BlockItem { } public static void handleClick(ItemStack stack, ItemStack otherStack, PlayerEntity player) { - player.getInventory().offerOrDrop(new ItemStack(Content.ROSE_OF_THE_VALLEY.get())); + player.getInventory().offerOrDrop(new ItemStack(Content.ROSE_OF_THE_VALLEY.orThrow())); stack.decrement(1); otherStack.decrement(1); if (player.world.isClient) { -- 2.51.2 From c852d432a2c29dab1652faef7120a5104afea51d Mon Sep 17 00:00:00 2001 From: melontini <104443436+melontini@users.noreply.github.com> Date: Sat, 9 Dec 2023 16:23:20 +0700 Subject: [PATCH 19/23] brighter incubator texture --- .../andromeda/textures/block/incubator.png | Bin 11480 -> 1078 bytes .../andromeda/textures/item/incubator.png | Bin 666 -> 656 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/src/main/resources/assets/andromeda/textures/block/incubator.png b/src/main/resources/assets/andromeda/textures/block/incubator.png index cb1643a8544731f9ce7a043a053c7f4099ffd374..761f299b62e75e5a4f410c49a13d6616a7f2b0a4 100644 GIT binary patch delta 1049 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 GGywp)A__AA delta 624 zcmbQhI*WCJN_}CbvvWXZaxw!$#jU9qtv#FqWsZMbA0?7#8X|D9pgqg0gDaD#Tg5}b z^g`APyPC%DTHm#F`y5waxR87@DzRgzP_%yircFv1Ti)LyWIZY^8aDW z{mk#O{I0Iu#(AN4kt8SEl8PkPR~5@9%kANLFgFqY98tQ3%?t6 zDd?aop^$%qx-r<V-JBM>Op|e~Nim$T zp+i9BLQ)-vq5QHIr#>C6dZEuxE>0Bu++qJ??%JudX0aT2%IolZa_;_Kr{iWxn44a2MfOa+pw#eg~7MMf;+-c&)|7gtZ2@}0|&oaXy-JrZU3BM@KuvF jYi(r8@-MD;{<4-Qv29D9+Z)2bz`)??>gTe~DWM4fYKs|@ -- 2.51.2 From 9f2573db248ab518154e04be4f383fb48a37688c Mon Sep 17 00:00:00 2001 From: melontini <104443436+melontini@users.noreply.github.com> Date: Sat, 9 Dec 2023 16:31:17 +0700 Subject: [PATCH 20/23] Magnet! --- .../modules/items/magnet/Content.java | 22 ++ .../modules/items/magnet/Magnet.java | 10 + .../items/magnet/items/MagnetItem.java | 208 ++++++++++++++++++ .../assets/andromeda/lang/en_us.json | 6 + .../assets/andromeda/models/item/magnet.json | 6 + .../assets/andromeda/textures/item/magnet.png | Bin 0 -> 642 bytes .../advancements/recipes/magnet.json | 42 ++++ .../data/andromeda/recipes/magnet.json | 30 +++ 8 files changed, 324 insertions(+) create mode 100644 src/main/java/me/melontini/andromeda/modules/items/magnet/Content.java create mode 100644 src/main/java/me/melontini/andromeda/modules/items/magnet/Magnet.java create mode 100644 src/main/java/me/melontini/andromeda/modules/items/magnet/items/MagnetItem.java create mode 100644 src/main/resources/assets/andromeda/models/item/magnet.json create mode 100644 src/main/resources/assets/andromeda/textures/item/magnet.png create mode 100644 src/main/resources/data/andromeda/advancements/recipes/magnet.json create mode 100644 src/main/resources/data/andromeda/recipes/magnet.json diff --git a/src/main/java/me/melontini/andromeda/modules/items/magnet/Content.java b/src/main/java/me/melontini/andromeda/modules/items/magnet/Content.java new file mode 100644 index 00000000..b017dddb --- /dev/null +++ b/src/main/java/me/melontini/andromeda/modules/items/magnet/Content.java @@ -0,0 +1,22 @@ +package me.melontini.andromeda.modules.items.magnet; + +import me.melontini.andromeda.base.ModuleManager; +import me.melontini.andromeda.common.registries.AndromedaItemGroup; +import me.melontini.andromeda.common.registries.Common; +import me.melontini.andromeda.common.registries.Keeper; +import me.melontini.andromeda.modules.items.magnet.items.MagnetItem; +import me.melontini.dark_matter.api.content.ContentBuilder; +import net.fabricmc.fabric.api.item.v1.FabricItemSettings; +import net.minecraft.item.ItemGroup; + +import static me.melontini.andromeda.common.registries.Common.id; + +public class Content { + + public static final Keeper MAGNET = Common.start(() -> ContentBuilder.ItemBuilder + .create(id("magnet"), () -> new MagnetItem(new FabricItemSettings().maxCount(1))) + .itemGroup(ItemGroup.TOOLS) + .register(() -> ModuleManager.quick(Magnet.class).enabled())) + .afterInit(m -> AndromedaItemGroup.accept(a -> a.item(ModuleManager.quick(Magnet.class), m))); + +} 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 new file mode 100644 index 00000000..c13be3aa --- /dev/null +++ b/src/main/java/me/melontini/andromeda/modules/items/magnet/Magnet.java @@ -0,0 +1,10 @@ +package me.melontini.andromeda.modules.items.magnet; + +import me.melontini.andromeda.base.BasicModule; +import me.melontini.andromeda.base.annotations.ModuleInfo; +import me.melontini.andromeda.base.annotations.ModuleTooltip; + +@ModuleTooltip +@ModuleInfo(name = "magnet", category = "items") +public class Magnet extends BasicModule { +} diff --git a/src/main/java/me/melontini/andromeda/modules/items/magnet/items/MagnetItem.java b/src/main/java/me/melontini/andromeda/modules/items/magnet/items/MagnetItem.java new file mode 100644 index 00000000..e5064bb4 --- /dev/null +++ b/src/main/java/me/melontini/andromeda/modules/items/magnet/items/MagnetItem.java @@ -0,0 +1,208 @@ +package me.melontini.andromeda.modules.items.magnet.items; + +import me.melontini.dark_matter.api.base.util.Support; +import me.melontini.dark_matter.api.glitter.ScreenParticleHelper; +import me.melontini.dark_matter.api.minecraft.util.TextUtil; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.item.BundleTooltipData; +import net.minecraft.client.item.TooltipContext; +import net.minecraft.client.item.TooltipData; +import net.minecraft.entity.Entity; +import net.minecraft.entity.ItemEntity; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.inventory.StackReference; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; +import net.minecraft.nbt.NbtCompound; +import net.minecraft.nbt.NbtElement; +import net.minecraft.nbt.NbtList; +import net.minecraft.nbt.NbtString; +import net.minecraft.particle.ItemStackParticleEffect; +import net.minecraft.particle.ParticleTypes; +import net.minecraft.screen.slot.Slot; +import net.minecraft.sound.SoundEvents; +import net.minecraft.text.Text; +import net.minecraft.util.ClickType; +import net.minecraft.util.Formatting; +import net.minecraft.util.Hand; +import net.minecraft.util.Identifier; +import net.minecraft.util.collection.DefaultedList; +import net.minecraft.util.math.Box; +import net.minecraft.util.math.Vec3d; +import net.minecraft.util.registry.Registry; +import net.minecraft.world.World; +import org.jetbrains.annotations.Nullable; + +import java.util.*; +import java.util.stream.Collectors; + +public class MagnetItem extends Item { + + public MagnetItem(Settings settings) { + super(settings); + } + + @Override + public boolean onStackClicked(ItemStack stack, Slot slot, ClickType clickType, PlayerEntity player) { + if (clickType == ClickType.RIGHT) { + ItemStack itemStack = slot.getStack(); + if (itemStack.isEmpty()) { + removeFirst(stack); + this.playRemoveOneSound(player); + } else { + addFirst(stack, itemStack); + Support.run(EnvType.CLIENT, () -> () -> itemParticles(itemStack, player)); + this.playInsertSound(player); + } + return true; + } + return false; + } + + @Override + public boolean onClicked(ItemStack stack, ItemStack otherStack, Slot slot, ClickType clickType, PlayerEntity player, StackReference cursorStackReference) { + if (clickType == ClickType.RIGHT) { + if (otherStack.isEmpty()) { + removeFirst(stack); + this.playRemoveOneSound(player); + } else { + addFirst(stack, otherStack); + itemParticles(otherStack, player); + this.playInsertSound(player); + } + return true; + } + if (clickType == ClickType.LEFT) { + if (otherStack.isOf(Items.HEART_OF_THE_SEA)) { + if (incrementLevel(stack)) { + otherStack.decrement(1); + Support.run(EnvType.CLIENT, () -> () -> upgradeParticles(player)); + playUpgradeSound(player); + } + return true; + } + } + return false; + } + + @Environment(EnvType.CLIENT) + private static void upgradeParticles(PlayerEntity player) { + if (player.world.isClient()) { + var client = MinecraftClient.getInstance(); + int x = (int) (client.mouse.getX() * (double) client.getWindow().getScaledWidth() / (double) client.getWindow().getWidth()); + int y = (int) (client.mouse.getY() * (double) client.getWindow().getScaledHeight() / (double) client.getWindow().getHeight()); + ScreenParticleHelper.addScreenParticles(ParticleTypes.END_ROD, + x, y, 0.5, 0.5, 0.07, 7); + } + } + + @Environment(EnvType.CLIENT) + private static void itemParticles(ItemStack stack, PlayerEntity player) { + if (player.world.isClient()) { + var client = MinecraftClient.getInstance(); + int x = (int) (client.mouse.getX() * (double) client.getWindow().getScaledWidth() / (double) client.getWindow().getWidth()); + int y = (int) (client.mouse.getY() * (double) client.getWindow().getScaledHeight() / (double) client.getWindow().getHeight()); + ScreenParticleHelper.addScreenParticles(new ItemStackParticleEffect(ParticleTypes.ITEM, stack), + x, y, 0.5, 0.5, 0.1, 7); + } + } + + @Override + public void inventoryTick(ItemStack stack, World world, Entity entity, int slot, boolean selected) { + if (!world.isClient()) { + if (entity instanceof LivingEntity pe) { //selected doesn't account for offhand + if (!stack.isItemEqual(pe.getStackInHand(Hand.MAIN_HAND)) && !stack.isItemEqual(pe.getStackInHand(Hand.OFF_HAND))) + return; + } else if (!selected) return; + + Set magnetables = magnetable(stack); + int level = getLevel(stack); + world.getEntitiesByClass(ItemEntity.class, new Box(entity.getBlockPos()).expand(level * 5), ie -> magnetables.contains(ie.getDataTracker().get(ItemEntity.STACK).getItem())) + .forEach(ie -> { + Vec3d vel = ie.getPos().relativize(entity.getPos()).normalize().multiply(0.05f * level); + ie.addVelocity(vel.x, vel.y, vel.z); + }); + } + } + + @Override + public Optional getTooltipData(ItemStack stack) { + DefaultedList defaultedList = DefaultedList.of(); + magnetable(stack).forEach(item -> defaultedList.add(item.getDefaultStack())); + return Optional.of(new BundleTooltipData(defaultedList, Integer.MAX_VALUE)); + } + + @Override + public void appendTooltip(ItemStack stack, @Nullable World world, List tooltip, TooltipContext context) { + tooltip.add(TextUtil.translatable("tooltip.andromeda.magnet.level", getLevel(stack)).formatted(Formatting.GRAY)); + } + + private static boolean incrementLevel(ItemStack stack) { + NbtCompound nbt = stack.getOrCreateNbt(); + if (!nbt.contains("PowerLevel")) nbt.putInt("PowerLevel", 1); + int level = nbt.getInt("PowerLevel"); + if (level >= 5) return false; + nbt.putInt("PowerLevel", level + 1); + return true; + } + + private static int getLevel(ItemStack stack) { + NbtCompound nbt = stack.getNbt(); + if (nbt != null) { + if (nbt.contains("PowerLevel")) + return nbt.getInt("PowerLevel"); + } + return 1; + } + + public static void addFirst(ItemStack bundle, ItemStack other) { + NbtCompound nbt = bundle.getOrCreateNbt(); + if (!nbt.contains("Items")) { + nbt.put("Items", new NbtList()); + } + + NbtList list = nbt.getList("Items", NbtElement.STRING_TYPE); + NbtString id = NbtString.of(Registry.ITEM.getId(other.getItem()).toString()); + if (list.contains(id)) return; + list.add(0, id); + } + + private static void removeFirst(ItemStack stack) { + NbtCompound nbt = stack.getOrCreateNbt(); + if (nbt.contains("Items")) { + NbtList list = nbt.getList("Items", NbtElement.STRING_TYPE); + if (!list.isEmpty()) { + list.remove(0); + if (list.isEmpty()) stack.removeSubNbt("Items"); + } + } + } + + private static Set magnetable(ItemStack stack) { + NbtCompound nbt = stack.getNbt(); + if (nbt == null) { + return Collections.emptySet(); + } else { + NbtList nbtList = nbt.getList("Items", NbtElement.STRING_TYPE); + return nbtList.stream().map(NbtString.class::cast) + .map(s -> Registry.ITEM.get(new Identifier(s.asString()))) + .collect(Collectors.toCollection(LinkedHashSet::new)); + } + } + + private void playUpgradeSound(Entity entity) { + entity.playSound(SoundEvents.BLOCK_ENCHANTMENT_TABLE_USE, 0.8F, 0.8F + entity.getWorld().getRandom().nextFloat() * 0.4F); + } + + private void playRemoveOneSound(Entity entity) { + entity.playSound(SoundEvents.ITEM_BUNDLE_REMOVE_ONE, 0.8F, 0.8F + entity.getWorld().getRandom().nextFloat() * 0.4F); + } + + private void playInsertSound(Entity entity) { + entity.playSound(SoundEvents.ITEM_BUNDLE_INSERT, 0.8F, 0.8F + entity.getWorld().getRandom().nextFloat() * 0.4F); + } +} diff --git a/src/main/resources/assets/andromeda/lang/en_us.json b/src/main/resources/assets/andromeda/lang/en_us.json index 001c0a85..73cf0eed 100644 --- a/src/main/resources/assets/andromeda/lang/en_us.json +++ b/src/main/resources/assets/andromeda/lang/en_us.json @@ -11,6 +11,7 @@ "tooltip.andromeda.compass.recovery": "Distance to last death spot: %s", "tooltip.andromeda.frameitem": "Item inside the frame", "tooltip.andromeda.throwable_item": "This item can be thrown.", + "tooltip.andromeda.magnet.level": "Level %s/5", "death.attack.andromeda_agony": "%s died from agony", "death.attack.andromeda_bricked": "%1$s was bricked by %2$s", "andromeda.container.guarded": "Can't open! The container is guarded!", @@ -33,8 +34,11 @@ "block.andromeda.incubator": "Incubator", "item.andromeda.infinite_totem": "Infinite Totem of Undying", + "item.andromeda.lockpick": "Lockpick", + "item.andromeda.magnet": "Magnet", + "item.andromeda.spawner_minecart": "Minecart with Spawner", "item.andromeda.anvil_minecart": "Minecart with Anvil", "item.andromeda.note_block_minecart": "Minecart with Note Block", @@ -228,6 +232,8 @@ "config.andromeda.items.lockpick.option.breakAfterUse.@Tooltip": "Breaks the lockpick after a successful break-in", "config.andromeda.items.lockpick.option.villagerInventory": "Villager Inventories", "config.andromeda.items.lockpick.option.villagerInventory.@Tooltip": "Open villager inventories.", + "config.andromeda.items.magnet": "Magnet", + "config.andromeda.items.magnet.@Tooltip": "A special magnet which attracts selected items. \nCan be upgraded using Heart of the Sea.", "config.andromeda.items.better_names": "Slightly Better Item Names", "config.andromeda.items.better_names.@Tooltip": "Shows durability (in %), or item count.", "config.andromeda.items.infinite_totem": "Infinite Totem of Undying", diff --git a/src/main/resources/assets/andromeda/models/item/magnet.json b/src/main/resources/assets/andromeda/models/item/magnet.json new file mode 100644 index 00000000..07ddbbef --- /dev/null +++ b/src/main/resources/assets/andromeda/models/item/magnet.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "andromeda:item/magnet" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/andromeda/textures/item/magnet.png b/src/main/resources/assets/andromeda/textures/item/magnet.png new file mode 100644 index 0000000000000000000000000000000000000000..46b2f2070ed7d3f6c8a309418c13915e581d03d0 GIT binary patch literal 642 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4rT@h1`S>QUd_a3c2uZk=n%{|6uQ_yiL~N3Znw6cK z!P~Te-6h*QIMDmVTe&4u4lMZpBtX&H&{Y=(yhPQmJiCh|} zcVN2FwB$wnJpxG+4Fpw0PCYphe8``VnX_9%u_^aiyWnTRQyNcBE>tq~XOxvR?Elex z|7O(7m7WYS`xHv-ZhpHhQL%kt+}5|}oo}y`Z+tGO*Ym7qA=~En4_2C0FJ`~6oily< z*?F6opGO;f37Fz5$-w`>Z~4QoELD>Y3V3Z-D{Y@&+V@@|u5qdMjoa-XdA_XOT3H^R zomc<%=ehUXreBKsx{FpNGcYi47I;J!Gcf2WgD_*oQu{In1_sLjpAc6D28Q2ia_RvN7X&VnlnJG3boa1LW$5m4{xA#8-1Ajzmu8HC*enwu8_#y^|7EaktajUl1Q>Z~ffH| Date: Sat, 9 Dec 2023 17:04:55 +0700 Subject: [PATCH 21/23] Fix subcategories requiring restart even if a single, unedited option requires restart. --- .../mixin/SubCategoryListEntryMixin.java | 18 ++++++++++++++++++ src/main/resources/andromeda.mixins.json | 3 ++- 2 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 src/main/java/me/melontini/andromeda/common/mixin/SubCategoryListEntryMixin.java diff --git a/src/main/java/me/melontini/andromeda/common/mixin/SubCategoryListEntryMixin.java b/src/main/java/me/melontini/andromeda/common/mixin/SubCategoryListEntryMixin.java new file mode 100644 index 00000000..65b7fa6e --- /dev/null +++ b/src/main/java/me/melontini/andromeda/common/mixin/SubCategoryListEntryMixin.java @@ -0,0 +1,18 @@ +package me.melontini.andromeda.common.mixin; + +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +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; + +@Mixin(SubCategoryListEntry.class) +public class SubCategoryListEntryMixin { + + //Why am I fixing CC bugs? + @WrapOperation(method = "isRequiresRestart", at = @At(value = "INVOKE", target = "Lme/shedaniel/clothconfig2/api/AbstractConfigListEntry;isRequiresRestart()Z")) + private boolean andromeda$isEdited(AbstractConfigListEntry instance, Operation original) { + return original.call(instance) && instance.isEdited(); + } +} diff --git a/src/main/resources/andromeda.mixins.json b/src/main/resources/andromeda.mixins.json index b349e0c2..9f6772c7 100644 --- a/src/main/resources/andromeda.mixins.json +++ b/src/main/resources/andromeda.mixins.json @@ -8,7 +8,8 @@ ], "client": [ "MinecraftClientMixin", - "ParticleManagerMixin" + "ParticleManagerMixin", + "SubCategoryListEntryMixin" ], "injectors": { "defaultRequire": 1, -- 2.51.2 From e989b2ac6e911464093ac45e35ec949af3f61364 Mon Sep 17 00:00:00 2001 From: melontini <104443436+melontini@users.noreply.github.com> Date: Sat, 9 Dec 2023 17:20:55 +0700 Subject: [PATCH 22/23] Guarded Loot now works with lockpicks. + a few other fixes. --- .../blocks/guarded_loot/GuardedLoot.java | 4 +++ .../LootableContainerBlockEntityMixin.java | 27 ++++++++++++++----- .../modules/items/lockpick/Lockpick.java | 5 ++++ .../modules/items/lockpick/LockpickItem.java | 10 +++---- .../MinecartBlockPicking.java | 24 ----------------- .../assets/andromeda/lang/en_us.json | 5 ++-- 6 files changed, 38 insertions(+), 37 deletions(-) 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 8e5d1948..1932b105 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 @@ -4,6 +4,7 @@ import me.melontini.andromeda.base.Module; import me.melontini.andromeda.base.annotations.ModuleInfo; import me.melontini.andromeda.base.annotations.ModuleTooltip; import me.melontini.andromeda.base.config.BasicConfig; +import me.shedaniel.autoconfig.annotation.ConfigEntry; @ModuleTooltip @ModuleInfo(name = "guarded_loot", category = "blocks") @@ -17,5 +18,8 @@ public class GuardedLoot extends Module { public static class Config extends BasicConfig { public int range = 4; + + @ConfigEntry.Gui.Tooltip + public boolean allowLockPicking = true; } } diff --git a/src/main/java/me/melontini/andromeda/modules/blocks/guarded_loot/mixin/LootableContainerBlockEntityMixin.java b/src/main/java/me/melontini/andromeda/modules/blocks/guarded_loot/mixin/LootableContainerBlockEntityMixin.java index 40cc9b22..ffa67e42 100644 --- a/src/main/java/me/melontini/andromeda/modules/blocks/guarded_loot/mixin/LootableContainerBlockEntityMixin.java +++ b/src/main/java/me/melontini/andromeda/modules/blocks/guarded_loot/mixin/LootableContainerBlockEntityMixin.java @@ -4,6 +4,8 @@ import com.llamalad7.mixinextras.injector.ModifyExpressionValue; import com.llamalad7.mixinextras.sugar.Local; import me.melontini.andromeda.base.ModuleManager; import me.melontini.andromeda.modules.blocks.guarded_loot.GuardedLoot; +import me.melontini.andromeda.modules.items.lockpick.Content; +import me.melontini.andromeda.modules.items.lockpick.Lockpick; import me.melontini.dark_matter.api.minecraft.util.TextUtil; import net.minecraft.block.BlockState; import net.minecraft.block.entity.BlockEntityType; @@ -43,14 +45,27 @@ abstract class LootableContainerBlockEntityMixin extends LockableContainerBlockE .toList(); if (!monster.isEmpty()) { - player.sendMessage(TextUtil.translatable("andromeda.container.guarded").formatted(Formatting.RED), true); - player.playSound(SoundEvents.BLOCK_CHEST_LOCKED, SoundCategory.BLOCKS, 1.0F, 1.0F); - player.emitGameEvent(GameEvent.CONTAINER_OPEN); + boolean lockpicking = ModuleManager.get().getModule(Lockpick.class).map(m -> { + if (am$guard.config().allowLockPicking) { + if (player.getMainHandStack().isOf(Content.LOCKPICK.get()) && m.rollLockpick()) { + if (!player.getAbilities().creativeMode && m.config().breakAfterUse) + player.getMainHandStack().decrement(1); + return true; + } + } + return false; + }).orElse(false); - for (LivingEntity livingEntity : monster) { - livingEntity.addStatusEffect(new StatusEffectInstance(StatusEffects.GLOWING, 5 * 20, 0, false, false)); + if (!lockpicking) { + player.sendMessage(TextUtil.translatable("andromeda.container.guarded").formatted(Formatting.RED), true); + player.playSound(SoundEvents.BLOCK_CHEST_LOCKED, SoundCategory.BLOCKS, 1.0F, 1.0F); + player.emitGameEvent(GameEvent.CONTAINER_OPEN); + + for (LivingEntity livingEntity : monster) { + livingEntity.addStatusEffect(new StatusEffectInstance(StatusEffects.GLOWING, 5 * 20, 0, false, false)); + } + return true; } - return true; } } return locked; 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 3d28b926..08990db0 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,6 +4,7 @@ import me.melontini.andromeda.base.Module; import me.melontini.andromeda.base.annotations.ModuleInfo; import me.melontini.andromeda.base.annotations.ModuleTooltip; import me.melontini.andromeda.base.config.BasicConfig; +import me.melontini.dark_matter.api.base.util.MathStuff; import me.shedaniel.autoconfig.annotation.ConfigEntry; @ModuleTooltip @@ -15,6 +16,10 @@ public class Lockpick extends Module { return Config.class; } + public boolean rollLockpick() { + return this.config().chance - 1 == 0 || MathStuff.threadRandom().nextInt(this.config().chance - 1) == 0; + } + public static class Config extends BasicConfig { @ConfigEntry.Gui.Tooltip diff --git a/src/main/java/me/melontini/andromeda/modules/items/lockpick/LockpickItem.java b/src/main/java/me/melontini/andromeda/modules/items/lockpick/LockpickItem.java index 6016a799..5a40b1e8 100644 --- a/src/main/java/me/melontini/andromeda/modules/items/lockpick/LockpickItem.java +++ b/src/main/java/me/melontini/andromeda/modules/items/lockpick/LockpickItem.java @@ -1,7 +1,6 @@ package me.melontini.andromeda.modules.items.lockpick; import me.melontini.andromeda.base.ModuleManager; -import me.melontini.dark_matter.api.base.util.classes.Lazy; import me.melontini.dark_matter.api.minecraft.util.TextUtil; import net.minecraft.entity.LivingEntity; import net.minecraft.entity.passive.MerchantEntity; @@ -13,19 +12,20 @@ import net.minecraft.util.ActionResult; import net.minecraft.util.Hand; public class LockpickItem extends Item { - private static final Lazy module = Lazy.of(() -> () -> ModuleManager.quick(Lockpick.class)); + public LockpickItem(Settings settings) { super(settings); } @Override public ActionResult useOnEntity(ItemStack stack, PlayerEntity user, LivingEntity entity, Hand hand) { - if (module.get().config().enabled && (module.get().config().chance - 1 == 0 || user.world.random.nextInt(module.get().config().chance - 1) == 0)) { - if (entity instanceof MerchantEntity merchant && module.get().config().villagerInventory) { + Lockpick module = ModuleManager.quick(Lockpick.class); + if (module.config().enabled && module.rollLockpick()) { + if (entity instanceof MerchantEntity merchant && module.config().villagerInventory) { if (user.world.isClient()) return ActionResult.SUCCESS; user.openHandledScreen(new SimpleNamedScreenHandlerFactory((syncId, inv, player) -> new MerchantInventoryScreenHandler(syncId, inv, merchant.getInventory()), TextUtil.translatable("gui.andromeda.merchant"))); - if (!user.getAbilities().creativeMode && module.get().config().breakAfterUse) stack.decrement(1); + if (!user.getAbilities().creativeMode && module.config().breakAfterUse) stack.decrement(1); return ActionResult.SUCCESS; } } 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 87436f15..8f2ffa9e 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 @@ -1,39 +1,15 @@ package me.melontini.andromeda.modules.items.minecart_block_picking; 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.ModuleTooltip; import me.melontini.andromeda.base.config.BasicConfig; -import me.melontini.andromeda.modules.entities.minecarts.Minecarts; -import me.melontini.andromeda.util.CommonValues; -import me.melontini.dark_matter.api.config.ConfigBuilder; import me.shedaniel.autoconfig.annotation.ConfigEntry; -import java.util.Map; - @ModuleTooltip @ModuleInfo(name = "minecart_block_picking", category = "items") -@SuppressWarnings("UnstableApiUsage") public class MinecartBlockPicking extends Module { - @Override - public void onConfig(ConfigBuilder builder) { - builder.processors((registry, mod) -> registry.register(CommonValues.MODID + ":spawner_enabled", manager -> { - if (ModuleManager.get().getDiscovered(Minecarts.class).filter(Module::enabled) - .map(m->!m.config().isSpawnerMinecartOn).orElse(true)) { - return Map.of("spawnerPicking", false); - } - return null; - }, mod)); - } - - @Override - public void postConfig() { - ModuleManager.get().getDiscovered(Minecarts.class) - .ifPresent(m -> m.manager().postSave(manager -> this.manager().save())); - } - @Override public Class configClass() { return Config.class; diff --git a/src/main/resources/assets/andromeda/lang/en_us.json b/src/main/resources/assets/andromeda/lang/en_us.json index 73cf0eed..fd62da65 100644 --- a/src/main/resources/assets/andromeda/lang/en_us.json +++ b/src/main/resources/assets/andromeda/lang/en_us.json @@ -20,7 +20,6 @@ "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.spawner_enabled": "Spawner minecart must be enabled to use this!", "andromeda.config.option_manager.reason.andromeda.side_only_enabled": "Module disabled in side-only mode!", "andromeda.config.tooltip.environment.client": "Client-only feature", @@ -127,6 +126,8 @@ "config.andromeda.blocks.guarded_loot": "Guarded Loot", "config.andromeda.blocks.guarded_loot.@Tooltip": "Block players from opening unlooted containers if there are any monsters nearby.", "config.andromeda.blocks.guarded_loot.option.range": "Range", + "config.andromeda.blocks.guarded_loot.option.allowLockPicking": "Allow Lock Picking", + "config.andromeda.blocks.guarded_loot.option.allowLockPicking.@Tooltip": "Requires Lockpick to be enabled!", "config.andromeda.blocks.falling_propagule": "Falling Propagule", "config.andromeda.blocks.falling_propagule.@Tooltip": "Fully grown, hanging propagule will fall after some time.", "config.andromeda.blocks.cactus_bottle_filling": "Cactus Bottle Filling", @@ -245,7 +246,7 @@ "config.andromeda.items.minecart_block_picking": "Minecart Block Picking", "config.andromeda.items.minecart_block_picking.@Tooltip": "Allows players to \"pick\" blocks via minecarts", "config.andromeda.items.minecart_block_picking.option.spawnerPicking": "Spawner Picking", - "config.andromeda.items.minecart_block_picking.option.spawnerPicking.@Tooltip": "Allows players to \"pick\" spawners", + "config.andromeda.items.minecart_block_picking.option.spawnerPicking.@Tooltip": "Allows players to \"pick\" spawners \nSpawner minecart must be enabled to use this!", "config.andromeda.category.bugfixes": "Bugfixes", "config.andromeda.bugfixes.advancement_shadow": "Frame-Independent Advancement Shadow", -- 2.51.2 From 12aaba34c4d4f92ff8426981439380e7942ce3ba Mon Sep 17 00:00:00 2001 From: melontini <104443436+melontini@users.noreply.github.com> Date: Sat, 9 Dec 2023 17:36:14 +0700 Subject: [PATCH 23/23] Bump versions + CHANGELOG.md --- .github/workflows/publish.yml | 2 +- CHANGELOG.md | 27 ++++++++++++++++----------- gradle.properties | 4 ++-- 3 files changed, 19 insertions(+), 14 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 9aed3222..e3d6fe8d 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -51,7 +51,7 @@ jobs: java: | 17 - github-tag: v${{ env.VERSION_PLAIN }} + github-tag: ${{ env.VERSION_PLAIN }} github-token: ${{ secrets.GITHUB_TOKEN }} github-commitish: ${{ github.sha }} github-prerelease: false diff --git a/CHANGELOG.md b/CHANGELOG.md index 22d14304..5fd721b9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,16 +2,21 @@ ## Alpha warning! -- In v1.0.0 Andromeda has been rewritten in a fairly major way. There were a lot of breaking changes! -- This release does not function properly on Connector and requires some complicated fixes on its side. -- I suggest reading the "State of Andromeda" post I made on GitHub for more context and changes in this version! +* New Feature! Magnet. + * This special magnet allows you to select items you want to attract. + * Can be upgraded 4 additional times using a Heart of the Sea. + * Crafted from Heart of the Sea, 4 Copper Ingots and 2 Redstone. +* Guarded Loot: Allow Lock Picking! + * Allows the Lockpick to bypass chest guards. -### https://github.com/melontini/andromeda/discussions/63 +Other stuff: -Something not mentioned in the post: - -- All resources were moved from `am_{something}` to `andromeda/{something}` -- There's no config migration, so you need to re-configure the mod again, sorry. -- `throwable_items:blacklist` is now part of the data pack as `"disabled": true`. -- Added `andromeda:tempting_for_villagers` tag to specify items villagers will follow. -- Throwable Items can now be dispensed! \ No newline at end of file +* Improved option tooltips if Cloth-Config is installed. +* Brightened Incubator's texture. +* Fixed New Minecarts not working. +* Configs are now selectively saved instead of all at once. +* Updated Chinese translation. Courtesy of [Rad233](https://github.com/Rad233). +* ModuleManager is now shared over ObjectShare. +* Optimized PNG assets. +* Fixed some bugs (and probably added more!) +* Updated DM. \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index 5261d6ce..78ee8e75 100644 --- a/gradle.properties +++ b/gradle.properties @@ -8,7 +8,7 @@ minecraft_version=1.19.2 yarn_mappings=1.19.2+build.28 loader_version=0.15.0 # Mod Properties -mod_version=1.0.0-1.19.2 +mod_version=1.1.0-1.19.2 maven_group=me.melontini archives_base_name=andromeda # Dependencies @@ -18,4 +18,4 @@ fabric_version=0.76.0+1.19.2 cloth_version=8.3.103 fabric_asm_version=2.3 dark_matter=2.1.0-1.19.2 -mixin_extras_version=0.3.0 \ No newline at end of file +mixin_extras_version=0.3.1 \ No newline at end of file