feat: updated dialog textures compiling
@ -19,11 +19,15 @@ import ru.dragonestia.msb3.api.glyph.glyph.image.TextureProperties;
|
||||
import ru.dragonestia.msb3.api.glyph.glyph.image.multicharacter.LanguageGlyphCollection;
|
||||
import ru.dragonestia.msb3.api.glyph.pack.GlyphResourcePack;
|
||||
import ru.dragonestia.msb3.api.glyph.pack.StringIdentifier;
|
||||
import ru.dragonestia.msb3.api.util.ImageUtil;
|
||||
import ru.dragonestia.msb3.api.util.ResourceFromJar;
|
||||
import ru.dragonestia.msb3.api.util.StringUtil;
|
||||
import team.unnamed.creative.base.Writable;
|
||||
import team.unnamed.creative.texture.Texture;
|
||||
|
||||
import javax.imageio.ImageIO;
|
||||
import java.awt.image.BufferedImage;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.stream.IntStream;
|
||||
@ -42,13 +46,7 @@ public class DialogueRenderer {
|
||||
private static final Writable ANSWER_BUTTON_ACTIVE_4 = ResourceFromJar.of("glyphs/dialogue/answer_button_active_4.png");
|
||||
private static final Writable ANSWER_NOT_ACTIVE_TEXT_FIELD = ResourceFromJar.of("glyphs/dialogue/answer_not_active_text_field.png");
|
||||
private static final Writable AVATAR_FRAME = ResourceFromJar.of("glyphs/dialogue/avatar_frame.png");
|
||||
private static final Writable BACKGROUND_1 = ResourceFromJar.of("glyphs/dialogue/background_1.png");
|
||||
private static final Writable BACKGROUND_2 = ResourceFromJar.of("glyphs/dialogue/background_2.png");
|
||||
private static final Writable BACKGROUND_3 = ResourceFromJar.of("glyphs/dialogue/background_3.png");
|
||||
private static final Writable BACKGROUND_4 = ResourceFromJar.of("glyphs/dialogue/background_4.png");
|
||||
private static final Writable DEFAULT_AVATAR = ResourceFromJar.of("glyphs/dialogue/default_avatar.png");
|
||||
private static final Writable PHRASE_SUBSTRATE_1 = ResourceFromJar.of("glyphs/dialogue/phrase_substrate_1.png");
|
||||
private static final Writable PHRASE_SUBSTRATE_2 = ResourceFromJar.of("glyphs/dialogue/phrase_substrate_2.png");
|
||||
private static final Writable SCROLL_PHRASE_DOWN_BUTTON = ResourceFromJar.of("glyphs/dialogue/scroll_phrase_down_button.png");
|
||||
private static final Writable SCROLL_PHRASE_UP_BUTTON = ResourceFromJar.of("glyphs/dialogue/scroll_phrase_up_button.png");
|
||||
|
||||
@ -127,34 +125,16 @@ public class DialogueRenderer {
|
||||
AVATAR_FRAME,
|
||||
DialogGlyphPositions.DEFAULT.avatar().frameHeight(),
|
||||
DialogGlyphPositions.DEFAULT.avatar().y() + DialogGlyphPositions.DEFAULT.avatar().frameBorderSize());
|
||||
private static final ImageGlyph GLYPH_BACKGROUND_1 = createGlyph("dialog/background_1.png",
|
||||
BACKGROUND_1,
|
||||
DialogGlyphPositions.DEFAULT.guiBackground().height() / 2,
|
||||
DialogGlyphPositions.DEFAULT.guiBackground().topPartsY());
|
||||
private static final ImageGlyph GLYPH_BACKGROUND_2 = createGlyph("dialog/background_2.png",
|
||||
BACKGROUND_2,
|
||||
DialogGlyphPositions.DEFAULT.guiBackground().height() / 2,
|
||||
DialogGlyphPositions.DEFAULT.guiBackground().topPartsY());
|
||||
private static final ImageGlyph GLYPH_BACKGROUND_3 = createGlyph("dialog/background_3.png",
|
||||
BACKGROUND_3,
|
||||
DialogGlyphPositions.DEFAULT.guiBackground().height() / 2,
|
||||
DialogGlyphPositions.DEFAULT.guiBackground().bottomPartsY());
|
||||
private static final ImageGlyph GLYPH_BACKGROUND_4 = createGlyph("dialog/background_4.png",
|
||||
BACKGROUND_4,
|
||||
DialogGlyphPositions.DEFAULT.guiBackground().height() / 2,
|
||||
DialogGlyphPositions.DEFAULT.guiBackground().bottomPartsY());
|
||||
private static final ImageGlyph GLYPH_BACKGROUND_1;
|
||||
private static final ImageGlyph GLYPH_BACKGROUND_2;
|
||||
private static final ImageGlyph GLYPH_BACKGROUND_3;
|
||||
private static final ImageGlyph GLYPH_BACKGROUND_4;
|
||||
private static final ImageGlyph GLYPH_DEFAULT_AVATAR = createGlyph("dialog/default_avatar.png",
|
||||
DEFAULT_AVATAR,
|
||||
DialogGlyphPositions.DEFAULT.avatar().height(),
|
||||
DialogGlyphPositions.DEFAULT.avatar().y());
|
||||
private static final ImageGlyph GLYPH_PHRASE_SUBSTRATE_1 = createGlyph("dialog/phrase_substrate_1.png",
|
||||
PHRASE_SUBSTRATE_1,
|
||||
DialogGlyphPositions.DEFAULT.phraseSubstrate().height(),
|
||||
DialogGlyphPositions.DEFAULT.phraseSubstrate().y());
|
||||
private static final ImageGlyph GLYPH_PHRASE_SUBSTRATE_2 = createGlyph("dialog/phrase_substrate_2.png",
|
||||
PHRASE_SUBSTRATE_2,
|
||||
DialogGlyphPositions.DEFAULT.phraseSubstrate().height(),
|
||||
DialogGlyphPositions.DEFAULT.phraseSubstrate().y());
|
||||
private static final ImageGlyph GLYPH_PHRASE_SUBSTRATE_1;
|
||||
private static final ImageGlyph GLYPH_PHRASE_SUBSTRATE_2;
|
||||
private static final ImageGlyph GLYPH_SCROLL_PHRASE_DOWN_BUTTON = createGlyph("dialog/scroll_phrase_down_button.png",
|
||||
SCROLL_PHRASE_DOWN_BUTTON,
|
||||
DialogGlyphPositions.DEFAULT.scrollPhraseButton().height(),
|
||||
@ -168,6 +148,72 @@ public class DialogueRenderer {
|
||||
private static final StringIdentifier<@NotNull LanguageGlyphCollection> ID_FONT = StringIdentifier.of("dialog_font", LanguageGlyphCollection.class);
|
||||
|
||||
static {
|
||||
BufferedImage backgroundImage;
|
||||
Writable b1;
|
||||
Writable b2;
|
||||
Writable b3;
|
||||
Writable b4;
|
||||
|
||||
try (var steam = ResourceFromJar.streamOf("glyphs/dialogue/background.png")) {
|
||||
backgroundImage = ImageIO.read(steam);
|
||||
var w = backgroundImage.getWidth();
|
||||
var h = backgroundImage.getHeight();
|
||||
|
||||
b1 = ImageUtil.imageToWritable(backgroundImage.getSubimage(0, 0, w / 2, h / 2));
|
||||
b2 = ImageUtil.imageToWritable(backgroundImage.getSubimage(w / 2, 0, w / 2, h / 2));
|
||||
b3 = ImageUtil.imageToWritable(backgroundImage.getSubimage(0, h / 2, w / 2, h / 2));
|
||||
b4 = ImageUtil.imageToWritable(backgroundImage.getSubimage(w / 2, h / 2, w / 2, h / 2));
|
||||
} catch (IOException ex) {
|
||||
throw new RuntimeException(ex);
|
||||
}
|
||||
|
||||
GLYPH_BACKGROUND_1 = createGlyph("dialog/background_1.png",
|
||||
b1,
|
||||
DialogGlyphPositions.DEFAULT.guiBackground().height() / 2,
|
||||
DialogGlyphPositions.DEFAULT.guiBackground().topPartsY());
|
||||
|
||||
GLYPH_BACKGROUND_2 = createGlyph("dialog/background_2.png",
|
||||
b2,
|
||||
DialogGlyphPositions.DEFAULT.guiBackground().height() / 2,
|
||||
DialogGlyphPositions.DEFAULT.guiBackground().topPartsY());
|
||||
|
||||
GLYPH_BACKGROUND_3 = createGlyph("dialog/background_3.png",
|
||||
b3,
|
||||
DialogGlyphPositions.DEFAULT.guiBackground().height() / 2,
|
||||
DialogGlyphPositions.DEFAULT.guiBackground().bottomPartsY());
|
||||
|
||||
GLYPH_BACKGROUND_4 = createGlyph("dialog/background_4.png",
|
||||
b4,
|
||||
DialogGlyphPositions.DEFAULT.guiBackground().height() / 2,
|
||||
DialogGlyphPositions.DEFAULT.guiBackground().bottomPartsY());
|
||||
|
||||
|
||||
BufferedImage substrateImage;
|
||||
Writable s1;
|
||||
Writable s2;
|
||||
|
||||
try (var stream = ResourceFromJar.streamOf("glyphs/dialogue/phrase_substrate.png")) {
|
||||
substrateImage = ImageIO.read(stream);
|
||||
var w = substrateImage.getWidth();
|
||||
var h = substrateImage.getHeight();
|
||||
|
||||
s1 = ImageUtil.imageToWritable(substrateImage.getSubimage(0, 0, w / 2, h));
|
||||
s2 = ImageUtil.imageToWritable(substrateImage.getSubimage(w / 2, 0, w / 2, h));
|
||||
} catch (IOException ex) {
|
||||
throw new RuntimeException(ex);
|
||||
}
|
||||
|
||||
GLYPH_PHRASE_SUBSTRATE_1 = createGlyph("dialog/phrase_substrate_1.png",
|
||||
s1,
|
||||
DialogGlyphPositions.DEFAULT.phraseSubstrate().height(),
|
||||
DialogGlyphPositions.DEFAULT.phraseSubstrate().y());
|
||||
|
||||
GLYPH_PHRASE_SUBSTRATE_2 = createGlyph("dialog/phrase_substrate_2.png",
|
||||
s2,
|
||||
DialogGlyphPositions.DEFAULT.phraseSubstrate().height(),
|
||||
DialogGlyphPositions.DEFAULT.phraseSubstrate().y());
|
||||
|
||||
|
||||
var positions = DialogGlyphPositions.DEFAULT;
|
||||
var propertiesList = Stream.concat(Stream.concat(IntStream.range(0, positions.phraseText().maxLines()).map((idx) -> {
|
||||
return idx * (positions.phraseText().fontHeight() + 1) + positions.phraseText().firstLineAscent() * -1;
|
||||
@ -222,8 +268,6 @@ public class DialogueRenderer {
|
||||
|
||||
private DialogueRenderer(Player player) {
|
||||
this.player = player;
|
||||
|
||||
|
||||
}
|
||||
|
||||
public static DialogueRenderer create(Player player) {
|
||||
|
||||
@ -0,0 +1,27 @@
|
||||
package ru.dragonestia.msb3.api.util;
|
||||
|
||||
import lombok.experimental.UtilityClass;
|
||||
import team.unnamed.creative.base.Writable;
|
||||
|
||||
import javax.imageio.ImageIO;
|
||||
import java.awt.image.BufferedImage;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
|
||||
@UtilityClass
|
||||
public class ImageUtil {
|
||||
|
||||
public Writable imageToWritable(BufferedImage image) {
|
||||
try {
|
||||
return imageToWritable0(image);
|
||||
} catch (Exception ex) {
|
||||
throw new RuntimeException(ex);
|
||||
}
|
||||
}
|
||||
|
||||
private Writable imageToWritable0(BufferedImage image) throws Exception {
|
||||
try (var stream = new ByteArrayOutputStream()) {
|
||||
ImageIO.write(image, "png", stream);
|
||||
return Writable.bytes(stream.toByteArray());
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -4,6 +4,7 @@ import ru.dragonestia.msb3.api.ServerBootstrap;
|
||||
import team.unnamed.creative.base.Writable;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.net.URL;
|
||||
import java.net.URLConnection;
|
||||
|
||||
@ -14,20 +15,26 @@ public interface ResourceFromJar {
|
||||
}
|
||||
|
||||
static Writable of(ClassLoader classLoader, String fileName) {
|
||||
return Writable.inputStream(() -> {
|
||||
try {
|
||||
URL url = classLoader.getResource(fileName);
|
||||
return Writable.inputStream(() -> streamOf(classLoader, fileName));
|
||||
}
|
||||
|
||||
if (url == null) {
|
||||
return null;
|
||||
}
|
||||
static InputStream streamOf(String fileName) {
|
||||
return streamOf(ServerBootstrap.CLASS_LOADER, fileName);
|
||||
}
|
||||
|
||||
URLConnection connection = url.openConnection();
|
||||
connection.setUseCaches(false);
|
||||
return connection.getInputStream();
|
||||
} catch (IOException ex) {
|
||||
static InputStream streamOf(ClassLoader classLoader, String fileName) {
|
||||
try {
|
||||
URL url = classLoader.getResource(fileName);
|
||||
|
||||
if (url == null) {
|
||||
return null;
|
||||
}
|
||||
});
|
||||
|
||||
URLConnection connection = url.openConnection();
|
||||
connection.setUseCaches(false);
|
||||
return connection.getInputStream();
|
||||
} catch (IOException ex) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
BIN
api/src/main/resources/glyphs/dialogue/background.png
Normal file
|
After Width: | Height: | Size: 19 KiB |
|
Before Width: | Height: | Size: 4.8 KiB |
|
Before Width: | Height: | Size: 3.8 KiB |
|
Before Width: | Height: | Size: 6.1 KiB |
|
Before Width: | Height: | Size: 5.8 KiB |
BIN
api/src/main/resources/glyphs/dialogue/phrase_substrate.png
Normal file
|
After Width: | Height: | Size: 970 B |
|
Before Width: | Height: | Size: 739 B |
|
Before Width: | Height: | Size: 796 B |