From dbb6e4713d3d08066eb7cecc7bca92e46eb64252 Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Sun, 27 Apr 2025 18:35:14 -0400 Subject: [PATCH] Improve usability of -Dmodernfix.debugReloaders --- .../ProfiledReloadInstanceMixin.java | 24 ++++++++++++++++++- .../main/resources/modernfix.accesswidener | 3 +++ .../AddReloadListenerEventWrapperMixin.java | 20 ++++++++++++++++ 3 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 forge/src/main/java/org/embeddedt/modernfix/forge/mixin/feature/measure_time/AddReloadListenerEventWrapperMixin.java diff --git a/common/src/main/java/org/embeddedt/modernfix/common/mixin/feature/measure_time/ProfiledReloadInstanceMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/feature/measure_time/ProfiledReloadInstanceMixin.java index 349c082e..33f4d60f 100644 --- a/common/src/main/java/org/embeddedt/modernfix/common/mixin/feature/measure_time/ProfiledReloadInstanceMixin.java +++ b/common/src/main/java/org/embeddedt/modernfix/common/mixin/feature/measure_time/ProfiledReloadInstanceMixin.java @@ -8,16 +8,38 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.ModifyVariable; import java.util.ArrayList; +import java.util.Comparator; import java.util.List; @Mixin(ProfiledReloadInstance.class) public class ProfiledReloadInstanceMixin { + /** + * @author embeddedt + * @reason Decorate reload listeners with their class name as well as the simple name + */ @ModifyVariable(method = "", at = @At("HEAD"), argsOnly = true, ordinal = 0) private static List getWrappedListeners(List listeners) { List newList = new ArrayList<>(listeners.size()); for(PreparableReloadListener listener : listeners) { - newList.add(new NamedPreparableResourceListener(listener)); + // No need to wrap listeners that are already wrapped/provided by a mod loader + String className = listener.getClass().getName(); + if (className.startsWith("net.minecraftforge.") || className.startsWith("net.neoforged.") || className.startsWith("net.fabricmc.")) { + newList.add(listener); + } else { + newList.add(new NamedPreparableResourceListener(listener)); + } } return newList; } + + /** + * @author embeddedt + * @reason Place most expensive reload listeners first + */ + @ModifyVariable(method = "finish", ordinal = 0, argsOnly = true, at = @At("HEAD")) + private List sortStates(List datapoints) { + datapoints = new ArrayList<>(datapoints); + datapoints.sort(Comparator.comparingLong(s -> s.preparationNanos.get() + s.reloadNanos.get()).reversed()); + return datapoints; + } } diff --git a/common/src/main/resources/modernfix.accesswidener b/common/src/main/resources/modernfix.accesswidener index 05d46ae1..f1291622 100644 --- a/common/src/main/resources/modernfix.accesswidener +++ b/common/src/main/resources/modernfix.accesswidener @@ -62,6 +62,9 @@ mutable field net/minecraft/client/renderer/block/model/ItemOverrides$BakedOverr accessible field net/minecraft/client/renderer/entity/EnderDragonRenderer$DragonModel entity Lnet/minecraft/world/entity/boss/enderdragon/EnderDragon; accessible method net/minecraft/world/level/block/state/StateDefinition appendPropertyCodec (Lcom/mojang/serialization/MapCodec;Ljava/util/function/Supplier;Ljava/lang/String;Lnet/minecraft/world/level/block/state/properties/Property;)Lcom/mojang/serialization/MapCodec; +accessible field net/minecraft/server/packs/resources/ProfiledReloadInstance$State preparationNanos Ljava/util/concurrent/atomic/AtomicLong; +accessible field net/minecraft/server/packs/resources/ProfiledReloadInstance$State reloadNanos Ljava/util/concurrent/atomic/AtomicLong; + accessible class net/minecraft/world/item/crafting/Ingredient$Value accessible class net/minecraft/world/item/crafting/Ingredient$ItemValue accessible class net/minecraft/client/searchtree/SearchRegistry$TreeEntry \ No newline at end of file diff --git a/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/feature/measure_time/AddReloadListenerEventWrapperMixin.java b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/feature/measure_time/AddReloadListenerEventWrapperMixin.java new file mode 100644 index 00000000..79351f01 --- /dev/null +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/feature/measure_time/AddReloadListenerEventWrapperMixin.java @@ -0,0 +1,20 @@ +package org.embeddedt.modernfix.forge.mixin.feature.measure_time; + +import net.minecraft.server.packs.resources.PreparableReloadListener; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +@Mixin(targets = "net/minecraftforge/event/AddReloadListenerEvent$WrappedStateAwareListener") +public abstract class AddReloadListenerEventWrapperMixin implements PreparableReloadListener { + @Shadow @Final private PreparableReloadListener wrapped; + + /** + * @author embeddedt + * @reason make a proper name show up in ProfiledReloadInstance + */ + @Override + public String getName() { + return this.wrapped.getClass().getName(); + } +}