Optimize VillagerTradingManager, avoid redundant work. Closes #10577

This commit is contained in:
LexManos committed 2025-08-12 18:02:33 -07:00
1 parent 7f56986027
commit eae9b9145d
2 files changed
+16 -9

No files matched your search

@@ -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<ResourceKey<VillagerProfession>, Int2ObjectMap<ItemListing[]>> VANILLA_TRADES = new HashMap<>();
private static final List<Pair<ItemListing[], Integer>> WANDERER_TRADES = new ArrayList<>();
private static final Lazy<Map<ResourceKey<VillagerProfession>, Int2ObjectMap<ItemListing[]>>> VANILLA_TRADES = Lazy.of(VillagerTradingManager::copyVanillaTrades);
private static final Lazy<List<Pair<ItemListing[], Integer>>> WANDERER_TRADES = Lazy.of(() -> new ArrayList<Pair<ItemListing[], Integer>>(VillagerTrades.WANDERING_TRADER_TRADES));
static {
private static Map<ResourceKey<VillagerProfession>, Int2ObjectMap<ItemListing[]>> copyVanillaTrades() {
var ret = new HashMap<ResourceKey<VillagerProfession>, Int2ObjectMap<ItemListing[]>>();
VillagerTrades.TRADES.forEach((key, value) -> {
Int2ObjectMap<ItemListing[]> 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<ItemListing[]> trades = VANILLA_TRADES.getOrDefault(prof, new Int2ObjectOpenHashMap<>());
Int2ObjectMap<ItemListing[]> trades = vanilla.getOrDefault(prof, new Int2ObjectOpenHashMap<>());
Int2ObjectMap<List<ItemListing>> mutableTrades = new Int2ObjectOpenHashMap<>();
for (int i = 1; i < 6; i++)
mutableTrades.put(i, NonNullList.create());