aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/de
diff options
context:
space:
mode:
authorolim <bobq4582@gmail.com>2024-02-13 14:30:22 +0000
committerolim <bobq4582@gmail.com>2024-02-15 11:10:24 +0000
commit2a9fae47611cec59776e96826db8a6305978e0b1 (patch)
tree6a8bcd7c7a50da35ecb87874707b83f34b4de3ad /src/main/java/de
parent41d02daf5f53a761043ae76f5be484f94ceb0128 (diff)
downloadSkyblocker-2a9fae47611cec59776e96826db8a6305978e0b1.tar.gz
Skyblocker-2a9fae47611cec59776e96826db8a6305978e0b1.tar.bz2
Skyblocker-2a9fae47611cec59776e96826db8a6305978e0b1.zip
start of implimentation
has config ui that dose not save the rules and the basic building blocks for the rest of the feature
Diffstat (limited to 'src/main/java/de')
-rw-r--r--src/main/java/de/hysky/skyblocker/config/categories/MessageFilterCategory.java17
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/chat/ChatRule.java226
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/chat/ChatRuleConfigScreen.java214
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/chat/ChatRulesConfigListWidget.java153
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/chat/ChatRulesConfigScreen.java110
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/chat/ChatRulesHandler.java4
6 files changed, 721 insertions, 3 deletions
diff --git a/src/main/java/de/hysky/skyblocker/config/categories/MessageFilterCategory.java b/src/main/java/de/hysky/skyblocker/config/categories/MessageFilterCategory.java
index acdc8169..18c3bc99 100644
--- a/src/main/java/de/hysky/skyblocker/config/categories/MessageFilterCategory.java
+++ b/src/main/java/de/hysky/skyblocker/config/categories/MessageFilterCategory.java
@@ -2,10 +2,11 @@ package de.hysky.skyblocker.config.categories;
import de.hysky.skyblocker.config.ConfigUtils;
import de.hysky.skyblocker.config.SkyblockerConfig;
+import de.hysky.skyblocker.skyblock.chat.ChatRulesConfigScreen;
+import de.hysky.skyblocker.skyblock.dwarven.CrystalsHudConfigScreen;
import de.hysky.skyblocker.utils.chat.ChatFilterResult;
-import dev.isxander.yacl3.api.ConfigCategory;
-import dev.isxander.yacl3.api.Option;
-import dev.isxander.yacl3.api.OptionDescription;
+import dev.isxander.yacl3.api.*;
+import net.minecraft.client.MinecraftClient;
import net.minecraft.text.Text;
public class MessageFilterCategory {
@@ -125,6 +126,16 @@ public class MessageFilterCategory {
() -> config.messages.hideDicer,
newValue -> config.messages.hideDicer = newValue)
.controller(ConfigUtils::createEnumCyclingListController)
+ //chat rules options
+ .group(OptionGroup.createBuilder()
+ .name(Text.translatable("text.autoconfig.skyblocker.option.messages.chatRules"))
+ .collapsed(false)
+ .option(ButtonOption.createBuilder()
+ .name(Text.translatable("text.autoconfig.skyblocker.option.messages.chatRules.screen"))
+ .text(Text.translatable("text.skyblocker.open"))
+ .action((screen, opt) -> MinecraftClient.getInstance().setScreen(new ChatRulesConfigScreen(screen)))
+ .build())
+
.build())
.build();
}
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/chat/ChatRule.java b/src/main/java/de/hysky/skyblocker/skyblock/chat/ChatRule.java
new file mode 100644
index 00000000..ebf0a310
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/skyblock/chat/ChatRule.java
@@ -0,0 +1,226 @@
+package de.hysky.skyblocker.skyblock.chat;
+
+import de.hysky.skyblocker.utils.Utils;
+import net.minecraft.client.MinecraftClient;
+import net.minecraft.client.sound.Sound;
+import net.minecraft.item.ItemStack;
+
+import java.util.List;
+import java.util.regex.Pattern;
+
+/**
+ * Data class to contain all the settings for a chat rule
+ */
+public class ChatRule {
+
+ private 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;
+
+ /**
+ * Creates a chat rule with default options.
+ */
+ public ChatRule(){
+ this.name = "New Rule";
+
+ this.enabled = true;
+ this.isPartialMatch = false;
+ this.isRegex = false;
+ this.filter = "";
+ this.validLocation = LocationOption.None;
+ this.validItems = List.of();
+
+ this.hideMessage = true;
+ this.showActionBar = false;
+ this.showAnnouncement = false;
+ this.replaceMessage = null;
+ this.customSound = null;
+ }
+
+
+ public ChatRule(String name, Boolean enabled, Boolean isPartialMatch, Boolean isRegex, String filter, LocationOption validLocation, List<ItemStack> validItems, Boolean hideMessage, Boolean showActionBar, Boolean showAnnouncement, String replaceMessage, Sound customSound) {
+ this.name = name;
+ this.enabled = enabled;
+ this.isPartialMatch = isPartialMatch;
+ this.isRegex = isRegex;
+ this.filter = filter;
+ this.validLocation = validLocation;
+ this.validItems = validItems;
+ this.hideMessage = hideMessage;
+ this.showActionBar = showActionBar;
+ this.showAnnouncement = showAnnouncement;
+ this.replaceMessage = replaceMessage;
+ this.customSound = customSound;
+ }
+
+ public Boolean getEnabled() { //todo remove unused getters and set
+ return enabled;
+ }
+
+ public void setEnabled(Boolean enabled) {
+ this.enabled = enabled;
+ }
+
+ public Boolean getPartialMatch() {
+ return isPartialMatch;
+ }
+
+ public void setPartialMatch(Boolean partialMatch) {
+ isPartialMatch = partialMatch;
+ }
+
+ public Boolean getRegex() {
+ return isRegex;
+ }
+
+ public void setRegex(Boolean regex) {
+ isRegex = regex;
+ }
+
+ public String getFilter() {
+ return filter;
+ }
+
+ public void setFilter(String filter) {
+ this.filter = filter;
+ }
+
+ public LocationOption getValidLocation() {
+ return validLocation;
+ }
+
+ public void setValidLocation(LocationOption validLocation) {
+ this.validLocation = validLocation;
+ }
+
+ public List<ItemStack> getValidItems() {
+ return validItems;
+ }
+
+ public void setValidItems(List<ItemStack> validItems) {
+ this.validItems = validItems;
+ }
+
+ public Boolean getHideMessage() {
+ return hideMessage;
+ }
+
+ public void setHideMessage(Boolean hideMessage) {
+ this.hideMessage = hideMessage;
+ }
+
+ public Boolean getShowActionBar() {
+ return showActionBar;
+ }
+
+ public void setShowActionBar(Boolean showActionBar) {
+ this.showActionBar = showActionBar;
+ }
+
+ public Boolean getShowAnnouncement() {
+ return showAnnouncement;
+ }
+
+ public void setShowAnnouncement(Boolean showAnnouncement) {
+ this.showAnnouncement = showAnnouncement;
+ }
+
+ public String getReplaceMessage() {
+ return replaceMessage;
+ }
+
+ public void setReplaceMessage(String replaceMessage) {
+ this.replaceMessage = replaceMessage;
+ }
+
+ public Sound getCustomSound() {
+ return customSound;
+ }
+
+ public void setCustomSound(Sound customSound) {
+ this.customSound = customSound;
+ }
+
+ /**
+ * checks every input option and if the games state and the inputted str matches them returns true.
+ * @param str the chat message to check if fits
+ * @return if the inputs are all true and the outputs should be performed
+ */
+ public Boolean isMatch(String str, MinecraftClient client){
+ //enabled
+ if (!enabled) return false;
+
+ //filter
+ if (filter.isEmpty()) return false;
+ if(isRegex) {
+ if (isPartialMatch) {
+ if (! Pattern.compile(filter).matcher(str).find()) return false;
+ }else {
+ if (!str.matches(filter)) return false;
+ }
+ } else{
+ if (isPartialMatch) {
+ if (!str.contains(filter)) return false;
+ }else {
+ if (!filter.equals(str)) return false;
+ }
+ }
+
+ //location
+ String rawLocation = Utils.getLocationRaw();
+ switch (validLocation){ //todo maybe add functionality straight into utils
+ case Island -> {
+ if (!rawLocation.equals("private_island")) return false;
+ }
+ case Hub -> {
+ if (!rawLocation.equals("hub")) return false;
+ }
+ case Garden -> {
+ if (!rawLocation.equals("garden")) return false;
+ }
+ 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;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public enum LocationOption {
+ None,
+ Island,
+ Hub,
+ Garden; //todo add more
+
+ }
+
+
+}
+
+
+
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/chat/ChatRuleConfigScreen.java b/src/main/java/de/hysky/skyblocker/skyblock/chat/ChatRuleConfigScreen.java
new file mode 100644
index 00000000..ef0f6d92
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/skyblock/chat/ChatRuleConfigScreen.java
@@ -0,0 +1,214 @@
+package de.hysky.skyblocker.skyblock.chat;
+
+import it.unimi.dsi.fastutil.ints.IntIntPair;
+import net.minecraft.client.MinecraftClient;
+import net.minecraft.client.gui.DrawContext;
+import net.minecraft.client.gui.screen.Screen;
+import net.minecraft.client.gui.widget.ButtonWidget;
+import net.minecraft.client.gui.widget.TextFieldWidget;
+import net.minecraft.text.Text;
+
+
+import java.awt.*;
+
+public class ChatRuleConfigScreen extends Screen {
+
+ private static final int SPACER_X = 5;
+ private static final int SPACER_Y = 25;
+
+ private ChatRule chatRule;
+
+ //widgets
+ private ButtonWidget finishButton;
+
+ private TextFieldWidget nameInput;
+ private TextFieldWidget filterInput;
+ private ButtonWidget partialMatchToggle;
+ private ButtonWidget regexToggle;
+ //todo location dropdown or somthig
+ //todo item selection thing
+
+ private ButtonWidget hideMessageToggle;
+ private ButtonWidget actionBarToggle;
+ private ButtonWidget announcementToggle;
+ private TextFieldWidget replaceMessageInput;
+ //todo custom sound thing
+
+ //textLocations
+ private IntIntPair nameLabelTextPos;
+ private IntIntPair inputsLabelTextPos;
+
+ private IntIntPair filterLabelTextPos;
+ private IntIntPair partialMatchTextPos;
+ private IntIntPair regexTextPos;
+
+ private IntIntPair validLocationLabelTextPos;
+
+ private IntIntPair validItemLabelTextPos;
+
+ private IntIntPair outputsLabelTextPos;
+
+ private IntIntPair hideMessageTextPos;
+ private IntIntPair actionBarTextPos;
+ private IntIntPair announcementTextPos;
+
+ private IntIntPair replaceMessageLabelTextPos;
+
+ private IntIntPair customSoundLabelTextPos;
+
+
+ private final Screen parent;
+
+
+
+ public ChatRuleConfigScreen(Screen parent, ChatRule chatRule) {
+ super(Text.translatable("text.autoconfig.skyblocker.option.messages.chatRules.screen.ruleScreen"));
+ this.chatRule = chatRule;
+ this.parent = parent;
+ }
+
+ @Override
+ protected void init() {
+ super.init();
+ if (client == null) return;
+
+ IntIntPair currentPos = IntIntPair.of(5,15);
+ int lineXOffset = 0;
+
+ nameLabelTextPos = currentPos;
+ lineXOffset = client.textRenderer.getWidth(Text.translatable("text.autoconfig.skyblocker.option.messages.chatRules.screen.ruleScreen.name")) + SPACER_X;
+ nameInput = new TextFieldWidget(MinecraftClient.getInstance().textRenderer, currentPos.leftInt() + lineXOffset, currentPos.rightInt(), 100, 20, Text.of(""));
+ nameInput.setText(chatRule.getName());
+ currentPos = IntIntPair.of(currentPos.leftInt(),currentPos.rightInt() + SPACER_Y);
+
+ inputsLabelTextPos = currentPos;
+ currentPos = IntIntPair.of(currentPos.leftInt() + 10 ,currentPos.rightInt() + SPACER_Y);
+
+ filterLabelTextPos = currentPos;
+ lineXOffset = client.textRenderer.getWidth(Text.translatable("text.autoconfig.skyblocker.option.messages.chatRules.screen.ruleScreen.filter")) + SPACER_X;
+ filterInput = new TextFieldWidget(MinecraftClient.getInstance().textRenderer, currentPos.leftInt() + lineXOffset, currentPos.rightInt(), 200, 20, Text.of(""));
+ filterInput.setText(chatRule.getFilter());
+ currentPos = IntIntPair.of(currentPos.leftInt(),currentPos.rightInt() + SPACER_Y);
+ lineXOffset = 0;
+
+ partialMatchTextPos = IntIntPair.of(currentPos.leftInt() + lineXOffset,currentPos.rightInt());
+ lineXOffset += client.textRenderer.getWidth(Text.translatable("text.autoconfig.skyblocker.option.messages.chatRules.screen.ruleScreen.partialMatch")) + SPACER_X;
+ partialMatchToggle = ButtonWidget.builder(enabledButtonText(chatRule.getPartialMatch()), a -> {
+ chatRule.setPartialMatch(!chatRule.getPartialMatch());
+ partialMatchToggle.setMessage(enabledButtonText(chatRule.getPartialMatch()));
+ })
+ .position(currentPos.leftInt() + lineXOffset, currentPos.rightInt())
+ .size(75,20)
+ .build();
+ lineXOffset += 75 + SPACER_X;
+ regexTextPos = IntIntPair.of(currentPos.leftInt() + lineXOffset,currentPos.rightInt());
+ lineXOffset += client.textRenderer.getWidth(Text.translatable("text.autoconfig.skyblocker.option.messages.chatRules.screen.ruleScreen.regex")) + SPACER_X;
+ regexToggle = ButtonWidget.builder(enabledButtonText(chatRule.getRegex()), a -> {
+ chatRule.setRegex(!chatRule.getRegex());
+ regexToggle.setMessage(enabledButtonText(chatRule.getRegex()));
+ })
+ .position(currentPos.leftInt() + lineXOffset, currentPos.rightInt())
+ .size(75,20)
+ .build();
+ currentPos = IntIntPair.of(currentPos.leftInt(),currentPos.rightInt() + SPACER_Y);
+
+
+ outputsLabelTextPos = IntIntPair.of(currentPos.leftInt() - 10,currentPos.rightInt());
+ currentPos = IntIntPair.of(currentPos.leftInt(),currentPos.rightInt() + SPACER_Y);
+
+ hideMessageTextPos = currentPos;
+ lineXOffset = client.textRenderer.getWidth(Text.translatable("text.autoconfig.skyblocker.option.messages.chatRules.screen.ruleScreen.hideMessage")) + SPACER_X;
+ hideMessageToggle = ButtonWidget.builder(enabledButtonText(chatRule.getHideMessage()), a -> {
+ chatRule.setHideMessage(!chatRule.getHideMessage());
+ hideMessageToggle.setMessage(enabledButtonText(chatRule.getHideMessage()));
+ })
+ .position(currentPos.leftInt() + lineXOffset, currentPos.rightInt())
+ .size(75,20)
+ .build();
+ lineXOffset += 75 + SPACER_X;
+ actionBarTextPos = IntIntPair.of(currentPos.leftInt() + lineXOffset,currentPos.rightInt());
+ lineXOffset += client.textRenderer.getWidth(Text.translatable("text.autoconfig.skyblocker.option.messages.chatRules.screen.ruleScreen.actionBar")) + SPACER_X;
+ actionBarToggle = ButtonWidget.builder(enabledButtonText(chatRule.getShowActionBar()), a -> {
+ chatRule.setShowActionBar(!chatRule.getShowActionBar());
+ actionBarToggle.setMessage(enabledButtonText(chatRule.getShowActionBar()));
+ })
+ .position(currentPos.leftInt() + lineXOffset, currentPos.rightInt())
+ .size(75,20)
+ .build();
+ lineXOffset = 0;
+ currentPos = IntIntPair.of(currentPos.leftInt(),currentPos.rightInt() + SPACER_Y);
+
+ announcementTextPos = IntIntPair.of(currentPos.leftInt() + lineXOffset,currentPos.rightInt());
+ lineXOffset += client.textRenderer.getWidth(Text.translatable("text.autoconfig.skyblocker.option.messages.chatRules.screen.ruleScreen.announcement")) + SPACER_X;
+ announcementToggle = ButtonWidget.builder(enabledButtonText(chatRule.getShowAnnouncement()), a -> {
+ chatRule.setShowAnnouncement(!chatRule.getShowAnnouncement());
+ announcementToggle.setMessage(enabledButtonText(chatRule.getShowAnnouncement()));
+ })
+ .position(currentPos.leftInt() + lineXOffset, currentPos.rightInt())
+ .size(75,20)
+ .build();
+ currentPos = IntIntPair.of(currentPos.leftInt(),currentPos.rightInt() + SPACER_Y);
+ replaceMessageLabelTextPos = currentPos;
+ lineXOffset = client.textRenderer.getWidth(Text.translatable("text.autoconfig.skyblocker.option.messages.chatRules.screen.ruleScreen.replace")) + SPACER_X;
+ replaceMessageInput = new TextFieldWidget(MinecraftClient.getInstance().textRenderer, currentPos.leftInt() + lineXOffset, currentPos.rightInt(), 200, 20, Text.of(""));
+ replaceMessageInput.setText(chatRule.getReplaceMessage());
+
+ finishButton = ButtonWidget.builder(Text.translatable("text.autoconfig.skyblocker.option.messages.chatRules.screen.ruleScreen.finish"), a -> {
+ close();
+ })
+ .position((int) (this.width * 0.66), this.height - SPACER_Y)
+ .size(75,20)
+ .build();
+
+
+
+ addDrawableChild(nameInput);
+ addDrawableChild(filterInput);
+ addDrawableChild(partialMatchToggle);
+ addDrawableChild(regexToggle);
+ addDrawableChild(hideMessageToggle);
+ addDrawableChild(actionBarToggle);
+ addDrawableChild(announcementToggle);
+ addDrawableChild(replaceMessageInput);
+ addDrawableChild(finishButton);
+
+
+ }
+
+ private Text enabledButtonText(boolean enabled) {
+ if (enabled){
+ return Text.translatable("text.autoconfig.skyblocker.option.messages.chatRules.screen.ruleScreen.true").withColor(Color.green.getRGB());
+ }else {
+ return Text.translatable("text.autoconfig.skyblocker.option.messages.chatRules.screen.ruleScreen.false").withColor(Color.red.getRGB());
+ }
+ }
+
+ @Override
+ public void render(DrawContext context, int mouseX, int mouseY, float delta) {
+ super.render(context, mouseX, mouseY, delta);
+ context.drawCenteredTextWithShadow(this.textRenderer, this.title, this.width / 2, 16, 0xFFFFFF);
+
+ //draw labels ands text
+ int yOffset = (SPACER_Y - this.textRenderer.fontHeight) / 2;
+ context.drawTextWithShadow(this.textRenderer,Text.translatable("text.autoconfig.skyblocker.option.messages.chatRules.screen.ruleScreen.inputs"), inputsLabelTextPos.leftInt(), inputsLabelTextPos.rightInt() + yOffset, 0xFFFFFF);
+ context.drawTextWithShadow(this.textRenderer,Text.translatable("text.autoconfig.skyblocker.option.messages.chatRules.screen.ruleScreen.name"), nameLabelTextPos.leftInt(), nameLabelTextPos.rightInt()+ yOffset, 0xFFFFFF);
+ context.drawTextWithShadow(this.textRenderer,Text.translatable("text.autoconfig.skyblocker.option.messages.chatRules.screen.ruleScreen.filter"), filterLabelTextPos.leftInt(), filterLabelTextPos.rightInt()+ yOffset, 0xFFFFFF);
+ context.drawTextWithShadow(this.textRenderer,Text.translatable("text.autoconfig.skyblocker.option.messages.chatRules.screen.ruleScreen.partialMatch"), partialMatchTextPos.leftInt(), partialMatchTextPos.rightInt()+ yOffset, 0xFFFFFF);
+ context.drawTextWithShadow(this.textRenderer,Text.translatable("text.autoconfig.skyblocker.option.messages.chatRules.screen.ruleScreen.regex"), regexTextPos.leftInt(), regexTextPos.rightInt()+ yOffset, 0xFFFFFF);
+ //context.drawTextWithShadow(this.textRenderer,"valid", validItemLabelTextPos.leftInt(), validItemLabelTextPos.rightInt(), 0xFFFFFF);
+ context.drawTextWithShadow(this.textRenderer,Text.translatable("text.autoconfig.skyblocker.option.messages.chatRules.screen.ruleScreen.outputs"), outputsLabelTextPos.leftInt(), outputsLabelTextPos.rightInt()+ yOffset, 0xFFFFFF);
+ context.drawTextWithShadow(this.textRenderer,Text.translatable("text.autoconfig.skyblocker.option.messages.chatRules.screen.ruleScreen.hideMessage"), hideMessageTextPos.leftInt(), hideMessageTextPos.rightInt()+ yOffset, 0xFFFFFF);
+ context.drawTextWithShadow(this.textRenderer,Text.translatable("text.autoconfig.skyblocker.option.messages.chatRules.screen.ruleScreen.actionBar"), actionBarTextPos.leftInt(), actionBarTextPos.rightInt()+ yOffset, 0xFFFFFF);
+ context.drawTextWithShadow(this.textRenderer,Text.translatable("text.autoconfig.skyblocker.option.messages.chatRules.screen.ruleScreen.announcement"), announcementTextPos.leftInt(), announcementTextPos.rightInt()+ yOffset, 0xFFFFFF);
+ context.drawTextWithShadow(this.textRenderer,Text.translatable("text.autoconfig.skyblocker.option.messages.chatRules.screen.ruleScreen.replace"), replaceMessageLabelTextPos.leftInt(), replaceMessageLabelTextPos.rightInt()+ yOffset, 0xFFFFFF);
+ }
+
+ @Override
+ public void close() {
+ //todo add checks to see if valid rule e.g. has name
+ //and if valid save a
+ if (client != null ) {
+ client.setScreen(parent);
+ }
+ }
+}
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/chat/ChatRulesConfigListWidget.java b/src/main/java/de/hysky/skyblocker/skyblock/chat/ChatRulesConfigListWidget.java
new file mode 100644
index 00000000..e5f7ddef
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/skyblock/chat/ChatRulesConfigListWidget.java
@@ -0,0 +1,153 @@
+package de.hysky.skyblocker.skyblock.chat;
+
+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;
+import net.minecraft.client.gui.widget.ElementListWidget;
+import net.minecraft.text.Text;
+import org.jetbrains.annotations.Nullable;
+
+import java.awt.*;
+import java.util.List;
+
+public class ChatRulesConfigListWidget extends ElementListWidget<ChatRulesConfigListWidget.chatRuleConfigEntry> {
+
+ private List<ChatRule> chatRules;
+
+ private final ChatRulesConfigScreen screen;
+
+ 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
+ //add entry fall all existing rules
+ for (ChatRule rule : chatRules){
+ addEntry(new chatRuleConfigEntry(rule));
+ }
+ }
+
+ @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()));
+ }
+
+ protected boolean removeEntry(chatRuleConfigEntry entry) {
+ 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
+ */
+ }
+
+ public class chatRuleConfigEntry extends ElementListWidget.Entry<ChatRulesConfigListWidget.chatRuleConfigEntry> {
+
+ private static final int SPACING = 20;
+
+ //data
+ private ChatRule chatRule;
+
+
+ private final List<? extends Element> children;
+
+ //widgets
+ private final ButtonWidget enabledWidget;
+ private final ButtonWidget openConfigWidget;
+
+ //text locations
+ private final int labelX;
+ private final int enabledX;
+
+
+ public chatRuleConfigEntry(ChatRule chatRule) {
+ this.chatRule = chatRule;
+
+ //initialize the widgets
+ int currentX = width / 2 - 160;
+ labelX = currentX;
+ currentX += client.textRenderer.getWidth("Rule: \"" + chatRule.getName() + "\"");
+ currentX += SPACING; //spacer
+
+ enabledX = currentX;
+ currentX += client.textRenderer.getWidth("Enabled:");
+ enabledWidget = ButtonWidget.builder(enabledButtonText() , a -> {
+ toggleEnabled();
+ })
+ .size(50,20)
+ .position(currentX,5)
+ .build()
+ ;
+ currentX += 50;
+ currentX += SPACING; //spacer
+
+ openConfigWidget = ButtonWidget.builder(Text.of("Edit Rule"), a -> {
+ client.setScreen(new ChatRuleConfigScreen(screen, chatRule));
+ })
+ .size(100,20)
+ .position(currentX,5)
+ .build()
+ ;
+
+ children = List.of(enabledWidget, openConfigWidget);
+ }
+
+ private Text enabledButtonText() {
+ if (chatRule.getEnabled()){
+ return Text.literal("TRUE").withColor(Color.green.getRGB());
+ }else {
+ return Text.literal("FALSE").withColor(Color.red.getRGB());
+ }
+ }
+ private void toggleEnabled() {
+ chatRule.setEnabled(!chatRule.getEnabled());
+ enabledWidget.setMessage(enabledButtonText());
+ }
+
+ @Override
+ public List<? extends Selectable> selectableChildren() {
+ return List.of(new Selectable() {
+ @Override
+ public SelectionType getType() {
+ return SelectionType.HOVERED;
+ }
+
+ @Override
+ public void appendNarrations(NarrationMessageBuilder builder) {
+ builder.put(NarrationPart.TITLE); //todo add more e.g. , targetName, replacementName
+ }
+ });
+ }
+
+ @Override
+ public List<? extends Element> children() {
+ return children;
+ }
+
+ @Override
+ public void render(DrawContext context, int index, int y, int x, int entryWidth, int entryHeight, int mouseX, int mouseY, boolean hovered, float tickDelta) { //todo get strings form en_us.json
+ //widgets
+ enabledWidget.setY(y);
+ enabledWidget.render(context, mouseX, mouseY, tickDelta);
+ openConfigWidget.setY(y);
+ openConfigWidget.render(context, mouseX, mouseY, tickDelta);
+ //text
+ context.drawTextWithShadow(client.textRenderer, "Rule: \"" + chatRule.getName() + "\"", labelX, y + 5, 0xFFFFFF);
+ context.drawTextWithShadow(client.textRenderer, "enabled:", enabledX, y + 5, 0xFFFFFF);
+ }
+ }
+}
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/chat/ChatRulesConfigScreen.java b/src/main/java/de/hysky/skyblocker/skyblock/chat/ChatRulesConfigScreen.java
new file mode 100644
index 00000000..be55e60e
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/skyblock/chat/ChatRulesConfigScreen.java
@@ -0,0 +1,110 @@
+package de.hysky.skyblocker.skyblock.chat;
+
+import de.hysky.skyblocker.skyblock.shortcut.Shortcuts;
+import net.minecraft.client.gui.DrawContext;
+import net.minecraft.client.gui.screen.ConfirmScreen;
+import net.minecraft.client.gui.screen.Screen;
+import net.minecraft.client.gui.tooltip.Tooltip;
+import net.minecraft.client.gui.widget.ButtonWidget;
+import net.minecraft.client.gui.widget.GridWidget;
+import net.minecraft.client.gui.widget.SimplePositioningWidget;
+import net.minecraft.screen.ScreenTexts;
+import net.minecraft.text.Text;
+
+public class ChatRulesConfigScreen extends Screen {
+
+ private ChatRulesConfigListWidget chatRulesConfigListWidget;
+ private ButtonWidget buttonDelete;
+ private ButtonWidget buttonNew;
+ private ButtonWidget buttonDone;
+ private double scrollAmount;
+ private final Screen parent;
+
+ public ChatRulesConfigScreen() {
+ this(null);
+ }
+
+ public ChatRulesConfigScreen(Screen parent) {
+ super(Text.translatable("skyblocker.shortcuts.config")); //todo correct name for whole code
+ this.parent = parent;
+ }
+
+ @Override
+ public void setTooltip(Text tooltip) {
+ super.setTooltip(tooltip);
+ }
+
+ @Override
+ protected void init() {
+ super.init();
+ chatRulesConfigListWidget = new ChatRulesConfigListWidget(client, this, width, height - 96, 32, 25);
+ addDrawableChild(chatRulesConfigListWidget);
+ GridWidget gridWidget = new GridWidget();
+ gridWidget.getMainPositioner().marginX(5).marginY(2);
+ GridWidget.Adder adder = gridWidget.createAdder(2);
+ buttonDelete = ButtonWidget.builder(Text.translatable("selectServer.delete"), button -> {
+ ChatRulesConfigListWidget.chatRuleConfigEntry currentChatRuleConfigEntry = chatRulesConfigListWidget.getSelectedOrNull();
+ if (client != null && currentChatRuleConfigEntry != null ) {
+ scrollAmount = chatRulesConfigListWidget.getScrollAmount();
+ client.setScreen(new ConfirmScreen(this::deleteEntry, Text.translatable("skyblocker.shortcuts.deleteQuestion"), Text.translatable("skyblocker.shortcuts.deleteWarning", currentChatRuleConfigEntry), Text.translatable("selectServer.deleteButton"), ScreenTexts.CANCEL)); //todo load text for this config
+ }
+ }).build();
+ adder.add(buttonDelete);
+ buttonNew = ButtonWidget.builder(Text.translatable("skyblocker.shortcuts.new"), buttonNew -> chatRulesConfigListWidget.addRuleAfterSelected()).build();
+ adder.add(buttonNew);
+ adder.add(ButtonWidget.builder(ScreenTexts.CANCEL, button -> {
+ if (client != null) {
+ close();
+ }
+ }).build());
+ buttonDone = ButtonWidget.builder(ScreenTexts.DONE, button -> {
+ chatRulesConfigListWidget.saveRules();
+ if (client != null) {
+ close();
+ }
+ }).tooltip(Tooltip.of(Text.translatable("skyblocker.shortcuts.commandSuggestionTooltip"))).build();
+ adder.add(buttonDone);
+ gridWidget.refreshPositions();
+ SimplePositioningWidget.setPos(gridWidget, 0, this.height - 64, this.width, 64);
+ gridWidget.forEachChild(this::addDrawableChild);
+ updateButtons();
+ }
+
+ private void deleteEntry(boolean confirmedAction) {
+ if (client != null) {
+ ChatRulesConfigListWidget.chatRuleConfigEntry currentChatRuleConfigEntry = chatRulesConfigListWidget.getSelectedOrNull();
+ if (confirmedAction && currentChatRuleConfigEntry != null) {
+ chatRulesConfigListWidget.removeEntry(currentChatRuleConfigEntry);
+ }
+ client.setScreen(this); // Re-inits the screen and keeps the old instance of ShortcutsConfigListWidget
+ chatRulesConfigListWidget.setScrollAmount(scrollAmount);
+ }
+ }
+
+ @Override
+ public void render(DrawContext context, int mouseX, int mouseY, float delta) {
+ super.render(context, mouseX, mouseY, delta);
+ context.drawCenteredTextWithShadow(this.textRenderer, this.title, this.width / 2, 16, 0xFFFFFF);
+ }
+
+ @Override
+ public void close() {
+ if (client != null ) { //todo && chatRuleConfigListWidget.hasChanges()
+ client.setScreen(new ConfirmScreen(confirmedAction -> {
+ if (confirmedAction) {
+ this.client.setScreen(parent);
+ } else {
+ client.setScreen(this);
+ }
+ }, Text.translatable("text.skyblocker.quit_config"), Text.translatable("text.skyblocker.quit_config_sure"), Text.translatable("text.skyblocker.quit_discard"), ScreenTexts.CANCEL));
+ } else {
+ this.client.setScreen(parent);
+ }
+ }
+
+ protected void updateButtons() {
+ buttonDelete.active = Shortcuts.isShortcutsLoaded() && chatRulesConfigListWidget.getSelectedOrNull() != null;
+ buttonNew.active = Shortcuts.isShortcutsLoaded() ; //todo ? && chatRuleConfigListWidget.getCategory().isPresent()
+ buttonDone.active = Shortcuts.isShortcutsLoaded();
+ }
+}
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/chat/ChatRulesHandler.java b/src/main/java/de/hysky/skyblocker/skyblock/chat/ChatRulesHandler.java
new file mode 100644
index 00000000..4ea8c24d
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/skyblock/chat/ChatRulesHandler.java
@@ -0,0 +1,4 @@
+package de.hysky.skyblocker.skyblock.chat;
+
+public class ChatRulesHandler {
+}