Skip to content

Commit 4e18056

Browse files
committed
Support sounds in AdvancementsScreen
1 parent 61e6e7b commit 4e18056

8 files changed

Lines changed: 98 additions & 20 deletions

File tree

logics/src/main/java/dev/stashy/extrasounds/logics/impl/ChatSoundHandler.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ public void onMessage(Player player, String text) {
2929

3030
public void onScroll(int line) {
3131
if (line != this.currentLines) {
32-
ExtraSounds.MANAGER.playSound2D(Sounds.INVENTORY_SCROLL, SoundType.CHAT);
32+
ExtraSounds.MANAGER.playSound2D(Sounds.SCREEN_SCROLL, SoundType.CHAT);
3333
this.currentLines = line;
3434
}
3535
}

logics/src/main/java/dev/stashy/extrasounds/logics/impl/ScreenScrollHandler.java

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,13 @@ public final class ScreenScrollHandler {
1313
*/
1414
private long lastScrollTime;
1515
/**
16-
* Current scroll position.
16+
* Current horizontal scroll position.
1717
*/
18-
private int lastScrollPos;
18+
private int lastScrollPosX;
19+
/**
20+
* Current vertical scroll position.
21+
*/
22+
private int lastScrollPosY;
1923

2024
public ScreenScrollHandler() {
2125
this.resetScrollPos();
@@ -26,7 +30,8 @@ public ScreenScrollHandler() {
2630
*/
2731
public void resetScrollPos() {
2832
this.lastScrollTime = 0;
29-
this.lastScrollPos = 0;
33+
this.lastScrollPosX = 0;
34+
this.lastScrollPosY = 0;
3035
}
3136

3237
/**
@@ -35,20 +40,21 @@ public void resetScrollPos() {
3540
* @param row Target screen Y offset.
3641
*/
3742
public void onScroll(int row) {
43+
this.onScroll(this.lastScrollPosX, row);
44+
}
45+
46+
public void onScroll(int x, int y) {
3847
final long now = System.currentTimeMillis();
3948
final long timeDiff = now - this.lastScrollTime;
40-
if (timeDiff > 20 && this.lastScrollPos != row) {
49+
if (timeDiff > 20 && (this.lastScrollPosX != x || this.lastScrollPosY != y)) {
4150
ExtraSounds.MANAGER.playSound2D(
42-
Sounds.INVENTORY_SCROLL,
51+
Sounds.SCREEN_SCROLL,
4352
Mixers.SCREENS,
4453
(1f - 0.1f + 0.1f * Math.min(1, 50f / timeDiff))
4554
);
4655
this.lastScrollTime = now;
47-
this.lastScrollPos = row;
56+
this.lastScrollPosX = x;
57+
this.lastScrollPosY = y;
4858
}
4959
}
50-
51-
public void setScroll(int position) {
52-
this.lastScrollPos = position;
53-
}
5460
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package dev.stashy.extrasounds.logics.mixin.access;
2+
3+
import net.minecraft.client.gui.screens.advancements.AdvancementTab;
4+
import net.minecraft.world.item.ItemStack;
5+
import org.spongepowered.asm.mixin.Mixin;
6+
import org.spongepowered.asm.mixin.gen.Accessor;
7+
8+
@Mixin(AdvancementTab.class)
9+
public interface AdvancementTabAccessor {
10+
@Accessor("icon")
11+
ItemStack getIcon();
12+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package dev.stashy.extrasounds.logics.mixin.screens;
2+
3+
import dev.stashy.extrasounds.logics.impl.ScreenScrollHandler;
4+
import net.minecraft.client.gui.screens.advancements.AdvancementTab;
5+
import org.spongepowered.asm.mixin.Mixin;
6+
import org.spongepowered.asm.mixin.Shadow;
7+
import org.spongepowered.asm.mixin.Unique;
8+
import org.spongepowered.asm.mixin.injection.At;
9+
import org.spongepowered.asm.mixin.injection.Inject;
10+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
11+
12+
@Mixin(AdvancementTab.class)
13+
public abstract class AdvancementTabMixin {
14+
@Shadow
15+
double scrollX;
16+
@Shadow
17+
double scrollY;
18+
19+
@Unique
20+
private final ScreenScrollHandler scrollHandler = new ScreenScrollHandler();
21+
@Unique
22+
private static final double SCROLL_THRESHOLD = 16.;
23+
24+
@Inject(method = "scroll", at = @At("RETURN"))
25+
private void extrasounds$advancementScreenScroll(CallbackInfo ci) {
26+
this.scrollHandler.onScroll((int) (this.scrollX / SCROLL_THRESHOLD), (int) (this.scrollY / SCROLL_THRESHOLD));
27+
}
28+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package dev.stashy.extrasounds.logics.mixin.screens;
2+
3+
import com.llamalad7.mixinextras.sugar.Local;
4+
import dev.stashy.extrasounds.logics.ExtraSounds;
5+
import dev.stashy.extrasounds.logics.mixin.access.AdvancementTabAccessor;
6+
import dev.stashy.extrasounds.sounds.SoundType;
7+
import net.minecraft.client.gui.screens.advancements.AdvancementTab;
8+
import net.minecraft.client.gui.screens.advancements.AdvancementsScreen;
9+
import org.jspecify.annotations.Nullable;
10+
import org.spongepowered.asm.mixin.Mixin;
11+
import org.spongepowered.asm.mixin.Shadow;
12+
import org.spongepowered.asm.mixin.Unique;
13+
import org.spongepowered.asm.mixin.injection.At;
14+
import org.spongepowered.asm.mixin.injection.Inject;
15+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
16+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
17+
18+
@Mixin(AdvancementsScreen.class)
19+
public abstract class AdvancementsScreenMixin {
20+
@Shadow
21+
@Nullable AdvancementTab selectedTab;
22+
23+
@Unique
24+
private static AdvancementTab currentTab;
25+
26+
@Inject(method = "mouseClicked", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/multiplayer/ClientAdvancements;setSelectedTab(Lnet/minecraft/advancements/AdvancementHolder;Z)V"))
27+
private void extrasounds$changeAdvancementsTab(CallbackInfoReturnable<Boolean> cir, @Local AdvancementTab tab) {
28+
if (currentTab != tab && tab instanceof AdvancementTabAccessor accessor) {
29+
ExtraSounds.MANAGER.playSound2D(accessor.getIcon().getItem(), SoundType.DEFAULT);
30+
}
31+
}
32+
33+
@Inject(method = "onSelectedTabChanged", at = @At("RETURN"))
34+
private void extrasounds$obtainSelectedTab(CallbackInfo ci) {
35+
currentTab = this.selectedTab;
36+
}
37+
}

logics/src/main/java/dev/stashy/extrasounds/sounds/Sounds.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ private Sounds() {
2020
public static final VersionedSoundEventWrapper HOTBAR_SCROLL = ExtraSounds.createEvent("hotbar_scroll");
2121
public static final VersionedSoundEventWrapper INVENTORY_OPEN = ExtraSounds.createEvent("inventory.open");
2222
public static final VersionedSoundEventWrapper INVENTORY_CLOSE = ExtraSounds.createEvent("inventory.close");
23-
public static final VersionedSoundEventWrapper INVENTORY_SCROLL = ExtraSounds.createEvent("inventory.scroll");
23+
public static final VersionedSoundEventWrapper SCREEN_SCROLL = ExtraSounds.createEvent("generic.scroll");
2424
public static final VersionedSoundEventWrapper ITEM_DROP = ExtraSounds.createEvent("item.drop");
2525
public static final VersionedSoundEventWrapper ITEM_PICK = ExtraSounds.createEvent("item.pickup");
2626
public static final VersionedSoundEventWrapper ITEM_PICK_ALL = ExtraSounds.createEvent("item.pickup_all");

logics/src/main/resources/extrasounds.logics.mixins.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,13 @@
66
"client": [
77
"access.CustomCreativeSlotAccessor",
88
"access.FlowerPotBlockAccessor",
9+
"access.AdvancementTabAccessor",
910

1011
"action.item.LocalPlayerMixin",
1112
"hotbar.MinecraftMixin",
1213
"screens.AbstractContainerScreenMixin",
14+
"screens.AdvancementsScreenMixin",
15+
"screens.AdvancementTabMixin",
1316
"screens.MinecraftMixin",
1417
"screens.MultiPlayerGameModeMixin",
1518
"keyboard.ScreenshotMixin"

src/main/resources/assets/extrasounds/sounds.json

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -130,14 +130,6 @@
130130
}
131131
]
132132
},
133-
"inventory.scroll": {
134-
"sounds": [
135-
{
136-
"name": "extrasounds:generic.scroll",
137-
"type": "event"
138-
}
139-
]
140-
},
141133
"item.category.arrow": {
142134
"sounds": [
143135
{

0 commit comments

Comments
 (0)