package com.team.kalstuff.entity; import java.util.Set; import javax.annotation.Nullable; import com.google.common.collect.Sets; import net.minecraft.block.Block; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityAgeable; import net.minecraft.entity.EntityLiving; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.SharedMonsterAttributes; import net.minecraft.entity.ai.EntityAIFollowParent; import net.minecraft.entity.ai.EntityAILookIdle; import net.minecraft.entity.ai.EntityAIPanic; import net.minecraft.entity.ai.EntityAISwimming; import net.minecraft.entity.ai.EntityAITempt; import net.minecraft.entity.passive.EntityAnimal; import net.minecraft.entity.passive.EntityChicken; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Items; import net.minecraft.init.SoundEvents; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.pathfinding.PathNodeType; import net.minecraft.util.ResourceLocation; import net.minecraft.util.SoundEvent; import net.minecraft.util.datafix.DataFixer; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; import net.minecraft.world.World; import net.minecraft.world.storage.loot.LootTableList; public class EntityDuck extends EntityAnimal { private static final Set<Item> TEMPTATION_ITEMS = Sets.newHashSet(new Item[] {Items.BREAD}); public float wingRotation; public float destPos; public float oFlapSpeed; public float oFlap; public float wingRotDelta = 1.0F; /** The time until the next egg is spawned. */ public int timeUntilNextEgg; public boolean chickenJockey; public EntityDuck(World worldIn) { super(worldIn); this.setSize(0.4F, 0.7F); this.timeUntilNextEgg = this.rand.nextInt(6000) + 6000; this.setPathPriority(PathNodeType.WATER, 0.0F); } protected void initEntityAI() { this.tasks.addTask(0, new EntityAISwimming(this)); this.tasks.addTask(1, new EntityAIPanic(this, 1.4D)); this.tasks.addTask(3, new EntityAITempt(this, 1.0D, false, TEMPTATION_ITEMS)); this.tasks.addTask(4, new EntityAIFollowParent(this, 1.1D)); this.tasks.addTask(7, new EntityAILookIdle(this)); } public float getEyeHeight() { return this.height; } protected void applyEntityAttributes() { super.applyEntityAttributes(); this.getEntityAttribute(SharedMonsterAttributes.MAX_HEALTH).setBaseValue(4.0D); this.getEntityAttribute(SharedMonsterAttributes.MOVEMENT_SPEED).setBaseValue(0.25D); } /** * Called frequently so the entity can update its state every tick as required. For example, zombies and skeletons * use this to react to sunlight and start to burn. */ public void onLivingUpdate() { super.onLivingUpdate(); this.oFlap = this.wingRotation; this.oFlapSpeed = this.destPos; this.destPos = (float)((double)this.destPos + (double)(this.onGround ? -1 : 4) * 0.3D); this.destPos = MathHelper.clamp(this.destPos, 0.0F, 1.0F); if (!this.onGround && this.wingRotDelta < 1.0F) { this.wingRotDelta = 1.0F; } this.wingRotDelta = (float)((double)this.wingRotDelta * 0.9D); if (!this.onGround && this.motionY < 0.0D) { this.motionY *= 0.6D; } this.wingRotation += this.wingRotDelta * 2.0F; if (!this.world.isRemote && !this.isChild() && !this.isChickenJockey() && --this.timeUntilNextEgg <= 0) { this.playSound(SoundEvents.ENTITY_CHICKEN_EGG, 1.0F, (this.rand.nextFloat() - this.rand.nextFloat()) * 0.2F + 1.0F); this.dropItem(Items.EGG, 1); this.timeUntilNextEgg = this.rand.nextInt(6000) + 6000; } } public void fall(float distance, float damageMultiplier) { } protected SoundEvent getAmbientSound() { return SoundEvents.ENTITY_CHICKEN_AMBIENT; } protected SoundEvent getHurtSound() { return SoundEvents.ENTITY_CHICKEN_HURT; } protected SoundEvent getDeathSound() { return SoundEvents.ENTITY_CHICKEN_DEATH; } protected void playStepSound(BlockPos pos, Block blockIn) { this.playSound(SoundEvents.ENTITY_CHICKEN_STEP, 0.15F, 1.0F); } @Nullable protected ResourceLocation getLootTable() { return LootTableList.ENTITIES_CHICKEN; } public EntityDuck createChild(EntityAgeable ageable) { return new EntityDuck(this.world); } /** * Checks if the parameter is an item which this animal can be fed to breed it (wheat, carrots or seeds depending on * the animal type) */ public boolean isBreedingItem(ItemStack stack) { return TEMPTATION_ITEMS.contains(stack.getItem()); } /** * Get the experience points the entity currently has. */ protected int getExperiencePoints(EntityPlayer player) { return 200; } public static void registerFixesChicken(DataFixer fixer) { EntityLiving.registerFixesMob(fixer, EntityChicken.class); } /** * (abstract) Protected helper method to read subclass entity data from NBT. */ public void readEntityFromNBT(NBTTagCompound compound) { super.readEntityFromNBT(compound); this.chickenJockey = compound.getBoolean("IsChickenJockey"); if (compound.hasKey("EggLayTime")) { this.timeUntilNextEgg = compound.getInteger("EggLayTime"); } } /** * (abstract) Protected helper method to write subclass entity data to NBT. */ public void writeEntityToNBT(NBTTagCompound compound) { super.writeEntityToNBT(compound); compound.setBoolean("IsChickenJockey", this.chickenJockey); compound.setInteger("EggLayTime", this.timeUntilNextEgg); } /** * Determines if an entity can be despawned, used on idle far away entities */ protected boolean canDespawn() { return false; } public void updatePassenger(Entity passenger) { super.updatePassenger(passenger); float f = MathHelper.sin(this.renderYawOffset * 0.017453292F); float f1 = MathHelper.cos(this.renderYawOffset * 0.017453292F); passenger.setPosition(this.posX + (double)(0.1F * f), this.posY + (double)(this.height * 0.5F) + passenger.getYOffset() + 0.0D, this.posZ - (double)(0.1F * f1)); if (passenger instanceof EntityLivingBase) { ((EntityLivingBase)passenger).renderYawOffset = this.renderYawOffset; } } /** * Determines if this chicken is a jockey with a zombie riding it. */ public boolean isChickenJockey() { return this.chickenJockey; } /** * Sets whether this chicken is a jockey or not. */ public void setChickenJockey(boolean jockey) { this.chickenJockey = jockey; } }