net.minecraft.server.EntityEnderman Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of chest-server Show documentation
Show all versions of chest-server Show documentation
A spigot fork to kotlin structure and news.
The newest version!
package net.minecraft.server;
import com.google.common.base.Predicate;
import com.google.common.collect.Sets;
import org.bukkit.Location;
import org.bukkit.entity.Creature;
import org.bukkit.entity.Enderman;
import org.bukkit.event.entity.EntityTeleportEvent;
import org.jetbrains.annotations.NotNull;
import java.util.*;
// CraftBukkit end
public class EntityEnderman extends EntityMonster {
private static final UUID a = UUID.fromString("020E0DFB-87AE-4653-9556-831010E291A0");
private static final AttributeModifier b = (new AttributeModifier(EntityEnderman.a, "Attacking speed boost", 0.15000000596046448D, 0)).a(false);
private static final Set c = Sets.newIdentityHashSet();
static {
EntityEnderman.c.add(Blocks.GRASS);
EntityEnderman.c.add(Blocks.DIRT);
EntityEnderman.c.add(Blocks.SAND);
EntityEnderman.c.add(Blocks.GRAVEL);
EntityEnderman.c.add(Blocks.YELLOW_FLOWER);
EntityEnderman.c.add(Blocks.RED_FLOWER);
EntityEnderman.c.add(Blocks.BROWN_MUSHROOM);
EntityEnderman.c.add(Blocks.RED_MUSHROOM);
EntityEnderman.c.add(Blocks.TNT);
EntityEnderman.c.add(Blocks.CACTUS);
EntityEnderman.c.add(Blocks.CLAY);
EntityEnderman.c.add(Blocks.PUMPKIN);
EntityEnderman.c.add(Blocks.MELON_BLOCK);
EntityEnderman.c.add(Blocks.MYCELIUM);
}
private boolean bm;
public EntityEnderman(World world) {
super(world);
this.setSize(0.6F, 2.9F);
this.S = 1.0F;
this.goalSelector.a(0, new PathfinderGoalFloat(this));
this.goalSelector.a(2, new PathfinderGoalMeleeAttack(this, 1.0D, false));
this.goalSelector.a(7, new PathfinderGoalRandomStroll(this, 1.0D));
this.goalSelector.a(8, new PathfinderGoalLookAtPlayer(this, EntityHuman.class, 8.0F));
this.goalSelector.a(8, new PathfinderGoalRandomLookaround(this));
this.goalSelector.a(10, new EntityEnderman.PathfinderGoalEndermanPlaceBlock(this));
this.goalSelector.a(11, new EntityEnderman.PathfinderGoalEndermanPickupBlock(this));
this.targetSelector.a(1, new PathfinderGoalHurtByTarget(this, false));
this.targetSelector.a(2, new EntityEnderman.PathfinderGoalPlayerWhoLookedAtTarget(this));
this.targetSelector.a(3, new PathfinderGoalNearestAttackableTarget(this, EntityEndermite.class, 10, true, false, new Predicate() {
public boolean a(EntityEndermite entityendermite) {
return entityendermite.n();
}
public boolean apply(Object object) {
return this.a((EntityEndermite) object);
}
}));
}
@NotNull
@Override
public Enderman getEntity() {
return (Enderman) super.getEntity();
}
protected void initAttributes() {
super.initAttributes();
this.getAttributeInstance(GenericAttributes.maxHealth).setValue(40.0D);
this.getAttributeInstance(GenericAttributes.MOVEMENT_SPEED).setValue(0.30000001192092896D);
this.getAttributeInstance(GenericAttributes.ATTACK_DAMAGE).setValue(7.0D);
this.getAttributeInstance(GenericAttributes.FOLLOW_RANGE).setValue(64.0D);
}
protected void h() {
super.h();
this.datawatcher.a(16, new Short((short) 0));
this.datawatcher.a(17, new Byte((byte) 0));
this.datawatcher.a(18, new Byte((byte) 0));
}
public void b(NBTTagCompound nbttagcompound) {
super.b(nbttagcompound);
IBlockData iblockdata = this.getCarried();
nbttagcompound.setShort("carried", (short) Block.getId(iblockdata.getBlock()));
nbttagcompound.setShort("carriedData", (short) iblockdata.getBlock().toLegacyData(iblockdata));
}
public void a(NBTTagCompound nbttagcompound) {
super.a(nbttagcompound);
IBlockData iblockdata;
if (nbttagcompound.hasKeyOfType("carried", 8)) {
iblockdata = Block.getByName(nbttagcompound.getString("carried")).fromLegacyData(nbttagcompound.getShort("carriedData") & '\uffff');
} else {
iblockdata = Block.getById(nbttagcompound.getShort("carried")).fromLegacyData(nbttagcompound.getShort("carriedData") & '\uffff');
}
this.setCarried(iblockdata);
}
private boolean c(EntityHuman entityhuman) {
ItemStack itemstack = entityhuman.inventory.armor[3];
if (itemstack != null && itemstack.getItem() == Item.getItemOf(Blocks.PUMPKIN)) {
return false;
} else {
Vec3D vec3d = entityhuman.d(1.0F).a();
Vec3D vec3d1 = new Vec3D(this.locX - entityhuman.locX, this.getBoundingBox().b + (double) (this.length / 2.0F) - (entityhuman.locY + (double) entityhuman.getHeadHeight()), this.locZ - entityhuman.locZ);
double d0 = vec3d1.b();
vec3d1 = vec3d1.a();
double d1 = vec3d.b(vec3d1);
return d1 > 1.0D - 0.025D / d0 && entityhuman.hasLineOfSight(this);
}
}
public float getHeadHeight() {
return 2.55F;
}
public void m() {
if (this.world.isClientSide) {
for (int i = 0; i < 2; ++i) {
this.world.addParticle(EnumParticle.PORTAL, this.locX + (this.random.nextDouble() - 0.5D) * (double) this.width, this.locY + this.random.nextDouble() * (double) this.length - 0.25D, this.locZ + (this.random.nextDouble() - 0.5D) * (double) this.width, (this.random.nextDouble() - 0.5D) * 2.0D, -this.random.nextDouble(), (this.random.nextDouble() - 0.5D) * 2.0D);
}
}
this.aY = false;
super.m();
}
protected void E() {
if (this.U()) {
this.damageEntity(DamageSource.DROWN, 1.0F);
}
if (this.co() && !this.bm && this.random.nextInt(100) == 0) {
this.a(false);
}
if (this.world.w()) {
float f = this.c(1.0F);
if (f > 0.5F && this.world.i(new BlockPosition(this)) && this.random.nextFloat() * 30.0F < (f - 0.4F) * 2.0F) {
this.setGoalTarget(null);
this.a(false);
this.bm = false;
this.n();
}
}
super.E();
}
protected boolean n() {
double d0 = this.locX + (this.random.nextDouble() - 0.5D) * 64.0D;
double d1 = this.locY + (double) (this.random.nextInt(64) - 32);
double d2 = this.locZ + (this.random.nextDouble() - 0.5D) * 64.0D;
return this.k(d0, d1, d2);
}
protected boolean b(Entity entity) {
Vec3D vec3d = new Vec3D(this.locX - entity.locX, this.getBoundingBox().b + (double) (this.length / 2.0F) - entity.locY + (double) entity.getHeadHeight(), this.locZ - entity.locZ);
vec3d = vec3d.a();
double d0 = 16.0D;
double d1 = this.locX + (this.random.nextDouble() - 0.5D) * 8.0D - vec3d.a * d0;
double d2 = this.locY + (double) (this.random.nextInt(16) - 8) - vec3d.b * d0;
double d3 = this.locZ + (this.random.nextDouble() - 0.5D) * 8.0D - vec3d.c * d0;
return this.k(d1, d2, d3);
}
protected boolean k(double d0, double d1, double d2) {
double d3 = this.locX;
double d4 = this.locY;
double d5 = this.locZ;
this.locX = d0;
this.locY = d1;
this.locZ = d2;
boolean flag = false;
BlockPosition blockposition = new BlockPosition(this.locX, this.locY, this.locZ);
if (this.world.isLoaded(blockposition)) {
boolean flag1 = false;
while (!flag1 && blockposition.getY() > 0) {
BlockPosition blockposition1 = blockposition.down();
Block block = this.world.getType(blockposition1).getBlock();
if (block.getMaterial().isSolid()) {
flag1 = true;
} else {
--this.locY;
blockposition = blockposition1;
}
}
if (flag1) {
// CraftBukkit start - Teleport event
// super.enderTeleportTo(this.locX, this.locY, this.locZ);
EntityTeleportEvent teleport = new EntityTeleportEvent(this.getBukkitEntity(), new Location(this.world.getWorld(), d3, d4, d5), new Location(this.world.getWorld(), this.locX, this.locY, this.locZ));
this.world.getServer().getPluginManager().callEvent(teleport);
if (teleport.isCancelled()) {
return false;
}
Location to = teleport.getTo();
this.enderTeleportTo(to.getX(), to.getY(), to.getZ());
// CraftBukkit end
if (this.world.getCubes(this, this.getBoundingBox()).isEmpty() && !this.world.containsLiquid(this.getBoundingBox())) {
flag = true;
}
}
}
if (!flag) {
this.setPosition(d3, d4, d5);
return false;
} else {
short short0 = 128;
for (int i = 0; i < short0; ++i) {
double d6 = (double) i / ((double) short0 - 1.0D);
float f = (this.random.nextFloat() - 0.5F) * 0.2F;
float f1 = (this.random.nextFloat() - 0.5F) * 0.2F;
float f2 = (this.random.nextFloat() - 0.5F) * 0.2F;
double d7 = d3 + (this.locX - d3) * d6 + (this.random.nextDouble() - 0.5D) * (double) this.width * 2.0D;
double d8 = d4 + (this.locY - d4) * d6 + this.random.nextDouble() * (double) this.length;
double d9 = d5 + (this.locZ - d5) * d6 + (this.random.nextDouble() - 0.5D) * (double) this.width * 2.0D;
this.world.addParticle(EnumParticle.PORTAL, d7, d8, d9, f, f1, f2);
}
this.world.makeSound(d3, d4, d5, "mob.endermen.portal", 1.0F, 1.0F);
this.makeSound("mob.endermen.portal", 1.0F, 1.0F);
return true;
}
}
protected String z() {
return this.co() ? "mob.endermen.scream" : "mob.endermen.idle";
}
protected String bo() {
return "mob.endermen.hit";
}
protected String bp() {
return "mob.endermen.death";
}
protected Item getLoot() {
return Items.ENDER_PEARL;
}
protected void dropDeathLoot(boolean flag, int i) {
Item item = this.getLoot();
if (item != null) {
int j = this.random.nextInt(2 + i);
for (int k = 0; k < j; ++k) {
this.a(item, 1);
}
}
}
public IBlockData getCarried() {
return Block.getByCombinedId(this.datawatcher.getShort(16) & '\uffff');
}
public void setCarried(IBlockData iblockdata) {
this.datawatcher.watch(16, Short.valueOf((short) (Block.getCombinedId(iblockdata) & '\uffff')));
}
public boolean damageEntity(DamageSource damagesource, float f) {
if (this.isInvulnerable(damagesource)) {
return false;
} else {
if (damagesource.getEntity() == null || !(damagesource.getEntity() instanceof EntityEndermite)) {
if (!this.world.isClientSide) {
this.a(true);
}
if (damagesource instanceof EntityDamageSource && damagesource.getEntity() instanceof EntityHuman) {
if (damagesource.getEntity() instanceof EntityPlayer && ((EntityPlayer) damagesource.getEntity()).playerInteractManager.isCreative()) {
this.a(false);
} else {
this.bm = true;
}
}
if (damagesource instanceof EntityDamageSourceIndirect) {
this.bm = false;
for (int i = 0; i < 64; ++i) {
if (this.n()) {
return true;
}
}
return false;
}
}
boolean flag = super.damageEntity(damagesource, f);
if (damagesource.ignoresArmor() && this.random.nextInt(10) != 0) {
this.n();
}
return flag;
}
}
public boolean co() {
return this.datawatcher.getByte(18) > 0;
}
public void a(boolean flag) {
this.datawatcher.watch(18, Byte.valueOf((byte) (flag ? 1 : 0)));
}
static class PathfinderGoalEndermanPickupBlock extends PathfinderGoal {
private final EntityEnderman enderman;
public PathfinderGoalEndermanPickupBlock(EntityEnderman entityenderman) {
this.enderman = entityenderman;
}
public boolean a() {
return this.enderman.world.getGameRules().getBoolean("mobGriefing") && (this.enderman.getCarried().getBlock().getMaterial() == Material.AIR && this.enderman.bc().nextInt(20) == 0);
}
public void e() {
Random random = this.enderman.bc();
World world = this.enderman.world;
int i = MathHelper.floor(this.enderman.locX - 2.0D + random.nextDouble() * 4.0D);
int j = MathHelper.floor(this.enderman.locY + random.nextDouble() * 3.0D);
int k = MathHelper.floor(this.enderman.locZ - 2.0D + random.nextDouble() * 4.0D);
BlockPosition blockposition = new BlockPosition(i, j, k);
IBlockData iblockdata = world.getType(blockposition);
Block block = iblockdata.getBlock();
if (EntityEnderman.c.contains(block)) {
// CraftBukkit start - Pickup event
if (!org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(this.enderman, this.enderman.world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()), org.bukkit.Material.AIR).isCancelled()) {
this.enderman.setCarried(iblockdata);
world.setTypeUpdate(blockposition, Blocks.AIR.getBlockData());
}
// CraftBukkit end
}
}
}
static class PathfinderGoalEndermanPlaceBlock extends PathfinderGoal {
private final EntityEnderman a;
public PathfinderGoalEndermanPlaceBlock(EntityEnderman entityenderman) {
this.a = entityenderman;
}
public boolean a() {
return this.a.world.getGameRules().getBoolean("mobGriefing") && (this.a.getCarried().getBlock().getMaterial() != Material.AIR && this.a.bc().nextInt(2000) == 0);
}
public void e() {
Random random = this.a.bc();
World world = this.a.world;
int i = MathHelper.floor(this.a.locX - 1.0D + random.nextDouble() * 2.0D);
int j = MathHelper.floor(this.a.locY + random.nextDouble() * 2.0D);
int k = MathHelper.floor(this.a.locZ - 1.0D + random.nextDouble() * 2.0D);
BlockPosition blockposition = new BlockPosition(i, j, k);
Block block = world.getType(blockposition).getBlock();
Block block1 = world.getType(blockposition.down()).getBlock();
if (this.a(world, blockposition, this.a.getCarried().getBlock(), block, block1)) {
// CraftBukkit start - Place event
if (!org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(this.a, blockposition.getX(), blockposition.getY(), blockposition.getZ(), this.a.getCarried().getBlock(), this.a.getCarried().getBlock().toLegacyData(this.a.getCarried())).isCancelled()) {
world.setTypeAndData(blockposition, this.a.getCarried(), 3);
this.a.setCarried(Blocks.AIR.getBlockData());
}
// CraftBukkit end
}
}
private boolean a(World world, BlockPosition blockposition, Block block, Block block1, Block block2) {
return block.canPlace(world, blockposition) && (block1.getMaterial() == Material.AIR && (block2.getMaterial() != Material.AIR && block2.d()));
}
}
static class PathfinderGoalPlayerWhoLookedAtTarget extends PathfinderGoalNearestAttackableTarget {
private final EntityEnderman j;
private EntityHuman g;
private int h;
private int i;
public PathfinderGoalPlayerWhoLookedAtTarget(EntityEnderman entityenderman) {
super(entityenderman, EntityHuman.class, true);
this.j = entityenderman;
}
public boolean a() {
double d0 = this.f();
List list = this.e.world.a(EntityHuman.class, this.e.getBoundingBox().grow(d0, 4.0D, d0), this.c);
Collections.sort(list, this.b);
if (list.isEmpty()) {
return false;
} else {
this.g = (EntityHuman) list.get(0);
return true;
}
}
public void c() {
this.h = 5;
this.i = 0;
}
public void d() {
this.g = null;
this.j.a(false);
AttributeInstance attributeinstance = this.j.getAttributeInstance(GenericAttributes.MOVEMENT_SPEED);
attributeinstance.c(EntityEnderman.b);
super.d();
}
public boolean b() {
if (this.g != null) {
if (!this.j.c(this.g)) {
return false;
} else {
this.j.bm = true;
this.j.a(this.g, 10.0F, 10.0F);
return true;
}
} else {
return super.b();
}
}
public void e() {
if (this.g != null) {
if (--this.h <= 0) {
this.d = this.g;
this.g = null;
super.c();
this.j.makeSound("mob.endermen.stare", 1.0F, 1.0F);
this.j.a(true);
AttributeInstance attributeinstance = this.j.getAttributeInstance(GenericAttributes.MOVEMENT_SPEED);
attributeinstance.b(EntityEnderman.b);
}
} else {
if (this.d != null) {
if (this.d instanceof EntityHuman && this.j.c((EntityHuman) this.d)) {
if (this.d.h(this.j) < 16.0D) {
this.j.n();
}
this.i = 0;
} else if (this.d.h(this.j) > 256.0D && this.i++ >= 30 && this.j.b((Entity) this.d)) {
this.i = 0;
}
}
super.e();
}
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy