All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.minecraft.server.EntityRabbit Maven / Gradle / Ivy

package net.minecraft.server;

import org.bukkit.entity.Rabbit;
import org.jetbrains.annotations.NotNull;

public class EntityRabbit extends EntityAnimal {

  private final EntityHuman bv;
  private EntityRabbit.PathfinderGoalRabbitAvoidTarget bm;
  private int bo = 0;
  private int bp = 0;
  private boolean bq = false;
  private boolean br = false;
  private int bs = 0;
  private EntityRabbit.EnumRabbitState bt;
  private int bu;

  @NotNull
  @Override
  public Rabbit getEntity() {
    return (Rabbit) super.getEntity();
  }

  public EntityRabbit(World world) {
    super(world);
    this.bt = EntityRabbit.EnumRabbitState.HOP;
    this.bu = 0;
    this.bv = null;
    this.setSize(0.6F, 0.7F);
    this.g = new EntityRabbit.ControllerJumpRabbit(this);
    this.moveController = new EntityRabbit.ControllerMoveRabbit(this);
    ((Navigation) this.getNavigation()).a(true);
    this.initializePathFinderGoals(); // CraftBukkit - moved code
    this.b(0.0D);
  }

  // CraftBukkit start - code from constructor
  public void initializePathFinderGoals() {
    this.navigation.a(2.5F);
    this.goalSelector.a(1, new PathfinderGoalFloat(this));
    this.goalSelector.a(1, new EntityRabbit.PathfinderGoalRabbitPanic(this, 1.33D));
    this.goalSelector.a(2, new PathfinderGoalTempt(this, 1.0D, Items.CARROT, false));
    this.goalSelector.a(2, new PathfinderGoalTempt(this, 1.0D, Items.GOLDEN_CARROT, false));
    this.goalSelector.a(2, new PathfinderGoalTempt(this, 1.0D, Item.getItemOf(Blocks.YELLOW_FLOWER), false));
    this.goalSelector.a(3, new PathfinderGoalBreed(this, 0.8D));
    this.goalSelector.a(5, new EntityRabbit.PathfinderGoalEatCarrots(this));
    this.goalSelector.a(5, new PathfinderGoalRandomStroll(this, 0.6D));
    this.goalSelector.a(11, new PathfinderGoalLookAtPlayer(this, EntityHuman.class, 10.0F));
    this.bm = new EntityRabbit.PathfinderGoalRabbitAvoidTarget(this, EntityWolf.class, 16.0F, 1.33D, 1.33D);
    this.goalSelector.a(4, this.bm);
  }
  // CraftBukkit end

  protected float bE() {
    return this.moveController.a() && this.moveController.e() > this.locY + 0.5D ? 0.5F : this.bt.b();
  }

  public void a(EntityRabbit.EnumRabbitState entityrabbit_enumrabbitstate) {
    this.bt = entityrabbit_enumrabbitstate;
  }

  public void b(double d0) {
    this.getNavigation().a(d0);
    this.moveController.a(this.moveController.d(), this.moveController.e(), this.moveController.f(), d0);
  }

  public void a(boolean flag, EntityRabbit.EnumRabbitState entityrabbit_enumrabbitstate) {
    super.i(flag);
    if (!flag) {
      if (this.bt == EntityRabbit.EnumRabbitState.ATTACK) {
        this.bt = EntityRabbit.EnumRabbitState.HOP;
      }
    } else {
      this.b(1.5D * (double) entityrabbit_enumrabbitstate.a());
      this.makeSound(this.cm(), this.bB(), ((this.random.nextFloat() - this.random.nextFloat()) * 0.2F + 1.0F) * 0.8F);
    }

    this.bq = flag;
  }

  public void b(EntityRabbit.EnumRabbitState entityrabbit_enumrabbitstate) {
    this.a(true, entityrabbit_enumrabbitstate);
    this.bp = entityrabbit_enumrabbitstate.d();
    this.bo = 0;
  }

  public boolean cl() {
    return this.bq;
  }

  protected void h() {
    super.h();
    this.datawatcher.a(18, Byte.valueOf((byte) 0));
  }

