diff --git a/patches/minecraft/net/minecraft/entity/passive/EntityVillager.java.patch b/patches/minecraft/net/minecraft/entity/passive/EntityVillager.java.patch index f6a41feba6..84bc38a3c1 100644 --- a/patches/minecraft/net/minecraft/entity/passive/EntityVillager.java.patch +++ b/patches/minecraft/net/minecraft/entity/passive/EntityVillager.java.patch @@ -120,16 +120,24 @@ this.field_175562_bw = 1; } -@@ -552,7 +596,7 @@ +@@ -552,13 +596,11 @@ int i = this.field_175563_bv - 1; int j = this.field_175562_bw - 1; - EntityVillager.ITradeList[][] aentityvillager$itradelist1 = aentityvillager$itradelist[i]; -+ EntityVillager.ITradeList[][] aentityvillager$itradelist1 = this.getProfessionForge().getCareer(i).getTrades(); ++ java.util.List trades = this.getProfessionForge().getCareer(i).getTrades(j); - if (j >= 0 && j < aentityvillager$itradelist1.length) +- if (j >= 0 && j < aentityvillager$itradelist1.length) ++ if (trades != null) { -@@ -647,9 +691,14 @@ +- EntityVillager.ITradeList[] aentityvillager$itradelist2 = aentityvillager$itradelist1[j]; +- +- for (EntityVillager.ITradeList entityvillager$itradelist : aentityvillager$itradelist2) ++ for (EntityVillager.ITradeList entityvillager$itradelist : trades) + { + entityvillager$itradelist.func_179401_a(this.field_70963_i, this.field_70146_Z); + } +@@ -647,9 +689,14 @@ } } @@ -145,7 +153,7 @@ textcomponenttranslation.func_150256_b().func_150209_a(this.func_174823_aP()); textcomponenttranslation.func_150256_b().func_179989_a(this.func_110124_au().toString()); -@@ -708,7 +757,7 @@ +@@ -708,7 +755,7 @@ public IEntityLivingData func_180482_a(DifficultyInstance p_180482_1_, IEntityLivingData p_180482_2_) { p_180482_2_ = super.func_180482_a(p_180482_1_, p_180482_2_); diff --git a/src/main/java/net/minecraftforge/fml/common/registry/VillagerRegistry.java b/src/main/java/net/minecraftforge/fml/common/registry/VillagerRegistry.java index 0c02d63b25..bfb9fd17c8 100644 --- a/src/main/java/net/minecraftforge/fml/common/registry/VillagerRegistry.java +++ b/src/main/java/net/minecraftforge/fml/common/registry/VillagerRegistry.java @@ -12,11 +12,14 @@ package net.minecraftforge.fml.common.registry; +import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Random; import java.util.Set; +import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import org.apache.commons.lang3.Validate; @@ -224,7 +227,8 @@ public class VillagerRegistry private VillagerProfession profession; private String name; private int id; - private ITradeList[][] trades; + private List> trades = Lists.newArrayList(); + private List> imm = Lists.newArrayList(); public VillagerCareer(VillagerProfession parent, String name) { @@ -238,14 +242,44 @@ public class VillagerRegistry return this.name; } - public ITradeList[][] getTrades() + + public VillagerCareer addTrade(int level, ITradeList... trades) { - return this.trades; + if (level <= 0) + throw new IllegalArgumentException("Levels start at 1"); + + List levelTrades = level <= this.trades.size() ? this.trades.get(level - 1) : null; + if (levelTrades == null) + { + List tmp = null; + while (this.trades.size() < level) + { + tmp = Lists.newArrayList(); + this.trades.add(tmp); + this.imm.add(Collections.unmodifiableList(tmp)); + } + levelTrades = tmp; + } + if (levelTrades == null) //Not sure how this could happen, but screw it + { + levelTrades = Lists.newArrayList(); + this.trades.set(level - 1, levelTrades); + this.imm.set(level - 1, Collections.unmodifiableList(levelTrades)); + } + for (ITradeList t : trades) + levelTrades.add(t); + return this; } + + public List getTrades(int level) + { + return level >= 0 && level < this.imm.size() ? this.imm.get(level) : null; + } private VillagerCareer init(EntityVillager.ITradeList[][] trades) { - this.trades = trades; + for (int x = 0; x < trades.length; x++) + this.trades.add(Lists.newArrayList(trades[x])); return this; }