package net.minecraft.entity.passive; import cpw.mods.fml.common.registry.VillagerRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Random; import net.minecraft.enchantment.Enchantment; import net.minecraft.enchantment.EnchantmentData; import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityAgeable; import net.minecraft.entity.EntityLiving; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.IEntityLivingData; import net.minecraft.entity.IMerchant; import net.minecraft.entity.INpc; import net.minecraft.entity.SharedMonsterAttributes; import net.minecraft.entity.ai.EntityAIAvoidEntity; import net.minecraft.entity.ai.EntityAIFollowGolem; import net.minecraft.entity.ai.EntityAILookAtTradePlayer; import net.minecraft.entity.ai.EntityAIMoveIndoors; import net.minecraft.entity.ai.EntityAIMoveTowardsRestriction; import net.minecraft.entity.ai.EntityAIOpenDoor; import net.minecraft.entity.ai.EntityAIPlay; import net.minecraft.entity.ai.EntityAIRestrictOpenDoor; import net.minecraft.entity.ai.EntityAISwimming; import net.minecraft.entity.ai.EntityAITradePlayer; import net.minecraft.entity.ai.EntityAIVillagerMate; import net.minecraft.entity.ai.EntityAIWander; import net.minecraft.entity.ai.EntityAIWatchClosest; import net.minecraft.entity.ai.EntityAIWatchClosest2; import net.minecraft.entity.monster.EntityZombie; import net.minecraft.entity.monster.IMob; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; import net.minecraft.init.Items; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.potion.Potion; import net.minecraft.potion.PotionEffect; import net.minecraft.util.ChunkCoordinates; import net.minecraft.util.DamageSource; import net.minecraft.util.MathHelper; import net.minecraft.util.Tuple; import net.minecraft.village.MerchantRecipe; import net.minecraft.village.MerchantRecipeList; import net.minecraft.village.Village; import net.minecraft.world.World; public class EntityVillager extends EntityAgeable implements IMerchant, INpc { private int randomTickDivider; private boolean isMating; private boolean isPlaying; Village villageObj; /** This villager's current customer. */ private EntityPlayer buyingPlayer; /** Initialises the MerchantRecipeList.java */ private MerchantRecipeList buyingList; private int timeUntilReset; /** addDefaultEquipmentAndRecipies is called if this is true */ private boolean needsInitilization; private int wealth; /** Last player to trade with this villager, used for aggressivity. */ private String lastBuyingPlayer; private boolean isLookingForHome; private float field_82191_bN; /** Selling list of Villagers items. */ public static final Map villagersSellingList = new HashMap(); /** Selling list of Blacksmith items. */ public static final Map blacksmithSellingList = new HashMap(); private static final String __OBFID = "CL_00001707"; public EntityVillager(World p_i1747_1_) { this(p_i1747_1_, 0); } public EntityVillager(World p_i1748_1_, int p_i1748_2_) { super(p_i1748_1_); this.setProfession(p_i1748_2_); this.setSize(0.6F, 1.8F); this.getNavigator().setBreakDoors(true); this.getNavigator().setAvoidsWater(true); this.tasks.addTask(0, new EntityAISwimming(this)); this.tasks.addTask(1, new EntityAIAvoidEntity(this, EntityZombie.class, 8.0F, 0.6D, 0.6D)); this.tasks.addTask(1, new EntityAITradePlayer(this)); this.tasks.addTask(1, new EntityAILookAtTradePlayer(this)); this.tasks.addTask(2, new EntityAIMoveIndoors(this)); this.tasks.addTask(3, new EntityAIRestrictOpenDoor(this)); this.tasks.addTask(4, new EntityAIOpenDoor(this, true)); this.tasks.addTask(5, new EntityAIMoveTowardsRestriction(this, 0.6D)); this.tasks.addTask(6, new EntityAIVillagerMate(this)); this.tasks.addTask(7, new EntityAIFollowGolem(this)); this.tasks.addTask(8, new EntityAIPlay(this, 0.32D)); this.tasks.addTask(9, new EntityAIWatchClosest2(this, EntityPlayer.class, 3.0F, 1.0F)); this.tasks.addTask(9, new EntityAIWatchClosest2(this, EntityVillager.class, 5.0F, 0.02F)); this.tasks.addTask(9, new EntityAIWander(this, 0.6D)); this.tasks.addTask(10, new EntityAIWatchClosest(this, EntityLiving.class, 8.0F)); } protected void applyEntityAttributes() { super.applyEntityAttributes(); this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.5D); } /** * Returns true if the newer Entity AI code should be run */ public boolean isAIEnabled() { return true; } /** * main AI tick function, replaces updateEntityActionState */ protected void updateAITick() { if (--this.randomTickDivider <= 0) { this.worldObj.villageCollectionObj.addVillagerPosition(MathHelper.floor_double(this.posX), MathHelper.floor_double(this.posY), MathHelper.floor_double(this.posZ)); this.randomTickDivider = 70 + this.rand.nextInt(50); this.villageObj = this.worldObj.villageCollectionObj.findNearestVillage(MathHelper.floor_double(this.posX), MathHelper.floor_double(this.posY), MathHelper.floor_double(this.posZ), 32); if (this.villageObj == null) { this.detachHome(); } else { ChunkCoordinates chunkcoordinates = this.villageObj.getCenter(); this.setHomeArea(chunkcoordinates.posX, chunkcoordinates.posY, chunkcoordinates.posZ, (int)((float)this.villageObj.getVillageRadius() * 0.6F)); if (this.isLookingForHome) { this.isLookingForHome = false; this.villageObj.setDefaultPlayerReputation(5); } } } if (!this.isTrading() && this.timeUntilReset > 0) { --this.timeUntilReset; if (this.timeUntilReset <= 0) { if (this.needsInitilization) { if (this.buyingList.size() > 1) { Iterator iterator = this.buyingList.iterator(); while (iterator.hasNext()) { MerchantRecipe merchantrecipe = (MerchantRecipe)iterator.next(); if (merchantrecipe.isRecipeDisabled()) { merchantrecipe.func_82783_a(this.rand.nextInt(6) + this.rand.nextInt(6) + 2); } } } this.addDefaultEquipmentAndRecipies(1); this.needsInitilization = false; if (this.villageObj != null && this.lastBuyingPlayer != null) { this.worldObj.setEntityState(this, (byte)14); this.villageObj.setReputationForPlayer(this.lastBuyingPlayer, 1); } } this.addPotionEffect(new PotionEffect(Potion.regeneration.id, 200, 0)); } } super.updateAITick(); } /** * Called when a player interacts with a mob. e.g. gets milk from a cow, gets into the saddle on a pig. */ public boolean interact(EntityPlayer p_70085_1_) { ItemStack itemstack = p_70085_1_.inventory.getCurrentItem(); boolean flag = itemstack != null && itemstack.getItem() == Items.spawn_egg; if (!flag && this.isEntityAlive() && !this.isTrading() && !this.isChild() && !p_70085_1_.isSneaking()) { if (!this.worldObj.isRemote) { this.setCustomer(p_70085_1_); p_70085_1_.displayGUIMerchant(this, this.getCustomNameTag()); } return true; } else { return super.interact(p_70085_1_); } } protected void entityInit() { super.entityInit(); this.dataWatcher.addObject(16, Integer.valueOf(0)); } /** * (abstract) Protected helper method to write subclass entity data to NBT. */ public void writeEntityToNBT(NBTTagCompound tagCompound) { super.writeEntityToNBT(tagCompound); tagCompound.setInteger("Profession", this.getProfession()); tagCompound.setInteger("Riches", this.wealth); if (this.buyingList != null) { tagCompound.setTag("Offers", this.buyingList.getRecipiesAsTags()); } } /** * (abstract) Protected helper method to read subclass entity data from NBT. */ public void readEntityFromNBT(NBTTagCompound tagCompund) { super.readEntityFromNBT(tagCompund); this.setProfession(tagCompund.getInteger("Profession")); this.wealth = tagCompund.getInteger("Riches"); if (tagCompund.hasKey("Offers", 10)) { NBTTagCompound nbttagcompound1 = tagCompund.getCompoundTag("Offers"); this.buyingList = new MerchantRecipeList(nbttagcompound1); } } /** * Determines if an entity can be despawned, used on idle far away entities */ protected boolean canDespawn() { return false; } /** * Returns the sound this mob makes while it's alive. */ protected String getLivingSound() { return this.isTrading() ? "mob.villager.haggle" : "mob.villager.idle"; } /** * Returns the sound this mob makes when it is hurt. */ protected String getHurtSound() { return "mob.villager.hit"; } /** * Returns the sound this mob makes on death. */ protected String getDeathSound() { return "mob.villager.death"; } public void setProfession(int p_70938_1_) { this.dataWatcher.updateObject(16, Integer.valueOf(p_70938_1_)); } public int getProfession() { return this.dataWatcher.getWatchableObjectInt(16); } public boolean isMating() { return this.isMating; } public void setMating(boolean p_70947_1_) { this.isMating = p_70947_1_; } public void setPlaying(boolean p_70939_1_) { this.isPlaying = p_70939_1_; } public boolean isPlaying() { return this.isPlaying; } public void setRevengeTarget(EntityLivingBase p_70604_1_) { super.setRevengeTarget(p_70604_1_); if (this.villageObj != null && p_70604_1_ != null) { this.villageObj.addOrRenewAgressor(p_70604_1_); if (p_70604_1_ instanceof EntityPlayer) { byte b0 = -1; if (this.isChild()) { b0 = -3; } this.villageObj.setReputationForPlayer(p_70604_1_.getCommandSenderName(), b0); if (this.isEntityAlive()) { this.worldObj.setEntityState(this, (byte)13); } } } } /** * Called when the mob's health reaches 0. */ public void onDeath(DamageSource p_70645_1_) { if (this.villageObj != null) { Entity entity = p_70645_1_.getEntity(); if (entity != null) { if (entity instanceof EntityPlayer) { this.villageObj.setReputationForPlayer(entity.getCommandSenderName(), -2); } else if (entity instanceof IMob) { this.villageObj.endMatingSeason(); } } else if (entity == null) { EntityPlayer entityplayer = this.worldObj.getClosestPlayerToEntity(this, 16.0D); if (entityplayer != null) { this.villageObj.endMatingSeason(); } } } super.onDeath(p_70645_1_); } public void setCustomer(EntityPlayer p_70932_1_) { this.buyingPlayer = p_70932_1_; } public EntityPlayer getCustomer() { return this.buyingPlayer; } public boolean isTrading() { return this.buyingPlayer != null; } public void useRecipe(MerchantRecipe p_70933_1_) { p_70933_1_.incrementToolUses(); this.livingSoundTime = -this.getTalkInterval(); this.playSound("mob.villager.yes", this.getSoundVolume(), this.getSoundPitch()); if (p_70933_1_.hasSameIDsAs((MerchantRecipe)this.buyingList.get(this.buyingList.size() - 1))) { this.timeUntilReset = 40; this.needsInitilization = true; if (this.buyingPlayer != null) { this.lastBuyingPlayer = this.buyingPlayer.getCommandSenderName(); } else { this.lastBuyingPlayer = null; } } if (p_70933_1_.getItemToBuy().getItem() == Items.emerald) { this.wealth += p_70933_1_.getItemToBuy().stackSize; } } /** * Notifies the merchant of a possible merchantrecipe being fulfilled or not. Usually, this is just a sound byte * being played depending if the suggested itemstack is not null. */ public void verifySellingItem(ItemStack p_110297_1_) { if (!this.worldObj.isRemote && this.livingSoundTime > -this.getTalkInterval() + 20) { this.livingSoundTime = -this.getTalkInterval(); if (p_110297_1_ != null) { this.playSound("mob.villager.yes", this.getSoundVolume(), this.getSoundPitch()); } else { this.playSound("mob.villager.no", this.getSoundVolume(), this.getSoundPitch()); } } } public MerchantRecipeList getRecipes(EntityPlayer p_70934_1_) { if (this.buyingList == null) { this.addDefaultEquipmentAndRecipies(1); } return this.buyingList; } /** * Adjusts the probability of obtaining a given recipe being offered by a villager */ private float adjustProbability(float p_82188_1_) { float f1 = p_82188_1_ + this.field_82191_bN; return f1 > 0.9F ? 0.9F - (f1 - 0.9F) : f1; } /** * based on the villagers profession add items, equipment, and recipies adds par1 random items to the list of things * that the villager wants to buy. (at most 1 of each wanted type is added) */ private void addDefaultEquipmentAndRecipies(int p_70950_1_) { if (this.buyingList != null) { this.field_82191_bN = MathHelper.sqrt_float((float)this.buyingList.size()) * 0.2F; } else { this.field_82191_bN = 0.0F; } MerchantRecipeList merchantrecipelist; merchantrecipelist = new MerchantRecipeList(); VillagerRegistry.manageVillagerTrades(merchantrecipelist, this, this.getProfession(), this.rand); int k; label50: switch (this.getProfession()) { case 0: func_146091_a(merchantrecipelist, Items.wheat, this.rand, this.adjustProbability(0.9F)); func_146091_a(merchantrecipelist, Item.getItemFromBlock(Blocks.wool), this.rand, this.adjustProbability(0.5F)); func_146091_a(merchantrecipelist, Items.chicken, this.rand, this.adjustProbability(0.5F)); func_146091_a(merchantrecipelist, Items.cooked_fish, this.rand, this.adjustProbability(0.4F)); func_146089_b(merchantrecipelist, Items.bread, this.rand, this.adjustProbability(0.9F)); func_146089_b(merchantrecipelist, Items.melon, this.rand, this.adjustProbability(0.3F)); func_146089_b(merchantrecipelist, Items.apple, this.rand, this.adjustProbability(0.3F)); func_146089_b(merchantrecipelist, Items.cookie, this.rand, this.adjustProbability(0.3F)); func_146089_b(merchantrecipelist, Items.shears, this.rand, this.adjustProbability(0.3F)); func_146089_b(merchantrecipelist, Items.flint_and_steel, this.rand, this.adjustProbability(0.3F)); func_146089_b(merchantrecipelist, Items.cooked_chicken, this.rand, this.adjustProbability(0.3F)); func_146089_b(merchantrecipelist, Items.arrow, this.rand, this.adjustProbability(0.5F)); if (this.rand.nextFloat() < this.adjustProbability(0.5F)) { merchantrecipelist.add(new MerchantRecipe(new ItemStack(Blocks.gravel, 10), new ItemStack(Items.emerald), new ItemStack(Items.flint, 4 + this.rand.nextInt(2), 0))); } break; case 1: func_146091_a(merchantrecipelist, Items.paper, this.rand, this.adjustProbability(0.8F)); func_146091_a(merchantrecipelist, Items.book, this.rand, this.adjustProbability(0.8F)); func_146091_a(merchantrecipelist, Items.written_book, this.rand, this.adjustProbability(0.3F)); func_146089_b(merchantrecipelist, Item.getItemFromBlock(Blocks.bookshelf), this.rand, this.adjustProbability(0.8F)); func_146089_b(merchantrecipelist, Item.getItemFromBlock(Blocks.glass), this.rand, this.adjustProbability(0.2F)); func_146089_b(merchantrecipelist, Items.compass, this.rand, this.adjustProbability(0.2F)); func_146089_b(merchantrecipelist, Items.clock, this.rand, this.adjustProbability(0.2F)); if (this.rand.nextFloat() < this.adjustProbability(0.07F)) { Enchantment enchantment = Enchantment.enchantmentsBookList[this.rand.nextInt(Enchantment.enchantmentsBookList.length)]; int i1 = MathHelper.getRandomIntegerInRange(this.rand, enchantment.getMinLevel(), enchantment.getMaxLevel()); ItemStack itemstack = Items.enchanted_book.getEnchantedItemStack(new EnchantmentData(enchantment, i1)); k = 2 + this.rand.nextInt(5 + i1 * 10) + 3 * i1; merchantrecipelist.add(new MerchantRecipe(new ItemStack(Items.book), new ItemStack(Items.emerald, k), itemstack)); } break; case 2: func_146089_b(merchantrecipelist, Items.ender_eye, this.rand, this.adjustProbability(0.3F)); func_146089_b(merchantrecipelist, Items.experience_bottle, this.rand, this.adjustProbability(0.2F)); func_146089_b(merchantrecipelist, Items.redstone, this.rand, this.adjustProbability(0.4F)); func_146089_b(merchantrecipelist, Item.getItemFromBlock(Blocks.glowstone), this.rand, this.adjustProbability(0.3F)); Item[] aitem = new Item[] {Items.iron_sword, Items.diamond_sword, Items.iron_chestplate, Items.diamond_chestplate, Items.iron_axe, Items.diamond_axe, Items.iron_pickaxe, Items.diamond_pickaxe}; Item[] aitem1 = aitem; int j = aitem.length; k = 0; while (true) { if (k >= j) { break label50; } Item item = aitem1[k]; if (this.rand.nextFloat() < this.adjustProbability(0.05F)) { merchantrecipelist.add(new MerchantRecipe(new ItemStack(item, 1, 0), new ItemStack(Items.emerald, 2 + this.rand.nextInt(3), 0), EnchantmentHelper.addRandomEnchantment(this.rand, new ItemStack(item, 1, 0), 5 + this.rand.nextInt(15)))); } ++k; } case 3: func_146091_a(merchantrecipelist, Items.coal, this.rand, this.adjustProbability(0.7F)); func_146091_a(merchantrecipelist, Items.iron_ingot, this.rand, this.adjustProbability(0.5F)); func_146091_a(merchantrecipelist, Items.gold_ingot, this.rand, this.adjustProbability(0.5F)); func_146091_a(merchantrecipelist, Items.diamond, this.rand, this.adjustProbability(0.5F)); func_146089_b(merchantrecipelist, Items.iron_sword, this.rand, this.adjustProbability(0.5F)); func_146089_b(merchantrecipelist, Items.diamond_sword, this.rand, this.adjustProbability(0.5F)); func_146089_b(merchantrecipelist, Items.iron_axe, this.rand, this.adjustProbability(0.3F)); func_146089_b(merchantrecipelist, Items.diamond_axe, this.rand, this.adjustProbability(0.3F)); func_146089_b(merchantrecipelist, Items.iron_pickaxe, this.rand, this.adjustProbability(0.5F)); func_146089_b(merchantrecipelist, Items.diamond_pickaxe, this.rand, this.adjustProbability(0.5F)); func_146089_b(merchantrecipelist, Items.iron_shovel, this.rand, this.adjustProbability(0.2F)); func_146089_b(merchantrecipelist, Items.diamond_shovel, this.rand, this.adjustProbability(0.2F)); func_146089_b(merchantrecipelist, Items.iron_hoe, this.rand, this.adjustProbability(0.2F)); func_146089_b(merchantrecipelist, Items.diamond_hoe, this.rand, this.adjustProbability(0.2F)); func_146089_b(merchantrecipelist, Items.iron_boots, this.rand, this.adjustProbability(0.2F)); func_146089_b(merchantrecipelist, Items.diamond_boots, this.rand, this.adjustProbability(0.2F)); func_146089_b(merchantrecipelist, Items.iron_helmet, this.rand, this.adjustProbability(0.2F)); func_146089_b(merchantrecipelist, Items.diamond_helmet, this.rand, this.adjustProbability(0.2F)); func_146089_b(merchantrecipelist, Items.iron_chestplate, this.rand, this.adjustProbability(0.2F)); func_146089_b(merchantrecipelist, Items.diamond_chestplate, this.rand, this.adjustProbability(0.2F)); func_146089_b(merchantrecipelist, Items.iron_leggings, this.rand, this.adjustProbability(0.2F)); func_146089_b(merchantrecipelist, Items.diamond_leggings, this.rand, this.adjustProbability(0.2F)); func_146089_b(merchantrecipelist, Items.chainmail_boots, this.rand, this.adjustProbability(0.1F)); func_146089_b(merchantrecipelist, Items.chainmail_helmet, this.rand, this.adjustProbability(0.1F)); func_146089_b(merchantrecipelist, Items.chainmail_chestplate, this.rand, this.adjustProbability(0.1F)); func_146089_b(merchantrecipelist, Items.chainmail_leggings, this.rand, this.adjustProbability(0.1F)); break; case 4: func_146091_a(merchantrecipelist, Items.coal, this.rand, this.adjustProbability(0.7F)); func_146091_a(merchantrecipelist, Items.porkchop, this.rand, this.adjustProbability(0.5F)); func_146091_a(merchantrecipelist, Items.beef, this.rand, this.adjustProbability(0.5F)); func_146089_b(merchantrecipelist, Items.saddle, this.rand, this.adjustProbability(0.1F)); func_146089_b(merchantrecipelist, Items.leather_chestplate, this.rand, this.adjustProbability(0.3F)); func_146089_b(merchantrecipelist, Items.leather_boots, this.rand, this.adjustProbability(0.3F)); func_146089_b(merchantrecipelist, Items.leather_helmet, this.rand, this.adjustProbability(0.3F)); func_146089_b(merchantrecipelist, Items.leather_leggings, this.rand, this.adjustProbability(0.3F)); func_146089_b(merchantrecipelist, Items.cooked_porkchop, this.rand, this.adjustProbability(0.3F)); func_146089_b(merchantrecipelist, Items.cooked_beef, this.rand, this.adjustProbability(0.3F)); } if (merchantrecipelist.isEmpty()) { func_146091_a(merchantrecipelist, Items.gold_ingot, this.rand, 1.0F); } Collections.shuffle(merchantrecipelist); if (this.buyingList == null) { this.buyingList = new MerchantRecipeList(); } for (int l = 0; l < p_70950_1_ && l < merchantrecipelist.size(); ++l) { this.buyingList.addToListWithCheck((MerchantRecipe)merchantrecipelist.get(l)); } } @SideOnly(Side.CLIENT) public void setRecipes(MerchantRecipeList p_70930_1_) {} public static void func_146091_a(MerchantRecipeList p_146091_0_, Item p_146091_1_, Random p_146091_2_, float p_146091_3_) { if (p_146091_2_.nextFloat() < p_146091_3_) { p_146091_0_.add(new MerchantRecipe(func_146088_a(p_146091_1_, p_146091_2_), Items.emerald)); } } private static ItemStack func_146088_a(Item p_146088_0_, Random p_146088_1_) { return new ItemStack(p_146088_0_, func_146092_b(p_146088_0_, p_146088_1_), 0); } private static int func_146092_b(Item p_146092_0_, Random p_146092_1_) { Tuple tuple = (Tuple)villagersSellingList.get(p_146092_0_); return tuple == null ? 1 : (((Integer)tuple.getFirst()).intValue() >= ((Integer)tuple.getSecond()).intValue() ? ((Integer)tuple.getFirst()).intValue() : ((Integer)tuple.getFirst()).intValue() + p_146092_1_.nextInt(((Integer)tuple.getSecond()).intValue() - ((Integer)tuple.getFirst()).intValue())); } public static void func_146089_b(MerchantRecipeList p_146089_0_, Item p_146089_1_, Random p_146089_2_, float p_146089_3_) { if (p_146089_2_.nextFloat() < p_146089_3_) { int i = func_146090_c(p_146089_1_, p_146089_2_); ItemStack itemstack; ItemStack itemstack1; if (i < 0) { itemstack = new ItemStack(Items.emerald, 1, 0); itemstack1 = new ItemStack(p_146089_1_, -i, 0); } else { itemstack = new ItemStack(Items.emerald, i, 0); itemstack1 = new ItemStack(p_146089_1_, 1, 0); } p_146089_0_.add(new MerchantRecipe(itemstack, itemstack1)); } } private static int func_146090_c(Item p_146090_0_, Random p_146090_1_) { Tuple tuple = (Tuple)blacksmithSellingList.get(p_146090_0_); return tuple == null ? 1 : (((Integer)tuple.getFirst()).intValue() >= ((Integer)tuple.getSecond()).intValue() ? ((Integer)tuple.getFirst()).intValue() : ((Integer)tuple.getFirst()).intValue() + p_146090_1_.nextInt(((Integer)tuple.getSecond()).intValue() - ((Integer)tuple.getFirst()).intValue())); } @SideOnly(Side.CLIENT) public void handleHealthUpdate(byte p_70103_1_) { if (p_70103_1_ == 12) { this.generateRandomParticles("heart"); } else if (p_70103_1_ == 13) { this.generateRandomParticles("angryVillager"); } else if (p_70103_1_ == 14) { this.generateRandomParticles("happyVillager"); } else { super.handleHealthUpdate(p_70103_1_); } } public IEntityLivingData onSpawnWithEgg(IEntityLivingData p_110161_1_) { p_110161_1_ = super.onSpawnWithEgg(p_110161_1_); VillagerRegistry.applyRandomTrade(this, worldObj.rand); return p_110161_1_; } /** * par1 is the particleName */ @SideOnly(Side.CLIENT) private void generateRandomParticles(String p_70942_1_) { for (int i = 0; i < 5; ++i) { double d0 = this.rand.nextGaussian() * 0.02D; double d1 = this.rand.nextGaussian() * 0.02D; double d2 = this.rand.nextGaussian() * 0.02D; this.worldObj.spawnParticle(p_70942_1_, 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, d0, d1, d2); } } public void setLookingForHome() { this.isLookingForHome = true; } public EntityVillager createChild(EntityAgeable p_90011_1_) { EntityVillager entityvillager = new EntityVillager(this.worldObj); entityvillager.onSpawnWithEgg((IEntityLivingData)null); return entityvillager; } public boolean allowLeashing() { return false; } static { villagersSellingList.put(Items.coal, new Tuple(Integer.valueOf(16), Integer.valueOf(24))); villagersSellingList.put(Items.iron_ingot, new Tuple(Integer.valueOf(8), Integer.valueOf(10))); villagersSellingList.put(Items.gold_ingot, new Tuple(Integer.valueOf(8), Integer.valueOf(10))); villagersSellingList.put(Items.diamond, new Tuple(Integer.valueOf(4), Integer.valueOf(6))); villagersSellingList.put(Items.paper, new Tuple(Integer.valueOf(24), Integer.valueOf(36))); villagersSellingList.put(Items.book, new Tuple(Integer.valueOf(11), Integer.valueOf(13))); villagersSellingList.put(Items.written_book, new Tuple(Integer.valueOf(1), Integer.valueOf(1))); villagersSellingList.put(Items.ender_pearl, new Tuple(Integer.valueOf(3), Integer.valueOf(4))); villagersSellingList.put(Items.ender_eye, new Tuple(Integer.valueOf(2), Integer.valueOf(3))); villagersSellingList.put(Items.porkchop, new Tuple(Integer.valueOf(14), Integer.valueOf(18))); villagersSellingList.put(Items.beef, new Tuple(Integer.valueOf(14), Integer.valueOf(18))); villagersSellingList.put(Items.chicken, new Tuple(Integer.valueOf(14), Integer.valueOf(18))); villagersSellingList.put(Items.cooked_fish, new Tuple(Integer.valueOf(9), Integer.valueOf(13))); villagersSellingList.put(Items.wheat_seeds, new Tuple(Integer.valueOf(34), Integer.valueOf(48))); villagersSellingList.put(Items.melon_seeds, new Tuple(Integer.valueOf(30), Integer.valueOf(38))); villagersSellingList.put(Items.pumpkin_seeds, new Tuple(Integer.valueOf(30), Integer.valueOf(38))); villagersSellingList.put(Items.wheat, new Tuple(Integer.valueOf(18), Integer.valueOf(22))); villagersSellingList.put(Item.getItemFromBlock(Blocks.wool), new Tuple(Integer.valueOf(14), Integer.valueOf(22))); villagersSellingList.put(Items.rotten_flesh, new Tuple(Integer.valueOf(36), Integer.valueOf(64))); blacksmithSellingList.put(Items.flint_and_steel, new Tuple(Integer.valueOf(3), Integer.valueOf(4))); blacksmithSellingList.put(Items.shears, new Tuple(Integer.valueOf(3), Integer.valueOf(4))); blacksmithSellingList.put(Items.iron_sword, new Tuple(Integer.valueOf(7), Integer.valueOf(11))); blacksmithSellingList.put(Items.diamond_sword, new Tuple(Integer.valueOf(12), Integer.valueOf(14))); blacksmithSellingList.put(Items.iron_axe, new Tuple(Integer.valueOf(6), Integer.valueOf(8))); blacksmithSellingList.put(Items.diamond_axe, new Tuple(Integer.valueOf(9), Integer.valueOf(12))); blacksmithSellingList.put(Items.iron_pickaxe, new Tuple(Integer.valueOf(7), Integer.valueOf(9))); blacksmithSellingList.put(Items.diamond_pickaxe, new Tuple(Integer.valueOf(10), Integer.valueOf(12))); blacksmithSellingList.put(Items.iron_shovel, new Tuple(Integer.valueOf(4), Integer.valueOf(6))); blacksmithSellingList.put(Items.diamond_shovel, new Tuple(Integer.valueOf(7), Integer.valueOf(8))); blacksmithSellingList.put(Items.iron_hoe, new Tuple(Integer.valueOf(4), Integer.valueOf(6))); blacksmithSellingList.put(Items.diamond_hoe, new Tuple(Integer.valueOf(7), Integer.valueOf(8))); blacksmithSellingList.put(Items.iron_boots, new Tuple(Integer.valueOf(4), Integer.valueOf(6))); blacksmithSellingList.put(Items.diamond_boots, new Tuple(Integer.valueOf(7), Integer.valueOf(8))); blacksmithSellingList.put(Items.iron_helmet, new Tuple(Integer.valueOf(4), Integer.valueOf(6))); blacksmithSellingList.put(Items.diamond_helmet, new Tuple(Integer.valueOf(7), Integer.valueOf(8))); blacksmithSellingList.put(Items.iron_chestplate, new Tuple(Integer.valueOf(10), Integer.valueOf(14))); blacksmithSellingList.put(Items.diamond_chestplate, new Tuple(Integer.valueOf(16), Integer.valueOf(19))); blacksmithSellingList.put(Items.iron_leggings, new Tuple(Integer.valueOf(8), Integer.valueOf(10))); blacksmithSellingList.put(Items.diamond_leggings, new Tuple(Integer.valueOf(11), Integer.valueOf(14))); blacksmithSellingList.put(Items.chainmail_boots, new Tuple(Integer.valueOf(5), Integer.valueOf(7))); blacksmithSellingList.put(Items.chainmail_helmet, new Tuple(Integer.valueOf(5), Integer.valueOf(7))); blacksmithSellingList.put(Items.chainmail_chestplate, new Tuple(Integer.valueOf(11), Integer.valueOf(15))); blacksmithSellingList.put(Items.chainmail_leggings, new Tuple(Integer.valueOf(9), Integer.valueOf(11))); blacksmithSellingList.put(Items.bread, new Tuple(Integer.valueOf(-4), Integer.valueOf(-2))); blacksmithSellingList.put(Items.melon, new Tuple(Integer.valueOf(-8), Integer.valueOf(-4))); blacksmithSellingList.put(Items.apple, new Tuple(Integer.valueOf(-8), Integer.valueOf(-4))); blacksmithSellingList.put(Items.cookie, new Tuple(Integer.valueOf(-10), Integer.valueOf(-7))); blacksmithSellingList.put(Item.getItemFromBlock(Blocks.glass), new Tuple(Integer.valueOf(-5), Integer.valueOf(-3))); blacksmithSellingList.put(Item.getItemFromBlock(Blocks.bookshelf), new Tuple(Integer.valueOf(3), Integer.valueOf(4))); blacksmithSellingList.put(Items.leather_chestplate, new Tuple(Integer.valueOf(4), Integer.valueOf(5))); blacksmithSellingList.put(Items.leather_boots, new Tuple(Integer.valueOf(2), Integer.valueOf(4))); blacksmithSellingList.put(Items.leather_helmet, new Tuple(Integer.valueOf(2), Integer.valueOf(4))); blacksmithSellingList.put(Items.leather_leggings, new Tuple(Integer.valueOf(2), Integer.valueOf(4))); blacksmithSellingList.put(Items.saddle, new Tuple(Integer.valueOf(6), Integer.valueOf(8))); blacksmithSellingList.put(Items.experience_bottle, new Tuple(Integer.valueOf(-4), Integer.valueOf(-1))); blacksmithSellingList.put(Items.redstone, new Tuple(Integer.valueOf(-4), Integer.valueOf(-1))); blacksmithSellingList.put(Items.compass, new Tuple(Integer.valueOf(10), Integer.valueOf(12))); blacksmithSellingList.put(Items.clock, new Tuple(Integer.valueOf(10), Integer.valueOf(12))); blacksmithSellingList.put(Item.getItemFromBlock(Blocks.glowstone), new Tuple(Integer.valueOf(-3), Integer.valueOf(-1))); blacksmithSellingList.put(Items.cooked_porkchop, new Tuple(Integer.valueOf(-7), Integer.valueOf(-5))); blacksmithSellingList.put(Items.cooked_beef, new Tuple(Integer.valueOf(-7), Integer.valueOf(-5))); blacksmithSellingList.put(Items.cooked_chicken, new Tuple(Integer.valueOf(-8), Integer.valueOf(-6))); blacksmithSellingList.put(Items.ender_eye, new Tuple(Integer.valueOf(7), Integer.valueOf(11))); blacksmithSellingList.put(Items.arrow, new Tuple(Integer.valueOf(-12), Integer.valueOf(-8))); } }