  public void E() {
    if (this.moveController.b() > 0.8D) {
      this.a(EntityRabbit.EnumRabbitState.SPRINT);
    } else if (this.bt != EntityRabbit.EnumRabbitState.ATTACK) {
      this.a(EntityRabbit.EnumRabbitState.HOP);
    }

    if (this.bs > 0) {
      --this.bs;
    }

    if (this.bu > 0) {
      this.bu -= this.random.nextInt(3);
      if (this.bu < 0) {
        this.bu = 0;
      }
    }

    if (this.onGround) {
      if (!this.br) {
        this.a(false, EntityRabbit.EnumRabbitState.NONE);
        this.cw();
      }

      if (this.getRabbitType() == 99 && this.bs == 0) {
        EntityLiving entityliving = this.getGoalTarget();

        if (entityliving != null && this.h(entityliving) < 16.0D) {
          this.a(entityliving.locX, entityliving.locZ);
          this.moveController.a(entityliving.locX, entityliving.locY, entityliving.locZ, this.moveController.b());
          this.b(EntityRabbit.EnumRabbitState.ATTACK);
          this.br = true;
        }
      }

      EntityRabbit.ControllerJumpRabbit entityrabbit_controllerjumprabbit = (EntityRabbit.ControllerJumpRabbit) this.g;

      if (!entityrabbit_controllerjumprabbit.c()) {
        if (this.moveController.a() && this.bs == 0) {
          PathEntity pathentity = this.navigation.j();
          Vec3D vec3d = new Vec3D(this.moveController.d(), this.moveController.e(), this.moveController.f());

          if (pathentity != null && pathentity.e() < pathentity.d()) {
            vec3d = pathentity.a(this);
          }

          this.a(vec3d.a, vec3d.c);
          this.b(this.bt);
        }
      } else if (!entityrabbit_controllerjumprabbit.d()) {
        this.ct();
      }
    }

    this.br = this.onGround;
  }

  public void Y() {
  }

  private void a(double d0, double d1) {
    this.yaw = (float) (MathHelper.b(d1 - this.locZ, d0 - this.locX) * 180.0D / 3.1415927410125732D) - 90.0F;
  }

  private void ct() {
    ((EntityRabbit.ControllerJumpRabbit) this.g).a(true);
  }

  private void cu() {
    ((EntityRabbit.ControllerJumpRabbit) this.g).a(false);
  }

  private void cv() {
    this.bs = this.co();
  }

  private void cw() {
    this.cv();
    this.cu();
  }

  public void m() {
    super.m();
    if (this.bo != this.bp) {
      if (this.bo == 0 && !this.world.isClientSide) {
        this.world.broadcastEntityEffect(this, (byte) 1);
      }

      ++this.bo;
    } else if (this.bp != 0) {
      this.bo = 0;
      this.bp = 0;
    }

  }

  protected void initAttributes() {
    super.initAttributes();
    this.getAttributeInstance(GenericAttributes.maxHealth).setValue(10.0D);
    this.getAttributeInstance(GenericAttributes.MOVEMENT_SPEED).setValue(0.30000001192092896D);
  }

  public void b(NBTTagCompound nbttagcompound) {
    super.b(nbttagcompound);
    nbttagcompound.setInt("RabbitType", this.getRabbitType());
    nbttagcompound.setInt("MoreCarrotTicks", this.bu);
  }

  public void a(NBTTagCompound nbttagcompound) {
    super.a(nbttagcompound);
    this.setRabbitType(nbttagcompound.getInt("RabbitType"));
    this.bu = nbttagcompound.getInt("MoreCarrotTicks");
  }

  protected String cm() {
    return "mob.rabbit.hop";
  }

  protected String z() {
    return "mob.rabbit.idle";
  }

  protected String bo() {
    return "mob.rabbit.hurt";
  }

  protected String bp() {
    return "mob.rabbit.death";
  }

  public boolean r(Entity entity) {
    if (this.getRabbitType() == 99) {
      this.makeSound("mob.attack", 1.0F, (this.random.nextFloat() - this.random.nextFloat()) * 0.2F + 1.0F);
      return entity.damageEntity(DamageSource.mobAttack(this), 8.0F);
    } else {
      return entity.damageEntity(DamageSource.mobAttack(this), 3.0F);
    }
  }

  public int br() {
    return this.getRabbitType() == 99 ? 8 : super.br();
  }

  public boolean damageEntity(DamageSource damagesource, float f) {
    return !this.isInvulnerable(damagesource) && super.damageEntity(damagesource, f);
  }

