From 8f0a6ef88591e6823b35db2ef362ee80e87501d8 Mon Sep 17 00:00:00 2001 From: Pixirora Date: Fri, 27 Sep 2024 18:45:23 -0400 Subject: [PATCH] parse sound files in Minecraft --- projects/catculator/build.gradle.kts | 2 ++ .../catculator/impl/music/SoundFile.java | 15 +++++++++ projects/catculator/src/main/rust/bridge.rs | 1 + .../src/main/rust/bridge/sound_parsing.rs | 31 +++++++++++++++++++ projects/catculator/src/main/rust/errors.rs | 9 ++++++ .../pixaurora/kit_tunes/api/music/Track.java | 3 ++ .../kitten_cube/impl/MinecraftClient.java | 8 +++++ .../kitten_heart/impl/EventHandling.java | 18 +++++++++++ .../listener/ScrobblingMusicListener.java | 9 ++++-- .../kitten_heart/impl/music/TrackImpl.java | 6 ++++ .../impl/music/metadata/MusicMetadata.java | 14 +++++++-- .../music/metadata/MusicMetadataImpl.java | 18 +++++++++++ .../music/metadata/MutableMusicMetadata.java | 4 +++ .../impl/resource/temp/FileAccess.java | 15 +++------ ...TempFileAcces.java => TempFileAccess.java} | 4 +-- .../impl/service/MinecraftUICompat.java | 5 +++ .../impl/service/MusicMetadataService.java | 3 ++ .../impl/service/UICompatImpl.java | 10 ++++++ .../impl/service/UICompatImpl.java | 10 ++++++ .../impl/service/UICompatImpl.java | 10 ++++++ .../impl/service/UICompatImpl.java | 10 ++++++ .../impl/service/UICompatImpl.java | 10 ++++++ .../impl/service/UICompatImpl.java | 10 ++++++ .../impl/service/UICompatImpl.java | 10 ++++++ 24 files changed, 217 insertions(+), 18 deletions(-) create mode 100644 projects/catculator/src/main/java/net/pixaurora/catculator/impl/music/SoundFile.java create mode 100644 projects/catculator/src/main/rust/bridge/sound_parsing.rs rename projects/kitten-heart/src/main/java/net/pixaurora/kitten_heart/impl/resource/temp/{TempFileAcces.java => TempFileAccess.java} (80%) diff --git a/projects/catculator/build.gradle.kts b/projects/catculator/build.gradle.kts index cd768c5..650a885 100644 --- a/projects/catculator/build.gradle.kts +++ b/projects/catculator/build.gradle.kts @@ -16,6 +16,8 @@ mod { dependencies { implementation(libs.annotations) implementation(libs.quilt.loader) + + implementation(project(":projects:kit-tunes-api")) } tasks.register("buildDevNatives") { diff --git a/projects/catculator/src/main/java/net/pixaurora/catculator/impl/music/SoundFile.java b/projects/catculator/src/main/java/net/pixaurora/catculator/impl/music/SoundFile.java new file mode 100644 index 0000000..6678fba --- /dev/null +++ b/projects/catculator/src/main/java/net/pixaurora/catculator/impl/music/SoundFile.java @@ -0,0 +1,15 @@ +package net.pixaurora.catculator.impl.music; + +import java.io.IOException; +import java.nio.file.Path; +import java.time.Duration; + +public class SoundFile { + public static Duration parseDuration(Path path) throws IOException { + long nanos = parseDuration0(path.toString()); + + return Duration.ofNanos(nanos); + } + + private static native long parseDuration0(String path) throws IOException; +} diff --git a/projects/catculator/src/main/rust/bridge.rs b/projects/catculator/src/main/rust/bridge.rs index ab6131e..ef241e0 100644 --- a/projects/catculator/src/main/rust/bridge.rs +++ b/projects/catculator/src/main/rust/bridge.rs @@ -2,6 +2,7 @@ use crate::Result; use jni::{objects::JObject, sys::jlong, JNIEnv}; mod http; +mod sound_parsing; fn get_pointer<'local>(env: &mut JNIEnv<'local>, object: &JObject<'local>) -> Result { Ok(env.get_field(object, "pointer", "J")?.try_into()?) diff --git a/projects/catculator/src/main/rust/bridge/sound_parsing.rs b/projects/catculator/src/main/rust/bridge/sound_parsing.rs new file mode 100644 index 0000000..8d96d60 --- /dev/null +++ b/projects/catculator/src/main/rust/bridge/sound_parsing.rs @@ -0,0 +1,31 @@ +use jni::{ + objects::{JClass, JString}, + sys::jlong, + JNIEnv, +}; + +use crate::sound_parsing::audio_length; +use crate::Result; + +fn parse_duration<'local>(env: &mut JNIEnv<'local>, path: &JString<'local>) -> Result { + let path: String = env.get_string(path)?.into(); + + let duration = audio_length(path)?; + + Ok(duration.as_nanos().try_into()?) +} + +#[no_mangle] +pub extern "system" fn Java_net_pixaurora_catculator_impl_music_SoundFile_parseDuration0<'local>( + mut env: JNIEnv<'local>, + _class: JClass<'local>, + path: JString<'local>, +) -> jlong { + match parse_duration(&mut env, &path) { + Ok(duration) => duration, + Err(error) => { + error.throw(&mut env); + jlong::default() + } + } +} diff --git a/projects/catculator/src/main/rust/errors.rs b/projects/catculator/src/main/rust/errors.rs index 0f596ae..4505061 100644 --- a/projects/catculator/src/main/rust/errors.rs +++ b/projects/catculator/src/main/rust/errors.rs @@ -1,4 +1,5 @@ use std::fmt::Display; +use std::num::TryFromIntError; use jni::errors::Error as JNIError; use jni::JNIEnv; @@ -17,6 +18,7 @@ pub enum Error { Join(JoinError), Server(String), Lofty(LoftyError), + TryFromInt(TryFromIntError), } pub type Result = core::result::Result; @@ -41,6 +43,7 @@ impl Display for Error { Error::Join(error) => error.fmt(f), Error::Server(message) => write!(f, "Server Error: {}", message), Error::Lofty(error) => error.fmt(f), + Error::TryFromInt(error) => error.fmt(f), } } } @@ -80,3 +83,9 @@ impl From for Error { Error::Lofty(value) } } + +impl From for Error { + fn from(value: TryFromIntError) -> Self { + Error::TryFromInt(value) + } +} diff --git a/projects/kit-tunes-api/src/main/java/net/pixaurora/kit_tunes/api/music/Track.java b/projects/kit-tunes-api/src/main/java/net/pixaurora/kit_tunes/api/music/Track.java index 2eee560..2949515 100644 --- a/projects/kit-tunes-api/src/main/java/net/pixaurora/kit_tunes/api/music/Track.java +++ b/projects/kit-tunes-api/src/main/java/net/pixaurora/kit_tunes/api/music/Track.java @@ -1,5 +1,6 @@ package net.pixaurora.kit_tunes.api.music; +import java.time.Duration; import java.util.List; import java.util.Optional; import java.util.Random; @@ -24,4 +25,6 @@ public default Optional album() { } public List albums(); + + public Duration duration(); } diff --git a/projects/kitten-heart/src/main/java/net/pixaurora/kitten_cube/impl/MinecraftClient.java b/projects/kitten-heart/src/main/java/net/pixaurora/kitten_cube/impl/MinecraftClient.java index db331c9..7922cfd 100644 --- a/projects/kitten-heart/src/main/java/net/pixaurora/kitten_cube/impl/MinecraftClient.java +++ b/projects/kitten-heart/src/main/java/net/pixaurora/kitten_cube/impl/MinecraftClient.java @@ -1,10 +1,14 @@ package net.pixaurora.kitten_cube.impl; +import java.io.IOException; + +import net.pixaurora.kit_tunes.api.resource.ResourcePath; import net.pixaurora.kitten_cube.impl.math.Size; import net.pixaurora.kitten_cube.impl.text.Component; import net.pixaurora.kitten_cube.impl.ui.screen.Screen; import net.pixaurora.kitten_cube.impl.ui.sound.Sound; import net.pixaurora.kitten_heart.impl.KitTunes; +import net.pixaurora.kitten_heart.impl.resource.temp.FileAccess; import net.pixaurora.kitten_heart.impl.service.MinecraftUICompat; public final class MinecraftClient { @@ -39,4 +43,8 @@ public static void setScreen(Screen screen) { public static void openURL(String url) { impl().openURL(url); } + + public static FileAccess accessResource(ResourcePath resource) throws IOException { + return impl().accessResource(resource); + } } diff --git a/projects/kitten-heart/src/main/java/net/pixaurora/kitten_heart/impl/EventHandling.java b/projects/kitten-heart/src/main/java/net/pixaurora/kitten_heart/impl/EventHandling.java index 08377bb..b9915b2 100644 --- a/projects/kitten-heart/src/main/java/net/pixaurora/kitten_heart/impl/EventHandling.java +++ b/projects/kitten-heart/src/main/java/net/pixaurora/kitten_heart/impl/EventHandling.java @@ -1,5 +1,7 @@ package net.pixaurora.kitten_heart.impl; +import java.io.IOException; +import java.time.Duration; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -8,15 +10,19 @@ import java.util.function.Consumer; import java.util.Optional; +import net.pixaurora.catculator.impl.music.SoundFile; import net.pixaurora.kit_tunes.api.event.TrackEndEvent; import net.pixaurora.kit_tunes.api.event.TrackStartEvent; import net.pixaurora.kit_tunes.api.listener.MusicEventListener; import net.pixaurora.kit_tunes.api.music.ListeningProgress; import net.pixaurora.kit_tunes.api.music.Track; import net.pixaurora.kit_tunes.api.resource.ResourcePath; +import net.pixaurora.kitten_cube.impl.MinecraftClient; +import net.pixaurora.kitten_heart.impl.error.UnhandledKitTunesException; import net.pixaurora.kitten_heart.impl.event.TrackEventImpl; import net.pixaurora.kitten_heart.impl.music.metadata.MusicMetadata; import net.pixaurora.kitten_heart.impl.music.progress.PolledListeningProgress; +import net.pixaurora.kitten_heart.impl.resource.temp.FileAccess; import net.pixaurora.kitten_heart.impl.util.Pair; public class EventHandling { @@ -73,11 +79,23 @@ public static synchronized void stop() { private static synchronized TrackStartEvent createStartEvent(ResourcePath path, ListeningProgress progress) { Optional track = MusicMetadata.matchTrack(path); + if (track.isPresent()) { + Duration songDuration = UnhandledKitTunesException.runOrThrow(() -> songDuration(path)); + + MusicMetadata.asMutable().giveDuration(track.get(), songDuration); + } + PLAYING_TRACKS.put(progress, Pair.of(path, track)); return new TrackEventImpl(path, track, progress); } + private static Duration songDuration(ResourcePath path) throws IOException { + try (FileAccess resource = MinecraftClient.accessResource(path)) { + return SoundFile.parseDuration(resource.path()); + } + } + private static synchronized Pair> getTrackInfo(ListeningProgress progress, boolean flushFromMap) { Pair> trackInfo = Objects.requireNonNull(PLAYING_TRACKS.get(progress)); diff --git a/projects/kitten-heart/src/main/java/net/pixaurora/kitten_heart/impl/listener/ScrobblingMusicListener.java b/projects/kitten-heart/src/main/java/net/pixaurora/kitten_heart/impl/listener/ScrobblingMusicListener.java index 67e46d6..e43e6e6 100644 --- a/projects/kitten-heart/src/main/java/net/pixaurora/kitten_heart/impl/listener/ScrobblingMusicListener.java +++ b/projects/kitten-heart/src/main/java/net/pixaurora/kitten_heart/impl/listener/ScrobblingMusicListener.java @@ -32,15 +32,18 @@ public void onTrackEnd(TrackEndEvent event) { Track track = event.track().get(); ListeningProgress progress = event.progress(); - boolean longEnoughToScrobble = progress.amountPlayed().compareTo(Duration.ofMinutes(1)) > 0; + Duration requiredLength = track.duration().dividedBy(2); + boolean longEnoughToScrobble = progress.amountPlayed().compareTo(requiredLength) > 0; // We use 60 seconds as the amount of time required to scrobble a song, for now. if (longEnoughToScrobble) { KitTunes.SCROBBLER_CACHE .execute(scrobblers -> scrobblers.completeScrobbling(new ScrobbledTrack(track, progress))); } else { - KitTunes.LOGGER.info("Skipping scrobbling " + track.name() + " because it only played for " - + (float) progress.amountPlayed().toMillis() / 1000 + " seconds!"); + float amountPlayed = (float) progress.amountPlayed().toMillis() / 1000; + float amountRequired = (float) requiredLength.toMillis() / 1000; + KitTunes.LOGGER.info("Skipping scrobbling " + track.name() + " because it only played for " + + amountPlayed + " out of " + amountRequired + " seconds!"); } } diff --git a/projects/kitten-heart/src/main/java/net/pixaurora/kitten_heart/impl/music/TrackImpl.java b/projects/kitten-heart/src/main/java/net/pixaurora/kitten_heart/impl/music/TrackImpl.java index faf1fff..e83e0d7 100644 --- a/projects/kitten-heart/src/main/java/net/pixaurora/kitten_heart/impl/music/TrackImpl.java +++ b/projects/kitten-heart/src/main/java/net/pixaurora/kitten_heart/impl/music/TrackImpl.java @@ -1,6 +1,7 @@ package net.pixaurora.kitten_heart.impl.music; import java.lang.reflect.Type; +import java.time.Duration; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -64,6 +65,11 @@ public List albums() { return MusicMetadata.albumsWithTrack(this); } + @Override + public Duration duration() { + return MusicMetadata.trackDuration(this); + } + public static interface TransformsToTrack extends TransformsTo { public static class Serializer implements JsonDeserializer { @Override diff --git a/projects/kitten-heart/src/main/java/net/pixaurora/kitten_heart/impl/music/metadata/MusicMetadata.java b/projects/kitten-heart/src/main/java/net/pixaurora/kitten_heart/impl/music/metadata/MusicMetadata.java index 7ffb66e..26b7e61 100644 --- a/projects/kitten-heart/src/main/java/net/pixaurora/kitten_heart/impl/music/metadata/MusicMetadata.java +++ b/projects/kitten-heart/src/main/java/net/pixaurora/kitten_heart/impl/music/metadata/MusicMetadata.java @@ -1,6 +1,7 @@ package net.pixaurora.kitten_heart.impl.music.metadata; import java.nio.file.Path; +import java.time.Duration; import java.util.List; import java.util.Optional; @@ -11,13 +12,12 @@ import net.pixaurora.kit_tunes.api.music.Track; import net.pixaurora.kit_tunes.api.resource.ResourcePath; import net.pixaurora.kitten_cube.impl.text.Component; -import net.pixaurora.kitten_heart.impl.service.MusicMetadataService; public final class MusicMetadata { private static final String METADATA_PREFIX = "kit_tunes.metadata"; private static final String SEPARATOR = "."; - private static @Nullable MusicMetadataService IMPL; + private static @Nullable MusicMetadataImpl IMPL; public static void init(List albumFiles, List artistFiles, List trackFiles) { IMPL = new MusicMetadataImpl(); @@ -25,7 +25,7 @@ public static void init(List albumFiles, List artistFiles, List albumsWithTrack(Track track) { return impl().albumsWithTrack(track); } + public static Duration trackDuration(Track track) { + return impl().trackDuration(track); + } + public static Component asComponent(Track track) { return Component.translatableWithFallback(translationKey(track.path()), track.name()); } @@ -66,4 +70,8 @@ private static String translationKey(ResourcePath path) { return METADATA_PREFIX + SEPARATOR + specifier; } + + public static MutableMusicMetadata asMutable() { + return impl(); + } } diff --git a/projects/kitten-heart/src/main/java/net/pixaurora/kitten_heart/impl/music/metadata/MusicMetadataImpl.java b/projects/kitten-heart/src/main/java/net/pixaurora/kitten_heart/impl/music/metadata/MusicMetadataImpl.java index 475fe8b..a867008 100644 --- a/projects/kitten-heart/src/main/java/net/pixaurora/kitten_heart/impl/music/metadata/MusicMetadataImpl.java +++ b/projects/kitten-heart/src/main/java/net/pixaurora/kitten_heart/impl/music/metadata/MusicMetadataImpl.java @@ -1,6 +1,7 @@ package net.pixaurora.kitten_heart.impl.music.metadata; import java.nio.file.Path; +import java.time.Duration; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -21,6 +22,8 @@ public class MusicMetadataImpl implements MusicMetadataService, MutableMusicMeta private final HashMap trackMatches = new HashMap<>(); private final HashMap> trackToAlbums = new HashMap<>(); + private final HashMap trackDurations = new HashMap<>(); + @Override public void add(Album album) { this.albums.put(album.path(), album); @@ -44,6 +47,11 @@ public void add(Track track) { } } + @Override + public void giveDuration(Track track, Duration duration) { + this.trackDurations.put(track.path(), duration); + } + @Override public void load(List albumFiles, List artistFiles, List trackFiles) { MusicMetadataLoader.load(this, albumFiles, artistFiles, trackFiles); @@ -75,4 +83,14 @@ public Optional getTrack(ResourcePath path) { return Optional.ofNullable(tracks.get(path)); } + @Override + public Duration trackDuration(Track track) { + Optional duration = Optional.ofNullable(this.trackDurations.get(track.path())); + + if (duration.isPresent()) { + return duration.get(); + } else { + throw new RuntimeException("Track duration has not been initialized for Track `" + track.path() + "`!"); + } + } } diff --git a/projects/kitten-heart/src/main/java/net/pixaurora/kitten_heart/impl/music/metadata/MutableMusicMetadata.java b/projects/kitten-heart/src/main/java/net/pixaurora/kitten_heart/impl/music/metadata/MutableMusicMetadata.java index e553dc6..fc89a8b 100644 --- a/projects/kitten-heart/src/main/java/net/pixaurora/kitten_heart/impl/music/metadata/MutableMusicMetadata.java +++ b/projects/kitten-heart/src/main/java/net/pixaurora/kitten_heart/impl/music/metadata/MutableMusicMetadata.java @@ -1,5 +1,7 @@ package net.pixaurora.kitten_heart.impl.music.metadata; +import java.time.Duration; + import net.pixaurora.kit_tunes.api.music.Album; import net.pixaurora.kit_tunes.api.music.Artist; import net.pixaurora.kit_tunes.api.music.Track; @@ -10,4 +12,6 @@ public interface MutableMusicMetadata { public void add(Artist artist); public void add(Track track); + + public void giveDuration(Track track, Duration duration); } diff --git a/projects/kitten-heart/src/main/java/net/pixaurora/kitten_heart/impl/resource/temp/FileAccess.java b/projects/kitten-heart/src/main/java/net/pixaurora/kitten_heart/impl/resource/temp/FileAccess.java index e4a7912..31d6186 100644 --- a/projects/kitten-heart/src/main/java/net/pixaurora/kitten_heart/impl/resource/temp/FileAccess.java +++ b/projects/kitten-heart/src/main/java/net/pixaurora/kitten_heart/impl/resource/temp/FileAccess.java @@ -1,11 +1,11 @@ package net.pixaurora.kitten_heart.impl.resource.temp; -import java.io.BufferedWriter; import java.io.Closeable; import java.io.IOException; import java.io.InputStream; import java.nio.file.Files; import java.nio.file.Path; +import java.nio.file.StandardCopyOption; import org.quiltmc.loader.api.QuiltLoader; @@ -18,17 +18,12 @@ public static FileAccess create(Path staticFile) { public static FileAccess create(InputStream data) throws IOException { Files.createDirectories(TEMP_FILE_DIR); + // TODO: Make the workaround of adding `.ogg` unnecessary + Path tempFile = Files.createTempFile(TEMP_FILE_DIR, null, ".ogg"); - Path tempFile = Files.createTempFile(TEMP_FILE_DIR, null, null); + Files.copy(data, tempFile, StandardCopyOption.REPLACE_EXISTING); - try (BufferedWriter writer = Files.newBufferedWriter(tempFile)) { - int nextByte = data.read(); - while (nextByte != -1) { - writer.write((byte) nextByte); - } - } - - return new TempFileAcces(tempFile); + return new TempFileAccess(tempFile); } public Path path(); diff --git a/projects/kitten-heart/src/main/java/net/pixaurora/kitten_heart/impl/resource/temp/TempFileAcces.java b/projects/kitten-heart/src/main/java/net/pixaurora/kitten_heart/impl/resource/temp/TempFileAccess.java similarity index 80% rename from projects/kitten-heart/src/main/java/net/pixaurora/kitten_heart/impl/resource/temp/TempFileAcces.java rename to projects/kitten-heart/src/main/java/net/pixaurora/kitten_heart/impl/resource/temp/TempFileAccess.java index d74c14c..b2570c6 100644 --- a/projects/kitten-heart/src/main/java/net/pixaurora/kitten_heart/impl/resource/temp/TempFileAcces.java +++ b/projects/kitten-heart/src/main/java/net/pixaurora/kitten_heart/impl/resource/temp/TempFileAccess.java @@ -4,10 +4,10 @@ import java.nio.file.Files; import java.nio.file.Path; -public class TempFileAcces implements FileAccess { +public class TempFileAccess implements FileAccess { private final Path file; - public TempFileAcces(Path file) { + public TempFileAccess(Path file) { this.file = file; } diff --git a/projects/kitten-heart/src/main/java/net/pixaurora/kitten_heart/impl/service/MinecraftUICompat.java b/projects/kitten-heart/src/main/java/net/pixaurora/kitten_heart/impl/service/MinecraftUICompat.java index 9c14e0f..f98580a 100644 --- a/projects/kitten-heart/src/main/java/net/pixaurora/kitten_heart/impl/service/MinecraftUICompat.java +++ b/projects/kitten-heart/src/main/java/net/pixaurora/kitten_heart/impl/service/MinecraftUICompat.java @@ -1,11 +1,14 @@ package net.pixaurora.kitten_heart.impl.service; +import java.io.IOException; + import net.pixaurora.kit_tunes.api.resource.ResourcePath; import net.pixaurora.kitten_cube.impl.text.Component; import net.pixaurora.kitten_cube.impl.text.TextProcessor; import net.pixaurora.kitten_cube.impl.ui.screen.Screen; import net.pixaurora.kitten_cube.impl.ui.sound.SoundPlayer; import net.pixaurora.kitten_cube.impl.ui.toast.Toast; +import net.pixaurora.kitten_heart.impl.resource.temp.FileAccess; /** * The version-specific implementation for pieces of the UI that are organized @@ -27,4 +30,6 @@ public interface MinecraftUICompat extends SoundPlayer, TextProcessor { public void setScreen(Screen screen); public void openURL(String url); + + public FileAccess accessResource(ResourcePath path) throws IOException; } diff --git a/projects/kitten-heart/src/main/java/net/pixaurora/kitten_heart/impl/service/MusicMetadataService.java b/projects/kitten-heart/src/main/java/net/pixaurora/kitten_heart/impl/service/MusicMetadataService.java index 2240c7f..a604de4 100644 --- a/projects/kitten-heart/src/main/java/net/pixaurora/kitten_heart/impl/service/MusicMetadataService.java +++ b/projects/kitten-heart/src/main/java/net/pixaurora/kitten_heart/impl/service/MusicMetadataService.java @@ -1,6 +1,7 @@ package net.pixaurora.kitten_heart.impl.service; import java.nio.file.Path; +import java.time.Duration; import java.util.List; import java.util.Optional; @@ -19,4 +20,6 @@ public interface MusicMetadataService { public Optional matchTrack(ResourcePath soundPath); public List albumsWithTrack(Track track); + + public Duration trackDuration(Track track); } diff --git a/projects/kitten-square/r1.17.0/src/main/java/net/pixaurora/kitten_square/impl/service/UICompatImpl.java b/projects/kitten-square/r1.17.0/src/main/java/net/pixaurora/kitten_square/impl/service/UICompatImpl.java index 142462e..c3e4753 100644 --- a/projects/kitten-square/r1.17.0/src/main/java/net/pixaurora/kitten_square/impl/service/UICompatImpl.java +++ b/projects/kitten-square/r1.17.0/src/main/java/net/pixaurora/kitten_square/impl/service/UICompatImpl.java @@ -1,5 +1,6 @@ package net.pixaurora.kitten_square.impl.service; +import java.io.IOException; import java.util.List; import net.minecraft.Util; @@ -9,6 +10,7 @@ import net.minecraft.network.chat.TextComponent; import net.minecraft.network.chat.TranslatableComponent; import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.packs.resources.Resource; import net.minecraft.util.FormattedCharSequence; import net.pixaurora.kit_tunes.api.resource.ResourcePath; import net.pixaurora.kitten_cube.impl.math.Point; @@ -17,6 +19,7 @@ import net.pixaurora.kitten_cube.impl.ui.screen.Screen; import net.pixaurora.kitten_cube.impl.ui.sound.Sound; import net.pixaurora.kitten_cube.impl.ui.widget.text.TextBox; +import net.pixaurora.kitten_heart.impl.resource.temp.FileAccess; import net.pixaurora.kitten_heart.impl.service.MinecraftUICompat; import net.pixaurora.kitten_square.impl.FakeComponent; import net.pixaurora.kitten_square.impl.SoundUtil; @@ -110,4 +113,11 @@ public TextBox createTextbox(List lines, Color color, int maxLineLeng return new TextBoxImpl(text, color, pos); } + + @Override + public FileAccess accessResource(ResourcePath path) throws IOException { + Resource resource = this.client.getResourceManager().getResource(internalToMinecraftType(path)); + + return FileAccess.create(resource.getInputStream()); + } } diff --git a/projects/kitten-square/r1.19.0/src/main/java/net/pixaurora/kitten_square/impl/service/UICompatImpl.java b/projects/kitten-square/r1.19.0/src/main/java/net/pixaurora/kitten_square/impl/service/UICompatImpl.java index 756e249..6a79d5e 100644 --- a/projects/kitten-square/r1.19.0/src/main/java/net/pixaurora/kitten_square/impl/service/UICompatImpl.java +++ b/projects/kitten-square/r1.19.0/src/main/java/net/pixaurora/kitten_square/impl/service/UICompatImpl.java @@ -1,5 +1,6 @@ package net.pixaurora.kitten_square.impl.service; +import java.io.IOException; import java.util.List; import net.minecraft.Util; @@ -7,6 +8,7 @@ import net.minecraft.client.resources.language.I18n; import net.minecraft.network.chat.MutableComponent; import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.packs.resources.Resource; import net.minecraft.util.FormattedCharSequence; import net.pixaurora.kit_tunes.api.resource.ResourcePath; import net.pixaurora.kitten_cube.impl.math.Point; @@ -15,6 +17,7 @@ import net.pixaurora.kitten_cube.impl.ui.screen.Screen; import net.pixaurora.kitten_cube.impl.ui.sound.Sound; import net.pixaurora.kitten_cube.impl.ui.widget.text.TextBox; +import net.pixaurora.kitten_heart.impl.resource.temp.FileAccess; import net.pixaurora.kitten_heart.impl.service.MinecraftUICompat; import net.pixaurora.kitten_square.impl.FakeComponent; import net.pixaurora.kitten_square.impl.SoundUtil; @@ -108,4 +111,11 @@ public TextBox createTextbox(List lines, Color color, int maxLineLeng return new TextBoxImpl(text, color, pos); } + + @Override + public FileAccess accessResource(ResourcePath path) throws IOException { + Resource resource = this.client.getResourceManager().getResourceOrThrow(internalToMinecraftType(path)); + + return FileAccess.create(resource.open()); + } } diff --git a/projects/kitten-square/r1.19.3/src/main/java/net/pixaurora/kitten_square/impl/service/UICompatImpl.java b/projects/kitten-square/r1.19.3/src/main/java/net/pixaurora/kitten_square/impl/service/UICompatImpl.java index 756e249..6a79d5e 100644 --- a/projects/kitten-square/r1.19.3/src/main/java/net/pixaurora/kitten_square/impl/service/UICompatImpl.java +++ b/projects/kitten-square/r1.19.3/src/main/java/net/pixaurora/kitten_square/impl/service/UICompatImpl.java @@ -1,5 +1,6 @@ package net.pixaurora.kitten_square.impl.service; +import java.io.IOException; import java.util.List; import net.minecraft.Util; @@ -7,6 +8,7 @@ import net.minecraft.client.resources.language.I18n; import net.minecraft.network.chat.MutableComponent; import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.packs.resources.Resource; import net.minecraft.util.FormattedCharSequence; import net.pixaurora.kit_tunes.api.resource.ResourcePath; import net.pixaurora.kitten_cube.impl.math.Point; @@ -15,6 +17,7 @@ import net.pixaurora.kitten_cube.impl.ui.screen.Screen; import net.pixaurora.kitten_cube.impl.ui.sound.Sound; import net.pixaurora.kitten_cube.impl.ui.widget.text.TextBox; +import net.pixaurora.kitten_heart.impl.resource.temp.FileAccess; import net.pixaurora.kitten_heart.impl.service.MinecraftUICompat; import net.pixaurora.kitten_square.impl.FakeComponent; import net.pixaurora.kitten_square.impl.SoundUtil; @@ -108,4 +111,11 @@ public TextBox createTextbox(List lines, Color color, int maxLineLeng return new TextBoxImpl(text, color, pos); } + + @Override + public FileAccess accessResource(ResourcePath path) throws IOException { + Resource resource = this.client.getResourceManager().getResourceOrThrow(internalToMinecraftType(path)); + + return FileAccess.create(resource.open()); + } } diff --git a/projects/kitten-square/r1.19.4/src/main/java/net/pixaurora/kitten_square/impl/service/UICompatImpl.java b/projects/kitten-square/r1.19.4/src/main/java/net/pixaurora/kitten_square/impl/service/UICompatImpl.java index 756e249..6a79d5e 100644 --- a/projects/kitten-square/r1.19.4/src/main/java/net/pixaurora/kitten_square/impl/service/UICompatImpl.java +++ b/projects/kitten-square/r1.19.4/src/main/java/net/pixaurora/kitten_square/impl/service/UICompatImpl.java @@ -1,5 +1,6 @@ package net.pixaurora.kitten_square.impl.service; +import java.io.IOException; import java.util.List; import net.minecraft.Util; @@ -7,6 +8,7 @@ import net.minecraft.client.resources.language.I18n; import net.minecraft.network.chat.MutableComponent; import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.packs.resources.Resource; import net.minecraft.util.FormattedCharSequence; import net.pixaurora.kit_tunes.api.resource.ResourcePath; import net.pixaurora.kitten_cube.impl.math.Point; @@ -15,6 +17,7 @@ import net.pixaurora.kitten_cube.impl.ui.screen.Screen; import net.pixaurora.kitten_cube.impl.ui.sound.Sound; import net.pixaurora.kitten_cube.impl.ui.widget.text.TextBox; +import net.pixaurora.kitten_heart.impl.resource.temp.FileAccess; import net.pixaurora.kitten_heart.impl.service.MinecraftUICompat; import net.pixaurora.kitten_square.impl.FakeComponent; import net.pixaurora.kitten_square.impl.SoundUtil; @@ -108,4 +111,11 @@ public TextBox createTextbox(List lines, Color color, int maxLineLeng return new TextBoxImpl(text, color, pos); } + + @Override + public FileAccess accessResource(ResourcePath path) throws IOException { + Resource resource = this.client.getResourceManager().getResourceOrThrow(internalToMinecraftType(path)); + + return FileAccess.create(resource.open()); + } } diff --git a/projects/kitten-square/r1.20.0/src/main/java/net/pixaurora/kitten_square/impl/service/UICompatImpl.java b/projects/kitten-square/r1.20.0/src/main/java/net/pixaurora/kitten_square/impl/service/UICompatImpl.java index d2f9483..049870f 100644 --- a/projects/kitten-square/r1.20.0/src/main/java/net/pixaurora/kitten_square/impl/service/UICompatImpl.java +++ b/projects/kitten-square/r1.20.0/src/main/java/net/pixaurora/kitten_square/impl/service/UICompatImpl.java @@ -1,11 +1,13 @@ package net.pixaurora.kitten_square.impl.service; +import java.io.IOException; import java.util.List; import net.minecraft.Util; import net.minecraft.client.Minecraft; import net.minecraft.network.chat.MutableComponent; import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.packs.resources.Resource; import net.minecraft.util.FormattedCharSequence; import net.pixaurora.kit_tunes.api.resource.ResourcePath; import net.pixaurora.kitten_cube.impl.math.Point; @@ -15,6 +17,7 @@ import net.pixaurora.kitten_cube.impl.ui.sound.Sound; import net.pixaurora.kitten_cube.impl.ui.widget.text.TextBox; import net.pixaurora.kitten_heart.impl.resource.ResourcePathUtils; +import net.pixaurora.kitten_heart.impl.resource.temp.FileAccess; import net.pixaurora.kitten_heart.impl.service.MinecraftUICompat; import net.pixaurora.kitten_square.impl.FakeComponent; import net.pixaurora.kitten_square.impl.SoundUtil; @@ -112,4 +115,11 @@ public TextBox createTextbox(List lines, Color color, int maxLineLeng return new TextBoxImpl(text, color, pos); } + + @Override + public FileAccess accessResource(ResourcePath path) throws IOException { + Resource resource = this.client.getResourceManager().getResourceOrThrow(internalToMinecraftType(path)); + + return FileAccess.create(resource.open()); + } } diff --git a/projects/kitten-square/r1.20.3/src/main/java/net/pixaurora/kitten_square/impl/service/UICompatImpl.java b/projects/kitten-square/r1.20.3/src/main/java/net/pixaurora/kitten_square/impl/service/UICompatImpl.java index a1f123d..9c81d3d 100644 --- a/projects/kitten-square/r1.20.3/src/main/java/net/pixaurora/kitten_square/impl/service/UICompatImpl.java +++ b/projects/kitten-square/r1.20.3/src/main/java/net/pixaurora/kitten_square/impl/service/UICompatImpl.java @@ -1,11 +1,13 @@ package net.pixaurora.kitten_square.impl.service; +import java.io.IOException; import java.util.List; import net.minecraft.Util; import net.minecraft.client.Minecraft; import net.minecraft.network.chat.MutableComponent; import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.packs.resources.Resource; import net.minecraft.util.FormattedCharSequence; import net.pixaurora.kit_tunes.api.resource.ResourcePath; import net.pixaurora.kitten_cube.impl.math.Point; @@ -15,6 +17,7 @@ import net.pixaurora.kitten_cube.impl.ui.sound.Sound; import net.pixaurora.kitten_cube.impl.ui.widget.text.TextBox; import net.pixaurora.kitten_heart.impl.resource.ResourcePathUtils; +import net.pixaurora.kitten_heart.impl.resource.temp.FileAccess; import net.pixaurora.kitten_heart.impl.service.MinecraftUICompat; import net.pixaurora.kitten_square.impl.FakeComponent; import net.pixaurora.kitten_square.impl.SoundUtil; @@ -112,4 +115,11 @@ public TextBox createTextbox(List lines, Color color, int maxLineLeng return new TextBoxImpl(text, color, pos); } + + @Override + public FileAccess accessResource(ResourcePath path) throws IOException { + Resource resource = this.client.getResourceManager().getResourceOrThrow(internalToMinecraftType(path)); + + return FileAccess.create(resource.open()); + } } diff --git a/projects/kitten-square/r1.21.0/src/main/java/net/pixaurora/kitten_square/impl/service/UICompatImpl.java b/projects/kitten-square/r1.21.0/src/main/java/net/pixaurora/kitten_square/impl/service/UICompatImpl.java index 59349c9..5eae172 100644 --- a/projects/kitten-square/r1.21.0/src/main/java/net/pixaurora/kitten_square/impl/service/UICompatImpl.java +++ b/projects/kitten-square/r1.21.0/src/main/java/net/pixaurora/kitten_square/impl/service/UICompatImpl.java @@ -1,11 +1,13 @@ package net.pixaurora.kitten_square.impl.service; +import java.io.IOException; import java.util.List; import net.minecraft.Util; import net.minecraft.client.Minecraft; import net.minecraft.network.chat.MutableComponent; import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.packs.resources.Resource; import net.minecraft.util.FormattedCharSequence; import net.pixaurora.kit_tunes.api.resource.ResourcePath; import net.pixaurora.kitten_cube.impl.math.Point; @@ -15,6 +17,7 @@ import net.pixaurora.kitten_cube.impl.ui.sound.Sound; import net.pixaurora.kitten_cube.impl.ui.widget.text.TextBox; import net.pixaurora.kitten_heart.impl.resource.ResourcePathUtils; +import net.pixaurora.kitten_heart.impl.resource.temp.FileAccess; import net.pixaurora.kitten_heart.impl.service.MinecraftUICompat; import net.pixaurora.kitten_square.impl.FakeComponent; import net.pixaurora.kitten_square.impl.SoundUtil; @@ -112,4 +115,11 @@ public TextBox createTextbox(List lines, Color color, int maxLineLeng return new TextBoxImpl(text, color, pos); } + + @Override + public FileAccess accessResource(ResourcePath path) throws IOException { + Resource resource = this.client.getResourceManager().getResourceOrThrow(internalToMinecraftType(path)); + + return FileAccess.create(resource.open()); + } }