001    package net.minecraft.src;
002    
003    import cpw.mods.fml.common.Side;
004    import cpw.mods.fml.common.asm.SideOnly;
005    import cpw.mods.fml.common.registry.VillagerRegistry;
006    
007    import java.util.Collections;
008    import java.util.HashMap;
009    import java.util.Map;
010    import java.util.Random;
011    
012    public class EntityVillager extends EntityAgeable implements INpc, IMerchant
013    {
014        private int randomTickDivider;
015        private boolean isMating;
016        private boolean isPlaying;
017        Village villageObj;
018    
019        /** This villager's current customer. */
020        private EntityPlayer buyingPlayer;
021    
022        /** Initialises the MerchantRecipeList.java */
023        private MerchantRecipeList buyingList;
024        private int timeUntilReset;
025    
026        /** addDefaultEquipmentAndRecipies is called if this is true */
027        private boolean needsInitilization;
028        private int wealth;
029    
030        /** Recipes for buying things from Villagers. */
031        private MerchantRecipe sellingRecipeList;
032    
033        /**
034         * a villagers recipe list is intialized off this list ; the 2 params are min/max amount they will trade for 1
035         * emerald
036         */
037        public static final Map villagerStockList = new HashMap();
038    
039        /**
040         * Selling list of Blacksmith items. negative numbers mean 1 emerald for n items, positive numbers are n emeralds
041         * for 1 item
042         */
043        public static final Map blacksmithSellingList = new HashMap();
044    
045        public EntityVillager(World par1World)
046        {
047            this(par1World, 0);
048        }
049    
050        public EntityVillager(World par1World, int par2)
051        {
052            super(par1World);
053            this.randomTickDivider = 0;
054            this.isMating = false;
055            this.isPlaying = false;
056            this.villageObj = null;
057            this.setProfession(par2);
058            this.texture = "/mob/villager/villager.png";
059            this.moveSpeed = 0.5F;
060            this.getNavigator().setBreakDoors(true);
061            this.getNavigator().setAvoidsWater(true);
062            this.tasks.addTask(0, new EntityAISwimming(this));
063            this.tasks.addTask(1, new EntityAIAvoidEntity(this, EntityZombie.class, 8.0F, 0.3F, 0.35F));
064            this.tasks.addTask(1, new EntityAITradePlayer(this));
065            this.tasks.addTask(1, new EntityAILookAtTradePlayer(this));
066            this.tasks.addTask(2, new EntityAIMoveIndoors(this));
067            this.tasks.addTask(3, new EntityAIRestrictOpenDoor(this));
068            this.tasks.addTask(4, new EntityAIOpenDoor(this, true));
069            this.tasks.addTask(5, new EntityAIMoveTwardsRestriction(this, 0.3F));
070            this.tasks.addTask(6, new EntityAIVillagerMate(this));
071            this.tasks.addTask(7, new EntityAIFollowGolem(this));
072            this.tasks.addTask(8, new EntityAIPlay(this, 0.32F));
073            this.tasks.addTask(9, new EntityAIWatchClosest2(this, EntityPlayer.class, 3.0F, 1.0F));
074            this.tasks.addTask(9, new EntityAIWatchClosest2(this, EntityVillager.class, 5.0F, 0.02F));
075            this.tasks.addTask(9, new EntityAIWander(this, 0.3F));
076            this.tasks.addTask(10, new EntityAIWatchClosest(this, EntityLiving.class, 8.0F));
077        }
078    
079        /**
080         * Returns true if the newer Entity AI code should be run
081         */
082        public boolean isAIEnabled()
083        {
084            return true;
085        }
086    
087        /**
088         * main AI tick function, replaces updateEntityActionState
089         */
090        protected void updateAITick()
091        {
092            if (--this.randomTickDivider <= 0)
093            {
094                this.worldObj.villageCollectionObj.addVillagerPosition(MathHelper.floor_double(this.posX), MathHelper.floor_double(this.posY), MathHelper.floor_double(this.posZ));
095                this.randomTickDivider = 70 + this.rand.nextInt(50);
096                this.villageObj = this.worldObj.villageCollectionObj.findNearestVillage(MathHelper.floor_double(this.posX), MathHelper.floor_double(this.posY), MathHelper.floor_double(this.posZ), 32);
097    
098                if (this.villageObj == null)
099                {
100                    this.detachHome();
101                }
102                else
103                {
104                    ChunkCoordinates var1 = this.villageObj.getCenter();
105                    this.setHomeArea(var1.posX, var1.posY, var1.posZ, this.villageObj.getVillageRadius());
106                }
107            }
108    
109            if (!this.isTrading() && this.timeUntilReset > 0)
110            {
111                --this.timeUntilReset;
112    
113                if (this.timeUntilReset <= 0)
114                {
115                    if (this.needsInitilization)
116                    {
117                        this.addDefaultEquipmentAndRecipies(1);
118                        this.needsInitilization = false;
119                    }
120    
121                    if (this.sellingRecipeList != null)
122                    {
123                        this.buyingList.remove(this.sellingRecipeList);
124                        this.sellingRecipeList = null;
125                    }
126    
127                    this.addPotionEffect(new PotionEffect(Potion.regeneration.id, 200, 0));
128                }
129            }
130    
131            super.updateAITick();
132        }
133    
134        /**
135         * Called when a player interacts with a mob. e.g. gets milk from a cow, gets into the saddle on a pig.
136         */
137        public boolean interact(EntityPlayer par1EntityPlayer)
138        {
139            if (this.isEntityAlive() && !this.isTrading() && !this.isChild())
140            {
141                if (!this.worldObj.isRemote)
142                {
143                    this.setCustomer(par1EntityPlayer);
144                    par1EntityPlayer.displayGUIMerchant(this);
145                }
146    
147                return true;
148            }
149            else
150            {
151                return super.interact(par1EntityPlayer);
152            }
153        }
154    
155        protected void entityInit()
156        {
157            super.entityInit();
158            this.dataWatcher.addObject(16, Integer.valueOf(0));
159        }
160    
161        public int getMaxHealth()
162        {
163            return 20;
164        }
165    
166        /**
167         * (abstract) Protected helper method to write subclass entity data to NBT.
168         */
169        public void writeEntityToNBT(NBTTagCompound par1NBTTagCompound)
170        {
171            super.writeEntityToNBT(par1NBTTagCompound);
172            par1NBTTagCompound.setInteger("Profession", this.getProfession());
173            par1NBTTagCompound.setInteger("Riches", this.wealth);
174    
175            if (this.buyingList != null)
176            {
177                par1NBTTagCompound.setCompoundTag("Offers", this.buyingList.getRecipiesAsTags());
178            }
179        }
180    
181        /**
182         * (abstract) Protected helper method to read subclass entity data from NBT.
183         */
184        public void readEntityFromNBT(NBTTagCompound par1NBTTagCompound)
185        {
186            super.readEntityFromNBT(par1NBTTagCompound);
187            this.setProfession(par1NBTTagCompound.getInteger("Profession"));
188            this.wealth = par1NBTTagCompound.getInteger("Riches");
189    
190            if (par1NBTTagCompound.hasKey("Offers"))
191            {
192                NBTTagCompound var2 = par1NBTTagCompound.getCompoundTag("Offers");
193                this.buyingList = new MerchantRecipeList(var2);
194            }
195        }
196    
197        @SideOnly(Side.CLIENT)
198    
199        /**
200         * Returns the texture's file path as a String.
201         */
202        public String getTexture()
203        {
204            switch (this.getProfession())
205            {
206                case 0:
207                    return "/mob/villager/farmer.png";
208                case 1:
209                    return "/mob/villager/librarian.png";
210                case 2:
211                    return "/mob/villager/priest.png";
212                case 3:
213                    return "/mob/villager/smith.png";
214                case 4:
215                    return "/mob/villager/butcher.png";
216                default:
217                    return VillagerRegistry.getVillagerSkin(this.getProfession(), super.getTexture());
218            }
219        }
220    
221        /**
222         * Determines if an entity can be despawned, used on idle far away entities
223         */
224        protected boolean canDespawn()
225        {
226            return false;
227        }
228    
229        /**
230         * Returns the sound this mob makes while it's alive.
231         */
232        protected String getLivingSound()
233        {
234            return "mob.villager.default";
235        }
236    
237        /**
238         * Returns the sound this mob makes when it is hurt.
239         */
240        protected String getHurtSound()
241        {
242            return "mob.villager.defaulthurt";
243        }
244    
245        /**
246         * Returns the sound this mob makes on death.
247         */
248        protected String getDeathSound()
249        {
250            return "mob.villager.defaultdeath";
251        }
252    
253        public void setProfession(int par1)
254        {
255            this.dataWatcher.updateObject(16, Integer.valueOf(par1));
256        }
257    
258        public int getProfession()
259        {
260            return this.dataWatcher.getWatchableObjectInt(16);
261        }
262    
263        public boolean isMating()
264        {
265            return this.isMating;
266        }
267    
268        public void setMating(boolean par1)
269        {
270            this.isMating = par1;
271        }
272    
273        public void setPlaying(boolean par1)
274        {
275            this.isPlaying = par1;
276        }
277    
278        public boolean isPlaying()
279        {
280            return this.isPlaying;
281        }
282    
283        public void setRevengeTarget(EntityLiving par1EntityLiving)
284        {
285            super.setRevengeTarget(par1EntityLiving);
286    
287            if (this.villageObj != null && par1EntityLiving != null)
288            {
289                this.villageObj.addOrRenewAgressor(par1EntityLiving);
290            }
291        }
292    
293        public void setCustomer(EntityPlayer par1EntityPlayer)
294        {
295            this.buyingPlayer = par1EntityPlayer;
296        }
297    
298        public EntityPlayer getCustomer()
299        {
300            return this.buyingPlayer;
301        }
302    
303        public boolean isTrading()
304        {
305            return this.buyingPlayer != null;
306        }
307    
308        public void useRecipe(MerchantRecipe par1MerchantRecipe)
309        {
310            par1MerchantRecipe.incrementToolUses();
311    
312            if (par1MerchantRecipe.hasSameIDsAs((MerchantRecipe)this.buyingList.get(this.buyingList.size() - 1)))
313            {
314                this.timeUntilReset = 60;
315                this.needsInitilization = true;
316            }
317            else if (this.buyingList.size() > 1)
318            {
319                int var2 = this.rand.nextInt(6) + this.rand.nextInt(6) + 3;
320    
321                if (var2 <= par1MerchantRecipe.getToolUses())
322                {
323                    this.timeUntilReset = 20;
324                    this.sellingRecipeList = par1MerchantRecipe;
325                }
326            }
327    
328            if (par1MerchantRecipe.getItemToBuy().itemID == Item.emerald.shiftedIndex)
329            {
330                this.wealth += par1MerchantRecipe.getItemToBuy().stackSize;
331            }
332        }
333    
334        public MerchantRecipeList getRecipes(EntityPlayer par1EntityPlayer)
335        {
336            if (this.buyingList == null)
337            {
338                this.addDefaultEquipmentAndRecipies(1);
339            }
340    
341            return this.buyingList;
342        }
343    
344        /**
345         * based on the villagers profession add items, equipment, and recipies adds par1 random items to the list of things
346         * that the villager wants to buy. (at most 1 of each wanted type is added)
347         */
348        private void addDefaultEquipmentAndRecipies(int par1)
349        {
350            MerchantRecipeList var2;
351            var2 = new MerchantRecipeList();
352            label44:
353    
354            switch (this.getProfession())
355            {
356                case 0:
357                    addMerchantItem(var2, Item.wheat.shiftedIndex, this.rand, 0.9F);
358                    addMerchantItem(var2, Block.cloth.blockID, this.rand, 0.5F);
359                    addMerchantItem(var2, Item.chickenRaw.shiftedIndex, this.rand, 0.5F);
360                    addMerchantItem(var2, Item.fishCooked.shiftedIndex, this.rand, 0.4F);
361                    addBlacksmithItem(var2, Item.bread.shiftedIndex, this.rand, 0.9F);
362                    addBlacksmithItem(var2, Item.melon.shiftedIndex, this.rand, 0.3F);
363                    addBlacksmithItem(var2, Item.appleRed.shiftedIndex, this.rand, 0.3F);
364                    addBlacksmithItem(var2, Item.cookie.shiftedIndex, this.rand, 0.3F);
365                    addBlacksmithItem(var2, Item.shears.shiftedIndex, this.rand, 0.3F);
366                    addBlacksmithItem(var2, Item.flintAndSteel.shiftedIndex, this.rand, 0.3F);
367                    addBlacksmithItem(var2, Item.chickenCooked.shiftedIndex, this.rand, 0.3F);
368                    addBlacksmithItem(var2, Item.arrow.shiftedIndex, this.rand, 0.5F);
369    
370                    if (this.rand.nextFloat() < 0.5F)
371                    {
372                        var2.add(new MerchantRecipe(new ItemStack(Block.gravel, 10), new ItemStack(Item.emerald), new ItemStack(Item.flint.shiftedIndex, 2 + this.rand.nextInt(2), 0)));
373                    }
374    
375                    break;
376                case 1:
377                    addMerchantItem(var2, Item.paper.shiftedIndex, this.rand, 0.8F);
378                    addMerchantItem(var2, Item.book.shiftedIndex, this.rand, 0.8F);
379                    addMerchantItem(var2, Item.writtenBook.shiftedIndex, this.rand, 0.3F);
380                    addBlacksmithItem(var2, Block.bookShelf.blockID, this.rand, 0.8F);
381                    addBlacksmithItem(var2, Block.glass.blockID, this.rand, 0.2F);
382                    addBlacksmithItem(var2, Item.compass.shiftedIndex, this.rand, 0.2F);
383                    addBlacksmithItem(var2, Item.pocketSundial.shiftedIndex, this.rand, 0.2F);
384                    break;
385                case 2:
386                    addBlacksmithItem(var2, Item.eyeOfEnder.shiftedIndex, this.rand, 0.3F);
387                    addBlacksmithItem(var2, Item.expBottle.shiftedIndex, this.rand, 0.2F);
388                    addBlacksmithItem(var2, Item.redstone.shiftedIndex, this.rand, 0.4F);
389                    addBlacksmithItem(var2, Block.glowStone.blockID, this.rand, 0.3F);
390                    int[] var3 = new int[] {Item.swordSteel.shiftedIndex, Item.swordDiamond.shiftedIndex, Item.plateSteel.shiftedIndex, Item.plateDiamond.shiftedIndex, Item.axeSteel.shiftedIndex, Item.axeDiamond.shiftedIndex, Item.pickaxeSteel.shiftedIndex, Item.pickaxeDiamond.shiftedIndex};
391                    int[] var4 = var3;
392                    int var5 = var3.length;
393                    int var6 = 0;
394    
395                    while (true)
396                    {
397                        if (var6 >= var5)
398                        {
399                            break label44;
400                        }
401    
402                        int var7 = var4[var6];
403    
404                        if (this.rand.nextFloat() < 0.1F)
405                        {
406                            var2.add(new MerchantRecipe(new ItemStack(var7, 1, 0), new ItemStack(Item.emerald, 2 + this.rand.nextInt(3), 0), EnchantmentHelper.addRandomEnchantment(this.rand, new ItemStack(var7, 1, 0), 5 + this.rand.nextInt(15))));
407                        }
408    
409                        ++var6;
410                    }
411                case 3:
412                    addMerchantItem(var2, Item.coal.shiftedIndex, this.rand, 0.7F);
413                    addMerchantItem(var2, Item.ingotIron.shiftedIndex, this.rand, 0.5F);
414                    addMerchantItem(var2, Item.ingotGold.shiftedIndex, this.rand, 0.5F);
415                    addMerchantItem(var2, Item.diamond.shiftedIndex, this.rand, 0.5F);
416                    addBlacksmithItem(var2, Item.swordSteel.shiftedIndex, this.rand, 0.5F);
417                    addBlacksmithItem(var2, Item.swordDiamond.shiftedIndex, this.rand, 0.5F);
418                    addBlacksmithItem(var2, Item.axeSteel.shiftedIndex, this.rand, 0.3F);
419                    addBlacksmithItem(var2, Item.axeDiamond.shiftedIndex, this.rand, 0.3F);
420                    addBlacksmithItem(var2, Item.pickaxeSteel.shiftedIndex, this.rand, 0.5F);
421                    addBlacksmithItem(var2, Item.pickaxeDiamond.shiftedIndex, this.rand, 0.5F);
422                    addBlacksmithItem(var2, Item.shovelSteel.shiftedIndex, this.rand, 0.2F);
423                    addBlacksmithItem(var2, Item.shovelDiamond.shiftedIndex, this.rand, 0.2F);
424                    addBlacksmithItem(var2, Item.hoeSteel.shiftedIndex, this.rand, 0.2F);
425                    addBlacksmithItem(var2, Item.hoeDiamond.shiftedIndex, this.rand, 0.2F);
426                    addBlacksmithItem(var2, Item.bootsSteel.shiftedIndex, this.rand, 0.2F);
427                    addBlacksmithItem(var2, Item.bootsDiamond.shiftedIndex, this.rand, 0.2F);
428                    addBlacksmithItem(var2, Item.helmetSteel.shiftedIndex, this.rand, 0.2F);
429                    addBlacksmithItem(var2, Item.helmetDiamond.shiftedIndex, this.rand, 0.2F);
430                    addBlacksmithItem(var2, Item.plateSteel.shiftedIndex, this.rand, 0.2F);
431                    addBlacksmithItem(var2, Item.plateDiamond.shiftedIndex, this.rand, 0.2F);
432                    addBlacksmithItem(var2, Item.legsSteel.shiftedIndex, this.rand, 0.2F);
433                    addBlacksmithItem(var2, Item.legsDiamond.shiftedIndex, this.rand, 0.2F);
434                    addBlacksmithItem(var2, Item.bootsChain.shiftedIndex, this.rand, 0.1F);
435                    addBlacksmithItem(var2, Item.helmetChain.shiftedIndex, this.rand, 0.1F);
436                    addBlacksmithItem(var2, Item.plateChain.shiftedIndex, this.rand, 0.1F);
437                    addBlacksmithItem(var2, Item.legsChain.shiftedIndex, this.rand, 0.1F);
438                    break;
439                case 4:
440                    addMerchantItem(var2, Item.coal.shiftedIndex, this.rand, 0.7F);
441                    addMerchantItem(var2, Item.porkRaw.shiftedIndex, this.rand, 0.5F);
442                    addMerchantItem(var2, Item.beefRaw.shiftedIndex, this.rand, 0.5F);
443                    addBlacksmithItem(var2, Item.saddle.shiftedIndex, this.rand, 0.1F);
444                    addBlacksmithItem(var2, Item.plateLeather.shiftedIndex, this.rand, 0.3F);
445                    addBlacksmithItem(var2, Item.bootsLeather.shiftedIndex, this.rand, 0.3F);
446                    addBlacksmithItem(var2, Item.helmetLeather.shiftedIndex, this.rand, 0.3F);
447                    addBlacksmithItem(var2, Item.legsLeather.shiftedIndex, this.rand, 0.3F);
448                    addBlacksmithItem(var2, Item.porkCooked.shiftedIndex, this.rand, 0.3F);
449                    addBlacksmithItem(var2, Item.beefCooked.shiftedIndex, this.rand, 0.3F);
450            }
451    
452            VillagerRegistry.manageVillagerTrades(var2, this, this.getProfession(), this.rand);
453    
454            if (var2.isEmpty())
455            {
456                addMerchantItem(var2, Item.ingotGold.shiftedIndex, this.rand, 1.0F);
457            }
458    
459            Collections.shuffle(var2);
460    
461            if (this.buyingList == null)
462            {
463                this.buyingList = new MerchantRecipeList();
464            }
465    
466            for (int var8 = 0; var8 < par1 && var8 < var2.size(); ++var8)
467            {
468                this.buyingList.addToListWithCheck((MerchantRecipe)var2.get(var8));
469            }
470        }
471    
472        @SideOnly(Side.CLIENT)
473        public void setRecipes(MerchantRecipeList par1MerchantRecipeList) {}
474    
475        /**
476         * each recipie takes a random stack from villagerStockList and offers it for 1 emerald
477         */
478        public static void addMerchantItem(MerchantRecipeList par0MerchantRecipeList, int par1, Random par2Random, float par3)
479        {
480            if (par2Random.nextFloat() < par3)
481            {
482                par0MerchantRecipeList.add(new MerchantRecipe(getRandomSizedStack(par1, par2Random), Item.emerald));
483            }
484        }
485    
486        private static ItemStack getRandomSizedStack(int par0, Random par1Random)
487        {
488            return new ItemStack(par0, getRandomCountForItem(par0, par1Random), 0);
489        }
490    
491        /**
492         * default to 1, and villagerStockList contains a min/max amount for each index
493         */
494        private static int getRandomCountForItem(int par0, Random par1Random)
495        {
496            Tuple var2 = (Tuple)villagerStockList.get(Integer.valueOf(par0));
497            return var2 == null ? 1 : (((Integer)var2.getFirst()).intValue() >= ((Integer)var2.getSecond()).intValue() ? ((Integer)var2.getFirst()).intValue() : ((Integer)var2.getFirst()).intValue() + par1Random.nextInt(((Integer)var2.getSecond()).intValue() - ((Integer)var2.getFirst()).intValue()));
498        }
499    
500        public static void addBlacksmithItem(MerchantRecipeList par0MerchantRecipeList, int par1, Random par2Random, float par3)
501        {
502            if (par2Random.nextFloat() < par3)
503            {
504                int var4 = getRandomCountForBlacksmithItem(par1, par2Random);
505                ItemStack var5;
506                ItemStack var6;
507    
508                if (var4 < 0)
509                {
510                    var5 = new ItemStack(Item.emerald.shiftedIndex, 1, 0);
511                    var6 = new ItemStack(par1, -var4, 0);
512                }
513                else
514                {
515                    var5 = new ItemStack(Item.emerald.shiftedIndex, var4, 0);
516                    var6 = new ItemStack(par1, 1, 0);
517                }
518    
519                par0MerchantRecipeList.add(new MerchantRecipe(var5, var6));
520            }
521        }
522    
523        private static int getRandomCountForBlacksmithItem(int par0, Random par1Random)
524        {
525            Tuple var2 = (Tuple)blacksmithSellingList.get(Integer.valueOf(par0));
526            return var2 == null ? 1 : (((Integer)var2.getFirst()).intValue() >= ((Integer)var2.getSecond()).intValue() ? ((Integer)var2.getFirst()).intValue() : ((Integer)var2.getFirst()).intValue() + par1Random.nextInt(((Integer)var2.getSecond()).intValue() - ((Integer)var2.getFirst()).intValue()));
527        }
528    
529        @SideOnly(Side.CLIENT)
530        public void handleHealthUpdate(byte par1)
531        {
532            if (par1 == 12)
533            {
534                this.generateRandomParticles("heart");
535            }
536            else
537            {
538                super.handleHealthUpdate(par1);
539            }
540        }
541    
542        @SideOnly(Side.CLIENT)
543    
544        /**
545         * par1 is the particleName
546         */
547        private void generateRandomParticles(String par1Str)
548        {
549            for (int var2 = 0; var2 < 5; ++var2)
550            {
551                double var3 = this.rand.nextGaussian() * 0.02D;
552                double var5 = this.rand.nextGaussian() * 0.02D;
553                double var7 = this.rand.nextGaussian() * 0.02D;
554                this.worldObj.spawnParticle(par1Str, this.posX + (double)(this.rand.nextFloat() * this.width * 2.0F) - (double)this.width, this.posY + 1.0D + (double)(this.rand.nextFloat() * this.height), this.posZ + (double)(this.rand.nextFloat() * this.width * 2.0F) - (double)this.width, var3, var5, var7);
555            }
556        }
557    
558        static
559        {
560            villagerStockList.put(Integer.valueOf(Item.coal.shiftedIndex), new Tuple(Integer.valueOf(16), Integer.valueOf(24)));
561            villagerStockList.put(Integer.valueOf(Item.ingotIron.shiftedIndex), new Tuple(Integer.valueOf(8), Integer.valueOf(10)));
562            villagerStockList.put(Integer.valueOf(Item.ingotGold.shiftedIndex), new Tuple(Integer.valueOf(8), Integer.valueOf(10)));
563            villagerStockList.put(Integer.valueOf(Item.diamond.shiftedIndex), new Tuple(Integer.valueOf(4), Integer.valueOf(6)));
564            villagerStockList.put(Integer.valueOf(Item.paper.shiftedIndex), new Tuple(Integer.valueOf(19), Integer.valueOf(30)));
565            villagerStockList.put(Integer.valueOf(Item.book.shiftedIndex), new Tuple(Integer.valueOf(12), Integer.valueOf(15)));
566            villagerStockList.put(Integer.valueOf(Item.writtenBook.shiftedIndex), new Tuple(Integer.valueOf(1), Integer.valueOf(1)));
567            villagerStockList.put(Integer.valueOf(Item.enderPearl.shiftedIndex), new Tuple(Integer.valueOf(3), Integer.valueOf(4)));
568            villagerStockList.put(Integer.valueOf(Item.eyeOfEnder.shiftedIndex), new Tuple(Integer.valueOf(2), Integer.valueOf(3)));
569            villagerStockList.put(Integer.valueOf(Item.porkRaw.shiftedIndex), new Tuple(Integer.valueOf(14), Integer.valueOf(18)));
570            villagerStockList.put(Integer.valueOf(Item.beefRaw.shiftedIndex), new Tuple(Integer.valueOf(14), Integer.valueOf(18)));
571            villagerStockList.put(Integer.valueOf(Item.chickenRaw.shiftedIndex), new Tuple(Integer.valueOf(14), Integer.valueOf(18)));
572            villagerStockList.put(Integer.valueOf(Item.fishCooked.shiftedIndex), new Tuple(Integer.valueOf(9), Integer.valueOf(13)));
573            villagerStockList.put(Integer.valueOf(Item.seeds.shiftedIndex), new Tuple(Integer.valueOf(34), Integer.valueOf(48)));
574            villagerStockList.put(Integer.valueOf(Item.melonSeeds.shiftedIndex), new Tuple(Integer.valueOf(30), Integer.valueOf(38)));
575            villagerStockList.put(Integer.valueOf(Item.pumpkinSeeds.shiftedIndex), new Tuple(Integer.valueOf(30), Integer.valueOf(38)));
576            villagerStockList.put(Integer.valueOf(Item.wheat.shiftedIndex), new Tuple(Integer.valueOf(18), Integer.valueOf(22)));
577            villagerStockList.put(Integer.valueOf(Block.cloth.blockID), new Tuple(Integer.valueOf(14), Integer.valueOf(22)));
578            villagerStockList.put(Integer.valueOf(Item.rottenFlesh.shiftedIndex), new Tuple(Integer.valueOf(36), Integer.valueOf(64)));
579            blacksmithSellingList.put(Integer.valueOf(Item.flintAndSteel.shiftedIndex), new Tuple(Integer.valueOf(3), Integer.valueOf(4)));
580            blacksmithSellingList.put(Integer.valueOf(Item.shears.shiftedIndex), new Tuple(Integer.valueOf(3), Integer.valueOf(4)));
581            blacksmithSellingList.put(Integer.valueOf(Item.swordSteel.shiftedIndex), new Tuple(Integer.valueOf(7), Integer.valueOf(11)));
582            blacksmithSellingList.put(Integer.valueOf(Item.swordDiamond.shiftedIndex), new Tuple(Integer.valueOf(12), Integer.valueOf(14)));
583            blacksmithSellingList.put(Integer.valueOf(Item.axeSteel.shiftedIndex), new Tuple(Integer.valueOf(6), Integer.valueOf(8)));
584            blacksmithSellingList.put(Integer.valueOf(Item.axeDiamond.shiftedIndex), new Tuple(Integer.valueOf(9), Integer.valueOf(12)));
585            blacksmithSellingList.put(Integer.valueOf(Item.pickaxeSteel.shiftedIndex), new Tuple(Integer.valueOf(7), Integer.valueOf(9)));
586            blacksmithSellingList.put(Integer.valueOf(Item.pickaxeDiamond.shiftedIndex), new Tuple(Integer.valueOf(10), Integer.valueOf(12)));
587            blacksmithSellingList.put(Integer.valueOf(Item.shovelSteel.shiftedIndex), new Tuple(Integer.valueOf(4), Integer.valueOf(6)));
588            blacksmithSellingList.put(Integer.valueOf(Item.shovelDiamond.shiftedIndex), new Tuple(Integer.valueOf(7), Integer.valueOf(8)));
589            blacksmithSellingList.put(Integer.valueOf(Item.hoeSteel.shiftedIndex), new Tuple(Integer.valueOf(4), Integer.valueOf(6)));
590            blacksmithSellingList.put(Integer.valueOf(Item.hoeDiamond.shiftedIndex), new Tuple(Integer.valueOf(7), Integer.valueOf(8)));
591            blacksmithSellingList.put(Integer.valueOf(Item.bootsSteel.shiftedIndex), new Tuple(Integer.valueOf(4), Integer.valueOf(6)));
592            blacksmithSellingList.put(Integer.valueOf(Item.bootsDiamond.shiftedIndex), new Tuple(Integer.valueOf(7), Integer.valueOf(8)));
593            blacksmithSellingList.put(Integer.valueOf(Item.helmetSteel.shiftedIndex), new Tuple(Integer.valueOf(4), Integer.valueOf(6)));
594            blacksmithSellingList.put(Integer.valueOf(Item.helmetDiamond.shiftedIndex), new Tuple(Integer.valueOf(7), Integer.valueOf(8)));
595            blacksmithSellingList.put(Integer.valueOf(Item.plateSteel.shiftedIndex), new Tuple(Integer.valueOf(10), Integer.valueOf(14)));
596            blacksmithSellingList.put(Integer.valueOf(Item.plateDiamond.shiftedIndex), new Tuple(Integer.valueOf(16), Integer.valueOf(19)));
597            blacksmithSellingList.put(Integer.valueOf(Item.legsSteel.shiftedIndex), new Tuple(Integer.valueOf(8), Integer.valueOf(10)));
598            blacksmithSellingList.put(Integer.valueOf(Item.legsDiamond.shiftedIndex), new Tuple(Integer.valueOf(11), Integer.valueOf(14)));
599            blacksmithSellingList.put(Integer.valueOf(Item.bootsChain.shiftedIndex), new Tuple(Integer.valueOf(5), Integer.valueOf(7)));
600            blacksmithSellingList.put(Integer.valueOf(Item.helmetChain.shiftedIndex), new Tuple(Integer.valueOf(5), Integer.valueOf(7)));
601            blacksmithSellingList.put(Integer.valueOf(Item.plateChain.shiftedIndex), new Tuple(Integer.valueOf(11), Integer.valueOf(15)));
602            blacksmithSellingList.put(Integer.valueOf(Item.legsChain.shiftedIndex), new Tuple(Integer.valueOf(9), Integer.valueOf(11)));
603            blacksmithSellingList.put(Integer.valueOf(Item.bread.shiftedIndex), new Tuple(Integer.valueOf(-4), Integer.valueOf(-2)));
604            blacksmithSellingList.put(Integer.valueOf(Item.melon.shiftedIndex), new Tuple(Integer.valueOf(-8), Integer.valueOf(-4)));
605            blacksmithSellingList.put(Integer.valueOf(Item.appleRed.shiftedIndex), new Tuple(Integer.valueOf(-8), Integer.valueOf(-4)));
606            blacksmithSellingList.put(Integer.valueOf(Item.cookie.shiftedIndex), new Tuple(Integer.valueOf(-10), Integer.valueOf(-7)));
607            blacksmithSellingList.put(Integer.valueOf(Block.glass.blockID), new Tuple(Integer.valueOf(-5), Integer.valueOf(-3)));
608            blacksmithSellingList.put(Integer.valueOf(Block.bookShelf.blockID), new Tuple(Integer.valueOf(3), Integer.valueOf(4)));
609            blacksmithSellingList.put(Integer.valueOf(Item.plateLeather.shiftedIndex), new Tuple(Integer.valueOf(4), Integer.valueOf(5)));
610            blacksmithSellingList.put(Integer.valueOf(Item.bootsLeather.shiftedIndex), new Tuple(Integer.valueOf(2), Integer.valueOf(4)));
611            blacksmithSellingList.put(Integer.valueOf(Item.helmetLeather.shiftedIndex), new Tuple(Integer.valueOf(2), Integer.valueOf(4)));
612            blacksmithSellingList.put(Integer.valueOf(Item.legsLeather.shiftedIndex), new Tuple(Integer.valueOf(2), Integer.valueOf(4)));
613            blacksmithSellingList.put(Integer.valueOf(Item.saddle.shiftedIndex), new Tuple(Integer.valueOf(6), Integer.valueOf(8)));
614            blacksmithSellingList.put(Integer.valueOf(Item.expBottle.shiftedIndex), new Tuple(Integer.valueOf(-4), Integer.valueOf(-1)));
615            blacksmithSellingList.put(Integer.valueOf(Item.redstone.shiftedIndex), new Tuple(Integer.valueOf(-4), Integer.valueOf(-1)));
616            blacksmithSellingList.put(Integer.valueOf(Item.compass.shiftedIndex), new Tuple(Integer.valueOf(10), Integer.valueOf(12)));
617            blacksmithSellingList.put(Integer.valueOf(Item.pocketSundial.shiftedIndex), new Tuple(Integer.valueOf(10), Integer.valueOf(12)));
618            blacksmithSellingList.put(Integer.valueOf(Block.glowStone.blockID), new Tuple(Integer.valueOf(-3), Integer.valueOf(-1)));
619            blacksmithSellingList.put(Integer.valueOf(Item.porkCooked.shiftedIndex), new Tuple(Integer.valueOf(-7), Integer.valueOf(-5)));
620            blacksmithSellingList.put(Integer.valueOf(Item.beefCooked.shiftedIndex), new Tuple(Integer.valueOf(-7), Integer.valueOf(-5)));
621            blacksmithSellingList.put(Integer.valueOf(Item.chickenCooked.shiftedIndex), new Tuple(Integer.valueOf(-8), Integer.valueOf(-6)));
622            blacksmithSellingList.put(Integer.valueOf(Item.eyeOfEnder.shiftedIndex), new Tuple(Integer.valueOf(7), Integer.valueOf(11)));
623            blacksmithSellingList.put(Integer.valueOf(Item.arrow.shiftedIndex), new Tuple(Integer.valueOf(-5), Integer.valueOf(-19)));
624        }
625    }