  protected void getRareDrop() {
    this.a(new ItemStack(Items.RABBIT_FOOT, 1), 0.0F);
  }

  protected void dropDeathLoot(boolean flag, int i) {
    int j = this.random.nextInt(2) + this.random.nextInt(1 + i);

    int k;

    for (k = 0; k < j; ++k) {
      this.a(Items.RABBIT_HIDE, 1);
    }

    j = this.random.nextInt(2);

    for (k = 0; k < j; ++k) {
      if (this.isBurning()) {
        this.a(Items.COOKED_RABBIT, 1);
      } else {
        this.a(Items.RABBIT, 1);
      }
    }

  }

  private boolean a(Item item) {
    return item == Items.CARROT || item == Items.GOLDEN_CARROT || item == Item.getItemOf(Blocks.YELLOW_FLOWER);
  }

  public EntityRabbit b(EntityAgeable entityageable) {
    EntityRabbit entityrabbit = new EntityRabbit(this.world);

    if (entityageable instanceof EntityRabbit) {
      entityrabbit.setRabbitType(this.random.nextBoolean() ? this.getRabbitType() : ((EntityRabbit) entityageable).getRabbitType());
    }

    return entityrabbit;
  }

  public boolean d(ItemStack itemstack) {
    return itemstack != null && this.a(itemstack.getItem());
  }

  public int getRabbitType() {
    return this.datawatcher.getByte(18);
  }

  public void setRabbitType(int i) {
    if (i == 99) {
      this.goalSelector.a(this.bm);
      this.goalSelector.a(4, new EntityRabbit.PathfinderGoalKillerRabbitMeleeAttack(this));
      this.targetSelector.a(1, new PathfinderGoalHurtByTarget(this, false));
      this.targetSelector.a(2, new PathfinderGoalNearestAttackableTarget(this, EntityHuman.class, true));
      this.targetSelector.a(2, new PathfinderGoalNearestAttackableTarget(this, EntityWolf.class, true));
      if (!this.hasCustomName()) {
        this.setCustomName(LocaleI18n.get("entity.KillerBunny.name"));
      }
    }

    this.datawatcher.watch(18, Byte.valueOf((byte) i));
  }

  public GroupDataEntity prepare(DifficultyDamageScaler difficultydamagescaler, GroupDataEntity groupdataentity) {
    Object object = super.prepare(difficultydamagescaler, groupdataentity);
    int i = this.random.nextInt(6);
    boolean flag = false;

    if (object instanceof EntityRabbit.GroupDataRabbit) {
      i = ((EntityRabbit.GroupDataRabbit) object).a;
      flag = true;
    } else {
      object = new EntityRabbit.GroupDataRabbit(i);
    }

    this.setRabbitType(i);
    if (flag) {
      this.setAgeRaw(-24000);
    }

    return (GroupDataEntity) object;
  }

  private boolean cx() {
    return this.bu == 0;
  }

  protected int co() {
    return this.bt.c();
  }

  protected void cp() {
    this.world.addParticle(EnumParticle.BLOCK_DUST, this.locX + (double) (this.random.nextFloat() * this.width * 2.0F) - (double) this.width, this.locY + 0.5D + (double) (this.random.nextFloat() * this.length), this.locZ + (double) (this.random.nextFloat() * this.width * 2.0F) - (double) this.width, 0.0D, 0.0D, 0.0D, Block.getCombinedId(Blocks.CARROTS.fromLegacyData(7)));
    this.bu = 100;
  }

  public EntityAgeable createChild(EntityAgeable entityageable) {
    return this.b(entityageable);
  }

  enum EnumRabbitState {

    NONE(0.0F, 0.0F, 30, 1), HOP(0.8F, 0.2F, 20, 10), STEP(1.0F, 0.45F, 14, 14), SPRINT(1.75F, 0.4F, 1, 8), ATTACK(2.0F, 0.7F, 7, 8);

    private final float f;
    private final float g;
    private final int h;
    private final int i;

    EnumRabbitState(float f, float f1, int i, int j) {
      this.f = f;
      this.g = f1;
      this.h = i;
      this.i = j;
    }

    public float a() {
      return this.f;
    }

    public float b() {
      return this.g;
    }

    public int c() {
      return this.h;
    }

    public int d() {
      return this.i;
    }
  }

