package net.minecraft.server; import java.util.Random; import javax.annotation.Nullable; public class EntitySpider extends EntityMonster { private static final DataWatcherObject<Byte> a = DataWatcher.a(EntitySpider.class, DataWatcherRegistry.a); public EntitySpider(World world) { super(world); this.setSize(1.4F, 0.9F); } public static void c(DataConverterManager dataconvertermanager) { EntityInsentient.a(dataconvertermanager, EntitySpider.class); } protected void r() { this.goalSelector.a(1, new PathfinderGoalFloat(this)); this.goalSelector.a(3, new PathfinderGoalLeapAtTarget(this, 0.4F)); this.goalSelector.a(4, new EntitySpider.PathfinderGoalSpiderMeleeAttack(this)); this.goalSelector.a(5, new PathfinderGoalRandomStrollLand(this, 0.8D)); this.goalSelector.a(6, new PathfinderGoalLookAtPlayer(this, EntityHuman.class, 8.0F)); this.goalSelector.a(6, new PathfinderGoalRandomLookaround(this)); this.targetSelector.a(1, new PathfinderGoalHurtByTarget(this, false, new Class[0])); this.targetSelector.a(2, new EntitySpider.PathfinderGoalSpiderNearestAttackableTarget(this, EntityHuman.class)); this.targetSelector.a(3, new EntitySpider.PathfinderGoalSpiderNearestAttackableTarget(this, EntityIronGolem.class)); } public double ay() { return (double) (this.length * 0.5F); } protected NavigationAbstract b(World world) { return new NavigationSpider(this, world); } protected void i() { super.i(); this.datawatcher.register(EntitySpider.a, Byte.valueOf((byte) 0)); } public void A_() { super.A_(); if (!this.world.isClientSide) { this.a(this.positionChanged); } } protected void initAttributes() { super.initAttributes(); this.getAttributeInstance(GenericAttributes.maxHealth).setValue(16.0D); this.getAttributeInstance(GenericAttributes.MOVEMENT_SPEED).setValue(0.30000001192092896D); } protected SoundEffect G() { return SoundEffects.gy; } protected SoundEffect bW() { return SoundEffects.gA; } protected SoundEffect bX() { return SoundEffects.gz; } protected void a(BlockPosition blockposition, Block block) { this.a(SoundEffects.gB, 0.15F, 1.0F); } @Nullable protected MinecraftKey J() { return LootTables.s; } public boolean m_() { return this.o(); } public void aS() {} public EnumMonsterType getMonsterType() { return EnumMonsterType.ARTHROPOD; } public boolean d(MobEffect mobeffect) { return mobeffect.getMobEffect() == MobEffects.POISON ? false : super.d(mobeffect); } public boolean o() { return (((Byte) this.datawatcher.get(EntitySpider.a)).byteValue() & 1) != 0; } public void a(boolean flag) { byte b0 = ((Byte) this.datawatcher.get(EntitySpider.a)).byteValue(); if (flag) { b0 = (byte) (b0 | 1); } else { b0 &= -2; } this.datawatcher.set(EntitySpider.a, Byte.valueOf(b0)); } @Nullable public GroupDataEntity prepare(DifficultyDamageScaler difficultydamagescaler, @Nullable GroupDataEntity groupdataentity) { Object object = super.prepare(difficultydamagescaler, groupdataentity); if (this.world.random.nextInt(100) == 0) { EntitySkeleton entityskeleton = new EntitySkeleton(this.world); entityskeleton.setPositionRotation(this.locX, this.locY, this.locZ, this.yaw, 0.0F); entityskeleton.prepare(difficultydamagescaler, (GroupDataEntity) null); this.world.addEntity(entityskeleton, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.JOCKEY); // CraftBukkit - add SpawnReason entityskeleton.startRiding(this); } if (object == null) { object = new EntitySpider.GroupDataSpider(); if (this.world.getDifficulty() == EnumDifficulty.HARD && this.world.random.nextFloat() < 0.1F * difficultydamagescaler.d()) { ((EntitySpider.GroupDataSpider) object).a(this.world.random); } } if (object instanceof EntitySpider.GroupDataSpider) { MobEffectList mobeffectlist = ((EntitySpider.GroupDataSpider) object).a; if (mobeffectlist != null) { this.addEffect(new MobEffect(mobeffectlist, Integer.MAX_VALUE)); } } return (GroupDataEntity) object; } public float getHeadHeight() { return 0.65F; } static class PathfinderGoalSpiderNearestAttackableTarget<T extends EntityLiving> extends PathfinderGoalNearestAttackableTarget<T> { public PathfinderGoalSpiderNearestAttackableTarget(EntitySpider entityspider, Class<T> oclass) { super(entityspider, oclass, true); } public boolean a() { float f = this.e.e(1.0F); return f >= 0.5F ? false : super.a(); } } static class PathfinderGoalSpiderMeleeAttack extends PathfinderGoalMeleeAttack { public PathfinderGoalSpiderMeleeAttack(EntitySpider entityspider) { super(entityspider, 1.0D, true); } public boolean b() { float f = this.b.e(1.0F); if (f >= 0.5F && this.b.getRandom().nextInt(100) == 0) { this.b.setGoalTarget((EntityLiving) null); return false; } else { return super.b(); } } protected double a(EntityLiving entityliving) { return (double) (4.0F + entityliving.width); } } public static class GroupDataSpider implements GroupDataEntity { public MobEffectList a; public GroupDataSpider() {} public void a(Random random) { int i = random.nextInt(5); if (i <= 1) { this.a = MobEffects.FASTER_MOVEMENT; } else if (i <= 2) { this.a = MobEffects.INCREASE_DAMAGE; } else if (i <= 3) { this.a = MobEffects.REGENERATION; } else if (i <= 4) { this.a = MobEffects.INVISIBILITY; } } } }