From eae9b9145d99699e9105010f32924dffc4017460 Mon Sep 17 00:00:00 2001 From: LexManos Date: Tue, 12 Aug 2025 18:02:33 -0700 Subject: [PATCH] Optimize VillagerTradingManager, avoid redundant work. Closes #10577 --- settings.gradle | 4 ++-- .../common/VillagerTradingManager.java | 21 ++++++++++++------- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/settings.gradle b/settings.gradle index e696e17b27..4545965c48 100644 --- a/settings.gradle +++ b/settings.gradle @@ -32,8 +32,8 @@ dependencyResolutionManagement { library('accesstransformers', 'net.minecraftforge:accesstransformers:8.2.2') library('coremods', 'net.minecraftforge:coremods:5.2.6') library('nashorn', 'org.openjdk.nashorn:nashorn-core:15.4') // Needed by coremods, because the JRE no longer ships JS - library('eventbus', 'net.minecraftforge:eventbus:7.0-beta.10') - library('eventbus-validator', 'net.minecraftforge:eventbus-validator:7.0-beta.10') + library('eventbus', 'net.minecraftforge:eventbus:7.0-beta.11') + library('eventbus-validator', 'net.minecraftforge:eventbus-validator:7.0-beta.11') library('mergetool-api', 'net.minecraftforge:mergetool-api:1.0') library('mixin', 'org.spongepowered:mixin:0.8.7') diff --git a/src/main/java/net/minecraftforge/common/VillagerTradingManager.java b/src/main/java/net/minecraftforge/common/VillagerTradingManager.java index 413e76f295..c0bb3dfb4f 100644 --- a/src/main/java/net/minecraftforge/common/VillagerTradingManager.java +++ b/src/main/java/net/minecraftforge/common/VillagerTradingManager.java @@ -20,23 +20,25 @@ import net.minecraft.world.entity.npc.VillagerTrades.ItemListing; import net.minecraft.core.NonNullList; import net.minecraftforge.event.village.VillagerTradesEvent; import net.minecraftforge.event.village.WandererTradesEvent; +import net.minecraftforge.common.util.Lazy; import net.minecraftforge.event.server.ServerAboutToStartEvent; import net.minecraftforge.registries.ForgeRegistries; import org.apache.commons.lang3.tuple.Pair; public class VillagerTradingManager { - private static final Map, Int2ObjectMap> VANILLA_TRADES = new HashMap<>(); - private static final List> WANDERER_TRADES = new ArrayList<>(); + private static final Lazy, Int2ObjectMap>> VANILLA_TRADES = Lazy.of(VillagerTradingManager::copyVanillaTrades); + private static final Lazy>> WANDERER_TRADES = Lazy.of(() -> new ArrayList>(VillagerTrades.WANDERING_TRADER_TRADES)); - static { + private static Map, Int2ObjectMap> copyVanillaTrades() { + var ret = new HashMap, Int2ObjectMap>(); VillagerTrades.TRADES.forEach((key, value) -> { Int2ObjectMap copy = new Int2ObjectOpenHashMap<>(); for (var ent : value.int2ObjectEntrySet()) { copy.put(ent.getIntKey(), Arrays.copyOf(ent.getValue(), ent.getValue().length)); } - VANILLA_TRADES.put(key, copy); + ret.put(key, copy); }); - WANDERER_TRADES.addAll(VillagerTrades.WANDERING_TRADER_TRADES); + return ret; } static void loadTrades(ServerAboutToStartEvent e) { @@ -46,7 +48,9 @@ public class VillagerTradingManager { /** Posts the WandererTradesEvent. */ private static void postWandererEvent() { - var event = WandererTradesEvent.BUS.fire(new WandererTradesEvent(WANDERER_TRADES)); + if (!WandererTradesEvent.BUS.hasListeners()) + return; + var event = WandererTradesEvent.BUS.fire(new WandererTradesEvent(WANDERER_TRADES.get())); VillagerTrades.WANDERING_TRADER_TRADES.clear(); for (var pool : event.getPools()) VillagerTrades.WANDERING_TRADER_TRADES.add(Pair.of(pool.getEntries().toArray(ItemListing[]::new), pool.getRolls())); @@ -54,10 +58,13 @@ public class VillagerTradingManager { /** Posts a VillagerTradesEvent for each registered profession. */ private static void postVillagerEvents() { + if (!VillagerTradesEvent.BUS.hasListeners()) + return; // TODO [VillagerType][1.21.5] Villager Professions are stored as keys in vanilla now? Re-evaluate this. + var vanilla = VANILLA_TRADES.get(); for (VillagerProfession value : ForgeRegistries.VILLAGER_PROFESSIONS) { var prof = ForgeRegistries.VILLAGER_PROFESSIONS.getResourceKey(value).orElseThrow(); - Int2ObjectMap trades = VANILLA_TRADES.getOrDefault(prof, new Int2ObjectOpenHashMap<>()); + Int2ObjectMap trades = vanilla.getOrDefault(prof, new Int2ObjectOpenHashMap<>()); Int2ObjectMap> mutableTrades = new Int2ObjectOpenHashMap<>(); for (int i = 1; i < 6; i++) mutableTrades.put(i, NonNullList.create());