diff options
author | olim <bobq4582@gmail.com> | 2024-02-13 14:30:22 +0000 |
---|---|---|
committer | olim <bobq4582@gmail.com> | 2024-02-15 11:10:24 +0000 |
commit | 2a9fae47611cec59776e96826db8a6305978e0b1 (patch) | |
tree | 6a8bcd7c7a50da35ecb87874707b83f34b4de3ad /src/main/java/de/hysky/skyblocker/skyblock/chat | |
parent | 41d02daf5f53a761043ae76f5be484f94ceb0128 (diff) | |
download | Skyblocker-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/hysky/skyblocker/skyblock/chat')
5 files changed, 707 insertions, 0 deletions
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 { +} |