From 269abd3ff7304890c0ebb55738b209d35fbb1f4b Mon Sep 17 00:00:00 2001 From: ScarletRedMan Date: Tue, 10 Dec 2024 01:07:04 +0700 Subject: [PATCH] feat: added dynamic parameters for DialogueRenderer --- .../api/resource/dialog/ButtonNumber.java | 8 +- .../api/talk/dialogue/DialogueRenderer.java | 162 +++++++++--------- .../msb3/api/talk/dialogue/DialogueTheme.java | 8 +- 3 files changed, 91 insertions(+), 87 deletions(-) diff --git a/api/src/main/java/ru/dragonestia/msb3/api/resource/dialog/ButtonNumber.java b/api/src/main/java/ru/dragonestia/msb3/api/resource/dialog/ButtonNumber.java index 2c37d35..a48cfca 100644 --- a/api/src/main/java/ru/dragonestia/msb3/api/resource/dialog/ButtonNumber.java +++ b/api/src/main/java/ru/dragonestia/msb3/api/resource/dialog/ButtonNumber.java @@ -6,10 +6,10 @@ import lombok.RequiredArgsConstructor; @Getter @RequiredArgsConstructor public enum ButtonNumber { - BUTTON_1(1), - BUTTON_2(2), - BUTTON_3(3), - BUTTON_4(4); + BUTTON_1(0), + BUTTON_2(1), + BUTTON_3(2), + BUTTON_4(3); private final int index; } diff --git a/api/src/main/java/ru/dragonestia/msb3/api/talk/dialogue/DialogueRenderer.java b/api/src/main/java/ru/dragonestia/msb3/api/talk/dialogue/DialogueRenderer.java index 4f1225b..d6fea2f 100644 --- a/api/src/main/java/ru/dragonestia/msb3/api/talk/dialogue/DialogueRenderer.java +++ b/api/src/main/java/ru/dragonestia/msb3/api/talk/dialogue/DialogueRenderer.java @@ -1,5 +1,7 @@ package ru.dragonestia.msb3.api.talk.dialogue; +import lombok.Getter; +import lombok.Setter; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.TextComponent; import net.kyori.adventure.text.format.Style; @@ -9,70 +11,74 @@ import net.minestom.server.entity.Player; import net.minestom.server.inventory.Inventory; import net.minestom.server.inventory.InventoryType; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import ru.dragonestia.msb3.api.ServerBootstrap; import ru.dragonestia.msb3.api.glyph.glyph.AppendableGlyph; import ru.dragonestia.msb3.api.glyph.glyph.GlyphComponentBuilder; import ru.dragonestia.msb3.api.glyph.glyph.image.TextureProperties; import ru.dragonestia.msb3.api.glyph.pack.GlyphResourcePack; +import ru.dragonestia.msb3.api.resource.dialog.ButtonNumber; import ru.dragonestia.msb3.api.util.StringUtil; import java.util.ArrayList; +import java.util.EnumMap; import java.util.List; -public class DialogueRenderer { +public class DialogueRenderer extends Inventory { public static final int CHEST_GUI_WIDTH = 176; - private final DialogueTheme theme = DialogueTheme.builder().build(); + private final GlyphResourcePack glyphResourcePack = ServerBootstrap.getInstance().getResourcePackManager().getGlyphResourcePack(); private final Player player; - private final String text = """ - Абсолютно точно. - Я знаю точнo - невозможное возможно - Сойти с ума, влюбиться так неосторoжно - Найти тебя, не отпускать ни днём, ни ночью - Всё невозможное - возможно, знаю точно! - А где тебя искать, прошу ты мне ответь - В какие города мне за тобой лететь - Я готов на край Земли, я всё должен объяснить - Пойми, что без тебя я не умею жить - Я знаю точно - невозможное возможно - Сойти с ума, влюбиться так неосторожно - Найти тебя, не отпускать ни днём, ни ночью - Всё невозможное - возможно, знаю точно! - На-на-на-на (на-на-на-на), а-а, а-а - На-на-на-на (на-на-на-на), а-а, а-а - Всё готов делить, с тобой я пополам - Ты только мне поверь, я сделал выбор сам - Дай же мне последний шанс, я всё должен объяснить - Пойми, что без тебя я не умею жить - Я знаю точно - невозможное возможно - Сойти с ума, влюбиться так неосторожно - Найти тебя, не отпускать ни днём, ни ночью - Всё невозможное - возможно, знаю точно! - На-на-на-на (на-на-на-на), а-а, а-а - На-на-на-на (на-на-на-на), а-а, а-а - Я знаю точно - невозможное возможно - Сойти с ума, влюбиться так неосторожно - Найти тебя, не отпускать ни днём, ни ночью - Всё невозможное - возможно, знаю точно! - На-на-на-на (на-на-на-на), а-а, а-а - На-на-на-на (на-на-на-на), а-а, а-а"""; + @Getter @Setter private DialogueTheme theme; + @Getter private String text = ""; + private int shifted = 0; + private int maxLines = 0; + private final EnumMap buttonsText = new EnumMap<>(ButtonNumber.class); - private DialogueRenderer(Player player) { + public DialogueRenderer(Player player, DialogueTheme theme) { + super(InventoryType.CHEST_6_ROW, Component.empty()); this.player = player; + this.theme = theme; } - public static DialogueRenderer create(Player player) { - return new DialogueRenderer(player); + public void setText(String text) { + this.text = text; + this.shifted = 0; + } + + public void setButtonText(ButtonNumber number, @Nullable String text) { + if (text == null) buttonsText.remove(number); + else buttonsText.put(number, text); + } + + public void scrollUp() { + if (shifted > 0) { + shifted = Math.max(0, shifted - 3); + } + } + + public void scrollDown() { + if (maxLines > shifted + theme.getPositions().phraseText().maxLines()) { + shifted = Math.min(maxLines - theme.getPositions().phraseText().maxLines(), shifted + 3); + } + } + + public void rerender() { + setTitle(render()); } public void show() { - var inv = new Inventory(InventoryType.CHEST_6_ROW, render(ServerBootstrap.getInstance().getResourcePackManager().getGlyphResourcePack())); - player.openInventory(inv); + rerender(); + player.openInventory(this); } - private Component render(GlyphResourcePack resourcePack) { - var builder = GlyphComponentBuilder.gui(resourcePack.spaces()); + public void close() { + player.closeInventory(); + } + + private Component render() { + var builder = GlyphComponentBuilder.gui(glyphResourcePack.spaces()); // GUI background builder.append(CHEST_GUI_WIDTH / 2 + 2 - theme.getBackground().part1().width(), theme.getBackground().part1()); @@ -89,75 +95,72 @@ public class DialogueRenderer { builder.append(theme.getPositions().avatar().x(), theme.getAvatar()); // Phrase text - renderText(builder, 0); + renderText(builder, shifted); // Scroll phrase buttons (optional) - builder.append( - theme.getPositions().scrollPhraseButton().scrollUpButtonX(), - theme.getScrollTextUp()); + if (shifted != 0) { + builder.append( + theme.getPositions().scrollPhraseButton().scrollUpButtonX(), + theme.getScrollTextUp()); + } - builder.append( - theme.getPositions().scrollPhraseButton().scrollDownButtonX(), - theme.getScrollTextDown()); + if (maxLines > shifted + theme.getPositions().phraseText().maxLines()) { + builder.append( + theme.getPositions().scrollPhraseButton().scrollDownButtonX(), + theme.getScrollTextDown()); + } // Answers - - var answers = List.of("Hello world!", "I am a teapot", "I love pizza\nMamma mia\nPeperoni\nPapa carlo\nZaebumba\nPidoraso ebanino", "msb3 is top!"); - for (int i = 0; i < 4; i++) { - if (true) { //TODO: checking answer exists - builder.append(i % 2 == 0 + for (var number: ButtonNumber.values()) { + if (buttonsText.containsKey(number)) { //TODO: checking answer exists + builder.append(number.getIndex() % 2 == 0 ? theme.getPositions().answerField().leftFieldX() : theme.getPositions().answerField().rightFieldX(), - switch (i) { - case 0 -> theme.getActiveTextField1(); - case 1 -> theme.getActiveTextField2(); - case 2 -> theme.getActiveTextField3(); - case 3 -> theme.getActiveTextField4(); - default -> throw new IllegalStateException("Unexpected value: " + i); + switch (number) { + case BUTTON_1 -> theme.getActiveTextField1(); + case BUTTON_2 -> theme.getActiveTextField2(); + case BUTTON_3 -> theme.getActiveTextField3(); + case BUTTON_4 -> theme.getActiveTextField4(); }); - builder.append(i % 2 == 0 + builder.append(number.getIndex() % 2 == 0 ? theme.getPositions().answerButton().leftButtonX() : theme.getPositions().answerButton().rightButtonX(), - switch (i) { - case 0 -> theme.getButton1(); - case 1 -> theme.getButton2(); - case 2 -> theme.getButton3(); - case 3 -> theme.getButton4(); - default -> throw new IllegalStateException("Unexpected value: " + i); + switch (number) { + case BUTTON_1 -> theme.getButton1(); + case BUTTON_2 -> theme.getButton2(); + case BUTTON_3 -> theme.getButton3(); + case BUTTON_4 -> theme.getButton4(); }); var lines = breakIntoLines( - answers.get(i), - i < 2 + buttonsText.get(number), + number.getIndex() < 2 ? new TextureProperties(theme.getPositions().answerText().fontHeight(), theme.getPositions().answerText().topFirstLineAscent()) : new TextureProperties(theme.getPositions().answerText().fontHeight(), theme.getPositions().answerText().bottomFirstLineAscent()), theme.getPositions().answerText().fontHeight(), theme.getPositions().answerText().lineWidth()); for (int lineIdx = 0; lineIdx < Math.min(lines.size(), theme.getPositions().answerText().maxLines()); lineIdx++) { - boolean endWithDots = lineIdx + 1 == theme.getPositions().answerText().maxLines() - && lineIdx + 1 != lines.size(); - + boolean endWithDots = lineIdx + 1 == theme.getPositions().answerText().maxLines() && lineIdx + 1 != lines.size(); var line = lines.get(lineIdx); builder.append( - i % 2 == 0 + number.getIndex() % 2 == 0 ? theme.getPositions().answerText().leftLineX() : theme.getPositions().answerText().rightLineX(), line.toGlyphList(line.textureProperties(), 0, endWithDots, theme.getPositions().answerText().textColor()) ); } } else { - builder.append(i % 2 == 0 + builder.append(number.getIndex() % 2 == 0 ? theme.getPositions().answerField().leftFieldX() : theme.getPositions().answerField().rightFieldX(), - switch (i) { - case 0 -> theme.getNotActiveTextField1(); - case 1 -> theme.getNotActiveTextField2(); - case 2 -> theme.getNotActiveTextField3(); - case 3 -> theme.getNotActiveTextField4(); - default -> throw new IllegalStateException("Unexpected value: " + i); + switch (number) { + case BUTTON_1 -> theme.getNotActiveTextField1(); + case BUTTON_2 -> theme.getNotActiveTextField2(); + case BUTTON_3 -> theme.getNotActiveTextField3(); + case BUTTON_4 -> theme.getNotActiveTextField4(); }); } } @@ -197,6 +200,7 @@ public class DialogueRenderer { positions.phraseText().firstLineProperties(), positions.phraseText().fontHeight(), positions.phraseText().lineWidth()); + maxLines = textLines.size(); for (int lineIdx = shift; (lineIdx - shift) < Math.min(textLines.size() - shift, positions.phraseText().maxLines()); lineIdx++) { var line = textLines.get(lineIdx); diff --git a/api/src/main/java/ru/dragonestia/msb3/api/talk/dialogue/DialogueTheme.java b/api/src/main/java/ru/dragonestia/msb3/api/talk/dialogue/DialogueTheme.java index a1f717f..20bf612 100644 --- a/api/src/main/java/ru/dragonestia/msb3/api/talk/dialogue/DialogueTheme.java +++ b/api/src/main/java/ru/dragonestia/msb3/api/talk/dialogue/DialogueTheme.java @@ -89,10 +89,10 @@ public class DialogueTheme { if (activeTextField2 == null) setActiveTextField(ButtonNumber.BUTTON_2, resources.getActiveTextField(DialogueResources.DEFAULT).orElseThrow()); if (activeTextField3 == null) setActiveTextField(ButtonNumber.BUTTON_3, resources.getActiveTextField(DialogueResources.DEFAULT).orElseThrow()); if (activeTextField4 == null) setActiveTextField(ButtonNumber.BUTTON_4, resources.getActiveTextField(DialogueResources.DEFAULT).orElseThrow()); - if (notActiveTextField1 == null) setActiveTextField(ButtonNumber.BUTTON_1, resources.getNotActiveTextField(DialogueResources.DEFAULT).orElseThrow()); - if (notActiveTextField2 == null) setActiveTextField(ButtonNumber.BUTTON_2, resources.getNotActiveTextField(DialogueResources.DEFAULT).orElseThrow()); - if (notActiveTextField3 == null) setActiveTextField(ButtonNumber.BUTTON_3, resources.getNotActiveTextField(DialogueResources.DEFAULT).orElseThrow()); - if (notActiveTextField4 == null) setActiveTextField(ButtonNumber.BUTTON_4, resources.getNotActiveTextField(DialogueResources.DEFAULT).orElseThrow()); + if (notActiveTextField1 == null) setNotActiveTextField(ButtonNumber.BUTTON_1, resources.getNotActiveTextField(DialogueResources.DEFAULT).orElseThrow()); + if (notActiveTextField2 == null) setNotActiveTextField(ButtonNumber.BUTTON_2, resources.getNotActiveTextField(DialogueResources.DEFAULT).orElseThrow()); + if (notActiveTextField3 == null) setNotActiveTextField(ButtonNumber.BUTTON_3, resources.getNotActiveTextField(DialogueResources.DEFAULT).orElseThrow()); + if (notActiveTextField4 == null) setNotActiveTextField(ButtonNumber.BUTTON_4, resources.getNotActiveTextField(DialogueResources.DEFAULT).orElseThrow()); if (button1 == null) setButton(ButtonNumber.BUTTON_1, resources.getButton(DialogueResources.DEFAULT + 1).orElseThrow()); if (button2 == null) setButton(ButtonNumber.BUTTON_2, resources.getButton(DialogueResources.DEFAULT + 2).orElseThrow()); if (button3 == null) setButton(ButtonNumber.BUTTON_3, resources.getButton(DialogueResources.DEFAULT + 3).orElseThrow());