feat: added dynamic parameters for DialogueRenderer
This commit is contained in:
parent
bd29931a60
commit
269abd3ff7
@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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)
|
||||||
|
if (shifted != 0) {
|
||||||
builder.append(
|
builder.append(
|
||||||
theme.getPositions().scrollPhraseButton().scrollUpButtonX(),
|
theme.getPositions().scrollPhraseButton().scrollUpButtonX(),
|
||||||
theme.getScrollTextUp());
|
theme.getScrollTextUp());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (maxLines > shifted + theme.getPositions().phraseText().maxLines()) {
|
||||||
builder.append(
|
builder.append(
|
||||||
theme.getPositions().scrollPhraseButton().scrollDownButtonX(),
|
theme.getPositions().scrollPhraseButton().scrollDownButtonX(),
|
||||||
theme.getScrollTextDown());
|
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);
|
||||||
|
|||||||
@ -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());
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user