diff --git a/gradle.properties b/gradle.properties index 85565592d..891c012c1 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,7 +3,7 @@ name=OneConfig mod_id=oneconfig version_major=1 version_minor=0 -version_patch=0-alpha.59 +version_patch=0-alpha.60 polyfrost.defaults.loom=3 diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index e7aa4b414..53fdeee77 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -6,7 +6,7 @@ kotlin = "2.0.20" kotlinx-coroutines = "1.8.1" kotlinx-atomicfu = "0.24.0" fabric-language-kotlin = "1.12.2+kotlin.2.0.20" -polyui = "1.7.36" +polyui = "1.7.385" annotations = "24.1.0" hypixel-modapi = "1.0" hypixel-data = "0.1.2" # Dep of hypixel-modapi diff --git a/modules/config-impl/src/main/kotlin/org/polyfrost/oneconfig/api/config/v1/internal/ConfigVisualizer.kt b/modules/config-impl/src/main/kotlin/org/polyfrost/oneconfig/api/config/v1/internal/ConfigVisualizer.kt index a30c68f9d..4a715635d 100644 --- a/modules/config-impl/src/main/kotlin/org/polyfrost/oneconfig/api/config/v1/internal/ConfigVisualizer.kt +++ b/modules/config-impl/src/main/kotlin/org/polyfrost/oneconfig/api/config/v1/internal/ConfigVisualizer.kt @@ -34,23 +34,18 @@ import org.polyfrost.oneconfig.api.config.v1.Visualizer import org.polyfrost.polyui.animate.Animations import org.polyfrost.polyui.color.PolyColor import org.polyfrost.polyui.color.rgba -import org.polyfrost.polyui.component.Component import org.polyfrost.polyui.component.Drawable import org.polyfrost.polyui.component.extensions.* import org.polyfrost.polyui.component.impl.* import org.polyfrost.polyui.data.PolyImage import org.polyfrost.polyui.event.Event -import org.polyfrost.polyui.operations.ComponentOp import org.polyfrost.polyui.operations.Resize import org.polyfrost.polyui.operations.Rotate import org.polyfrost.polyui.unit.Align import org.polyfrost.polyui.unit.Vec2 import org.polyfrost.polyui.unit.by import org.polyfrost.polyui.unit.seconds -import org.polyfrost.polyui.utils.fastEach -import org.polyfrost.polyui.utils.image -import org.polyfrost.polyui.utils.levenshteinDistance -import org.polyfrost.polyui.utils.mapToArray +import org.polyfrost.polyui.utils.* import java.lang.ref.WeakReference import kotlin.math.PI @@ -58,12 +53,12 @@ open class ConfigVisualizer { private val LOGGER = LogManager.getLogger("OneConfig/Config") protected val configs = HashMap() protected val optBg = rgba(39, 49, 55, 0.2f) - protected val alignCV = Align(cross = Align.Cross.Start, mode = Align.Mode.Vertical) - protected val alignVNoPad = Align(cross = Align.Cross.Start, mode = Align.Mode.Vertical, pad = Vec2.ZERO) + protected val alignCStart = Align(cross = Align.Cross.Start, maxRowSize = 1) + protected val alignCStartNoPad = Align(cross = Align.Cross.Start, maxRowSize = 1, pad = Vec2.ZERO) protected val stdAlign = Align(main = Align.Main.SpaceBetween, pad = Vec2(16f, 8f)) protected val stdAccord = Align(main = Align.Main.SpaceBetween, pad = Vec2.ZERO) protected val ic2text = Align(pad = Vec2(8f, 0f)) - protected val stdOpt = Align(cross = Align.Cross.Start, mode = Align.Mode.Vertical, pad = Vec2(0f, 8f)) + protected val stdOpt = Align(cross = Align.Cross.Start, pad = Vec2(0f, 8f), maxRowSize = 1) protected val accordOpt = Align(cross = Align.Cross.Start, pad = Vec2(22f, 12f)) /** @@ -71,6 +66,13 @@ open class ConfigVisualizer { */ fun get(config: Tree) = configs.getOrPut(config) { create(config) } + /** + * Clears the cache of all created config screens. + */ + fun clearCache() { + configs.clear() + } + fun getMatching(str: String): List { val it = str.trim() if (it.length < 2) return emptyList() @@ -148,10 +150,10 @@ open class ConfigVisualizer { Group( Text(header, fontSize = 22f), *opts.toTypedArray(), - alignment = alignCV, + alignment = alignCStart, ) }, - alignment = alignCV, + alignment = alignCStart, ) } } @@ -211,30 +213,22 @@ open class ConfigVisualizer { val e: Property<*>? = tree.getProp("enabled") val toWrap: Drawable var enabled: Property? = null + var contentHeight = -1f // asm: signature as it prevents re-wrapping of function val openInsn: Drawable.(Any?) -> Unit = { open = !open val arrow = if (enabled != null) this[1][1] else this[1] - Rotate(arrow, if (!open) PI else 0.0, false, Animations.Default.create(0.2.seconds)).add() - val value = parent[1].height - val anim = Animations.Default.create(0.4.seconds) - val operation = Resize(parent, width = 0f, height = if (open) -value else value, add = true, anim) - addOperation( - object : ComponentOp.Animatable(parent, anim, onFinish = { - this[1].renders = !open - this[1].isEnabled = !open - }) { - override fun apply(value: Float) { - operation.apply() - // asm: instruct parent (options list) to replace all its children so that they move with it closing - self.parent.position() - // asm: instruct all children of this accordion to update their visibility based on THIS, NOT its parent - self[1].children!!.fastEach { option -> - option.renders = option.intersects(self.x, self.y, self.width, self.height) - } - } - }, - ) + val anim = Animations.Default.create(0.6.seconds) + Rotate(arrow, if (!open) PI else 0.0, false, anim).add() + val content = parent[1] + if (contentHeight == -1f) contentHeight = content.height + Resize(parent, width = 0f, height = if (open) -contentHeight else contentHeight, add = true, animation = anim).add() + Resize(content, width = 0f, height = if (open) -contentHeight else contentHeight, add = true, animation = anim).add() + // won't ever open properly unless it renders at least once (tee hee) :) + if (!open) { + content.height = 1f + content.renders = true + } } if (e != null && e.type == Boolean::class.java && e.getVisualizer() == null) { @@ -259,15 +253,15 @@ open class ConfigVisualizer { wrap(toWrap, title, desc, icon).also { it.color = PolyColor.TRANSPARENT it.onClick(openInsn) - }, + }.namedId("AccordionHeader"), Group( size = Vec2(1078f, 0f), alignment = accordOpt, children = options.toTypedArray(), ).namedId("AccordionContent"), color = optBg, - alignment = alignVNoPad, - ).namedId("AccordionHeader") + alignment = alignCStartNoPad, + ).namedId("AccordionContainer") return out } diff --git a/modules/events/src/main/java/org/polyfrost/oneconfig/api/event/v1/EventManager.java b/modules/events/src/main/java/org/polyfrost/oneconfig/api/event/v1/EventManager.java index a1f4be7cc..9ebb1f96b 100644 --- a/modules/events/src/main/java/org/polyfrost/oneconfig/api/event/v1/EventManager.java +++ b/modules/events/src/main/java/org/polyfrost/oneconfig/api/event/v1/EventManager.java @@ -52,7 +52,7 @@ public final class EventManager { public static final EventManager INSTANCE = new EventManager(); private static final Logger LOGGER = LogManager.getLogger("OneConfig/Events"); private final Deque collectors = new ArrayDeque<>(2); - private final Map>> cache = new WeakHashMap<>(5); + private final Map>> cache = new WeakHashMap<>(5); private final Map, List>> handlers = new HashMap<>(8); @ApiStatus.Internal @Nullable @@ -126,11 +126,13 @@ public void register(Object object) { */ public void register(Object object, boolean removable) { for (EventCollector m : collectors) { - List> h = m.collect(object); - if (h == null || h.isEmpty()) continue; + Iterable> h = m.collect(object); + if (h == null) continue; + Iterator> iter = h.iterator(); + if (!iter.hasNext()) continue; if (removable) cache.put(object, h); - for (EventHandler handler : h) { - register(handler); + while (iter.hasNext()) { + register(iter.next()); } } } @@ -187,7 +189,7 @@ public boolean unregister(EventHandler handler) { *
This method only works if the object was registered with removable true! */ public boolean unregister(Object object) { - Collection> h = cache.remove(object); + Iterable> h = cache.remove(object); if (h == null) return false; boolean state = true; for (EventHandler handler : h) { diff --git a/modules/events/src/main/java/org/polyfrost/oneconfig/api/event/v1/invoke/EventCollector.java b/modules/events/src/main/java/org/polyfrost/oneconfig/api/event/v1/invoke/EventCollector.java index e4a063118..3aff9a2c3 100644 --- a/modules/events/src/main/java/org/polyfrost/oneconfig/api/event/v1/invoke/EventCollector.java +++ b/modules/events/src/main/java/org/polyfrost/oneconfig/api/event/v1/invoke/EventCollector.java @@ -26,8 +26,6 @@ package org.polyfrost.oneconfig.api.event.v1.invoke; -import java.util.List; - @FunctionalInterface public interface EventCollector { /** @@ -35,5 +33,5 @@ public interface EventCollector { * * @return a list of handlers, or null if the object cannot be collected by this collector */ - List> collect(Object object); + Iterable> collect(Object object); } diff --git a/modules/hud/src/main/kotlin/org/polyfrost/oneconfig/api/hud/v1/internal/HudVisualizer.kt b/modules/hud/src/main/kotlin/org/polyfrost/oneconfig/api/hud/v1/internal/HudVisualizer.kt index 9f546815d..2e8852f70 100644 --- a/modules/hud/src/main/kotlin/org/polyfrost/oneconfig/api/hud/v1/internal/HudVisualizer.kt +++ b/modules/hud/src/main/kotlin/org/polyfrost/oneconfig/api/hud/v1/internal/HudVisualizer.kt @@ -44,7 +44,7 @@ class HudVisualizer : ConfigVisualizer() { mapOf( options.keys.first() to Group( *options.values.first().values.first().toTypedArray(), - alignment = alignVNoPad, + alignment = alignCStartNoPad, ) ) } else super.flattenSubcategories(options) diff --git a/modules/ui/src/main/java/org/polyfrost/oneconfig/api/ui/v1/UIManager.java b/modules/ui/src/main/java/org/polyfrost/oneconfig/api/ui/v1/UIManager.java index 6d4568ddb..099ff83c4 100644 --- a/modules/ui/src/main/java/org/polyfrost/oneconfig/api/ui/v1/UIManager.java +++ b/modules/ui/src/main/java/org/polyfrost/oneconfig/api/ui/v1/UIManager.java @@ -26,19 +26,23 @@ package org.polyfrost.oneconfig.api.ui.v1; +import org.apache.logging.log4j.LogManager; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.polyfrost.oneconfig.api.event.v1.EventDelay; import org.polyfrost.oneconfig.api.event.v1.EventManager; import org.polyfrost.oneconfig.api.event.v1.events.HudRenderEvent; import org.polyfrost.oneconfig.api.event.v1.events.ResizeEvent; +import org.polyfrost.oneconfig.api.event.v1.events.WorldLoadEvent; import org.polyfrost.oneconfig.api.platform.v1.Platform; import org.polyfrost.oneconfig.api.ui.v1.api.TinyFdApi; import org.polyfrost.polyui.PolyUI; -import org.polyfrost.polyui.component.Component; import org.polyfrost.polyui.Settings; +import org.polyfrost.polyui.component.Component; import org.polyfrost.polyui.renderer.Renderer; import org.polyfrost.polyui.renderer.Window; +import org.polyfrost.universal.UChat; import org.polyfrost.universal.UMatrixStack; import java.util.ServiceLoader; @@ -72,11 +76,11 @@ public interface UIManager { /** * Wrap this PolyUI instance in a Minecraft screen object, ready to be displayed to the user. {@link org.polyfrost.oneconfig.api.platform.v1.ScreenPlatform#display(Object) Platform.screen().display(this)} * - * @param polyUI the PolyUI instance to use + * @param polyUI the PolyUI instance to use * @param designedWidth the resolution that this PolyUI instance was designed to use - * @param pauses weather to pause the game when the screen is opened - * @param blurs if true blur will be used on the background - * @param onClose callback to run when the screen is closed + * @param pauses weather to pause the game when the screen is opened + * @param blurs if true blur will be used on the background + * @param onClose callback to run when the screen is closed * @return a Minecraft screen object. Will be a GuiScreen or Screen depending on the Minecraft version. */ Object createPolyUIScreen(@NotNull PolyUI polyUI, float designedWidth, float designedHeight, boolean pauses, boolean blurs, @Nullable Consumer onClose); @@ -92,19 +96,25 @@ public interface UIManager { */ @ApiStatus.Internal default PolyUI createDefault() { - Settings settings = new Settings(); - settings.enableDebugMode(false); - settings.enableInitCleanup(false); - PolyUI p = new PolyUI(new Component[0], getRenderer(), settings, 1920f, 1080f); - p.getMaster().setRawResize(true); - p.setWindow(createWindow()); - p.resize(Platform.screen().windowWidth(), Platform.screen().windowHeight(), false); - EventManager.register(HudRenderEvent.class, ev -> { - UMatrixStack stack = ev.matrices; - Platform.screen().setSmuggledMatrixStack(stack); - stack.runWithGlobalState(p::render); - }); - EventManager.register(ResizeEvent.class, ev -> p.resize(ev.newWidth, ev.newHeight, false)); - return p; + try { + Settings settings = new Settings(); + settings.enableDebugMode(false); + settings.enableInitCleanup(false); + PolyUI p = new PolyUI(new Component[0], getRenderer(), settings, 1920f, 1080f); + p.getMaster().setRawResize(true); + p.setWindow(createWindow()); + p.resize(Platform.screen().windowWidth(), Platform.screen().windowHeight(), false); + EventManager.register(HudRenderEvent.class, ev -> { + UMatrixStack stack = ev.matrices; + Platform.screen().setSmuggledMatrixStack(stack); + stack.runWithGlobalState(p::render); + }); + EventManager.register(ResizeEvent.class, ev -> p.resize(ev.newWidth, ev.newHeight, false)); + return p; + } catch (Throwable t) { + LogManager.getLogger("OneConfig/UI").error("Failed to load renderer!", t); + EventManager.register(WorldLoadEvent.class, () -> EventDelay.tick(20, () -> UChat.chat("&cFailed to load the renderer for OneConfig. This means the UI, HUD and Notifications will not work. Please report this to https://discord.gg/polyfrost and attach your log."))); + return null; + } } } diff --git a/modules/ui/src/main/kotlin/org/polyfrost/oneconfig/api/ui/v1/keybind/KeybindManager.kt b/modules/ui/src/main/kotlin/org/polyfrost/oneconfig/api/ui/v1/keybind/KeybindManager.kt index ac4810b63..f58348baa 100644 --- a/modules/ui/src/main/kotlin/org/polyfrost/oneconfig/api/ui/v1/keybind/KeybindManager.kt +++ b/modules/ui/src/main/kotlin/org/polyfrost/oneconfig/api/ui/v1/keybind/KeybindManager.kt @@ -26,6 +26,7 @@ package org.polyfrost.oneconfig.api.ui.v1.keybind +import org.apache.logging.log4j.LogManager import org.polyfrost.oneconfig.api.event.v1.eventHandler import org.polyfrost.oneconfig.api.event.v1.events.KeyInputEvent import org.polyfrost.oneconfig.api.event.v1.events.ScreenOpenEvent @@ -40,6 +41,7 @@ import org.polyfrost.universal.UKeyboard @Suppress("UnstableApiUsage") object KeybindManager { + private val LOGGER = LogManager.getLogger("OneConfig/Keybinds") private val settings = Settings() private val keyBinder = KeyBinder(settings) val inputManager = InputManager(null, keyBinder, settings) @@ -116,31 +118,40 @@ object KeybindManager { fun builder() = OCKeybindHelper() @JvmStatic - fun translateKey(inputManager: InputManager, key: Int, character: Char, state: Boolean) { - if (character != '\u0000' && !character.isISOControl() && character.isDefined()) { - if (state) { - inputManager.keyTyped(character) - inputManager.keyDown(character.lowercaseChar().code) - } else inputManager.keyUp(character.lowercaseChar().code) - return + fun translateKey(inputManager: InputManager, key: Int, char: Char, state: Boolean) { + // fix for modified characters not being sent in glfwCharCallback as glfwSetCharModsCallback is deprecated + // for more info (see PolyUI/nanovg-impl/GLFWWindow) + val character = if (!char.isValid() && key < 255 && inputManager.mods > 1.toByte() && state) (key + 32).toChar() else char + try { + if (character.isValid()) { + if (state) { + inputManager.keyTyped(character) + inputManager.keyDown(character.lowercaseChar().code) + } else inputManager.keyUp(character.lowercaseChar().code) + return + } + + val k = keysMap[key] + if (k != null) { + if (state) inputManager.keyDown(k) + else inputManager.keyUp(k) + return + } + + val m = modsMap[key].toByte() + if (m != 0.toByte()) { + if (state) inputManager.addModifier(m) + else inputManager.removeModifier(m) + return + } + + val raw = if (inputManager.mods > 1) key + 48 else key + if (state) inputManager.keyDown(raw) + else inputManager.keyUp(raw) + } catch (t: Throwable) { + LOGGER.error("Failed to process input key=$key, char=$character, state=$state", t) } - - val k = keysMap[key] - if (k != null) { - if (state) inputManager.keyDown(k) - else inputManager.keyUp(k) - return - } - - val m = modsMap[key].toByte() - if (m != 0.toByte()) { - if (state) inputManager.addModifier(m) - else inputManager.removeModifier(m) - return - } - - val raw = if (inputManager.mods > 1) key + 48 else key - if (state) inputManager.keyDown(raw) - else inputManager.keyUp(raw) } + + private fun Char.isValid() = this != '\u0000' && !this.isISOControl() && this.isDefined() } \ No newline at end of file diff --git a/modules/ui/src/main/resources/info.svg b/modules/ui/src/main/resources/info.svg new file mode 100644 index 000000000..1ec4e29d1 --- /dev/null +++ b/modules/ui/src/main/resources/info.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/versions/mappings/fabric-1.19.4-1.18.2.txt b/versions/mappings/fabric-1.19.4-1.18.2.txt index 03057a564..847837910 100644 --- a/versions/mappings/fabric-1.19.4-1.18.2.txt +++ b/versions/mappings/fabric-1.19.4-1.18.2.txt @@ -1,2 +1,4 @@ +net.minecraft.client.network.ClientPlayerEntity sendMessage() sendChatMessage() + net.minecraft.network.packet.s2c.play.GameMessageS2CPacket content() getMessage() net.minecraft.text.Text getString() asString() diff --git a/versions/mappings/forge-1.19.4-1.18.2.txt b/versions/mappings/forge-1.19.4-1.18.2.txt index 6c4bc1100..392e435cc 100644 --- a/versions/mappings/forge-1.19.4-1.18.2.txt +++ b/versions/mappings/forge-1.19.4-1.18.2.txt @@ -1,3 +1,5 @@ +net.minecraft.client.player.LocalPlayer sendSystemMessage() chat() + net.minecraftforge.client.event.ClientPlayerNetworkEvent$LoggingIn net.minecraftforge.client.event.ClientPlayerNetworkEvent$LoggedInEvent net.minecraftforge.client.gui.overlay.ForgeGui net.minecraftforge.client.gui.ForgeIngameGui diff --git a/versions/src/main/java/org/polyfrost/oneconfig/api/platform/v1/internal/LoaderPlatformImpl.java b/versions/src/main/java/org/polyfrost/oneconfig/api/platform/v1/internal/LoaderPlatformImpl.java index 99c1c70e5..d6e95d1f2 100644 --- a/versions/src/main/java/org/polyfrost/oneconfig/api/platform/v1/internal/LoaderPlatformImpl.java +++ b/versions/src/main/java/org/polyfrost/oneconfig/api/platform/v1/internal/LoaderPlatformImpl.java @@ -42,11 +42,12 @@ //#else import net.minecraftforge.fml.common.Loader; import net.minecraftforge.fml.common.ModContainer; -import net.minecraft.launchwrapper.Launch; -//#endif -//#if FORGE && MC>11202 +//#if MC>11202 //$$ import net.minecraftforge.fml.ModList; //$$ import net.minecraftforge.fml.ModLoadingContext; +//#else +import net.minecraft.launchwrapper.Launch; +//#endif //#endif public class LoaderPlatformImpl implements LoaderPlatform { diff --git a/versions/src/main/java/org/polyfrost/oneconfig/api/ui/v1/internal/wrappers/PolyUIScreen.java b/versions/src/main/java/org/polyfrost/oneconfig/api/ui/v1/internal/wrappers/PolyUIScreen.java index 19c539144..04d8584c7 100644 --- a/versions/src/main/java/org/polyfrost/oneconfig/api/ui/v1/internal/wrappers/PolyUIScreen.java +++ b/versions/src/main/java/org/polyfrost/oneconfig/api/ui/v1/internal/wrappers/PolyUIScreen.java @@ -59,7 +59,7 @@ public class PolyUIScreen extends UScreen implements BlurScreen { private final boolean pauses, blurs; private final Consumer close; - //#if MC<=11300 + //#if MC < 1.13 private int mx, my; //#endif @@ -93,7 +93,7 @@ protected final void adjustResolution(float w, float h, boolean force) { @Override public void onDrawScreen(@NotNull UMatrixStack matrices, int mouseX, int mouseY, float delta) { - //#if MC<11300 + //#if MC < 1.13 if (mouseX != mx || mouseY != my) { mx = mouseX; my = mouseY; @@ -191,7 +191,7 @@ public boolean uMouseReleased(double mouseX, double mouseY, int mouseButton) { public boolean uMouseScrolled(double delta) { try { float v = (float) - //#if MC<13000 + //#if MC < 1.13 //$$ delta / 8f; //#else delta; @@ -203,14 +203,14 @@ public boolean uMouseScrolled(double delta) { return true; } - //#if MC>=11300 + //#if MC >= 1.13 //$$ @Override //#endif public boolean shouldCloseOnEsc() { return true; } - //#if MC<=11300 + //#if MC < 1.13 @Override //#endif public boolean doesGuiPauseGame() { @@ -223,7 +223,7 @@ public boolean hasBackgroundBlur() { } - //#if MC>=11300 + //#if MC >= 1.13 //$$ @Override //#endif @MustBeInvokedByOverriders @@ -233,7 +233,7 @@ public void mouseMoved(double mouseX, double mouseY) { float oy = (float) Platform.screen().windowHeight() / 2f - master.getHeight() / 2f; float mx, my; - //#if MC>=11300 + //#if MC >= 1.13 //$$ mx = (float) Minecraft.getInstance().mouseHelper.getMouseX(); //$$ my = (float) Minecraft.getInstance().mouseHelper.getMouseY(); //#else diff --git a/versions/src/main/java/org/polyfrost/oneconfig/internal/OneConfig.java b/versions/src/main/java/org/polyfrost/oneconfig/internal/OneConfig.java index 2bc06d216..8ec5a1a86 100644 --- a/versions/src/main/java/org/polyfrost/oneconfig/internal/OneConfig.java +++ b/versions/src/main/java/org/polyfrost/oneconfig/internal/OneConfig.java @@ -32,6 +32,7 @@ import org.apache.logging.log4j.Logger; import org.polyfrost.oneconfig.api.commands.v1.CommandManager; import org.polyfrost.oneconfig.api.commands.v1.factories.builder.CommandBuilder; +import org.polyfrost.oneconfig.api.config.v1.internal.ConfigVisualizer; import org.polyfrost.oneconfig.api.event.v1.EventManager; import org.polyfrost.oneconfig.api.event.v1.events.InitializationEvent; import org.polyfrost.oneconfig.api.hud.v1.HudManager; @@ -115,13 +116,14 @@ private void init() { private static void registerCommands() { CommandBuilder b = CommandBuilder.command("oneconfig", "ocfg", "twoconfig").description("OneConfig main command"); - b.then(runs().does((Runnable) OneConfigUI.INSTANCE::open).description("Opens the OneConfig GUI")); + b.then(runs().does((Runnable) OneConfigUI.INSTANCE::open).description("Opens the OneConfig UI")); b.then(runs("updateCheck").does(() -> Multithreading.submit(() -> UChat.chat(MavenUpdateChecker.oneconfig().hasUpdate() ? "Update available!" : "No updates available"))).description("Check for updates")); b.then(runs("locraw").does(() -> UChat.chat(HypixelUtils.getLocation()))).description("Get your current location on Hypixel"); b.then(runs("hud").does(() -> Platform.screen().display(HudManager.INSTANCE.getWithEditor())).description("Opens the OneConfig HUD editor")); b.then(runs("delete").does(() -> { OneConfigUI.INSTANCE.invalidateCache(); - UChat.chat("OK"); + ConfigVisualizer.INSTANCE.clearCache(); + UChat.chat("Deleted OneConfig UI. Please make a report if you were having issues!"); })).description("Invalidate the OneConfig UI, forcing a reload. Use this if it is bugged and make sure to report an issue!"); CommandManager.registerCommand(b.build()); } @@ -130,7 +132,15 @@ private static void registerKeybinds() { OCKeybindHelper builder = OCKeybindHelper.builder(); if (Platform.loader().isDevelopment()) builder.inScreens(); builder.mods(KeyModifiers.RSHIFT).does((s) -> { - if (s) OneConfigUI.INSTANCE.open(); + if (s) { + try { + OneConfigUI.INSTANCE.open(); + } catch (Throwable t) { + UChat.chat("&cFailed to open OneConfig UI: " + t.getMessage() + ". Please report this!"); + // propagate for proper error handling + throw t; + } + } return Unit.INSTANCE; }); diff --git a/versions/src/main/java/org/polyfrost/oneconfig/internal/mixin/events/Mixin_ChatSendEvent.java b/versions/src/main/java/org/polyfrost/oneconfig/internal/mixin/events/Mixin_ChatSendEvent.java index d1c9b989f..a694a4faf 100644 --- a/versions/src/main/java/org/polyfrost/oneconfig/internal/mixin/events/Mixin_ChatSendEvent.java +++ b/versions/src/main/java/org/polyfrost/oneconfig/internal/mixin/events/Mixin_ChatSendEvent.java @@ -26,7 +26,6 @@ package org.polyfrost.oneconfig.internal.mixin.events; -//#if MC < 1.19 import net.minecraft.client.entity.EntityPlayerSP; import org.polyfrost.oneconfig.api.event.v1.EventManager; import org.polyfrost.oneconfig.api.event.v1.events.ChatSendEvent; @@ -44,7 +43,21 @@ public abstract class Mixin_ChatSendEvent { private ChatSendEvent ocfg$chatEvent; @Inject(method = "sendChatMessage", at = @At("HEAD"), cancellable = true) - public void chatCallback(String message, CallbackInfo ci) { + public void chatCallback( + //#if MC < 1.19 + String message, + //#else + //#if FABRIC + //$$ net.minecraft.text.Text text, + //#else + //$$ net.minecraft.network.chat.Component text, + //#endif + //#endif + CallbackInfo ci + ) { + //#if MC >= 1.19 + //$$ String message = text.getString(); + //#endif //#if MC >= 1.16 //$$ if (org.polyfrost.oneconfig.internal.libs.fabric.ClientCommandInternals.executeCommand(message)) { //$$ ci.cancel(); @@ -66,4 +79,3 @@ public String modifyMessage(String message) { } } -//#endif \ No newline at end of file diff --git a/versions/src/main/java/org/polyfrost/oneconfig/internal/mixin/events/Mixin_KeyInputEvent.java b/versions/src/main/java/org/polyfrost/oneconfig/internal/mixin/events/Mixin_KeyInputEvent.java index 00758479a..30779c342 100644 --- a/versions/src/main/java/org/polyfrost/oneconfig/internal/mixin/events/Mixin_KeyInputEvent.java +++ b/versions/src/main/java/org/polyfrost/oneconfig/internal/mixin/events/Mixin_KeyInputEvent.java @@ -22,7 +22,6 @@ public class Mixin_KeyInputEvent { //#if MC >= 1.16.5 - //#if FORGE //$$ @ModifyVariable(method = "onKeyEvent", at = @At(value = "STORE"), ordinal = 0) //$$ private boolean keyCallback(boolean original, long windowPointer, int key, int scanCode, int action, int modifiers) { //$$ EventManager.INSTANCE.post(new KeyInputEvent(key, (char) 0, action)); @@ -34,7 +33,6 @@ public class Mixin_KeyInputEvent { //$$ EventManager.INSTANCE.post(new KeyInputEvent(0, key, 1)); //$$ return original; //$$ } - //#endif //#else //@formatter:off diff --git a/versions/src/main/java/org/polyfrost/oneconfig/internal/mixin/events/Mixin_PlayerInteractEvent_LeftAction.java b/versions/src/main/java/org/polyfrost/oneconfig/internal/mixin/events/Mixin_PlayerInteractEvent_LeftAction.java index fa1c321d3..f137658fe 100644 --- a/versions/src/main/java/org/polyfrost/oneconfig/internal/mixin/events/Mixin_PlayerInteractEvent_LeftAction.java +++ b/versions/src/main/java/org/polyfrost/oneconfig/internal/mixin/events/Mixin_PlayerInteractEvent_LeftAction.java @@ -17,13 +17,13 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(Minecraft.class) -public class Mixin_PlayerInteractEvent_LeftAction { +public abstract class Mixin_PlayerInteractEvent_LeftAction { @Shadow public MovingObjectPosition objectMouseOver; @Shadow public EntityPlayerSP thePlayer; @Shadow private int leftClickCounter; - @Unique private PlayerInteractEvent lastAttackEvent; + @Unique private PlayerInteractEvent ocfg$lastAttackEvent; @Inject( method = "clickMouse", @@ -68,9 +68,9 @@ private void onPlayerAttackCallback( } } - lastAttackEvent = new PlayerInteractEvent(this.thePlayer, PlayerInteractEvent.Action.LEFT, type); - EventManager.INSTANCE.post(lastAttackEvent); - if (lastAttackEvent.cancelled) { + ocfg$lastAttackEvent = new PlayerInteractEvent(this.thePlayer, PlayerInteractEvent.Action.LEFT, type); + EventManager.INSTANCE.post(ocfg$lastAttackEvent); + if (ocfg$lastAttackEvent.cancelled) { //#if MC >= 1.18.2 //$$ cir.setReturnValue(false); //#else @@ -81,12 +81,12 @@ private void onPlayerAttackCallback( @Inject(method = "sendClickBlockToController", at = @At("HEAD"), cancellable = true) private void onBlockClickPacketCallback(boolean leftClick, CallbackInfo ci) { - if (lastAttackEvent != null && lastAttackEvent.getAction() == PlayerInteractEvent.Action.LEFT && lastAttackEvent.cancelled) { + if (ocfg$lastAttackEvent != null && ocfg$lastAttackEvent.getAction() == PlayerInteractEvent.Action.LEFT && ocfg$lastAttackEvent.cancelled) { ci.cancel(); } if (!leftClick) { - lastAttackEvent = null; + ocfg$lastAttackEvent = null; } }