Skip to content

Commit

Permalink
Get the music cooldown and put it on the music screen
Browse files Browse the repository at this point in the history
Signed-off-by: Rina Mary Shaw <[email protected]>
  • Loading branch information
Pixaurora committed Dec 6, 2024
1 parent 5bb3f82 commit 4d4efea
Show file tree
Hide file tree
Showing 30 changed files with 156 additions and 47 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,10 @@
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;
import net.pixaurora.kitten_heart.impl.service.UICompat;

public final class MinecraftClient {
private static MinecraftUICompat impl() {
private static UICompat impl() {
return KitTunes.UI_LAYER;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,8 @@
import net.pixaurora.kitten_heart.impl.music.metadata.MusicMetadata;
import net.pixaurora.kitten_heart.impl.music.metadata.MusicMetadataLoader;
import net.pixaurora.kitten_heart.impl.resource.ResourcePathImpl;
import net.pixaurora.kitten_heart.impl.service.MinecraftUICompat;
import net.pixaurora.kitten_heart.impl.service.UICompat;
import net.pixaurora.kitten_heart.impl.service.MusicCompat;
import net.pixaurora.kitten_heart.impl.service.ServiceLoading;
import net.pixaurora.catculator.impl.Catculator;

Expand All @@ -40,7 +41,9 @@ public class KitTunes {
public static ConfigManager<ScrobblerCache> SCROBBLER_CACHE;
public static ConfigManager<ListenHistory> LISTEN_HISTORY;

public static final MinecraftUICompat UI_LAYER = ServiceLoading.loadJustOneOrThrow(MinecraftUICompat.class);
public static final UICompat UI_LAYER = ServiceLoading.loadJustOneOrThrow(UICompat.class);

public static final MusicCompat MUSIC_LAYER = ServiceLoading.loadJustOneOrThrow(MusicCompat.class);

public static final List<MusicEventListener> MUSIC_LISTENERS = ServiceLoading.loadAll(MusicEventListener.class);

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package net.pixaurora.kitten_heart.impl.service;

public interface MusicCompat {
long millisToNextSong();
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
* The version-specific implementation for pieces of the UI that are organized
* in the core of the mod.
*/
public interface MinecraftUICompat extends SoundPlayer, TextProcessor {
public interface UICompat extends SoundPlayer, TextProcessor {
public void sendToast(Toast toast);

public Component translatable(String key);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,11 @@
import net.pixaurora.kitten_heart.impl.ui.screen.KitTunesScreenTemplate;
import net.pixaurora.kitten_heart.impl.ui.widget.PauseButton;
import net.pixaurora.kitten_heart.impl.ui.widget.Timer;
import net.pixaurora.kitten_heart.impl.ui.widget.progress.MusicCooldownProgress;
import net.pixaurora.kitten_heart.impl.ui.widget.progress.ProgressBar;
import net.pixaurora.kitten_heart.impl.ui.widget.progress.ProgressBarTileSet;
import net.pixaurora.kitten_heart.impl.ui.widget.progress.ProgressBarTileSets;
import net.pixaurora.kitten_heart.impl.ui.widget.progress.ProgressProvider;

import static net.pixaurora.kitten_heart.impl.music.metadata.MusicMetadata.asComponent;

Expand Down Expand Up @@ -89,18 +91,8 @@ private static ProgressBarTileSet tileSet(ResourcePath texturePath) {
Point.ZERO, Size.of(4, 4), Point.of(4, 0), Size.of(4, 4), Point.of(8, 0), Size.of(4, 4));
}

private static interface DisplayMode {
boolean isActive();

void cleanup();
}

public DisplayMode createMusicDisplay(PlayingSong song) {
WidgetContainer<ProgressBar> progressBar = this
.addWidget(new ProgressBar(song, PLAYING_SONG_TILE_SET))
.align(Alignment.CENTER_BOTTOM)
.at(Point.of(0, -24))
.anchor(WidgetAnchor.TOP_MIDDLE);
WidgetContainer<ProgressBar> progressBar = this.configProgressBar(song, PLAYING_SONG_TILE_SET);

WidgetContainer<Timer> timer = this.addWidget(new Timer(song))
.align(progressBar.relativeTo(WidgetAnchor.BOTTOM_MIDDLE))
Expand Down Expand Up @@ -155,40 +147,58 @@ public DisplayMode createMusicDisplay(PlayingSong song) {
}

public DisplayMode createWaitingDisplay() {
return new WaitingDisplayMode();
ProgressProvider progress = new MusicCooldownProgress();

WidgetContainer<ProgressBar> progressBar = this.configProgressBar(progress, PLAYING_SONG_TILE_SET);

return new WaitingDisplayMode(Arrays.asList(progressBar));
}

private class MusicDisplayMode implements DisplayMode {
private final PlayingSong song;
private WidgetContainer<ProgressBar> configProgressBar(ProgressProvider progress, ProgressBarTileSets tileSets) {
return this.addWidget(new ProgressBar(progress, tileSets))
.align(Alignment.CENTER_BOTTOM)
.at(Point.of(0, -24))
.anchor(WidgetAnchor.TOP_MIDDLE);
}

private abstract class DisplayMode {
private final List<WidgetContainer<?>> widgets;

MusicDisplayMode(PlayingSong song, List<WidgetContainer<?>> widgets) {
this.song = song;
public DisplayMode(List<WidgetContainer<?>> widgets) {
this.widgets = widgets;
}

@Override
public boolean isActive() {
return EventHandling.isTracking(song.progress());
}
abstract boolean isActive();

@Override
public void cleanup() {
void cleanup() {
for (WidgetContainer<?> widget : this.widgets) {
MusicScreen.this.removeWidget(widget);
}
}
}

private class WaitingDisplayMode implements DisplayMode {
private class MusicDisplayMode extends DisplayMode {
private final PlayingSong song;

MusicDisplayMode(PlayingSong song, List<WidgetContainer<?>> widgets) {
super(widgets);
this.song = song;
}

@Override
public boolean isActive() {
return !EventHandling.isTrackingAnything();
return EventHandling.isTracking(song.progress());
}
}

@Override
public void cleanup() {
private class WaitingDisplayMode extends DisplayMode {
WaitingDisplayMode(List<WidgetContainer<?>> widgets) {
super(widgets);
}

@Override
public boolean isActive() {
return !EventHandling.isTrackingAnything();
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package net.pixaurora.kitten_heart.impl.ui.widget.progress;

import java.time.Duration;

import net.pixaurora.kitten_heart.impl.KitTunes;

public class MusicCooldownProgress implements ProgressProvider {
private final long startingCooldown;

public MusicCooldownProgress() {
this.startingCooldown = KitTunes.MUSIC_LAYER.millisToNextSong();
}

@Override
public double percentComplete() {
return (double) KitTunes.MUSIC_LAYER.millisToNextSong() / this.startingCooldown;
}

@Override
public Duration playedDuration() {
return Duration.ofMillis(KitTunes.MUSIC_LAYER.millisToNextSong());
}

@Override
public Duration totalDuration() {
return Duration.ofMillis(startingCooldown);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package net.pixaurora.kitten_sounds.impl.mixin;

import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor;

import net.minecraft.client.sounds.MusicManager;

@Mixin(MusicManager.class)
public interface MusicManagerAccessor {
@Accessor
public int getNextSongDelay();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package net.pixaurora.kitten_sounds.impl.service;

import net.minecraft.client.Minecraft;
import net.pixaurora.kitten_heart.impl.service.MusicCompat;
import net.pixaurora.kitten_sounds.impl.mixin.MusicManagerAccessor;

public class MusicCompatImpl implements MusicCompat {
private static final long MILLIS_PER_TICK = 50;

private final Minecraft client = Minecraft.getInstance();

@Override
public long millisToNextSong() {
long nextSongDelay = ((MusicManagerAccessor) this.client.getMusicManager()).getNextSongDelay();
return MILLIS_PER_TICK * nextSongDelay;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
net.pixaurora.kitten_sounds.impl.service.MusicCompatImpl
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
"client": [
"ChannelMixin",
"MinecraftMixin",
"MusicManagerAccessor",
"SoundEngineMixin"
],
"injectors": {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package net.pixaurora.kitten_sounds.impl.mixin;

import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor;

import net.minecraft.client.sounds.MusicManager;

@Mixin(MusicManager.class)
public interface MusicManagerAccessor {
@Accessor
public int getNextSongDelay();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package net.pixaurora.kitten_sounds.impl.service;

import net.minecraft.client.Minecraft;
import net.pixaurora.kitten_heart.impl.service.MusicCompat;
import net.pixaurora.kitten_sounds.impl.mixin.MusicManagerAccessor;

public class MusicCompatImpl implements MusicCompat {
private static final long MILLIS_PER_TICK = 50;

private final Minecraft client = Minecraft.getInstance();

@Override
public long millisToNextSong() {
long nextSongDelay = ((MusicManagerAccessor) this.client.getMusicManager()).getNextSongDelay();
return MILLIS_PER_TICK * nextSongDelay;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
net.pixaurora.kitten_sounds.impl.service.MusicCompatImpl
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
"client": [
"ChannelMixin",
"MinecraftMixin",
"MusicManagerAccessor",
"SoundEngineMixin"
],
"injectors": {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,15 +20,15 @@
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_heart.impl.service.UICompat;
import net.pixaurora.kitten_square.impl.FakeComponent;
import net.pixaurora.kitten_square.impl.SoundUtil;
import net.pixaurora.kitten_square.impl.ui.screen.MinecraftScreen;
import net.pixaurora.kitten_square.impl.ui.screen.ScreenImpl;
import net.pixaurora.kitten_square.impl.ui.toast.ToastImpl;
import net.pixaurora.kitten_square.impl.ui.widget.TextBoxImpl;

public class UICompatImpl implements MinecraftUICompat {
public class UICompatImpl implements UICompat {
private final Minecraft client = Minecraft.getInstance();

public static ResourceLocation internalToMinecraftType(ResourcePath path) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,15 +18,15 @@
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_heart.impl.service.UICompat;
import net.pixaurora.kitten_square.impl.FakeComponent;
import net.pixaurora.kitten_square.impl.SoundUtil;
import net.pixaurora.kitten_square.impl.ui.screen.MinecraftScreen;
import net.pixaurora.kitten_square.impl.ui.screen.ScreenImpl;
import net.pixaurora.kitten_square.impl.ui.toast.ToastImpl;
import net.pixaurora.kitten_square.impl.ui.widget.TextBoxImpl;

public class UICompatImpl implements MinecraftUICompat {
public class UICompatImpl implements UICompat {
private final Minecraft client = Minecraft.getInstance();

public static ResourceLocation internalToMinecraftType(ResourcePath path) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,15 +18,15 @@
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_heart.impl.service.UICompat;
import net.pixaurora.kitten_square.impl.FakeComponent;
import net.pixaurora.kitten_square.impl.SoundUtil;
import net.pixaurora.kitten_square.impl.ui.screen.MinecraftScreen;
import net.pixaurora.kitten_square.impl.ui.screen.ScreenImpl;
import net.pixaurora.kitten_square.impl.ui.toast.ToastImpl;
import net.pixaurora.kitten_square.impl.ui.widget.TextBoxImpl;

public class UICompatImpl implements MinecraftUICompat {
public class UICompatImpl implements UICompat {
private final Minecraft client = Minecraft.getInstance();

public static ResourceLocation internalToMinecraftType(ResourcePath path) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,15 +18,15 @@
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_heart.impl.service.UICompat;
import net.pixaurora.kitten_square.impl.FakeComponent;
import net.pixaurora.kitten_square.impl.SoundUtil;
import net.pixaurora.kitten_square.impl.ui.screen.MinecraftScreen;
import net.pixaurora.kitten_square.impl.ui.screen.ScreenImpl;
import net.pixaurora.kitten_square.impl.ui.toast.ToastImpl;
import net.pixaurora.kitten_square.impl.ui.widget.TextBoxImpl;

public class UICompatImpl implements MinecraftUICompat {
public class UICompatImpl implements UICompat {
private final Minecraft client = Minecraft.getInstance();

public static ResourceLocation internalToMinecraftType(ResourcePath path) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,15 +18,15 @@
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_heart.impl.service.UICompat;
import net.pixaurora.kitten_square.impl.FakeComponent;
import net.pixaurora.kitten_square.impl.SoundUtil;
import net.pixaurora.kitten_square.impl.ui.screen.MinecraftScreen;
import net.pixaurora.kitten_square.impl.ui.screen.ScreenImpl;
import net.pixaurora.kitten_square.impl.ui.toast.ToastImpl;
import net.pixaurora.kitten_square.impl.ui.widget.TextBoxImpl;

public class UICompatImpl implements MinecraftUICompat {
public class UICompatImpl implements UICompat {
private final Minecraft client = Minecraft.getInstance();

public static ResourceLocation internalToMinecraftType(ResourcePath path) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,15 +18,15 @@
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_heart.impl.service.UICompat;
import net.pixaurora.kitten_square.impl.FakeComponent;
import net.pixaurora.kitten_square.impl.SoundUtil;
import net.pixaurora.kitten_square.impl.ui.screen.MinecraftScreen;
import net.pixaurora.kitten_square.impl.ui.screen.ScreenImpl;
import net.pixaurora.kitten_square.impl.ui.toast.ToastImpl;
import net.pixaurora.kitten_square.impl.ui.widget.TextBoxImpl;

public class UICompatImpl implements MinecraftUICompat {
public class UICompatImpl implements UICompat {
private final Minecraft client = Minecraft.getInstance();

public static ResourceLocation internalToMinecraftType(ResourcePath path) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,15 +18,15 @@
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_heart.impl.service.UICompat;
import net.pixaurora.kitten_square.impl.FakeComponent;
import net.pixaurora.kitten_square.impl.SoundUtil;
import net.pixaurora.kitten_square.impl.ui.screen.MinecraftScreen;
import net.pixaurora.kitten_square.impl.ui.screen.ScreenImpl;
import net.pixaurora.kitten_square.impl.ui.toast.ToastImpl;
import net.pixaurora.kitten_square.impl.ui.widget.TextBoxImpl;

public class UICompatImpl implements MinecraftUICompat {
public class UICompatImpl implements UICompat {
private final Minecraft client = Minecraft.getInstance();

public static ResourceLocation internalToMinecraftType(ResourcePath path) {
Expand Down
Loading

0 comments on commit 4d4efea

Please sign in to comment.