package net.minecraft.server; import com.google.common.collect.Maps; import java.util.Map; import java.util.Random; import javax.annotation.Nullable; // CraftBukkit start import org.bukkit.event.entity.SheepRegrowWoolEvent; import org.bukkit.event.player.PlayerShearEntityEvent; import org.bukkit.inventory.InventoryView; // CraftBukkit end public class EntitySheep extends EntityAnimal { private static final DataWatcherObject<Byte> bw = DataWatcher.a(EntitySheep.class, DataWatcherRegistry.a); private final InventoryCrafting container = new InventoryCrafting(new Container() { public boolean a(EntityHuman entityhuman) { return false; } // CraftBukkit start @Override public InventoryView getBukkitView() { return null; // TODO: O.O } // CraftBukkit end }, 2, 1); private static final Map<EnumColor, float[]> by = Maps.newEnumMap(EnumColor.class); private int bA; private PathfinderGoalEatTile bB; public static float[] a(EnumColor enumcolor) { return (float[]) EntitySheep.by.get(enumcolor); } public EntitySheep(World world) { super(world); this.setSize(0.9F, 1.3F); this.container.setItem(0, new ItemStack(Items.DYE)); this.container.setItem(1, new ItemStack(Items.DYE)); this.container.resultInventory = new InventoryCraftResult(); // CraftBukkit - add result slot for event } protected void r() { this.bB = new PathfinderGoalEatTile(this); this.goalSelector.a(0, new PathfinderGoalFloat(this)); this.goalSelector.a(1, new PathfinderGoalPanic(this, 1.25D)); this.goalSelector.a(2, new PathfinderGoalBreed(this, 1.0D)); this.goalSelector.a(3, new PathfinderGoalTempt(this, 1.1D, Items.WHEAT, false)); this.goalSelector.a(4, new PathfinderGoalFollowParent(this, 1.1D)); this.goalSelector.a(5, this.bB); this.goalSelector.a(6, new PathfinderGoalRandomStrollLand(this, 1.0D)); this.goalSelector.a(7, new PathfinderGoalLookAtPlayer(this, EntityHuman.class, 6.0F)); this.goalSelector.a(8, new PathfinderGoalRandomLookaround(this)); } protected void M() { this.bA = this.bB.f(); super.M(); } public void n() { if (this.world.isClientSide) { this.bA = Math.max(0, this.bA - 1); } super.n(); } protected void initAttributes() { super.initAttributes(); this.getAttributeInstance(GenericAttributes.maxHealth).setValue(8.0D); this.getAttributeInstance(GenericAttributes.MOVEMENT_SPEED).setValue(0.23000000417232513D); } protected void i() { super.i(); this.datawatcher.register(EntitySheep.bw, Byte.valueOf((byte) 0)); } @Nullable protected MinecraftKey J() { if (this.isSheared()) { return LootTables.P; } else { switch (this.getColor()) { case WHITE: default: return LootTables.Q; case ORANGE: return LootTables.R; case MAGENTA: return LootTables.S; case LIGHT_BLUE: return LootTables.T; case YELLOW: return LootTables.U; case LIME: return LootTables.V; case PINK: return LootTables.W; case GRAY: return LootTables.X; case SILVER: return LootTables.Y; case CYAN: return LootTables.Z; case PURPLE: return LootTables.aa; case BLUE: return LootTables.ab; case BROWN: return LootTables.ac; case GREEN: return LootTables.ad; case RED: return LootTables.ae; case BLACK: return LootTables.af; } } } public boolean a(EntityHuman entityhuman, EnumHand enumhand) { ItemStack itemstack = entityhuman.b(enumhand); if (itemstack.getItem() == Items.SHEARS && !this.isSheared() && !this.isBaby()) { if (!this.world.isClientSide) { // CraftBukkit start PlayerShearEntityEvent event = new PlayerShearEntityEvent((org.bukkit.entity.Player) entityhuman.getBukkitEntity(), this.getBukkitEntity()); this.world.getServer().getPluginManager().callEvent(event); if (event.isCancelled()) { return false; } // CraftBukkit end this.setSheared(true); int i = 1 + this.random.nextInt(3); for (int j = 0; j < i; ++j) { this.forceDrops = true; // CraftBukkit EntityItem entityitem = this.a(new ItemStack(Item.getItemOf(Blocks.WOOL), 1, this.getColor().getColorIndex()), 1.0F); this.forceDrops = false; // CraftBukkit entityitem.motY += (double) (this.random.nextFloat() * 0.05F); entityitem.motX += (double) ((this.random.nextFloat() - this.random.nextFloat()) * 0.1F); entityitem.motZ += (double) ((this.random.nextFloat() - this.random.nextFloat()) * 0.1F); } } itemstack.damage(1, entityhuman); this.a(SoundEffects.fu, 1.0F, 1.0F); } return super.a(entityhuman, enumhand); } public static void a(DataConverterManager dataconvertermanager) { EntityInsentient.a(dataconvertermanager, EntitySheep.class); } public void b(NBTTagCompound nbttagcompound) { super.b(nbttagcompound); nbttagcompound.setBoolean("Sheared", this.isSheared()); nbttagcompound.setByte("Color", (byte) this.getColor().getColorIndex()); } public void a(NBTTagCompound nbttagcompound) { super.a(nbttagcompound); this.setSheared(nbttagcompound.getBoolean("Sheared")); this.setColor(EnumColor.fromColorIndex(nbttagcompound.getByte("Color"))); } protected SoundEffect G() { return SoundEffects.fr; } protected SoundEffect bW() { return SoundEffects.ft; } protected SoundEffect bX() { return SoundEffects.fs; } protected void a(BlockPosition blockposition, Block block) { this.a(SoundEffects.fv, 0.15F, 1.0F); } public EnumColor getColor() { return EnumColor.fromColorIndex(((Byte) this.datawatcher.get(EntitySheep.bw)).byteValue() & 15); } public void setColor(EnumColor enumcolor) { byte b0 = ((Byte) this.datawatcher.get(EntitySheep.bw)).byteValue(); this.datawatcher.set(EntitySheep.bw, Byte.valueOf((byte) (b0 & 240 | enumcolor.getColorIndex() & 15))); } public boolean isSheared() { return (((Byte) this.datawatcher.get(EntitySheep.bw)).byteValue() & 16) != 0; } public void setSheared(boolean flag) { byte b0 = ((Byte) this.datawatcher.get(EntitySheep.bw)).byteValue(); if (flag) { this.datawatcher.set(EntitySheep.bw, Byte.valueOf((byte) (b0 | 16))); } else { this.datawatcher.set(EntitySheep.bw, Byte.valueOf((byte) (b0 & -17))); } } public static EnumColor a(Random random) { int i = random.nextInt(100); return i < 5 ? EnumColor.BLACK : (i < 10 ? EnumColor.GRAY : (i < 15 ? EnumColor.SILVER : (i < 18 ? EnumColor.BROWN : (random.nextInt(500) == 0 ? EnumColor.PINK : EnumColor.WHITE)))); } public EntitySheep b(EntityAgeable entityageable) { EntitySheep entitysheep = (EntitySheep) entityageable; EntitySheep entitysheep1 = new EntitySheep(this.world); entitysheep1.setColor(this.a((EntityAnimal) this, (EntityAnimal) entitysheep)); return entitysheep1; } public void A() { // CraftBukkit start SheepRegrowWoolEvent event = new SheepRegrowWoolEvent((org.bukkit.entity.Sheep) this.getBukkitEntity()); this.world.getServer().getPluginManager().callEvent(event); if (event.isCancelled()) return; // CraftBukkit end this.setSheared(false); if (this.isBaby()) { this.setAge(60); } } @Nullable public GroupDataEntity prepare(DifficultyDamageScaler difficultydamagescaler, @Nullable GroupDataEntity groupdataentity) { groupdataentity = super.prepare(difficultydamagescaler, groupdataentity); this.setColor(a(this.world.random)); return groupdataentity; } private EnumColor a(EntityAnimal entityanimal, EntityAnimal entityanimal1) { int i = ((EntitySheep) entityanimal).getColor().getInvColorIndex(); int j = ((EntitySheep) entityanimal1).getColor().getInvColorIndex(); this.container.getItem(0).setData(i); this.container.getItem(1).setData(j); ItemStack itemstack = CraftingManager.getInstance().craft(this.container, ((EntitySheep) entityanimal).world); int k; if (itemstack.getItem() == Items.DYE) { k = itemstack.getData(); } else { k = this.world.random.nextBoolean() ? i : j; } return EnumColor.fromInvColorIndex(k); } public float getHeadHeight() { return 0.95F * this.length; } public EntityAgeable createChild(EntityAgeable entityageable) { return this.b(entityageable); } static { EntitySheep.by.put(EnumColor.WHITE, new float[] { 1.0F, 1.0F, 1.0F}); EntitySheep.by.put(EnumColor.ORANGE, new float[] { 0.85F, 0.5F, 0.2F}); EntitySheep.by.put(EnumColor.MAGENTA, new float[] { 0.7F, 0.3F, 0.85F}); EntitySheep.by.put(EnumColor.LIGHT_BLUE, new float[] { 0.4F, 0.6F, 0.85F}); EntitySheep.by.put(EnumColor.YELLOW, new float[] { 0.9F, 0.9F, 0.2F}); EntitySheep.by.put(EnumColor.LIME, new float[] { 0.5F, 0.8F, 0.1F}); EntitySheep.by.put(EnumColor.PINK, new float[] { 0.95F, 0.5F, 0.65F}); EntitySheep.by.put(EnumColor.GRAY, new float[] { 0.3F, 0.3F, 0.3F}); EntitySheep.by.put(EnumColor.SILVER, new float[] { 0.6F, 0.6F, 0.6F}); EntitySheep.by.put(EnumColor.CYAN, new float[] { 0.3F, 0.5F, 0.6F}); EntitySheep.by.put(EnumColor.PURPLE, new float[] { 0.5F, 0.25F, 0.7F}); EntitySheep.by.put(EnumColor.BLUE, new float[] { 0.2F, 0.3F, 0.7F}); EntitySheep.by.put(EnumColor.BROWN, new float[] { 0.4F, 0.3F, 0.2F}); EntitySheep.by.put(EnumColor.GREEN, new float[] { 0.4F, 0.5F, 0.2F}); EntitySheep.by.put(EnumColor.RED, new float[] { 0.6F, 0.2F, 0.2F}); EntitySheep.by.put(EnumColor.BLACK, new float[] { 0.1F, 0.1F, 0.1F}); } }