feat: added dynamic parameters for DialogueRenderer

This commit is contained in:
Andrey Terentev 2024-12-10 01:07:04 +07:00
parent bd29931a60
commit 269abd3ff7
3 changed files with 91 additions and 87 deletions

View File

@ -6,10 +6,10 @@ import lombok.RequiredArgsConstructor;
@Getter @Getter
@RequiredArgsConstructor @RequiredArgsConstructor
public enum ButtonNumber { public enum ButtonNumber {
BUTTON_1(1), BUTTON_1(0),
BUTTON_2(2), BUTTON_2(1),
BUTTON_3(3), BUTTON_3(2),
BUTTON_4(4); BUTTON_4(3);
private final int index; private final int index;
} }

View File

@ -1,5 +1,7 @@
package ru.dragonestia.msb3.api.talk.dialogue; package ru.dragonestia.msb3.api.talk.dialogue;
import lombok.Getter;
import lombok.Setter;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.TextComponent; import net.kyori.adventure.text.TextComponent;
import net.kyori.adventure.text.format.Style; 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.Inventory;
import net.minestom.server.inventory.InventoryType; import net.minestom.server.inventory.InventoryType;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import ru.dragonestia.msb3.api.ServerBootstrap; import ru.dragonestia.msb3.api.ServerBootstrap;
import ru.dragonestia.msb3.api.glyph.glyph.AppendableGlyph; import ru.dragonestia.msb3.api.glyph.glyph.AppendableGlyph;
import ru.dragonestia.msb3.api.glyph.glyph.GlyphComponentBuilder; import ru.dragonestia.msb3.api.glyph.glyph.GlyphComponentBuilder;
import ru.dragonestia.msb3.api.glyph.glyph.image.TextureProperties; import ru.dragonestia.msb3.api.glyph.glyph.image.TextureProperties;
import ru.dragonestia.msb3.api.glyph.pack.GlyphResourcePack; import ru.dragonestia.msb3.api.glyph.pack.GlyphResourcePack;
import ru.dragonestia.msb3.api.resource.dialog.ButtonNumber;
import ru.dragonestia.msb3.api.util.StringUtil; import ru.dragonestia.msb3.api.util.StringUtil;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.EnumMap;
import java.util.List; import java.util.List;
public class DialogueRenderer { public class DialogueRenderer extends Inventory {
public static final int CHEST_GUI_WIDTH = 176; 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 Player player;
private final String text = """ @Getter @Setter private DialogueTheme theme;
Абсолютно точно. @Getter private String text = "";
Я знаю точнo - невозможное возможно private int shifted = 0;
Сойти с ума, влюбиться так неосторoжно private int maxLines = 0;
Найти тебя, не отпускать ни днём, ни ночью private final EnumMap<ButtonNumber, String> 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.player = player;
this.theme = theme;
} }
public static DialogueRenderer create(Player player) { public void setText(String text) {
return new DialogueRenderer(player); 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() { public void show() {
var inv = new Inventory(InventoryType.CHEST_6_ROW, render(ServerBootstrap.getInstance().getResourcePackManager().getGlyphResourcePack())); rerender();
player.openInventory(inv); player.openInventory(this);
} }
private Component render(GlyphResourcePack resourcePack) { public void close() {
var builder = GlyphComponentBuilder.gui(resourcePack.spaces()); player.closeInventory();
}
private Component render() {
var builder = GlyphComponentBuilder.gui(glyphResourcePack.spaces());
// GUI background // GUI background
builder.append(CHEST_GUI_WIDTH / 2 + 2 - theme.getBackground().part1().width(), theme.getBackground().part1()); 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()); builder.append(theme.getPositions().avatar().x(), theme.getAvatar());
// Phrase text // Phrase text
renderText(builder, 0); renderText(builder, shifted);
// Scroll phrase buttons (optional) // Scroll phrase buttons (optional)
builder.append( if (shifted != 0) {
theme.getPositions().scrollPhraseButton().scrollUpButtonX(), builder.append(
theme.getScrollTextUp()); theme.getPositions().scrollPhraseButton().scrollUpButtonX(),
theme.getScrollTextUp());
}
builder.append( if (maxLines > shifted + theme.getPositions().phraseText().maxLines()) {
theme.getPositions().scrollPhraseButton().scrollDownButtonX(), builder.append(
theme.getScrollTextDown()); theme.getPositions().scrollPhraseButton().scrollDownButtonX(),
theme.getScrollTextDown());
}
// Answers // Answers
for (var number: ButtonNumber.values()) {
var answers = List.of("Hello world!", "I am a teapot", "I love pizza\nMamma mia\nPeperoni\nPapa carlo\nZaebumba\nPidoraso ebanino", "msb3 is top!"); if (buttonsText.containsKey(number)) { //TODO: checking answer exists
for (int i = 0; i < 4; i++) { builder.append(number.getIndex() % 2 == 0
if (true) { //TODO: checking answer exists
builder.append(i % 2 == 0
? theme.getPositions().answerField().leftFieldX() ? theme.getPositions().answerField().leftFieldX()
: theme.getPositions().answerField().rightFieldX(), : theme.getPositions().answerField().rightFieldX(),
switch (i) { switch (number) {
case 0 -> theme.getActiveTextField1(); case BUTTON_1 -> theme.getActiveTextField1();
case 1 -> theme.getActiveTextField2(); case BUTTON_2 -> theme.getActiveTextField2();
case 2 -> theme.getActiveTextField3(); case BUTTON_3 -> theme.getActiveTextField3();
case 3 -> theme.getActiveTextField4(); case BUTTON_4 -> theme.getActiveTextField4();
default -> throw new IllegalStateException("Unexpected value: " + i);
}); });
builder.append(i % 2 == 0 builder.append(number.getIndex() % 2 == 0
? theme.getPositions().answerButton().leftButtonX() ? theme.getPositions().answerButton().leftButtonX()
: theme.getPositions().answerButton().rightButtonX(), : theme.getPositions().answerButton().rightButtonX(),
switch (i) { switch (number) {
case 0 -> theme.getButton1(); case BUTTON_1 -> theme.getButton1();
case 1 -> theme.getButton2(); case BUTTON_2 -> theme.getButton2();
case 2 -> theme.getButton3(); case BUTTON_3 -> theme.getButton3();
case 3 -> theme.getButton4(); case BUTTON_4 -> theme.getButton4();
default -> throw new IllegalStateException("Unexpected value: " + i);
}); });
var lines = breakIntoLines( var lines = breakIntoLines(
answers.get(i), buttonsText.get(number),
i < 2 number.getIndex() < 2
? new TextureProperties(theme.getPositions().answerText().fontHeight(), theme.getPositions().answerText().topFirstLineAscent()) ? new TextureProperties(theme.getPositions().answerText().fontHeight(), theme.getPositions().answerText().topFirstLineAscent())
: new TextureProperties(theme.getPositions().answerText().fontHeight(), theme.getPositions().answerText().bottomFirstLineAscent()), : new TextureProperties(theme.getPositions().answerText().fontHeight(), theme.getPositions().answerText().bottomFirstLineAscent()),
theme.getPositions().answerText().fontHeight(), theme.getPositions().answerText().fontHeight(),
theme.getPositions().answerText().lineWidth()); theme.getPositions().answerText().lineWidth());
for (int lineIdx = 0; lineIdx < Math.min(lines.size(), theme.getPositions().answerText().maxLines()); lineIdx++) { for (int lineIdx = 0; lineIdx < Math.min(lines.size(), theme.getPositions().answerText().maxLines()); lineIdx++) {
boolean endWithDots = lineIdx + 1 == theme.getPositions().answerText().maxLines() boolean endWithDots = lineIdx + 1 == theme.getPositions().answerText().maxLines() && lineIdx + 1 != lines.size();
&& lineIdx + 1 != lines.size();
var line = lines.get(lineIdx); var line = lines.get(lineIdx);
builder.append( builder.append(
i % 2 == 0 number.getIndex() % 2 == 0
? theme.getPositions().answerText().leftLineX() ? theme.getPositions().answerText().leftLineX()
: theme.getPositions().answerText().rightLineX(), : theme.getPositions().answerText().rightLineX(),
line.toGlyphList(line.textureProperties(), 0, endWithDots, theme.getPositions().answerText().textColor()) line.toGlyphList(line.textureProperties(), 0, endWithDots, theme.getPositions().answerText().textColor())
); );
} }
} else { } else {
builder.append(i % 2 == 0 builder.append(number.getIndex() % 2 == 0
? theme.getPositions().answerField().leftFieldX() ? theme.getPositions().answerField().leftFieldX()
: theme.getPositions().answerField().rightFieldX(), : theme.getPositions().answerField().rightFieldX(),
switch (i) { switch (number) {
case 0 -> theme.getNotActiveTextField1(); case BUTTON_1 -> theme.getNotActiveTextField1();
case 1 -> theme.getNotActiveTextField2(); case BUTTON_2 -> theme.getNotActiveTextField2();
case 2 -> theme.getNotActiveTextField3(); case BUTTON_3 -> theme.getNotActiveTextField3();
case 3 -> theme.getNotActiveTextField4(); case BUTTON_4 -> theme.getNotActiveTextField4();
default -> throw new IllegalStateException("Unexpected value: " + i);
}); });
} }
} }
@ -197,6 +200,7 @@ public class DialogueRenderer {
positions.phraseText().firstLineProperties(), positions.phraseText().firstLineProperties(),
positions.phraseText().fontHeight(), positions.phraseText().fontHeight(),
positions.phraseText().lineWidth()); positions.phraseText().lineWidth());
maxLines = textLines.size();
for (int lineIdx = shift; (lineIdx - shift) < Math.min(textLines.size() - shift, positions.phraseText().maxLines()); lineIdx++) { for (int lineIdx = shift; (lineIdx - shift) < Math.min(textLines.size() - shift, positions.phraseText().maxLines()); lineIdx++) {
var line = textLines.get(lineIdx); var line = textLines.get(lineIdx);

View File

@ -89,10 +89,10 @@ public class DialogueTheme {
if (activeTextField2 == null) setActiveTextField(ButtonNumber.BUTTON_2, resources.getActiveTextField(DialogueResources.DEFAULT).orElseThrow()); 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 (activeTextField3 == null) setActiveTextField(ButtonNumber.BUTTON_3, resources.getActiveTextField(DialogueResources.DEFAULT).orElseThrow());
if (activeTextField4 == null) setActiveTextField(ButtonNumber.BUTTON_4, 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 (notActiveTextField1 == null) setNotActiveTextField(ButtonNumber.BUTTON_1, resources.getNotActiveTextField(DialogueResources.DEFAULT).orElseThrow());
if (notActiveTextField2 == null) setActiveTextField(ButtonNumber.BUTTON_2, resources.getNotActiveTextField(DialogueResources.DEFAULT).orElseThrow()); if (notActiveTextField2 == null) setNotActiveTextField(ButtonNumber.BUTTON_2, resources.getNotActiveTextField(DialogueResources.DEFAULT).orElseThrow());
if (notActiveTextField3 == null) setActiveTextField(ButtonNumber.BUTTON_3, resources.getNotActiveTextField(DialogueResources.DEFAULT).orElseThrow()); if (notActiveTextField3 == null) setNotActiveTextField(ButtonNumber.BUTTON_3, resources.getNotActiveTextField(DialogueResources.DEFAULT).orElseThrow());
if (notActiveTextField4 == null) setActiveTextField(ButtonNumber.BUTTON_4, 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 (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 (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()); if (button3 == null) setButton(ButtonNumber.BUTTON_3, resources.getButton(DialogueResources.DEFAULT + 3).orElseThrow());