package net.minecraft.server; import java.util.EnumSet; import java.util.List; import java.util.Random; import java.util.function.Predicate; import javax.annotation.Nullable; public class EntityDolphin extends EntityWaterAnimal { private static final DataWatcherObject<BlockPosition> c = DataWatcher.a(EntityDolphin.class, DataWatcherRegistry.l); private static final DataWatcherObject<Boolean> d = DataWatcher.a(EntityDolphin.class, DataWatcherRegistry.i); private static final DataWatcherObject<Integer> bw = DataWatcher.a(EntityDolphin.class, DataWatcherRegistry.b); private static final PathfinderTargetCondition bx = (new PathfinderTargetCondition()).a(10.0D).b().a().c(); public static final Predicate<EntityItem> b = (entityitem) -> { return !entityitem.p() && entityitem.isAlive() && entityitem.isInWater(); }; public EntityDolphin(EntityTypes<? extends EntityDolphin> entitytypes, World world) { super(entitytypes, world); this.moveController = new EntityDolphin.a(this); this.lookController = new ControllerLookDolphin(this, 10); this.setCanPickupLoot(true); } @Nullable @Override public GroupDataEntity prepare(GeneratorAccess generatoraccess, DifficultyDamageScaler difficultydamagescaler, EnumMobSpawn enummobspawn, @Nullable GroupDataEntity groupdataentity, @Nullable NBTTagCompound nbttagcompound) { this.setAirTicks(this.bw()); this.pitch = 0.0F; return super.prepare(generatoraccess, difficultydamagescaler, enummobspawn, groupdataentity, nbttagcompound); } @Override public boolean cB() { return false; } @Override protected void a(int i) {} public void g(BlockPosition blockposition) { this.datawatcher.set(EntityDolphin.c, blockposition); } public BlockPosition l() { return (BlockPosition) this.datawatcher.get(EntityDolphin.c); } public boolean eq() { return (Boolean) this.datawatcher.get(EntityDolphin.d); } public void r(boolean flag) { this.datawatcher.set(EntityDolphin.d, flag); } public int er() { return (Integer) this.datawatcher.get(EntityDolphin.bw); } public void b(int i) { this.datawatcher.set(EntityDolphin.bw, i); } @Override protected void initDatawatcher() { super.initDatawatcher(); this.datawatcher.register(EntityDolphin.c, BlockPosition.ZERO); this.datawatcher.register(EntityDolphin.d, false); this.datawatcher.register(EntityDolphin.bw, 2400); } @Override public void b(NBTTagCompound nbttagcompound) { super.b(nbttagcompound); nbttagcompound.setInt("TreasurePosX", this.l().getX()); nbttagcompound.setInt("TreasurePosY", this.l().getY()); nbttagcompound.setInt("TreasurePosZ", this.l().getZ()); nbttagcompound.setBoolean("GotFish", this.eq()); nbttagcompound.setInt("Moistness", this.er()); } @Override public void a(NBTTagCompound nbttagcompound) { int i = nbttagcompound.getInt("TreasurePosX"); int j = nbttagcompound.getInt("TreasurePosY"); int k = nbttagcompound.getInt("TreasurePosZ"); this.g(new BlockPosition(i, j, k)); super.a(nbttagcompound); this.r(nbttagcompound.getBoolean("GotFish")); this.b(nbttagcompound.getInt("Moistness")); } @Override protected void initPathfinder() { this.goalSelector.a(0, new PathfinderGoalBreath(this)); this.goalSelector.a(0, new PathfinderGoalWater(this)); this.goalSelector.a(1, new EntityDolphin.b(this)); this.goalSelector.a(2, new EntityDolphin.c(this, 4.0D)); this.goalSelector.a(4, new PathfinderGoalRandomSwim(this, 1.0D, 10)); this.goalSelector.a(4, new PathfinderGoalRandomLookaround(this)); this.goalSelector.a(5, new PathfinderGoalLookAtPlayer(this, EntityHuman.class, 6.0F)); this.goalSelector.a(5, new PathfinderGoalWaterJump(this, 10)); this.goalSelector.a(6, new PathfinderGoalMeleeAttack(this, 1.2000000476837158D, true)); this.goalSelector.a(8, new EntityDolphin.d()); this.goalSelector.a(8, new PathfinderGoalFollowBoat(this)); this.goalSelector.a(9, new PathfinderGoalAvoidTarget<>(this, EntityGuardian.class, 8.0F, 1.0D, 1.0D)); this.targetSelector.a(1, (new PathfinderGoalHurtByTarget(this, new Class[]{EntityGuardian.class})).a()); } @Override protected void initAttributes() { super.initAttributes(); this.getAttributeInstance(GenericAttributes.MAX_HEALTH).setValue(10.0D); this.getAttributeInstance(GenericAttributes.MOVEMENT_SPEED).setValue(1.2000000476837158D); this.getAttributeMap().b(GenericAttributes.ATTACK_DAMAGE); this.getAttributeInstance(GenericAttributes.ATTACK_DAMAGE).setValue(3.0D); } @Override protected NavigationAbstract b(World world) { return new NavigationGuardian(this, world); } @Override public boolean B(Entity entity) { boolean flag = entity.damageEntity(DamageSource.mobAttack(this), (float) ((int) this.getAttributeInstance(GenericAttributes.ATTACK_DAMAGE).getValue())); if (flag) { this.a((EntityLiving) this, entity); this.a(SoundEffects.ENTITY_DOLPHIN_ATTACK, 1.0F, 1.0F); } return flag; } @Override public int bw() { return 4800; } @Override protected int m(int i) { return this.bw(); } @Override protected float b(EntityPose entitypose, EntitySize entitysize) { return 0.3F; } @Override public int dU() { return 1; } @Override public int dV() { return 1; } @Override protected boolean n(Entity entity) { return true; } @Override public boolean e(ItemStack itemstack) { EnumItemSlot enumitemslot = EntityInsentient.h(itemstack); return !this.getEquipment(enumitemslot).isEmpty() ? false : enumitemslot == EnumItemSlot.MAINHAND && super.e(itemstack); } @Override protected void a(EntityItem entityitem) { if (this.getEquipment(EnumItemSlot.MAINHAND).isEmpty()) { ItemStack itemstack = entityitem.getItemStack(); if (this.g(itemstack)) { this.setSlot(EnumItemSlot.MAINHAND, itemstack); this.dropChanceHand[EnumItemSlot.MAINHAND.b()] = 2.0F; this.receive(entityitem, itemstack.getCount()); entityitem.die(); } } } @Override public void tick() { super.tick(); if (!this.isNoAI()) { if (this.ay()) { this.b(2400); } else { this.b(this.er() - 1); if (this.er() <= 0) { this.damageEntity(DamageSource.DRYOUT, 1.0F); } if (this.onGround) { this.setMot(this.getMot().add((double) ((this.random.nextFloat() * 2.0F - 1.0F) * 0.2F), 0.5D, (double) ((this.random.nextFloat() * 2.0F - 1.0F) * 0.2F))); this.yaw = this.random.nextFloat() * 360.0F; this.onGround = false; this.impulse = true; } } if (this.world.isClientSide && this.isInWater() && this.getMot().g() > 0.03D) { Vec3D vec3d = this.f(0.0F); float f = MathHelper.cos(this.yaw * 0.017453292F) * 0.3F; float f1 = MathHelper.sin(this.yaw * 0.017453292F) * 0.3F; float f2 = 1.2F - this.random.nextFloat() * 0.7F; for (int i = 0; i < 2; ++i) { this.world.addParticle(Particles.DOLPHIN, this.locX() - vec3d.x * (double) f2 + (double) f, this.locY() - vec3d.y, this.locZ() - vec3d.z * (double) f2 + (double) f1, 0.0D, 0.0D, 0.0D); this.world.addParticle(Particles.DOLPHIN, this.locX() - vec3d.x * (double) f2 - (double) f, this.locY() - vec3d.y, this.locZ() - vec3d.z * (double) f2 - (double) f1, 0.0D, 0.0D, 0.0D); } } } } @Override protected boolean a(EntityHuman entityhuman, EnumHand enumhand) { ItemStack itemstack = entityhuman.b(enumhand); if (!itemstack.isEmpty() && itemstack.getItem().a(TagsItem.FISHES)) { if (!this.world.isClientSide) { this.a(SoundEffects.ENTITY_DOLPHIN_EAT, 1.0F, 1.0F); } this.r(true); if (!entityhuman.abilities.canInstantlyBuild) { itemstack.subtract(1); } return true; } else { return super.a(entityhuman, enumhand); } } public static boolean b(EntityTypes<EntityDolphin> entitytypes, GeneratorAccess generatoraccess, EnumMobSpawn enummobspawn, BlockPosition blockposition, Random random) { return blockposition.getY() > 45 && blockposition.getY() < generatoraccess.getSeaLevel() && (generatoraccess.getBiome(blockposition) != Biomes.OCEAN || generatoraccess.getBiome(blockposition) != Biomes.DEEP_OCEAN) && generatoraccess.getFluid(blockposition).a(TagsFluid.WATER); } @Override protected SoundEffect getSoundHurt(DamageSource damagesource) { return SoundEffects.ENTITY_DOLPHIN_HURT; } @Nullable @Override protected SoundEffect getSoundDeath() { return SoundEffects.ENTITY_DOLPHIN_DEATH; } @Nullable @Override protected SoundEffect getSoundAmbient() { return this.isInWater() ? SoundEffects.ENTITY_DOLPHIN_AMBIENT_WATER : SoundEffects.ENTITY_DOLPHIN_AMBIENT; } @Override protected SoundEffect getSoundSplash() { return SoundEffects.ENTITY_DOLPHIN_SPLASH; } @Override protected SoundEffect getSoundSwim() { return SoundEffects.ENTITY_DOLPHIN_SWIM; } protected boolean es() { BlockPosition blockposition = this.getNavigation().h(); return blockposition != null ? blockposition.a((IPosition) this.getPositionVector(), 12.0D) : false; } @Override public void e(Vec3D vec3d) { if (this.doAITick() && this.isInWater()) { this.a(this.dt(), vec3d); this.move(EnumMoveType.SELF, this.getMot()); this.setMot(this.getMot().a(0.9D)); if (this.getGoalTarget() == null) { this.setMot(this.getMot().add(0.0D, -0.005D, 0.0D)); } } else { super.e(vec3d); } } @Override public boolean a(EntityHuman entityhuman) { return true; } static class b extends PathfinderGoal { private final EntityDolphin a; private boolean b; b(EntityDolphin entitydolphin) { this.a = entitydolphin; this.a(EnumSet.of(PathfinderGoal.Type.MOVE, PathfinderGoal.Type.LOOK)); } @Override public boolean E_() { return false; } @Override public boolean a() { return this.a.eq() && this.a.getAirTicks() >= 100; } @Override public boolean b() { BlockPosition blockposition = this.a.l(); return !(new BlockPosition((double) blockposition.getX(), this.a.locY(), (double) blockposition.getZ())).a((IPosition) this.a.getPositionVector(), 4.0D) && !this.b && this.a.getAirTicks() >= 100; } @Override public void c() { if (this.a.world instanceof WorldServer) { WorldServer worldserver = (WorldServer) this.a.world; this.b = false; this.a.getNavigation().o(); BlockPosition blockposition = new BlockPosition(this.a); String s = (double) worldserver.random.nextFloat() >= 0.5D ? "Ocean_Ruin" : "Shipwreck"; BlockPosition blockposition1 = worldserver.a(s, blockposition, 50, false); if (blockposition1 == null) { BlockPosition blockposition2 = worldserver.a(s.equals("Ocean_Ruin") ? "Shipwreck" : "Ocean_Ruin", blockposition, 50, false); if (blockposition2 == null) { this.b = true; return; } this.a.g(blockposition2); } else { this.a.g(blockposition1); } worldserver.broadcastEntityEffect(this.a, (byte) 38); } } @Override public void d() { BlockPosition blockposition = this.a.l(); if ((new BlockPosition((double) blockposition.getX(), this.a.locY(), (double) blockposition.getZ())).a((IPosition) this.a.getPositionVector(), 4.0D) || this.b) { this.a.r(false); } } @Override public void e() { World world = this.a.world; if (this.a.es() || this.a.getNavigation().m()) { Vec3D vec3d = new Vec3D(this.a.l()); Vec3D vec3d1 = RandomPositionGenerator.a(this.a, 16, 1, vec3d, 0.39269909262657166D); if (vec3d1 == null) { vec3d1 = RandomPositionGenerator.a((EntityCreature) this.a, 8, 4, vec3d); } if (vec3d1 != null) { BlockPosition blockposition = new BlockPosition(vec3d1); if (!world.getFluid(blockposition).a(TagsFluid.WATER) || !world.getType(blockposition).a((IBlockAccess) world, blockposition, PathMode.WATER)) { vec3d1 = RandomPositionGenerator.a((EntityCreature) this.a, 8, 5, vec3d); } } if (vec3d1 == null) { this.b = true; return; } this.a.getControllerLook().a(vec3d1.x, vec3d1.y, vec3d1.z, (float) (this.a.dV() + 20), (float) this.a.dU()); this.a.getNavigation().a(vec3d1.x, vec3d1.y, vec3d1.z, 1.3D); if (world.random.nextInt(80) == 0) { world.broadcastEntityEffect(this.a, (byte) 38); } } } } static class c extends PathfinderGoal { private final EntityDolphin a; private final double b; private EntityHuman c; c(EntityDolphin entitydolphin, double d0) { this.a = entitydolphin; this.b = d0; this.a(EnumSet.of(PathfinderGoal.Type.MOVE, PathfinderGoal.Type.LOOK)); } @Override public boolean a() { this.c = this.a.world.a(EntityDolphin.bx, (EntityLiving) this.a); return this.c == null ? false : this.c.isSwimming(); } @Override public boolean b() { return this.c != null && this.c.isSwimming() && this.a.h((Entity) this.c) < 256.0D; } @Override public void c() { this.c.addEffect(new MobEffect(MobEffects.DOLPHINS_GRACE, 100)); } @Override public void d() { this.c = null; this.a.getNavigation().o(); } @Override public void e() { this.a.getControllerLook().a(this.c, (float) (this.a.dV() + 20), (float) this.a.dU()); if (this.a.h((Entity) this.c) < 6.25D) { this.a.getNavigation().o(); } else { this.a.getNavigation().a((Entity) this.c, this.b); } if (this.c.isSwimming() && this.c.world.random.nextInt(6) == 0) { this.c.addEffect(new MobEffect(MobEffects.DOLPHINS_GRACE, 100)); } } } class d extends PathfinderGoal { private int b; private d() {} @Override public boolean a() { if (this.b > EntityDolphin.this.ticksLived) { return false; } else { List<EntityItem> list = EntityDolphin.this.world.a(EntityItem.class, EntityDolphin.this.getBoundingBox().grow(8.0D, 8.0D, 8.0D), EntityDolphin.b); return !list.isEmpty() || !EntityDolphin.this.getEquipment(EnumItemSlot.MAINHAND).isEmpty(); } } @Override public void c() { List<EntityItem> list = EntityDolphin.this.world.a(EntityItem.class, EntityDolphin.this.getBoundingBox().grow(8.0D, 8.0D, 8.0D), EntityDolphin.b); if (!list.isEmpty()) { EntityDolphin.this.getNavigation().a((Entity) list.get(0), 1.2000000476837158D); EntityDolphin.this.a(SoundEffects.ENTITY_DOLPHIN_PLAY, 1.0F, 1.0F); } this.b = 0; } @Override public void d() { ItemStack itemstack = EntityDolphin.this.getEquipment(EnumItemSlot.MAINHAND); if (!itemstack.isEmpty()) { this.a(itemstack); EntityDolphin.this.setSlot(EnumItemSlot.MAINHAND, ItemStack.a); this.b = EntityDolphin.this.ticksLived + EntityDolphin.this.random.nextInt(100); } } @Override public void e() { List<EntityItem> list = EntityDolphin.this.world.a(EntityItem.class, EntityDolphin.this.getBoundingBox().grow(8.0D, 8.0D, 8.0D), EntityDolphin.b); ItemStack itemstack = EntityDolphin.this.getEquipment(EnumItemSlot.MAINHAND); if (!itemstack.isEmpty()) { this.a(itemstack); EntityDolphin.this.setSlot(EnumItemSlot.MAINHAND, ItemStack.a); } else if (!list.isEmpty()) { EntityDolphin.this.getNavigation().a((Entity) list.get(0), 1.2000000476837158D); } } private void a(ItemStack itemstack) { if (!itemstack.isEmpty()) { double d0 = EntityDolphin.this.getHeadY() - 0.30000001192092896D; EntityItem entityitem = new EntityItem(EntityDolphin.this.world, EntityDolphin.this.locX(), d0, EntityDolphin.this.locZ(), itemstack); entityitem.setPickupDelay(40); entityitem.setThrower(EntityDolphin.this.getUniqueID()); float f = 0.3F; float f1 = EntityDolphin.this.random.nextFloat() * 6.2831855F; float f2 = 0.02F * EntityDolphin.this.random.nextFloat(); entityitem.setMot((double) (0.3F * -MathHelper.sin(EntityDolphin.this.yaw * 0.017453292F) * MathHelper.cos(EntityDolphin.this.pitch * 0.017453292F) + MathHelper.cos(f1) * f2), (double) (0.3F * MathHelper.sin(EntityDolphin.this.pitch * 0.017453292F) * 1.5F), (double) (0.3F * MathHelper.cos(EntityDolphin.this.yaw * 0.017453292F) * MathHelper.cos(EntityDolphin.this.pitch * 0.017453292F) + MathHelper.sin(f1) * f2)); EntityDolphin.this.world.addEntity(entityitem); } } } static class a extends ControllerMove { private final EntityDolphin i; public a(EntityDolphin entitydolphin) { super(entitydolphin); this.i = entitydolphin; } @Override public void a() { if (this.i.isInWater()) { this.i.setMot(this.i.getMot().add(0.0D, 0.005D, 0.0D)); } if (this.h == ControllerMove.Operation.MOVE_TO && !this.i.getNavigation().m()) { double d0 = this.b - this.i.locX(); double d1 = this.c - this.i.locY(); double d2 = this.d - this.i.locZ(); double d3 = d0 * d0 + d1 * d1 + d2 * d2; if (d3 < 2.500000277905201E-7D) { this.a.r(0.0F); } else { float f = (float) (MathHelper.d(d2, d0) * 57.2957763671875D) - 90.0F; this.i.yaw = this.a(this.i.yaw, f, 10.0F); this.i.aI = this.i.yaw; this.i.aK = this.i.yaw; float f1 = (float) (this.e * this.i.getAttributeInstance(GenericAttributes.MOVEMENT_SPEED).getValue()); if (this.i.isInWater()) { this.i.o(f1 * 0.02F); float f2 = -((float) (MathHelper.d(d1, (double) MathHelper.sqrt(d0 * d0 + d2 * d2)) * 57.2957763671875D)); f2 = MathHelper.a(MathHelper.g(f2), -85.0F, 85.0F); this.i.pitch = this.a(this.i.pitch, f2, 5.0F); float f3 = MathHelper.cos(this.i.pitch * 0.017453292F); float f4 = MathHelper.sin(this.i.pitch * 0.017453292F); this.i.bb = f3 * f1; this.i.ba = -f4 * f1; } else { this.i.o(f1 * 0.1F); } } } else { this.i.o(0.0F); this.i.t(0.0F); this.i.s(0.0F); this.i.r(0.0F); } } } }