From fb7e264a76fd9a7354ee066416bc5795e3cb3ff7 Mon Sep 17 00:00:00 2001 From: Jonathing Date: Mon, 27 Jan 2025 23:33:27 -0500 Subject: [PATCH] Fix issues in VillagerTrades.EmeraldsForVillagerTypeItem related to custom Villager Types (#10361) Add VillagerType#registerBiomeType Co-authored-by: Joseph T. McQuigg --- .../entity/npc/VillagerTrades.java.patch | 21 +++++++++++++++++++ .../world/entity/npc/VillagerType.java.patch | 12 +++++++++++ 2 files changed, 33 insertions(+) create mode 100644 patches/minecraft/net/minecraft/world/entity/npc/VillagerTrades.java.patch create mode 100644 patches/minecraft/net/minecraft/world/entity/npc/VillagerType.java.patch diff --git a/patches/minecraft/net/minecraft/world/entity/npc/VillagerTrades.java.patch b/patches/minecraft/net/minecraft/world/entity/npc/VillagerTrades.java.patch new file mode 100644 index 0000000000..5e927a2a62 --- /dev/null +++ b/patches/minecraft/net/minecraft/world/entity/npc/VillagerTrades.java.patch @@ -0,0 +1,21 @@ +--- a/net/minecraft/world/entity/npc/VillagerTrades.java ++++ b/net/minecraft/world/entity/npc/VillagerTrades.java +@@ -151,6 +_,7 @@ + private final int f_35667_; + + public EmeraldsForVillagerTypeItem(int p_35669_, int p_35670_, int p_35671_, Map p_35672_) { ++ if (false) // FORGE: Modders can add custom villager types, so remove this validation + Registry.f_122868_.m_123024_().filter((p_35680_) -> { + return !p_35672_.containsKey(p_35680_); + }).findAny().ifPresent((p_35677_) -> { +@@ -165,7 +_,9 @@ + @Nullable + public MerchantOffer m_5670_(Entity p_35674_, Random p_35675_) { + if (p_35674_ instanceof VillagerDataHolder) { +- ItemStack itemstack = new ItemStack(this.f_35664_.get(((VillagerDataHolder)p_35674_).m_7141_().m_35560_()), this.f_35665_); ++ Item item = this.f_35664_.get(((VillagerDataHolder)p_35674_).m_7141_().m_35560_()); ++ if (item == null) return null; // FORGE: Account for modded villager types by returning null if there is no trade ++ ItemStack itemstack = new ItemStack(item, this.f_35665_); + return new MerchantOffer(itemstack, new ItemStack(Items.f_42616_), this.f_35666_, this.f_35667_, 0.05F); + } else { + return null; diff --git a/patches/minecraft/net/minecraft/world/entity/npc/VillagerType.java.patch b/patches/minecraft/net/minecraft/world/entity/npc/VillagerType.java.patch new file mode 100644 index 0000000000..7ce2c5af12 --- /dev/null +++ b/patches/minecraft/net/minecraft/world/entity/npc/VillagerType.java.patch @@ -0,0 +1,12 @@ +--- a/net/minecraft/world/entity/npc/VillagerType.java ++++ b/net/minecraft/world/entity/npc/VillagerType.java +@@ -65,4 +_,9 @@ + public static VillagerType m_204073_(Holder p_204074_) { + return p_204074_.m_203543_().map(f_35827_::get).orElse(f_35821_); + } ++ ++ /** FORGE: Registers the VillagerType that will spawn in the given biome. This method should be called during FMLCommonSetupEvent using event.enqueueWork() */ ++ public static void registerBiomeType(ResourceKey biomeKey, VillagerType villagerType) { ++ f_35827_.put(biomeKey, villagerType); ++ } + }