diff --git a/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/dynamic_sounds/SoundBufferLibraryMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/dynamic_sounds/SoundBufferLibraryMixin.java index 607657d5..921da3ef 100644 --- a/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/dynamic_sounds/SoundBufferLibraryMixin.java +++ b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/dynamic_sounds/SoundBufferLibraryMixin.java @@ -1,6 +1,7 @@ package org.embeddedt.modernfix.common.mixin.perf.dynamic_sounds; import com.google.common.cache.CacheBuilder; +import com.google.common.cache.RemovalCause; import com.google.common.cache.RemovalNotification; import com.mojang.blaze3d.audio.SoundBuffer; import net.minecraft.client.sounds.SoundBufferLibrary; @@ -26,12 +27,15 @@ public abstract class SoundBufferLibraryMixin { @Shadow @Final @Mutable private Map> cache = CacheBuilder.newBuilder() .expireAfterAccess(DynamicSoundHelpers.MAX_SOUND_LIFETIME_SECS, TimeUnit.SECONDS) + .concurrencyLevel(1) // Excessive use of type hinting due to it assuming Object as the broadest correct type .>removalListener(this::onSoundRemoval) .build() .asMap(); private > void onSoundRemoval(RemovalNotification notification) { + if(notification.getCause() == RemovalCause.REPLACED && notification.getValue() == cache.get(notification.getKey())) + return; notification.getValue().thenAccept(SoundBuffer::discardAlBuffer); if(debugDynamicSoundLoading) { K k = notification.getKey();