  static class PathfinderGoalKillerRabbitMeleeAttack extends PathfinderGoalMeleeAttack {

    public PathfinderGoalKillerRabbitMeleeAttack(EntityRabbit entityrabbit) {
      super(entityrabbit, EntityLiving.class, 1.4D, true);
    }

    protected double a(EntityLiving entityliving) {
      return 4.0F + entityliving.width;
    }
  }

  static class PathfinderGoalRabbitPanic extends PathfinderGoalPanic {

    private final EntityRabbit b;

    public PathfinderGoalRabbitPanic(EntityRabbit entityrabbit, double d0) {
      super(entityrabbit, d0);
      this.b = entityrabbit;
    }

    public void e() {
      super.e();
      this.b.b(this.a);
    }
  }

  static class PathfinderGoalEatCarrots extends PathfinderGoalGotoTarget {

    private final EntityRabbit c;
    private boolean d;
    private boolean e = false;

    public PathfinderGoalEatCarrots(EntityRabbit entityrabbit) {
      super(entityrabbit, 0.699999988079071D, 16);
      this.c = entityrabbit;
    }

    public boolean a() {
      if (this.a <= 0) {
        if (!this.c.world.getGameRules().getBoolean("mobGriefing")) {
          return false;
        }

        this.e = false;
        this.d = this.c.cx();
      }

      return super.a();
    }

    public boolean b() {
      return this.e && super.b();
    }

    public void c() {
      super.c();
    }

    public void d() {
      super.d();
    }

    public void e() {
      super.e();
      this.c.getControllerLook().a((double) this.b.getX() + 0.5D, this.b.getY() + 1, (double) this.b.getZ() + 0.5D, 10.0F, (float) this.c.bQ());
      if (this.f()) {
        World world = this.c.world;
        BlockPosition blockposition = this.b.up();
        IBlockData iblockdata = world.getType(blockposition);
        Block block = iblockdata.getBlock();

        if (this.e && block instanceof BlockCarrots && iblockdata.get(BlockCarrots.AGE).intValue() == 7) {
          world.setTypeAndData(blockposition, Blocks.AIR.getBlockData(), 2);
          world.setAir(blockposition, true);
          this.c.cp();
        }

        this.e = false;
        this.a = 10;
      }

    }

    protected boolean a(World world, BlockPosition blockposition) {
      Block block = world.getType(blockposition).getBlock();

      if (block == Blocks.FARMLAND) {
        blockposition = blockposition.up();
        IBlockData iblockdata = world.getType(blockposition);

        block = iblockdata.getBlock();
        if (block instanceof BlockCarrots && iblockdata.get(BlockCarrots.AGE).intValue() == 7 && this.d && !this.e) {
          this.e = true;
          return true;
        }
      }

      return false;
    }
  }

  static class PathfinderGoalRabbitAvoidTarget extends PathfinderGoalAvoidTarget {

    private final EntityRabbit c;

    public PathfinderGoalRabbitAvoidTarget(EntityRabbit entityrabbit, Class oclass, float f, double d0, double d1) {
      super(entityrabbit, oclass, f, d0, d1);
      this.c = entityrabbit;
    }

    public void e() {
      super.e();
    }
  }

  static class ControllerMoveRabbit extends ControllerMove {

    private final EntityRabbit g;

    public ControllerMoveRabbit(EntityRabbit entityrabbit) {
      super(entityrabbit);
      this.g = entityrabbit;
    }

    public void c() {
      if (this.g.onGround && !this.g.cl()) {
        this.g.b(0.0D);
      }

      super.c();
    }
  }

  public static class GroupDataRabbit implements GroupDataEntity {

    public int a;

    public GroupDataRabbit(int i) {
      this.a = i;
    }
  }

  public class ControllerJumpRabbit extends ControllerJump {

    private final EntityRabbit c;
    private boolean d = false;

    public ControllerJumpRabbit(EntityRabbit entityrabbit) {
      super(entityrabbit);
      this.c = entityrabbit;
    }

    public boolean c() {
      return this.a;
    }

    public boolean d() {
      return this.d;
    }

    public void a(boolean flag) {
      this.d = flag;
    }

    public void b() {
      if (this.a) {
        this.c.b(EntityRabbit.EnumRabbitState.STEP);
        this.a = false;
      }

    }
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy