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