From c5ec1bb856169c847b3c78862bb3e266da3abff6 Mon Sep 17 00:00:00 2001 From: melontini <104443436+melontini@users.noreply.github.com> Date: Fri, 15 Dec 2023 01:19:14 +0700 Subject: [PATCH 1/8] Bundle input particles. --- .../gui/gui_particles/GuiParticles.java | 2 ++ .../mixin/AnvilScreenHandlerMixin.java | 13 +++---- .../gui_particles/mixin/BundleItemMixin.java | 35 +++++++++++++++++++ 3 files changed, 42 insertions(+), 8 deletions(-) create mode 100644 src/main/java/me/melontini/andromeda/modules/gui/gui_particles/mixin/BundleItemMixin.java diff --git a/src/main/java/me/melontini/andromeda/modules/gui/gui_particles/GuiParticles.java b/src/main/java/me/melontini/andromeda/modules/gui/gui_particles/GuiParticles.java index c4da51f3..b566e6c0 100644 --- a/src/main/java/me/melontini/andromeda/modules/gui/gui_particles/GuiParticles.java +++ b/src/main/java/me/melontini/andromeda/modules/gui/gui_particles/GuiParticles.java @@ -28,5 +28,7 @@ public class GuiParticles extends Module { public double creativeScreenParticlesVelX = 0.7d; public boolean gameModeSwitcherParticles = true; + + public boolean bundleInputParticles = true; } } diff --git a/src/main/java/me/melontini/andromeda/modules/gui/gui_particles/mixin/AnvilScreenHandlerMixin.java b/src/main/java/me/melontini/andromeda/modules/gui/gui_particles/mixin/AnvilScreenHandlerMixin.java index 0b667948..f39b867e 100644 --- a/src/main/java/me/melontini/andromeda/modules/gui/gui_particles/mixin/AnvilScreenHandlerMixin.java +++ b/src/main/java/me/melontini/andromeda/modules/gui/gui_particles/mixin/AnvilScreenHandlerMixin.java @@ -2,7 +2,9 @@ package me.melontini.andromeda.modules.gui.gui_particles.mixin; import me.melontini.andromeda.base.ModuleManager; import me.melontini.andromeda.modules.gui.gui_particles.GuiParticles; +import me.melontini.dark_matter.api.base.util.Support; import me.melontini.dark_matter.api.glitter.ScreenParticleHelper; +import net.fabricmc.api.EnvType; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; import net.minecraft.client.MinecraftClient; @@ -19,15 +21,12 @@ import net.minecraft.screen.ScreenHandlerContext; import net.minecraft.screen.ScreenHandlerType; import org.jetbrains.annotations.Nullable; import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(AnvilScreenHandler.class) abstract class AnvilScreenHandlerMixin extends ForgingScreenHandler { - @Unique - private static final GuiParticles am$guip = ModuleManager.quick(GuiParticles.class); public AnvilScreenHandlerMixin(@Nullable ScreenHandlerType type, int syncId, PlayerInventory playerInventory, ScreenHandlerContext context) { super(type, syncId, playerInventory, context); @@ -35,9 +34,9 @@ abstract class AnvilScreenHandlerMixin extends ForgingScreenHandler { @Inject(at = @At(value = "INVOKE", target = "Lnet/minecraft/inventory/Inventory;setStack(ILnet/minecraft/item/ItemStack;)V", ordinal = 0), method = "onTakeOutput") private void andromeda$particles(PlayerEntity player, ItemStack stack, CallbackInfo ci) { - if (!am$guip.config().anvilScreenParticles) return; + if (!ModuleManager.quick(GuiParticles.class).config().anvilScreenParticles) return; - try { + Support.run(EnvType.CLIENT, () -> () -> { if (MinecraftClient.getInstance().isOnThread() && MinecraftClient.getInstance().currentScreen instanceof AnvilScreen anvilScreen) { BlockState state = Blocks.ANVIL.getDefaultState(); var slot = this.slots.get(2); @@ -47,8 +46,6 @@ abstract class AnvilScreenHandlerMixin extends ForgingScreenHandler { anvilScreen.x + slot.x + 8, anvilScreen.y + slot.y + 8, 0.5, 0.5, !enchant ? 0.5 : 0.07, 5); } - } catch (Exception e) { - //client-server handling 101 - } + }); } } diff --git a/src/main/java/me/melontini/andromeda/modules/gui/gui_particles/mixin/BundleItemMixin.java b/src/main/java/me/melontini/andromeda/modules/gui/gui_particles/mixin/BundleItemMixin.java new file mode 100644 index 00000000..7cdf9a3e --- /dev/null +++ b/src/main/java/me/melontini/andromeda/modules/gui/gui_particles/mixin/BundleItemMixin.java @@ -0,0 +1,35 @@ +package me.melontini.andromeda.modules.gui.gui_particles.mixin; + +import me.melontini.andromeda.base.ModuleManager; +import me.melontini.andromeda.modules.gui.gui_particles.GuiParticles; +import me.melontini.dark_matter.api.base.util.Support; +import me.melontini.dark_matter.api.glitter.ScreenParticleHelper; +import net.fabricmc.api.EnvType; +import net.minecraft.client.MinecraftClient; +import net.minecraft.item.BundleItem; +import net.minecraft.item.ItemStack; +import net.minecraft.particle.ItemStackParticleEffect; +import net.minecraft.particle.ParticleTypes; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +@Mixin(BundleItem.class) +class BundleItemMixin { + + @Inject(at = @At("RETURN"), method = "addToBundle") + private static void andromeda$spawnParticles(ItemStack bundle, ItemStack stack, CallbackInfoReturnable cir) { + if (cir.getReturnValueI() > 0 && ModuleManager.quick(GuiParticles.class).config().bundleInputParticles) { + Support.run(EnvType.CLIENT, () -> () -> { + var client = MinecraftClient.getInstance(); + if (client.isOnThread() && client.currentScreen != null) { + 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); + } + }); + } + } +} -- 2.51.2 From 77ccadc128b911ca744bb4feda3eafe3bd1dfdec Mon Sep 17 00:00:00 2001 From: melontini <104443436+melontini@users.noreply.github.com> Date: Fri, 15 Dec 2023 01:25:08 +0700 Subject: [PATCH 2/8] Remove some lazies. --- .../modules/blocks/incubator/IncubatorBlockEntity.java | 4 +--- .../andromeda/modules/gui/gui_particles/client/Client.java | 6 +++--- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/main/java/me/melontini/andromeda/modules/blocks/incubator/IncubatorBlockEntity.java b/src/main/java/me/melontini/andromeda/modules/blocks/incubator/IncubatorBlockEntity.java index 88191ad7..b9813cd5 100644 --- a/src/main/java/me/melontini/andromeda/modules/blocks/incubator/IncubatorBlockEntity.java +++ b/src/main/java/me/melontini/andromeda/modules/blocks/incubator/IncubatorBlockEntity.java @@ -3,7 +3,6 @@ package me.melontini.andromeda.modules.blocks.incubator; import me.melontini.andromeda.base.ModuleManager; import me.melontini.andromeda.modules.blocks.incubator.data.EggProcessingData; import me.melontini.dark_matter.api.base.util.MathStuff; -import me.melontini.dark_matter.api.base.util.classes.Lazy; import me.melontini.dark_matter.api.minecraft.data.NbtUtil; import net.minecraft.block.Block; import net.minecraft.block.BlockState; @@ -28,7 +27,6 @@ import net.minecraft.world.World; import org.jetbrains.annotations.Nullable; public class IncubatorBlockEntity extends BlockEntity implements SidedInventory { - private static final Lazy module = Lazy.of(() -> () -> ModuleManager.quick(Incubator.class)); public DefaultedList inventory = DefaultedList.ofSize(1, ItemStack.EMPTY); public int processingTime = -1; @@ -64,7 +62,7 @@ public class IncubatorBlockEntity extends BlockEntity implements SidedInventory if (!stack.isEmpty() && this.processingTime == -1) { EggProcessingData data = EggProcessingData.EGG_DATA.get(stack.getItem()); if (data != null) { - this.processingTime = module.get().config().randomness ? (int) (data.time() + (Math.random() * (data.time() * 0.3) * 2) - data.time() * 0.3) : data.time(); + this.processingTime = ModuleManager.quick(Incubator.class).config().randomness ? (int) (data.time() + (Math.random() * (data.time() * 0.3) * 2) - data.time() * 0.3) : data.time(); world.updateListeners(pos, state, state, Block.NOTIFY_LISTENERS); markDirty(); } diff --git a/src/main/java/me/melontini/andromeda/modules/gui/gui_particles/client/Client.java b/src/main/java/me/melontini/andromeda/modules/gui/gui_particles/client/Client.java index e564f052..140b22b5 100644 --- a/src/main/java/me/melontini/andromeda/modules/gui/gui_particles/client/Client.java +++ b/src/main/java/me/melontini/andromeda/modules/gui/gui_particles/client/Client.java @@ -3,18 +3,18 @@ package me.melontini.andromeda.modules.gui.gui_particles.client; import me.melontini.andromeda.base.ModuleManager; import me.melontini.andromeda.modules.gui.gui_particles.GuiParticles; import me.melontini.dark_matter.api.base.util.MathStuff; -import me.melontini.dark_matter.api.base.util.classes.Lazy; import me.melontini.dark_matter.api.glitter.ScreenParticleHelper; import net.fabricmc.fabric.api.client.screen.v1.ScreenEvents; import net.minecraft.client.gui.screen.ingame.AbstractFurnaceScreen; import net.minecraft.particle.ParticleTypes; public class Client { - private static final Lazy module = Lazy.of(() -> () -> ModuleManager.quick(GuiParticles.class)); public static void init() { + GuiParticles module = ModuleManager.quick(GuiParticles.class); + ScreenEvents.BEFORE_INIT.register((client, screen1, scaledWidth, scaledHeight) -> { - if (screen1 instanceof AbstractFurnaceScreen abstractFurnaceScreen && module.get().config().furnaceScreenParticles) { + if (screen1 instanceof AbstractFurnaceScreen abstractFurnaceScreen && module.config().furnaceScreenParticles) { ScreenEvents.afterTick(abstractFurnaceScreen).register(screen -> { AbstractFurnaceScreen furnaceScreen = (AbstractFurnaceScreen) screen; if (furnaceScreen.getScreenHandler().isBurning() && MathStuff.threadRandom().nextInt(10) == 0) { -- 2.51.2 From a1ee03d0aa2a2b9225bd7ef23551b6e57397521d Mon Sep 17 00:00:00 2001 From: melontini <104443436+melontini@users.noreply.github.com> Date: Fri, 15 Dec 2023 16:11:51 +0700 Subject: [PATCH 3/8] Simplify class init --- .../me/melontini/andromeda/base/Module.java | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/src/main/java/me/melontini/andromeda/base/Module.java b/src/main/java/me/melontini/andromeda/base/Module.java index e047e74a..1c1f990e 100644 --- a/src/main/java/me/melontini/andromeda/base/Module.java +++ b/src/main/java/me/melontini/andromeda/base/Module.java @@ -21,20 +21,23 @@ public abstract class Module { private final Lazy> manager = Lazy.of(() -> () -> Utilities.cast(ModuleManager.get().getConfig(this.getClass()))); public void onClient() { - try { - Class cls = Class.forName(this.getClass().getPackageName() + ".client.Client"); - Common.bootstrap(cls); - } catch (ClassNotFoundException ignored) { } + initClasses("client.Client"); } public void onServer() { } public void onMain() { - try { - Class cls = Class.forName(this.getClass().getPackageName() + ".Content"); - Common.bootstrap(cls); - } catch (ClassNotFoundException ignored) { } + initClasses("Main", "Content"); } public void onPreLaunch() { } + protected void initClasses(String... classes) { + for (String cls : classes) { + try { + Common.bootstrap(Class.forName(this.getClass().getPackageName() + "." + cls)); + } catch (ClassNotFoundException ignored) { + } + } + } + public void onConfig(ConfigBuilder builder) { } public void postConfig() { } -- 2.51.2 From 2a472bc290d9c23510ebb85a07bc483124d32250 Mon Sep 17 00:00:00 2001 From: melontini <104443436+melontini@users.noreply.github.com> Date: Fri, 15 Dec 2023 16:38:22 +0700 Subject: [PATCH 4/8] Use StringJoiner. --- .../andromeda/base/ModuleManager.java | 53 +++++++++++-------- 1 file changed, 31 insertions(+), 22 deletions(-) diff --git a/src/main/java/me/melontini/andromeda/base/ModuleManager.java b/src/main/java/me/melontini/andromeda/base/ModuleManager.java index 1f8a8504..12d7c071 100644 --- a/src/main/java/me/melontini/andromeda/base/ModuleManager.java +++ b/src/main/java/me/melontini/andromeda/base/ModuleManager.java @@ -42,13 +42,10 @@ public class ModuleManager { Set ids = new HashSet<>(); 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()); + validateModule(module); - if (ids.contains(module.meta().id())) + if (!ids.add(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 -> { @@ -56,10 +53,8 @@ public class ModuleManager { return i >= 0 ? i : categories.size(); })).toList(); - 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.discoveredModules = sorted.stream().collect(ImmutableMap.toImmutableMap(Module::getClass, m -> m)); + this.discoveredModuleNames = sorted.stream().collect(ImmutableMap.toImmutableMap(m -> m.meta().id(), m -> m)); this.configs = ImmutableMap.copyOf(setUpConfigs(sorted)); @@ -68,14 +63,20 @@ public class ModuleManager { sorted.forEach(module -> module.config().enabled = true); 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);}))); + this.modules = sorted.stream().filter(Module::enabled) + .collect(ImmutableMap.toImmutableMap(Module::getClass, m -> m)); + this.moduleNames = sorted.stream().filter(Module::enabled) + .collect(ImmutableMap.toImmutableMap(m -> m.meta().id(), m -> m)); cleanConfigs(); } + void validateModule(Module module) { + MakeSure.notEmpty(module.meta().category(), "Module category can't be null or empty! Module: " + module.getClass()); + MakeSure.isTrue(!module.meta().category().contains("/"), "Module category can't contain '/'! Module: " + module.getClass()); + MakeSure.notEmpty(module.meta().name(), "Module name can't be null or empty! Module: " + module.getClass()); + } + public Map, Lazy>> setUpConfigs(List> list) { Map, Lazy>> configs = new HashMap<>(); @@ -103,10 +104,7 @@ public class ModuleManager { } private void cleanConfigs() { - Set paths = new HashSet<>(); - paths.add(FabricLoader.getInstance().getConfigDir().resolve("andromeda/mod.json")); - paths.add(FabricLoader.getInstance().getConfigDir().resolve("andromeda/debug.json")); - configs.values().forEach(m -> paths.add(m.get().getSerializer().getPath())); + Set paths = collectPaths(); Utilities.runUnchecked(() -> Files.walkFileTree(FabricLoader.getInstance().getConfigDir().resolve("andromeda"), new SimpleFileVisitor<>() { @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { @@ -119,6 +117,17 @@ public class ModuleManager { })); } + private Set collectPaths() { + Set paths = new HashSet<>(); + + paths.add(FabricLoader.getInstance().getConfigDir().resolve("andromeda/mod.json")); + paths.add(FabricLoader.getInstance().getConfigDir().resolve("andromeda/debug.json")); + + configs.values().forEach(m -> paths.add(m.get().getSerializer().getPath())); + + return paths; + } + public ConfigManager getConfig(Class cls) { return MakeSure.notNull(configs.get(cls)).get(); } @@ -176,11 +185,11 @@ public class ModuleManager { builder.append("\n\t - ").append(s); if (!ModuleManager.categories.contains(s)) builder.append("*"); builder.append("\n\t |-- "); - strings.forEach(m -> { - builder.append('\'').append(m.meta().name().replace('/', '.')).append('\'').append(" "); - if (!m.getClass().getName().startsWith("me.melontini.andromeda")) - builder.append('*'); - }); + + StringJoiner joiner = new StringJoiner(", "); + strings.forEach(m -> joiner.add(m.meta().name().replace('/', '.') + + (!m.getClass().getName().startsWith("me.melontini.andromeda") ? '*' : ""))); + builder.append(joiner); }); if (!categories.isEmpty()) { LOGGER.info("Loaded modules: {}", builder); -- 2.51.2 From 19c8d351d9ffd719634ba3cc0daae51be22f0996 Mon Sep 17 00:00:00 2001 From: melontini <104443436+melontini@users.noreply.github.com> Date: Fri, 15 Dec 2023 16:56:32 +0700 Subject: [PATCH 5/8] Add missing translation key. --- src/main/resources/assets/andromeda/lang/en_us.json | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/resources/assets/andromeda/lang/en_us.json b/src/main/resources/assets/andromeda/lang/en_us.json index a41f50fd..16c64f10 100644 --- a/src/main/resources/assets/andromeda/lang/en_us.json +++ b/src/main/resources/assets/andromeda/lang/en_us.json @@ -292,6 +292,7 @@ "config.andromeda.gui.gui_particles.option.creativeScreenParticles": "Creative Screen Particles", "config.andromeda.gui.gui_particles.option.creativeScreenParticlesVelX": "X velocity of Creative Screen Particles", "config.andromeda.gui.gui_particles.option.gameModeSwitcherParticles": "Gamemode Switcher Particles", + "config.andromeda.gui.gui_particles.option.bundleInputParticles": "Bundle Input Particles", "config.andromeda.gui.item_frame_tooltips": "Item Frame Tooltips", "config.andromeda.gui.item_frame_tooltips.@Tooltip": "Enables in-world tooltips for item frames.", -- 2.51.2 From 6a068fb0cfdd673dfe1cdc77cccabebbe3484043 Mon Sep 17 00:00:00 2001 From: melontini <104443436+melontini@users.noreply.github.com> Date: Fri, 15 Dec 2023 16:56:46 +0700 Subject: [PATCH 6/8] Update Connector notice --- src/main/java/me/melontini/andromeda/base/Bootstrap.java | 2 +- 1 file changed, 1 insertion(+), 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 d171fee0..a900b447 100644 --- a/src/main/java/me/melontini/andromeda/base/Bootstrap.java +++ b/src/main/java/me/melontini/andromeda/base/Bootstrap.java @@ -56,7 +56,7 @@ public class Bootstrap { 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)"); + LOGGER.warn("Andromeda may not work on Connector! (If #557 is open on Connector's GitHub)"); } Path newCfg = FabricLoader.getInstance().getConfigDir().resolve("andromeda.json"); -- 2.51.2 From acfb6374901c88398b821a31ce5ddc61d1e2ca72 Mon Sep 17 00:00:00 2001 From: melontini <104443436+melontini@users.noreply.github.com> Date: Fri, 15 Dec 2023 17:02:10 +0700 Subject: [PATCH 7/8] Send on update. --- src/main/java/me/melontini/andromeda/util/CrashHandler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/me/melontini/andromeda/util/CrashHandler.java b/src/main/java/me/melontini/andromeda/util/CrashHandler.java index 1eb919c9..47982981 100644 --- a/src/main/java/me/melontini/andromeda/util/CrashHandler.java +++ b/src/main/java/me/melontini/andromeda/util/CrashHandler.java @@ -28,8 +28,8 @@ public class CrashHandler { @SuppressWarnings("deprecation") public static void nukeProfile() { if (!FabricLoader.getInstance().isDevelopmentEnvironment()) { - Analytics.oldUUID().ifPresent(uuid -> HANDLER.send((mixpanel, analytics) -> mixpanel.delete(uuid.toString()))); if (CommonValues.updated() && !ANALYTICS.getDefaultUUID().equals(ANALYTICS.getUUID())) { + Analytics.oldUUID().ifPresent(uuid -> HANDLER.send((mixpanel, analytics) -> mixpanel.delete(uuid.toString()))); HANDLER.send((mixpanel, analytics) -> mixpanel.delete(analytics.getUUIDString())); } } -- 2.51.2 From d006de63204c4f58f4052d29bd53ed61fc1003ff Mon Sep 17 00:00:00 2001 From: melontini <104443436+melontini@users.noreply.github.com> Date: Fri, 15 Dec 2023 17:11:07 +0700 Subject: [PATCH 8/8] Bump version and CHANGELOG.md --- CHANGELOG.md | 16 ++++++++++++++-- gradle.properties | 2 +- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c17269f1..a6ef1fd1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,5 +2,17 @@ ## Alpha warning! -* Fixed Dark Matter related crash. -* Updated Chinese translation. Courtesy of [Rad233](https://github.com/Rad233). \ No newline at end of file +* GUI Particles: New Bundle Input Particles! + +*** + +* Modules no longer pretend to be disabled at runtime. With the current state of affairs, this could cause some issues. +* Fixed module discovery on Quilt and Connector. (Connector is still broken due to other issues) +* Fixed empty categories in the item group. +* [Lockpick] Added Lockpick break sounds and particles. +* [Throwable Items] Added brick hit particles. +* [Throwable Items] Fixed item cooldown not being set on stacks of one. +* Moved debug options to their own mini config. + See [Debug.java](https://github.com/melontini/andromeda/blob/1.19-fabric/src/main/java/me/melontini/andromeda/base/Debug.java) + if you're interested. +* Fixed some other issues. \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index 598d54fd..59a16f7f 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.1.1-1.19.2 +mod_version=1.2.0-1.19.2 maven_group=me.melontini archives_base_name=andromeda # Dependencies -- 2.51.2