package org.mctourney.autoreferee.util.worldsearch; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; import org.bukkit.entity.Villager; import org.bukkit.inventory.ItemStack; import com.google.common.collect.Lists; /** * FIXME https://github.com/Bukkit/Bukkit/pull/921 * * @author riking */ class Unsafe_InspectVillagerTrades { public static List<ItemStack> getTradeResults(Villager vil) throws Exception, Error { Object internalVillager = vil.getClass().getDeclaredMethod("getHandle", (Class<?>) null).invoke(vil, (Object[]) null); Class<?> internalEntityHumanClass = Class.forName("net.minecraft.server.v1_6_R2.EntityHuman"); ArrayList<?> merchantRecipeList = (ArrayList<?>) internalVillager.getClass().getDeclaredMethod("getOffers", internalEntityHumanClass).invoke(internalVillager, new Object[] {null}); if (merchantRecipeList.size() == 0) return Lists.newArrayList(); List<ItemStack> ret = Lists.newArrayListWithCapacity(merchantRecipeList.size()); Field itemField = merchantRecipeList.get(0).getClass().getField("sellingItem"); Class<?> internalItemClass = Class.forName("net.minecraft.server.v1_6_R2.ItemStack"); Method getStackMethod = Class.forName("org.bukkit.craftbukkit.v1_6_R2.inventory.CraftItemStack").getDeclaredMethod("asBukkitCopy", internalItemClass); for (Object o : merchantRecipeList) { Object internalItemStack = itemField.get(o); if (!internalItemStack.getClass().equals(internalItemClass)) continue; Object bukkitItemStack = getStackMethod.invoke(null, internalItemStack); if (!ItemStack.class.isAssignableFrom(bukkitItemStack.getClass())) { new RuntimeException("asBukkitCopy() did not return a Bukkit ItemStack..? Investigate.").printStackTrace(); continue; } ret.add((ItemStack) bukkitItemStack); } return ret; } }