diff options
Diffstat (limited to 'src/main/java/de/hysky')
6 files changed, 137 insertions, 55 deletions
diff --git a/src/main/java/de/hysky/skyblocker/SkyblockerMod.java b/src/main/java/de/hysky/skyblocker/SkyblockerMod.java index 1aa97526..59383ff9 100644 --- a/src/main/java/de/hysky/skyblocker/SkyblockerMod.java +++ b/src/main/java/de/hysky/skyblocker/SkyblockerMod.java @@ -6,6 +6,7 @@ import de.hysky.skyblocker.config.SkyblockerConfigManager; import de.hysky.skyblocker.debug.Debug; import de.hysky.skyblocker.skyblock.*; import de.hysky.skyblocker.skyblock.crimson.kuudra.Kuudra; +import de.hysky.skyblocker.skyblock.chat.ChatRulesHandler; import de.hysky.skyblocker.skyblock.dungeon.*; import de.hysky.skyblocker.skyblock.dungeon.partyfinder.PartyFinderScreen; import de.hysky.skyblocker.skyblock.dungeon.puzzle.boulder.Boulder; @@ -109,6 +110,7 @@ public class SkyblockerMod implements ClientModInitializer { CrystalsLocationsManager.init(); ChatMessageListener.init(); Shortcuts.init(); + ChatRulesHandler.init(); DiscordRPCManager.init(); LividColor.init(); FishingHelper.init(); diff --git a/src/main/java/de/hysky/skyblocker/skyblock/chat/ChatRule.java b/src/main/java/de/hysky/skyblocker/skyblock/chat/ChatRule.java index ebf0a310..e212b2a0 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/chat/ChatRule.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/chat/ChatRule.java @@ -1,6 +1,7 @@ package de.hysky.skyblocker.skyblock.chat; import de.hysky.skyblocker.utils.Utils; +import dev.isxander.yacl3.config.v2.api.SerialEntry; import net.minecraft.client.MinecraftClient; import net.minecraft.client.sound.Sound; import net.minecraft.item.ItemStack; @@ -13,22 +14,21 @@ import java.util.regex.Pattern; */ public class ChatRule { - private String name; + public String name; //inputs - private Boolean enabled; - private Boolean isPartialMatch; - private Boolean isRegex; - private String filter; - private LocationOption validLocation; - private List<ItemStack> validItems; - //output - private Boolean hideMessage; - private Boolean showActionBar; - private Boolean showAnnouncement; - private String replaceMessage; //todo extract parts of original message - private Sound customSound; + public Boolean enabled; + public Boolean isPartialMatch; + public Boolean isRegex; + public String filter; + public LocationOption validLocation; + //output + public Boolean hideMessage; + public Boolean showActionBar; + public Boolean showAnnouncement; + public String replaceMessage; //todo extract parts of original message + public Sound customSound; /** * Creates a chat rule with default options. */ @@ -40,7 +40,6 @@ public class ChatRule { this.isRegex = false; this.filter = ""; this.validLocation = LocationOption.None; - this.validItems = List.of(); this.hideMessage = true; this.showActionBar = false; @@ -57,7 +56,6 @@ public class ChatRule { this.isRegex = isRegex; this.filter = filter; this.validLocation = validLocation; - this.validItems = validItems; this.hideMessage = hideMessage; this.showActionBar = showActionBar; this.showAnnouncement = showAnnouncement; @@ -105,13 +103,7 @@ public class ChatRule { this.validLocation = validLocation; } - public List<ItemStack> getValidItems() { - return validItems; - } - public void setValidItems(List<ItemStack> validItems) { - this.validItems = validItems; - } public Boolean getHideMessage() { return hideMessage; @@ -146,7 +138,7 @@ public class ChatRule { } public Sound getCustomSound() { - return customSound; + return customSound; } public void setCustomSound(Sound customSound) { @@ -193,12 +185,6 @@ public class ChatRule { default -> {} } - //held items - if (!validItems.isEmpty()){ - if (client.player == null) return false; - ItemStack heldItem = client.player.getMainHandStack(); - if (!validItems.contains(heldItem)) return false; - } return true; } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/chat/ChatRuleConfigScreen.java b/src/main/java/de/hysky/skyblocker/skyblock/chat/ChatRuleConfigScreen.java index ef0f6d92..0dc912d2 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/chat/ChatRuleConfigScreen.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/chat/ChatRuleConfigScreen.java @@ -16,7 +16,8 @@ public class ChatRuleConfigScreen extends Screen { private static final int SPACER_X = 5; private static final int SPACER_Y = 25; - private ChatRule chatRule; + private final int chatRuleIndex; + private final ChatRule chatRule; //widgets private ButtonWidget finishButton; @@ -61,9 +62,10 @@ public class ChatRuleConfigScreen extends Screen { - public ChatRuleConfigScreen(Screen parent, ChatRule chatRule) { + public ChatRuleConfigScreen(Screen parent, int chatRuleIndex) { super(Text.translatable("text.autoconfig.skyblocker.option.messages.chatRules.screen.ruleScreen")); - this.chatRule = chatRule; + this.chatRuleIndex = chatRuleIndex; + this.chatRule = ChatRulesHandler.chatRuleList.get(chatRuleIndex); this.parent = parent; } @@ -160,8 +162,6 @@ public class ChatRuleConfigScreen extends Screen { .size(75,20) .build(); - - addDrawableChild(nameInput); addDrawableChild(filterInput); addDrawableChild(partialMatchToggle); @@ -171,8 +171,6 @@ public class ChatRuleConfigScreen extends Screen { addDrawableChild(announcementToggle); addDrawableChild(replaceMessageInput); addDrawableChild(finishButton); - - } private Text enabledButtonText(boolean enabled) { @@ -208,7 +206,15 @@ public class ChatRuleConfigScreen extends Screen { //todo add checks to see if valid rule e.g. has name //and if valid save a if (client != null ) { + save(); client.setScreen(parent); } } + private void save(){ + chatRule.setName(nameInput.getText()); + chatRule.setFilter(filterInput.getText()); + chatRule.setReplaceMessage(replaceMessageInput.getText()); + + ChatRulesHandler.chatRuleList.set(chatRuleIndex,chatRule); + } } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/chat/ChatRulesConfigListWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/chat/ChatRulesConfigListWidget.java index e5f7ddef..07397f98 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/chat/ChatRulesConfigListWidget.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/chat/ChatRulesConfigListWidget.java @@ -4,7 +4,6 @@ import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.Element; import net.minecraft.client.gui.Selectable; -import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.screen.narration.NarrationMessageBuilder; import net.minecraft.client.gui.screen.narration.NarrationPart; import net.minecraft.client.gui.widget.ButtonWidget; @@ -17,52 +16,70 @@ import java.util.List; public class ChatRulesConfigListWidget extends ElementListWidget<ChatRulesConfigListWidget.chatRuleConfigEntry> { - private List<ChatRule> chatRules; private final ChatRulesConfigScreen screen; + private Boolean hasChanged; + public ChatRulesConfigListWidget(MinecraftClient minecraftClient, ChatRulesConfigScreen screen, int width, int height, int y, int itemHeight) { super(minecraftClient, width, height, y, itemHeight); this.screen = screen; - chatRules = List.of(); //todo load existing + this.hasChanged = false; //add entry fall all existing rules - for (ChatRule rule : chatRules){ - addEntry(new chatRuleConfigEntry(rule)); + for (int i = 0; i < (long) ChatRulesHandler.chatRuleList.size(); i++){ + addEntry(new chatRuleConfigEntry(i)); } } @Override + public int getRowWidth() { + return super.getRowWidth() + 100; + } + + @Override + protected int getScrollbarPositionX() { + return super.getScrollbarPositionX() + 50; + } + + @Override public void setSelected(@Nullable ChatRulesConfigListWidget.chatRuleConfigEntry entry) { super.setSelected(entry); screen.updateButtons(); } protected void addRuleAfterSelected() { - children().add(children().indexOf(getSelectedOrNull()) + 1, new chatRuleConfigEntry(new ChatRule())); + hasChanged = true; + int newIndex = children().indexOf(getSelectedOrNull()) + 1; + ChatRulesHandler.chatRuleList.add(newIndex, new ChatRule()); + children().add(newIndex, new chatRuleConfigEntry(newIndex)); } protected boolean removeEntry(chatRuleConfigEntry entry) { + hasChanged = true; return super.removeEntry(entry); } protected void saveRules() { - //todo save rules - /* - shortcutMaps.forEach(Map::clear); - getNotEmptyShortcuts().forEach(ShortcutsConfigListWidget.ShortcutEntry::save); - Shortcuts.saveShortcuts(MinecraftClient.getInstance()); // Save shortcuts to disk - */ + hasChanged = false; + ChatRulesHandler.saveChatRules(); } - public class chatRuleConfigEntry extends ElementListWidget.Entry<ChatRulesConfigListWidget.chatRuleConfigEntry> { + + protected boolean hasChanges(){ + return (hasChanged || children().stream().anyMatch(chatRuleConfigEntry::hasChange)); + } + + public class chatRuleConfigEntry extends Entry<chatRuleConfigEntry> { private static final int SPACING = 20; //data + private int chatRuleIndex; private ChatRule chatRule; + private final List<? extends Element> children; //widgets @@ -74,8 +91,9 @@ public class ChatRulesConfigListWidget extends ElementListWidget<ChatRulesConfig private final int enabledX; - public chatRuleConfigEntry(ChatRule chatRule) { - this.chatRule = chatRule; + public chatRuleConfigEntry(int chatRuleIndex) { + this.chatRuleIndex = chatRuleIndex; + this.chatRule = ChatRulesHandler.chatRuleList.get(chatRuleIndex); //initialize the widgets int currentX = width / 2 - 160; @@ -96,7 +114,7 @@ public class ChatRulesConfigListWidget extends ElementListWidget<ChatRulesConfig currentX += SPACING; //spacer openConfigWidget = ButtonWidget.builder(Text.of("Edit Rule"), a -> { - client.setScreen(new ChatRuleConfigScreen(screen, chatRule)); + client.setScreen(new ChatRuleConfigScreen(screen, chatRuleIndex)); }) .size(100,20) .position(currentX,5) @@ -114,10 +132,13 @@ public class ChatRulesConfigListWidget extends ElementListWidget<ChatRulesConfig } } private void toggleEnabled() { + hasChanged = true; chatRule.setEnabled(!chatRule.getEnabled()); enabledWidget.setMessage(enabledButtonText()); } + + @Override public List<? extends Selectable> selectableChildren() { return List.of(new Selectable() { @@ -149,5 +170,9 @@ public class ChatRulesConfigListWidget extends ElementListWidget<ChatRulesConfig context.drawTextWithShadow(client.textRenderer, "Rule: \"" + chatRule.getName() + "\"", labelX, y + 5, 0xFFFFFF); context.drawTextWithShadow(client.textRenderer, "enabled:", enabledX, y + 5, 0xFFFFFF); } + + public boolean hasChange() { + return (!chatRule.getEnabled().equals(ChatRulesHandler.chatRuleList.get(chatRuleIndex).getEnabled())); + } } } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/chat/ChatRulesConfigScreen.java b/src/main/java/de/hysky/skyblocker/skyblock/chat/ChatRulesConfigScreen.java index be55e60e..bbc3f14b 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/chat/ChatRulesConfigScreen.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/chat/ChatRulesConfigScreen.java @@ -89,7 +89,7 @@ public class ChatRulesConfigScreen extends Screen { @Override public void close() { - if (client != null ) { //todo && chatRuleConfigListWidget.hasChanges() + if (client != null && chatRulesConfigListWidget.hasChanges()) { client.setScreen(new ConfirmScreen(confirmedAction -> { if (confirmedAction) { this.client.setScreen(parent); @@ -103,8 +103,6 @@ public class ChatRulesConfigScreen extends Screen { } protected void updateButtons() { - buttonDelete.active = Shortcuts.isShortcutsLoaded() && chatRulesConfigListWidget.getSelectedOrNull() != null; - buttonNew.active = Shortcuts.isShortcutsLoaded() ; //todo ? && chatRuleConfigListWidget.getCategory().isPresent() - buttonDone.active = Shortcuts.isShortcutsLoaded(); + buttonDelete.active = chatRulesConfigListWidget.getSelectedOrNull() != null; } } 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 4ea8c24d..dc2ab0f1 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/chat/ChatRulesHandler.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/chat/ChatRulesHandler.java @@ -1,4 +1,69 @@ package de.hysky.skyblocker.skyblock.chat; +import com.google.gson.Gson; +import com.google.gson.JsonObject; +import com.google.gson.reflect.TypeToken; +import de.hysky.skyblocker.SkyblockerMod; +import de.hysky.skyblocker.skyblock.shortcut.Shortcuts; +import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback; +import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientLifecycleEvents; +import net.fabricmc.fabric.api.client.message.v1.ClientReceiveMessageEvents; +import net.fabricmc.fabric.api.client.message.v1.ClientSendMessageEvents; +import net.minecraft.text.Text; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.IOException; +import java.lang.reflect.Type; +import java.nio.file.Files; +import java.nio.file.NoSuchFileException; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + public class ChatRulesHandler { + private static final Logger LOGGER = LoggerFactory.getLogger(ChatRule.class); + private static final Path CHAT_RULE_FILE = SkyblockerMod.CONFIG_DIR.resolve("chatRules.json"); + + protected static final List<ChatRule> chatRuleList = new ArrayList<>(); + + public static void init() { + loadChatRules(); + ClientReceiveMessageEvents.GAME.register(ChatRulesHandler::checkMessage); + } + + private static void loadChatRules() { + try (BufferedReader reader = Files.newBufferedReader(CHAT_RULE_FILE)) { + Type chatRulesType = new TypeToken<Map<String, List<ChatRule>>>() { + }.getType(); + Map<String, List<ChatRule>> chatRules = SkyblockerMod.GSON.fromJson(reader,chatRulesType); + chatRuleList.addAll(chatRules.get("rules")); + + LOGGER.info("[Skyblocker] Loaded chat rules"); + } catch (NoSuchFileException e) { + //todo create default chat rules + LOGGER.warn("[Skyblocker] chat rule file not found, using default rules. This is normal when using for the first time."); + } catch (IOException e) { + LOGGER.error("[Skyblocker] Failed to load shortcuts file", e); + } + } + + protected static void saveChatRules() { + JsonObject chatRuleJson = new JsonObject(); + chatRuleJson.add("rules", SkyblockerMod.GSON.toJsonTree(chatRuleList)); + try (BufferedWriter writer = Files.newBufferedWriter(CHAT_RULE_FILE)) { + SkyblockerMod.GSON.toJson(chatRuleJson, writer); + LOGGER.info("[Skyblocker] Saved chat rules file"); + } catch (IOException e) { + LOGGER.error("[Skyblocker] Failed to save chat rules file", e); + } + } + + private static void checkMessage(Text message, Boolean overlay) { + + } + } |