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 75970da..749adec 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 @@ -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) { diff --git a/api/src/main/java/ru/dragonestia/msb3/api/util/ImageUtil.java b/api/src/main/java/ru/dragonestia/msb3/api/util/ImageUtil.java new file mode 100644 index 0000000..73a2492 --- /dev/null +++ b/api/src/main/java/ru/dragonestia/msb3/api/util/ImageUtil.java @@ -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()); + } + } +} diff --git a/api/src/main/java/ru/dragonestia/msb3/api/util/ResourceFromJar.java b/api/src/main/java/ru/dragonestia/msb3/api/util/ResourceFromJar.java index ef9c363..fe8974b 100644 --- a/api/src/main/java/ru/dragonestia/msb3/api/util/ResourceFromJar.java +++ b/api/src/main/java/ru/dragonestia/msb3/api/util/ResourceFromJar.java @@ -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; + } } } diff --git a/api/src/main/resources/glyphs/dialogue/background.png b/api/src/main/resources/glyphs/dialogue/background.png new file mode 100644 index 0000000..df41d25 Binary files /dev/null and b/api/src/main/resources/glyphs/dialogue/background.png differ diff --git a/api/src/main/resources/glyphs/dialogue/background_1.png b/api/src/main/resources/glyphs/dialogue/background_1.png deleted file mode 100644 index d8d8e1f..0000000 Binary files a/api/src/main/resources/glyphs/dialogue/background_1.png and /dev/null differ diff --git a/api/src/main/resources/glyphs/dialogue/background_2.png b/api/src/main/resources/glyphs/dialogue/background_2.png deleted file mode 100644 index 1f07f84..0000000 Binary files a/api/src/main/resources/glyphs/dialogue/background_2.png and /dev/null differ diff --git a/api/src/main/resources/glyphs/dialogue/background_3.png b/api/src/main/resources/glyphs/dialogue/background_3.png deleted file mode 100644 index a8fffc2..0000000 Binary files a/api/src/main/resources/glyphs/dialogue/background_3.png and /dev/null differ diff --git a/api/src/main/resources/glyphs/dialogue/background_4.png b/api/src/main/resources/glyphs/dialogue/background_4.png deleted file mode 100644 index d721a03..0000000 Binary files a/api/src/main/resources/glyphs/dialogue/background_4.png and /dev/null differ diff --git a/api/src/main/resources/glyphs/dialogue/phrase_substrate.png b/api/src/main/resources/glyphs/dialogue/phrase_substrate.png new file mode 100644 index 0000000..9c01881 Binary files /dev/null and b/api/src/main/resources/glyphs/dialogue/phrase_substrate.png differ diff --git a/api/src/main/resources/glyphs/dialogue/phrase_substrate_1.png b/api/src/main/resources/glyphs/dialogue/phrase_substrate_1.png deleted file mode 100644 index 2c0af6f..0000000 Binary files a/api/src/main/resources/glyphs/dialogue/phrase_substrate_1.png and /dev/null differ diff --git a/api/src/main/resources/glyphs/dialogue/phrase_substrate_2.png b/api/src/main/resources/glyphs/dialogue/phrase_substrate_2.png deleted file mode 100644 index cf8a2b3..0000000 Binary files a/api/src/main/resources/glyphs/dialogue/phrase_substrate_2.png and /dev/null differ