diff --git a/common/cpw/mods/fml/common/registry/VillagerRegistry.java b/common/cpw/mods/fml/common/registry/VillagerRegistry.java new file mode 100644 index 0000000000..e90e154d3f --- /dev/null +++ b/common/cpw/mods/fml/common/registry/VillagerRegistry.java @@ -0,0 +1,85 @@ +package cpw.mods.fml.common.registry; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Random; + +import com.google.common.collect.ArrayListMultimap; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import com.google.common.collect.Multimap; + +import cpw.mods.fml.common.FMLLog; + +import net.minecraft.src.EntityVillager; +import net.minecraft.src.MerchantRecipeList; +import net.minecraft.src.StructureVillagePieceWeight; + +/** + * Registry for villager trading control + * + * @author cpw + * + */ +public class VillagerRegistry +{ + private static final VillagerRegistry INSTANCE = new VillagerRegistry(); + + private Multimap tradeHandlers = ArrayListMultimap.create(); + private List villageCreationHandlers = Lists.newArrayList(); + private Map newVillagers = Maps.newHashMap(); + + public interface IVillageCreationHandler + { + List getVillagePieces(Random random, int i); + } + + public interface IVillageTradeHandler + { + void manipulateTradesForVillager(EntityVillager villager, MerchantRecipeList recipeList, Random random); + } + + public static VillagerRegistry instance() + { + return INSTANCE; + } + + public void registerVillagerType(int villagerId, String villagerSkin) + { + if (newVillagers.containsKey(villagerId)) + { + FMLLog.severe("Attempt to register duplicate villager id %d", villagerId); + throw new RuntimeException(); + } + newVillagers.put(villagerId, villagerSkin); + } + + + public static String getVillagerSkin(int villagerType, String defaultSkin) + { + if (instance().newVillagers.containsKey(villagerType)) + { + return instance().newVillagers.get(villagerType); + } + return defaultSkin; + } + + public static void manageVillagerTrades(MerchantRecipeList recipeList, EntityVillager villager, int villagerType, Random random) + { + for (IVillageTradeHandler handler : instance().tradeHandlers.get(villagerType)) + { + handler.manipulateTradesForVillager(villager, recipeList, random); + } + } + + public static void addExtraVillageComponents(ArrayList components, Random random, int i) + { + List parts = components; + for (IVillageCreationHandler handler : instance().villageCreationHandlers) + { + parts.addAll(handler.getVillagePieces(random, i)); + } + } + +} diff --git a/patches/common/net/minecraft/src/EntityVillager.java.patch b/patches/common/net/minecraft/src/EntityVillager.java.patch new file mode 100644 index 0000000000..57abc08978 --- /dev/null +++ b/patches/common/net/minecraft/src/EntityVillager.java.patch @@ -0,0 +1,29 @@ +--- ../src-base/common/net/minecraft/src/EntityVillager.java ++++ ../src-work/common/net/minecraft/src/EntityVillager.java +@@ -2,6 +2,8 @@ + + import cpw.mods.fml.common.Side; + import cpw.mods.fml.common.asm.SideOnly; ++import cpw.mods.fml.common.registry.VillagerRegistry; ++ + import java.util.Collections; + import java.util.HashMap; + import java.util.Map; +@@ -175,7 +177,7 @@ + case 4: + return "/mob/villager/butcher.png"; + default: +- return super.func_70073_O(); ++ return VillagerRegistry.getVillagerSkin(this.func_70946_n(), super.func_70073_O()); + } + } + +@@ -400,6 +402,8 @@ + } + + Collections.shuffle(var2); ++ ++ VillagerRegistry.manageVillagerTrades(var2, this, this.func_70946_n(), this.field_70146_Z); + + if (this.field_70963_i == null) + { diff --git a/patches/common/net/minecraft/src/StructureVillagePieces.java.patch b/patches/common/net/minecraft/src/StructureVillagePieces.java.patch new file mode 100644 index 0000000000..ea33c392b6 --- /dev/null +++ b/patches/common/net/minecraft/src/StructureVillagePieces.java.patch @@ -0,0 +1,20 @@ +--- ../src-base/common/net/minecraft/src/StructureVillagePieces.java ++++ ../src-work/common/net/minecraft/src/StructureVillagePieces.java +@@ -4,6 +4,8 @@ + import java.util.Iterator; + import java.util.List; + import java.util.Random; ++ ++import cpw.mods.fml.common.registry.VillagerRegistry; + + public class StructureVillagePieces + { +@@ -19,6 +21,8 @@ + var2.add(new StructureVillagePieceWeight(ComponentVillageField2.class, 3, MathHelper.func_76136_a(p_75084_0_, 2 + p_75084_1_, 4 + p_75084_1_ * 2))); + var2.add(new StructureVillagePieceWeight(ComponentVillageHouse2.class, 15, MathHelper.func_76136_a(p_75084_0_, 0, 1 + p_75084_1_))); + var2.add(new StructureVillagePieceWeight(ComponentVillageHouse3.class, 8, MathHelper.func_76136_a(p_75084_0_, 0 + p_75084_1_, 3 + p_75084_1_ * 2))); ++ VillagerRegistry.addExtraVillageComponents(var2, p_75084_0_, p_75084_1_); ++ + Iterator var3 = var2.iterator(); + + while (var3.hasNext())