mirror of
https://github.com/MinecraftForge/MinecraftForge.git
synced 2026-11-13 00:37:52 +00:00
Optimize VillagerTradingManager, avoid redundant work. Closes #10577
This commit is contained in:
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());
|
||||
|
||||
Reference in new issue
Block a user