diff options
author | Kevin <92656833+kevinthegreat1@users.noreply.github.com> | 2024-03-18 00:41:24 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-03-18 00:41:24 -0400 |
commit | 969fa4fbac7e769742c47d2fc3adacf2e212053a (patch) | |
tree | 5b41d94fd1a5684e51f4850c2c196b457e3d3561 | |
parent | 02a7ecc471c3a24a0ef4c9a58b70ebf2510ed55f (diff) | |
download | Skyblocker-969fa4fbac7e769742c47d2fc3adacf2e212053a.tar.gz Skyblocker-969fa4fbac7e769742c47d2fc3adacf2e212053a.tar.bz2 Skyblocker-969fa4fbac7e769742c47d2fc3adacf2e212053a.zip |
Fix potential stack overflow with chat rules (#592)
6 files changed, 33 insertions, 15 deletions
diff --git a/src/main/java/de/hysky/skyblocker/mixin/accessor/BeaconBlockEntityRendererInvoker.java b/src/main/java/de/hysky/skyblocker/mixin/accessor/BeaconBlockEntityRendererInvoker.java index 0b607fce..e470cdae 100644 --- a/src/main/java/de/hysky/skyblocker/mixin/accessor/BeaconBlockEntityRendererInvoker.java +++ b/src/main/java/de/hysky/skyblocker/mixin/accessor/BeaconBlockEntityRendererInvoker.java @@ -11,6 +11,6 @@ public interface BeaconBlockEntityRendererInvoker { @SuppressWarnings("unused") @Invoker("renderBeam") static void renderBeam(MatrixStack matrices, VertexConsumerProvider vertexConsumers, float tickDelta, long worldTime, int yOffset, int maxY, float[] color) { - throw new IllegalStateException("Mixin invoker failed to apply."); + throw new UnsupportedOperationException(); } } diff --git a/src/main/java/de/hysky/skyblocker/mixin/accessor/MessageHandlerAccessor.java b/src/main/java/de/hysky/skyblocker/mixin/accessor/MessageHandlerAccessor.java new file mode 100644 index 00000000..6e5793e3 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/mixin/accessor/MessageHandlerAccessor.java @@ -0,0 +1,14 @@ +package de.hysky.skyblocker.mixin.accessor; + +import net.minecraft.client.network.message.MessageHandler; +import net.minecraft.text.Text; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Invoker; + +import java.time.Instant; + +@Mixin(MessageHandler.class) +public interface MessageHandlerAccessor { + @Invoker + void invokeAddToChatLog(Text message, Instant timestamp); +} diff --git a/src/main/java/de/hysky/skyblocker/mixin/accessor/PlayerListHudAccessor.java b/src/main/java/de/hysky/skyblocker/mixin/accessor/PlayerListHudAccessor.java index d82c568f..c982249a 100644 --- a/src/main/java/de/hysky/skyblocker/mixin/accessor/PlayerListHudAccessor.java +++ b/src/main/java/de/hysky/skyblocker/mixin/accessor/PlayerListHudAccessor.java @@ -9,9 +9,8 @@ import java.util.Comparator; @Mixin(PlayerListHud.class) public interface PlayerListHudAccessor { - @Accessor("ENTRY_ORDERING") static Comparator<PlayerListEntry> getOrdering() { - throw new AssertionError(); + throw new UnsupportedOperationException(); } } diff --git a/src/main/java/de/hysky/skyblocker/mixin/accessor/RecipeBookWidgetAccessor.java b/src/main/java/de/hysky/skyblocker/mixin/accessor/RecipeBookWidgetAccessor.java index aecdf9b7..30aad00c 100644 --- a/src/main/java/de/hysky/skyblocker/mixin/accessor/RecipeBookWidgetAccessor.java +++ b/src/main/java/de/hysky/skyblocker/mixin/accessor/RecipeBookWidgetAccessor.java @@ -9,6 +9,7 @@ import org.spongepowered.asm.mixin.gen.Accessor; public interface RecipeBookWidgetAccessor { @Accessor String getSearchText(); + @Accessor TextFieldWidget getSearchField(); } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/chat/ChatRulesHandler.java b/src/main/java/de/hysky/skyblocker/skyblock/chat/ChatRulesHandler.java index 13115bee..2a103d13 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/chat/ChatRulesHandler.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/chat/ChatRulesHandler.java @@ -5,8 +5,8 @@ import com.google.gson.JsonObject; import com.google.gson.JsonParser; import com.mojang.serialization.Codec; import com.mojang.serialization.JsonOps; - import de.hysky.skyblocker.SkyblockerMod; +import de.hysky.skyblocker.mixin.accessor.MessageHandlerAccessor; import de.hysky.skyblocker.utils.Http; import de.hysky.skyblocker.utils.Utils; import net.fabricmc.fabric.api.client.message.v1.ClientReceiveMessageEvents; @@ -21,10 +21,10 @@ import org.slf4j.LoggerFactory; import java.io.BufferedReader; import java.io.BufferedWriter; -import java.io.IOException; import java.nio.file.Files; import java.nio.file.NoSuchFileException; import java.nio.file.Path; +import java.time.Instant; import java.util.*; import java.util.concurrent.CompletableFuture; @@ -53,16 +53,16 @@ public class ChatRulesHandler { private static void loadChatRules() { try (BufferedReader reader = Files.newBufferedReader(CHAT_RULE_FILE)) { Map<String, List<ChatRule>> chatRules = MAP_CODEC.parse(JsonOps.INSTANCE, JsonParser.parseReader(reader)).result().orElseThrow(); - LOGGER.info("[Sky: " + chatRules.toString()); - + LOGGER.info("[Skyblocker Chat Rules]: {}", chatRules); + chatRuleList.addAll(chatRules.get("rules")); - LOGGER.info("[Skyblocker] Loaded chat rules"); + LOGGER.info("[Skyblocker Chat Rules] Loaded chat rules"); } catch (NoSuchFileException e) { registerDefaultChatRules(); - LOGGER.warn("[Skyblocker] chat rule file not found, using default rules. This is normal when using for the first time."); + LOGGER.warn("[Skyblocker Chat Rules] chat rules file not found, using default rules. This is normal when using for the first time."); } catch (Exception e) { - LOGGER.error("[Skyblocker] Failed to load shortcuts file", e); + LOGGER.error("[Skyblocker Chat Rules] Failed to load chat rules file", e); } } @@ -92,7 +92,7 @@ public class ChatRulesHandler { locations.put(entry.getValue().getAsString().replace(" ", "").toLowerCase(), entry.getKey()); } } catch (Exception e) { - LOGGER.error("[Skyblocker] Failed to load locations!", e); + LOGGER.error("[Skyblocker Chat Rules] Failed to load locations!", e); } } @@ -101,9 +101,9 @@ public class ChatRulesHandler { chatRuleJson.add("rules", ChatRule.LIST_CODEC.encodeStart(JsonOps.INSTANCE, chatRuleList).result().orElseThrow()); try (BufferedWriter writer = Files.newBufferedWriter(CHAT_RULE_FILE)) { SkyblockerMod.GSON.toJson(chatRuleJson, writer); - LOGGER.info("[Skyblocker] Saved chat rules file"); + LOGGER.info("[Skyblocker Chat Rules] Saved chat rules file"); } catch (Exception e) { - LOGGER.error("[Skyblocker] Failed to save chat rules file", e); + LOGGER.error("[Skyblocker Chat Rules] Failed to save chat rules file", e); } } @@ -136,9 +136,12 @@ public class ChatRulesHandler { CLIENT.player.sendMessage(newMessage, true); } - //hide message + //show replacement message in chat + //bypass MessageHandler#onGameMessage to avoid activating chat rules again if (!rule.getHideMessage() && CLIENT.player != null) { - CLIENT.player.sendMessage(newMessage, false); + CLIENT.inGameHud.getChatHud().addMessage(newMessage); + ((MessageHandlerAccessor) CLIENT.getMessageHandler()).invokeAddToChatLog(newMessage, Instant.now()); + CLIENT.getNarratorManager().narrateSystemMessage(newMessage); } //play sound diff --git a/src/main/resources/skyblocker.mixins.json b/src/main/resources/skyblocker.mixins.json index fd7364ce..c5e78753 100644 --- a/src/main/resources/skyblocker.mixins.json +++ b/src/main/resources/skyblocker.mixins.json @@ -39,6 +39,7 @@ "accessor.FrustumInvoker", "accessor.HandledScreenAccessor", "accessor.ItemStackAccessor", + "accessor.MessageHandlerAccessor", "accessor.PlayerListHudAccessor", "accessor.RecipeBookWidgetAccessor", "accessor.ScreenAccessor", |