feat: added dynamic parameters for DialogueRenderer
This commit is contained in:
parent
bd29931a60
commit
269abd3ff7
@ -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;
|
||||
}
|
||||
|
||||
@ -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<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.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);
|
||||
|
||||
@ -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());
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user