package org.bukkit.craftbukkit.entity; import com.google.common.base.Function; import com.google.common.base.Preconditions; import com.google.common.base.Predicates; import com.google.common.collect.Lists; import java.util.List; import java.util.Set; import java.util.UUID; import net.minecraft.core.BlockPosition; import net.minecraft.nbt.NBTBase; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.chat.IChatBaseComponent; import net.minecraft.server.level.EntityPlayer; import net.minecraft.server.level.PlayerChunkMap; import net.minecraft.server.level.WorldServer; import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityAreaEffectCloud; import net.minecraft.world.entity.EntityCreature; import net.minecraft.world.entity.EntityExperienceOrb; import net.minecraft.world.entity.EntityFlying; import net.minecraft.world.entity.EntityLightning; import net.minecraft.world.entity.EntityLiving; import net.minecraft.world.entity.EntityTameableAnimal; import net.minecraft.world.entity.GlowSquid; import net.minecraft.world.entity.Marker; import net.minecraft.world.entity.ambient.EntityAmbient; import net.minecraft.world.entity.ambient.EntityBat; import net.minecraft.world.entity.animal.EntityAnimal; import net.minecraft.world.entity.animal.EntityBee; import net.minecraft.world.entity.animal.EntityCat; import net.minecraft.world.entity.animal.EntityChicken; import net.minecraft.world.entity.animal.EntityCod; import net.minecraft.world.entity.animal.EntityCow; import net.minecraft.world.entity.animal.EntityDolphin; import net.minecraft.world.entity.animal.EntityFish; import net.minecraft.world.entity.animal.EntityFox; import net.minecraft.world.entity.animal.EntityGolem; import net.minecraft.world.entity.animal.EntityIronGolem; import net.minecraft.world.entity.animal.EntityMushroomCow; import net.minecraft.world.entity.animal.EntityOcelot; import net.minecraft.world.entity.animal.EntityPanda; import net.minecraft.world.entity.animal.EntityParrot; import net.minecraft.world.entity.animal.EntityPig; import net.minecraft.world.entity.animal.EntityPolarBear; import net.minecraft.world.entity.animal.EntityPufferFish; import net.minecraft.world.entity.animal.EntityRabbit; import net.minecraft.world.entity.animal.EntitySalmon; import net.minecraft.world.entity.animal.EntitySheep; import net.minecraft.world.entity.animal.EntitySnowman; import net.minecraft.world.entity.animal.EntitySquid; import net.minecraft.world.entity.animal.EntityTropicalFish; import net.minecraft.world.entity.animal.EntityTurtle; import net.minecraft.world.entity.animal.EntityWaterAnimal; import net.minecraft.world.entity.animal.EntityWolf; import net.minecraft.world.entity.animal.axolotl.Axolotl; import net.minecraft.world.entity.animal.goat.Goat; import net.minecraft.world.entity.animal.horse.EntityHorse; import net.minecraft.world.entity.animal.horse.EntityHorseAbstract; import net.minecraft.world.entity.animal.horse.EntityHorseChestedAbstract; import net.minecraft.world.entity.animal.horse.EntityHorseDonkey; import net.minecraft.world.entity.animal.horse.EntityHorseMule; import net.minecraft.world.entity.animal.horse.EntityHorseSkeleton; import net.minecraft.world.entity.animal.horse.EntityHorseZombie; import net.minecraft.world.entity.animal.horse.EntityLlama; import net.minecraft.world.entity.animal.horse.EntityLlamaTrader; import net.minecraft.world.entity.boss.EntityComplexPart; import net.minecraft.world.entity.boss.enderdragon.EntityEnderCrystal; import net.minecraft.world.entity.boss.enderdragon.EntityEnderDragon; import net.minecraft.world.entity.boss.wither.EntityWither; import net.minecraft.world.entity.decoration.EntityArmorStand; import net.minecraft.world.entity.decoration.EntityHanging; import net.minecraft.world.entity.decoration.EntityItemFrame; import net.minecraft.world.entity.decoration.EntityLeash; import net.minecraft.world.entity.decoration.EntityPainting; import net.minecraft.world.entity.decoration.GlowItemFrame; import net.minecraft.world.entity.item.EntityFallingBlock; import net.minecraft.world.entity.item.EntityItem; import net.minecraft.world.entity.item.EntityTNTPrimed; import net.minecraft.world.entity.monster.EntityBlaze; import net.minecraft.world.entity.monster.EntityCaveSpider; import net.minecraft.world.entity.monster.EntityCreeper; import net.minecraft.world.entity.monster.EntityDrowned; import net.minecraft.world.entity.monster.EntityEnderman; import net.minecraft.world.entity.monster.EntityEndermite; import net.minecraft.world.entity.monster.EntityEvoker; import net.minecraft.world.entity.monster.EntityGhast; import net.minecraft.world.entity.monster.EntityGiantZombie; import net.minecraft.world.entity.monster.EntityGuardian; import net.minecraft.world.entity.monster.EntityGuardianElder; import net.minecraft.world.entity.monster.EntityIllagerAbstract; import net.minecraft.world.entity.monster.EntityIllagerIllusioner; import net.minecraft.world.entity.monster.EntityIllagerWizard; import net.minecraft.world.entity.monster.EntityMagmaCube; import net.minecraft.world.entity.monster.EntityMonster; import net.minecraft.world.entity.monster.EntityPhantom; import net.minecraft.world.entity.monster.EntityPigZombie; import net.minecraft.world.entity.monster.EntityPillager; import net.minecraft.world.entity.monster.EntityRavager; import net.minecraft.world.entity.monster.EntityShulker; import net.minecraft.world.entity.monster.EntitySilverfish; import net.minecraft.world.entity.monster.EntitySkeleton; import net.minecraft.world.entity.monster.EntitySkeletonAbstract; import net.minecraft.world.entity.monster.EntitySkeletonStray; import net.minecraft.world.entity.monster.EntitySkeletonWither; import net.minecraft.world.entity.monster.EntitySlime; import net.minecraft.world.entity.monster.EntitySpider; import net.minecraft.world.entity.monster.EntityStrider; import net.minecraft.world.entity.monster.EntityVex; import net.minecraft.world.entity.monster.EntityVindicator; import net.minecraft.world.entity.monster.EntityWitch; import net.minecraft.world.entity.monster.EntityZoglin; import net.minecraft.world.entity.monster.EntityZombie; import net.minecraft.world.entity.monster.EntityZombieHusk; import net.minecraft.world.entity.monster.EntityZombieVillager; import net.minecraft.world.entity.monster.hoglin.EntityHoglin; import net.minecraft.world.entity.monster.piglin.EntityPiglin; import net.minecraft.world.entity.monster.piglin.EntityPiglinAbstract; import net.minecraft.world.entity.monster.piglin.EntityPiglinBrute; import net.minecraft.world.entity.npc.EntityVillager; import net.minecraft.world.entity.npc.EntityVillagerAbstract; import net.minecraft.world.entity.npc.EntityVillagerTrader; import net.minecraft.world.entity.player.EntityHuman; import net.minecraft.world.entity.projectile.EntityArrow; import net.minecraft.world.entity.projectile.EntityDragonFireball; import net.minecraft.world.entity.projectile.EntityEgg; import net.minecraft.world.entity.projectile.EntityEnderPearl; import net.minecraft.world.entity.projectile.EntityEnderSignal; import net.minecraft.world.entity.projectile.EntityEvokerFangs; import net.minecraft.world.entity.projectile.EntityFireball; import net.minecraft.world.entity.projectile.EntityFireworks; import net.minecraft.world.entity.projectile.EntityFishingHook; import net.minecraft.world.entity.projectile.EntityLargeFireball; import net.minecraft.world.entity.projectile.EntityLlamaSpit; import net.minecraft.world.entity.projectile.EntityPotion; import net.minecraft.world.entity.projectile.EntityProjectile; import net.minecraft.world.entity.projectile.EntityShulkerBullet; import net.minecraft.world.entity.projectile.EntitySmallFireball; import net.minecraft.world.entity.projectile.EntitySnowball; import net.minecraft.world.entity.projectile.EntitySpectralArrow; import net.minecraft.world.entity.projectile.EntityThrownExpBottle; import net.minecraft.world.entity.projectile.EntityThrownTrident; import net.minecraft.world.entity.projectile.EntityTippedArrow; import net.minecraft.world.entity.projectile.EntityWitherSkull; import net.minecraft.world.entity.vehicle.EntityBoat; import net.minecraft.world.entity.vehicle.EntityMinecartAbstract; import net.minecraft.world.entity.vehicle.EntityMinecartChest; import net.minecraft.world.entity.vehicle.EntityMinecartCommandBlock; import net.minecraft.world.entity.vehicle.EntityMinecartFurnace; import net.minecraft.world.entity.vehicle.EntityMinecartHopper; import net.minecraft.world.entity.vehicle.EntityMinecartMobSpawner; import net.minecraft.world.entity.vehicle.EntityMinecartRideable; import net.minecraft.world.entity.vehicle.EntityMinecartTNT; import net.minecraft.world.phys.AxisAlignedBB; import org.bukkit.EntityEffect; import org.bukkit.Location; import org.bukkit.Server; import org.bukkit.World; import org.bukkit.block.BlockFace; import org.bukkit.block.PistonMoveReaction; import org.bukkit.craftbukkit.CraftServer; import org.bukkit.craftbukkit.CraftWorld; import org.bukkit.craftbukkit.block.CraftBlock; import org.bukkit.craftbukkit.persistence.CraftPersistentDataContainer; import org.bukkit.craftbukkit.persistence.CraftPersistentDataTypeRegistry; import org.bukkit.craftbukkit.util.CraftChatMessage; import org.bukkit.craftbukkit.util.CraftVector; import org.bukkit.entity.Pose; import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; import org.bukkit.metadata.MetadataValue; import org.bukkit.permissions.PermissibleBase; import org.bukkit.permissions.Permission; import org.bukkit.permissions.PermissionAttachment; import org.bukkit.permissions.PermissionAttachmentInfo; import org.bukkit.permissions.ServerOperator; import org.bukkit.plugin.Plugin; import org.bukkit.util.BoundingBox; import org.bukkit.util.NumberConversions; import org.bukkit.util.Vector; public abstract class CraftEntity implements org.bukkit.entity.Entity { private static PermissibleBase perm; private static final CraftPersistentDataTypeRegistry DATA_TYPE_REGISTRY = new CraftPersistentDataTypeRegistry(); protected final CraftServer server; protected Entity entity; private EntityDamageEvent lastDamageEvent; private final CraftPersistentDataContainer persistentDataContainer = new CraftPersistentDataContainer(DATA_TYPE_REGISTRY); public CraftEntity(final CraftServer server, final Entity entity) { this.server = server; this.entity = entity; } public static CraftEntity getEntity(CraftServer server, Entity entity) { /* * Order is *EXTREMELY* important -- keep it right! =D */ // CHECKSTYLE:OFF if (entity instanceof EntityLiving) { // Players if (entity instanceof EntityHuman) { if (entity instanceof EntityPlayer) { return new CraftPlayer(server, (EntityPlayer) entity); } else { return new CraftHumanEntity(server, (EntityHuman) entity); } } // Water Animals else if (entity instanceof EntityWaterAnimal) { if (entity instanceof EntitySquid) { if (entity instanceof GlowSquid) { return new CraftGlowSquid(server, (GlowSquid) entity); } else { return new CraftSquid(server, (EntitySquid) entity); } } else if (entity instanceof EntityFish) { if (entity instanceof EntityCod) { return new CraftCod(server, (EntityCod) entity); } else if (entity instanceof EntityPufferFish) { return new CraftPufferFish(server, (EntityPufferFish) entity); } else if (entity instanceof EntitySalmon) { return new CraftSalmon(server, (EntitySalmon) entity); } else if (entity instanceof EntityTropicalFish) { return new CraftTropicalFish(server, (EntityTropicalFish) entity); } else { return new CraftFish(server, (EntityFish) entity); } } else if (entity instanceof EntityDolphin) { return new CraftDolphin(server, (EntityDolphin) entity); } else { return new CraftWaterMob(server, (EntityWaterAnimal) entity); } } else if (entity instanceof EntityCreature) { // Animals if (entity instanceof EntityAnimal) { if (entity instanceof EntityChicken) { return new CraftChicken(server, (EntityChicken) entity); } else if (entity instanceof EntityCow) { if (entity instanceof EntityMushroomCow) { return new CraftMushroomCow(server, (EntityMushroomCow) entity); } else { return new CraftCow(server, (EntityCow) entity); } } else if (entity instanceof EntityPig) { return new CraftPig(server, (EntityPig) entity); } else if (entity instanceof EntityTameableAnimal) { if (entity instanceof EntityWolf) { return new CraftWolf(server, (EntityWolf) entity); } else if (entity instanceof EntityCat) { return new CraftCat(server, (EntityCat) entity); } else if (entity instanceof EntityParrot) { return new CraftParrot(server, (EntityParrot) entity); } } else if (entity instanceof EntitySheep) { return new CraftSheep(server, (EntitySheep) entity); } else if (entity instanceof EntityHorseAbstract) { if (entity instanceof EntityHorseChestedAbstract){ if (entity instanceof EntityHorseDonkey) { return new CraftDonkey(server, (EntityHorseDonkey) entity); } else if (entity instanceof EntityHorseMule) { return new CraftMule(server, (EntityHorseMule) entity); } else if (entity instanceof EntityLlamaTrader) { return new CraftTraderLlama(server, (EntityLlamaTrader) entity); } else if (entity instanceof EntityLlama) { return new CraftLlama(server, (EntityLlama) entity); } } else if (entity instanceof EntityHorse) { return new CraftHorse(server, (EntityHorse) entity); } else if (entity instanceof EntityHorseSkeleton) { return new CraftSkeletonHorse(server, (EntityHorseSkeleton) entity); } else if (entity instanceof EntityHorseZombie) { return new CraftZombieHorse(server, (EntityHorseZombie) entity); } } else if (entity instanceof EntityRabbit) { return new CraftRabbit(server, (EntityRabbit) entity); } else if (entity instanceof EntityPolarBear) { return new CraftPolarBear(server, (EntityPolarBear) entity); } else if (entity instanceof EntityTurtle) { return new CraftTurtle(server, (EntityTurtle) entity); } else if (entity instanceof EntityOcelot) { return new CraftOcelot(server, (EntityOcelot) entity); } else if (entity instanceof EntityPanda) { return new CraftPanda(server, (EntityPanda) entity); } else if (entity instanceof EntityFox) { return new CraftFox(server, (EntityFox) entity); } else if (entity instanceof EntityBee) { return new CraftBee(server, (EntityBee) entity); } else if (entity instanceof EntityHoglin) { return new CraftHoglin(server, (EntityHoglin) entity); } else if (entity instanceof EntityStrider) { return new CraftStrider(server, (EntityStrider) entity); } else if (entity instanceof Axolotl) { return new CraftAxolotl(server, (Axolotl) entity); } else if (entity instanceof Goat) { return new CraftGoat(server, (Goat) entity); } else { return new CraftAnimals(server, (EntityAnimal) entity); } } // Monsters else if (entity instanceof EntityMonster) { if (entity instanceof EntityZombie) { if (entity instanceof EntityPigZombie) { return new CraftPigZombie(server, (EntityPigZombie) entity); } else if (entity instanceof EntityZombieHusk) { return new CraftHusk(server, (EntityZombieHusk) entity); } else if (entity instanceof EntityZombieVillager) { return new CraftVillagerZombie(server, (EntityZombieVillager) entity); } else if (entity instanceof EntityDrowned) { return new CraftDrowned(server, (EntityDrowned) entity); } else { return new CraftZombie(server, (EntityZombie) entity); } } else if (entity instanceof EntityCreeper) { return new CraftCreeper(server, (EntityCreeper) entity); } else if (entity instanceof EntityEnderman) { return new CraftEnderman(server, (EntityEnderman) entity); } else if (entity instanceof EntitySilverfish) { return new CraftSilverfish(server, (EntitySilverfish) entity); } else if (entity instanceof EntityGiantZombie) { return new CraftGiant(server, (EntityGiantZombie) entity); } else if (entity instanceof EntitySkeletonAbstract) { if (entity instanceof EntitySkeletonStray) { return new CraftStray(server, (EntitySkeletonStray) entity); } else if (entity instanceof EntitySkeletonWither) { return new CraftWitherSkeleton(server, (EntitySkeletonWither) entity); } else if (entity instanceof EntitySkeleton){ return new CraftSkeleton(server, (EntitySkeleton) entity); } } else if (entity instanceof EntityBlaze) { return new CraftBlaze(server, (EntityBlaze) entity); } else if (entity instanceof EntityWitch) { return new CraftWitch(server, (EntityWitch) entity); } else if (entity instanceof EntityWither) { return new CraftWither(server, (EntityWither) entity); } else if (entity instanceof EntitySpider) { if (entity instanceof EntityCaveSpider) { return new CraftCaveSpider(server, (EntityCaveSpider) entity); } else { return new CraftSpider(server, (EntitySpider) entity); } } else if (entity instanceof EntityEndermite) { return new CraftEndermite(server, (EntityEndermite) entity); } else if (entity instanceof EntityGuardian) { if (entity instanceof EntityGuardianElder) { return new CraftElderGuardian(server, (EntityGuardianElder) entity); } else { return new CraftGuardian(server, (EntityGuardian) entity); } } else if (entity instanceof EntityVex) { return new CraftVex(server, (EntityVex) entity); } else if (entity instanceof EntityIllagerAbstract) { if (entity instanceof EntityIllagerWizard) { if (entity instanceof EntityEvoker) { return new CraftEvoker(server, (EntityEvoker) entity); } else if (entity instanceof EntityIllagerIllusioner) { return new CraftIllusioner(server, (EntityIllagerIllusioner) entity); } else { return new CraftSpellcaster(server, (EntityIllagerWizard) entity); } } else if (entity instanceof EntityVindicator) { return new CraftVindicator(server, (EntityVindicator) entity); } else if (entity instanceof EntityPillager) { return new CraftPillager(server, (EntityPillager) entity); } else { return new CraftIllager(server, (EntityIllagerAbstract) entity); } } else if (entity instanceof EntityRavager) { return new CraftRavager(server, (EntityRavager) entity); } else if (entity instanceof EntityPiglinAbstract) { if (entity instanceof EntityPiglin) return new CraftPiglin(server, (EntityPiglin) entity); else if (entity instanceof EntityPiglinBrute) { return new CraftPiglinBrute(server, (EntityPiglinBrute) entity); } else { return new CraftPiglinAbstract(server, (EntityPiglinAbstract) entity); } } else if (entity instanceof EntityZoglin) { return new CraftZoglin(server, (EntityZoglin) entity); } else { return new CraftMonster(server, (EntityMonster) entity); } } else if (entity instanceof EntityGolem) { if (entity instanceof EntitySnowman) { return new CraftSnowman(server, (EntitySnowman) entity); } else if (entity instanceof EntityIronGolem) { return new CraftIronGolem(server, (EntityIronGolem) entity); } else if (entity instanceof EntityShulker) { return new CraftShulker(server, (EntityShulker) entity); } } else if (entity instanceof EntityVillagerAbstract) { if (entity instanceof EntityVillager) { return new CraftVillager(server, (EntityVillager) entity); } else if (entity instanceof EntityVillagerTrader) { return new CraftWanderingTrader(server, (EntityVillagerTrader) entity); } else { return new CraftAbstractVillager(server, (EntityVillagerAbstract) entity); } } else { return new CraftCreature(server, (EntityCreature) entity); } } // Slimes are a special (and broken) case else if (entity instanceof EntitySlime) { if (entity instanceof EntityMagmaCube) { return new CraftMagmaCube(server, (EntityMagmaCube) entity); } else { return new CraftSlime(server, (EntitySlime) entity); } } // Flying else if (entity instanceof EntityFlying) { if (entity instanceof EntityGhast) { return new CraftGhast(server, (EntityGhast) entity); } else if (entity instanceof EntityPhantom) { return new CraftPhantom(server, (EntityPhantom) entity); } else { return new CraftFlying(server, (EntityFlying) entity); } } else if (entity instanceof EntityEnderDragon) { return new CraftEnderDragon(server, (EntityEnderDragon) entity); } // Ambient else if (entity instanceof EntityAmbient) { if (entity instanceof EntityBat) { return new CraftBat(server, (EntityBat) entity); } else { return new CraftAmbient(server, (EntityAmbient) entity); } } else if (entity instanceof EntityArmorStand) { return new CraftArmorStand(server, (EntityArmorStand) entity); } else { return new CraftLivingEntity(server, (EntityLiving) entity); } } else if (entity instanceof EntityComplexPart) { EntityComplexPart part = (EntityComplexPart) entity; if (part.parentMob instanceof EntityEnderDragon) { return new CraftEnderDragonPart(server, (EntityComplexPart) entity); } else { return new CraftComplexPart(server, (EntityComplexPart) entity); } } else if (entity instanceof EntityExperienceOrb) { return new CraftExperienceOrb(server, (EntityExperienceOrb) entity); } else if (entity instanceof EntityTippedArrow) { return new CraftTippedArrow(server, (EntityTippedArrow) entity); } else if (entity instanceof EntitySpectralArrow) { return new CraftSpectralArrow(server, (EntitySpectralArrow) entity); } else if (entity instanceof EntityArrow) { if (entity instanceof EntityThrownTrident) { return new CraftTrident(server, (EntityThrownTrident) entity); } else { return new CraftArrow(server, (EntityArrow) entity); } } else if (entity instanceof EntityBoat) { return new CraftBoat(server, (EntityBoat) entity); } else if (entity instanceof EntityProjectile) { if (entity instanceof EntityEgg) { return new CraftEgg(server, (EntityEgg) entity); } else if (entity instanceof EntitySnowball) { return new CraftSnowball(server, (EntitySnowball) entity); } else if (entity instanceof EntityPotion) { return new CraftThrownPotion(server, (EntityPotion) entity); } else if (entity instanceof EntityEnderPearl) { return new CraftEnderPearl(server, (EntityEnderPearl) entity); } else if (entity instanceof EntityThrownExpBottle) { return new CraftThrownExpBottle(server, (EntityThrownExpBottle) entity); } } else if (entity instanceof EntityFallingBlock) { return new CraftFallingBlock(server, (EntityFallingBlock) entity); } else if (entity instanceof EntityFireball) { if (entity instanceof EntitySmallFireball) { return new CraftSmallFireball(server, (EntitySmallFireball) entity); } else if (entity instanceof EntityLargeFireball) { return new CraftLargeFireball(server, (EntityLargeFireball) entity); } else if (entity instanceof EntityWitherSkull) { return new CraftWitherSkull(server, (EntityWitherSkull) entity); } else if (entity instanceof EntityDragonFireball) { return new CraftDragonFireball(server, (EntityDragonFireball) entity); } else { return new CraftFireball(server, (EntityFireball) entity); } } else if (entity instanceof EntityEnderSignal) { return new CraftEnderSignal(server, (EntityEnderSignal) entity); } else if (entity instanceof EntityEnderCrystal) { return new CraftEnderCrystal(server, (EntityEnderCrystal) entity); } else if (entity instanceof EntityFishingHook) { return new CraftFishHook(server, (EntityFishingHook) entity); } else if (entity instanceof EntityItem) { return new CraftItem(server, (EntityItem) entity); } else if (entity instanceof EntityLightning) { return new CraftLightningStrike(server, (EntityLightning) entity); } else if (entity instanceof EntityMinecartAbstract) { if (entity instanceof EntityMinecartFurnace) { return new CraftMinecartFurnace(server, (EntityMinecartFurnace) entity); } else if (entity instanceof EntityMinecartChest) { return new CraftMinecartChest(server, (EntityMinecartChest) entity); } else if (entity instanceof EntityMinecartTNT) { return new CraftMinecartTNT(server, (EntityMinecartTNT) entity); } else if (entity instanceof EntityMinecartHopper) { return new CraftMinecartHopper(server, (EntityMinecartHopper) entity); } else if (entity instanceof EntityMinecartMobSpawner) { return new CraftMinecartMobSpawner(server, (EntityMinecartMobSpawner) entity); } else if (entity instanceof EntityMinecartRideable) { return new CraftMinecartRideable(server, (EntityMinecartRideable) entity); } else if (entity instanceof EntityMinecartCommandBlock) { return new CraftMinecartCommand(server, (EntityMinecartCommandBlock) entity); } } else if (entity instanceof EntityHanging) { if (entity instanceof EntityPainting) { return new CraftPainting(server, (EntityPainting) entity); } else if (entity instanceof EntityItemFrame) { if (entity instanceof GlowItemFrame) { return new CraftGlowItemFrame(server, (GlowItemFrame) entity); } else { return new CraftItemFrame(server, (EntityItemFrame) entity); } } else if (entity instanceof EntityLeash) { return new CraftLeash(server, (EntityLeash) entity); } else { return new CraftHanging(server, (EntityHanging) entity); } } else if (entity instanceof EntityTNTPrimed) { return new CraftTNTPrimed(server, (EntityTNTPrimed) entity); } else if (entity instanceof EntityFireworks) { return new CraftFirework(server, (EntityFireworks) entity); } else if (entity instanceof EntityShulkerBullet) { return new CraftShulkerBullet(server, (EntityShulkerBullet) entity); } else if (entity instanceof EntityAreaEffectCloud) { return new CraftAreaEffectCloud(server, (EntityAreaEffectCloud) entity); } else if (entity instanceof EntityEvokerFangs) { return new CraftEvokerFangs(server, (EntityEvokerFangs) entity); } else if (entity instanceof EntityLlamaSpit) { return new CraftLlamaSpit(server, (EntityLlamaSpit) entity); } else if (entity instanceof Marker) { return new CraftMarker(server, (Marker) entity); } // CHECKSTYLE:ON throw new AssertionError("Unknown entity " + (entity == null ? null : entity.getClass())); } @Override public Location getLocation() { return new Location(getWorld(), entity.getX(), entity.getY(), entity.getZ(), entity.getBukkitYaw(), entity.getXRot()); } @Override public Location getLocation(Location loc) { if (loc != null) { loc.setWorld(getWorld()); loc.setX(entity.getX()); loc.setY(entity.getY()); loc.setZ(entity.getZ()); loc.setYaw(entity.getBukkitYaw()); loc.setPitch(entity.getXRot()); } return loc; } @Override public Vector getVelocity() { return CraftVector.toBukkit(entity.getDeltaMovement()); } @Override public void setVelocity(Vector velocity) { Preconditions.checkArgument(velocity != null, "velocity"); velocity.checkFinite(); entity.setDeltaMovement(CraftVector.toNMS(velocity)); entity.hurtMarked = true; } @Override public double getHeight() { return getHandle().getBbHeight(); } @Override public double getWidth() { return getHandle().getBbWidth(); } @Override public BoundingBox getBoundingBox() { AxisAlignedBB bb = getHandle().getBoundingBox(); return new BoundingBox(bb.minX, bb.minY, bb.minZ, bb.maxX, bb.maxY, bb.maxZ); } @Override public boolean isOnGround() { if (entity instanceof EntityArrow) { return ((EntityArrow) entity).inGround; } return entity.isOnGround(); } @Override public boolean isInWater() { return entity.isInWater(); } @Override public World getWorld() { return entity.level.getWorld(); } @Override public void setRotation(float yaw, float pitch) { NumberConversions.checkFinite(pitch, "pitch not finite"); NumberConversions.checkFinite(yaw, "yaw not finite"); yaw = Location.normalizeYaw(yaw); pitch = Location.normalizePitch(pitch); entity.setYRot(yaw); entity.setXRot(pitch); entity.yRotO = yaw; entity.xRotO = pitch; entity.setYHeadRot(yaw); } @Override public boolean teleport(Location location) { return teleport(location, TeleportCause.PLUGIN); } @Override public boolean teleport(Location location, TeleportCause cause) { Preconditions.checkArgument(location != null, "location"); location.checkFinite(); if (entity.isVehicle() || entity.isRemoved()) { return false; } // If this entity is riding another entity, we must dismount before teleporting. entity.stopRiding(); // Let the server handle cross world teleports if (!location.getWorld().equals(getWorld())) { // Prevent teleportation to an other world during world generation Preconditions.checkState(!entity.generation, "Cannot teleport entity to an other world during world generation"); entity.teleportTo(((CraftWorld) location.getWorld()).getHandle(), new BlockPosition(location.getX(), location.getY(), location.getZ())); return true; } // entity.setLocation() throws no event, and so cannot be cancelled entity.absMoveTo(location.getX(), location.getY(), location.getZ(), location.getYaw(), location.getPitch()); // SPIGOT-619: Force sync head rotation also entity.setYHeadRot(location.getYaw()); return true; } @Override public boolean teleport(org.bukkit.entity.Entity destination) { return teleport(destination.getLocation()); } @Override public boolean teleport(org.bukkit.entity.Entity destination, TeleportCause cause) { return teleport(destination.getLocation(), cause); } @Override public List getNearbyEntities(double x, double y, double z) { Preconditions.checkState(!entity.generation, "Cannot get nearby entities during world generation"); List notchEntityList = entity.level.getEntities(entity, entity.getBoundingBox().inflate(x, y, z), Predicates.alwaysTrue()); List bukkitEntityList = new java.util.ArrayList(notchEntityList.size()); for (Entity e : notchEntityList) { bukkitEntityList.add(e.getBukkitEntity()); } return bukkitEntityList; } @Override public int getEntityId() { return entity.getId(); } @Override public int getFireTicks() { return entity.remainingFireTicks; } @Override public int getMaxFireTicks() { return entity.getFireImmuneTicks(); } @Override public void setFireTicks(int ticks) { entity.remainingFireTicks = ticks; } @Override public void setVisualFire(boolean fire) { getHandle().hasVisualFire = fire; } @Override public boolean isVisualFire() { return getHandle().hasVisualFire; } @Override public int getFreezeTicks() { return getHandle().getTicksFrozen(); } @Override public int getMaxFreezeTicks() { return getHandle().getTicksRequiredToFreeze(); } @Override public void setFreezeTicks(int ticks) { Preconditions.checkArgument(0 <= ticks, "Ticks cannot be less than 0"); getHandle().setTicksFrozen(ticks); } @Override public boolean isFrozen() { return getHandle().isFullyFrozen(); } @Override public void remove() { entity.discard(); } @Override public boolean isDead() { return !entity.isAlive(); } @Override public boolean isValid() { return entity.isAlive() && entity.valid && entity.isChunkLoaded(); } @Override public Server getServer() { return server; } @Override public boolean isPersistent() { return entity.persist; } @Override public void setPersistent(boolean persistent) { entity.persist = persistent; } public Vector getMomentum() { return getVelocity(); } public void setMomentum(Vector value) { setVelocity(value); } @Override public org.bukkit.entity.Entity getPassenger() { return isEmpty() ? null : getHandle().passengers.get(0).getBukkitEntity(); } @Override public boolean setPassenger(org.bukkit.entity.Entity passenger) { Preconditions.checkArgument(!this.equals(passenger), "Entity cannot ride itself."); if (passenger instanceof CraftEntity) { eject(); return ((CraftEntity) passenger).getHandle().startRiding(getHandle()); } else { return false; } } @Override public List getPassengers() { return Lists.newArrayList(Lists.transform(getHandle().passengers, new Function() { @Override public org.bukkit.entity.Entity apply(Entity input) { return input.getBukkitEntity(); } })); } @Override public boolean addPassenger(org.bukkit.entity.Entity passenger) { Preconditions.checkArgument(passenger != null, "passenger == null"); Preconditions.checkArgument(!this.equals(passenger), "Entity cannot ride itself."); return ((CraftEntity) passenger).getHandle().startRiding(getHandle(), true); } @Override public boolean removePassenger(org.bukkit.entity.Entity passenger) { Preconditions.checkArgument(passenger != null, "passenger == null"); ((CraftEntity) passenger).getHandle().stopRiding(); return true; } @Override public boolean isEmpty() { return !getHandle().isVehicle(); } @Override public boolean eject() { if (isEmpty()) { return false; } getHandle().ejectPassengers(); return true; } @Override public float getFallDistance() { return getHandle().fallDistance; } @Override public void setFallDistance(float distance) { getHandle().fallDistance = distance; } @Override public void setLastDamageCause(EntityDamageEvent event) { lastDamageEvent = event; } @Override public EntityDamageEvent getLastDamageCause() { return lastDamageEvent; } @Override public UUID getUniqueId() { return getHandle().getUUID(); } @Override public int getTicksLived() { return getHandle().tickCount; } @Override public void setTicksLived(int value) { if (value <= 0) { throw new IllegalArgumentException("Age must be at least 1 tick"); } getHandle().tickCount = value; } public Entity getHandle() { return entity; } @Override public void playEffect(EntityEffect type) { Preconditions.checkArgument(type != null, "type"); Preconditions.checkState(!entity.generation, "Cannot play effect during world generation"); if (type.getApplicable().isInstance(this)) { this.getHandle().level.broadcastEntityEvent(getHandle(), type.getData()); } } public void setHandle(final Entity entity) { this.entity = entity; } @Override public String toString() { return "CraftEntity{" + "id=" + getEntityId() + '}'; } @Override public boolean equals(Object obj) { if (obj == null) { return false; } if (getClass() != obj.getClass()) { return false; } final CraftEntity other = (CraftEntity) obj; return (this.getEntityId() == other.getEntityId()); } @Override public int hashCode() { int hash = 7; hash = 29 * hash + this.getEntityId(); return hash; } @Override public void setMetadata(String metadataKey, MetadataValue newMetadataValue) { server.getEntityMetadata().setMetadata(this, metadataKey, newMetadataValue); } @Override public List getMetadata(String metadataKey) { return server.getEntityMetadata().getMetadata(this, metadataKey); } @Override public boolean hasMetadata(String metadataKey) { return server.getEntityMetadata().hasMetadata(this, metadataKey); } @Override public void removeMetadata(String metadataKey, Plugin owningPlugin) { server.getEntityMetadata().removeMetadata(this, metadataKey, owningPlugin); } @Override public boolean isInsideVehicle() { return getHandle().isPassenger(); } @Override public boolean leaveVehicle() { if (!isInsideVehicle()) { return false; } getHandle().stopRiding(); return true; } @Override public org.bukkit.entity.Entity getVehicle() { if (!isInsideVehicle()) { return null; } return getHandle().getVehicle().getBukkitEntity(); } @Override public void setCustomName(String name) { // sane limit for name length if (name != null && name.length() > 256) { name = name.substring(0, 256); } getHandle().setCustomName(CraftChatMessage.fromStringOrNull(name)); } @Override public String getCustomName() { IChatBaseComponent name = getHandle().getCustomName(); if (name == null) { return null; } return CraftChatMessage.fromComponent(name); } @Override public void setCustomNameVisible(boolean flag) { getHandle().setCustomNameVisible(flag); } @Override public boolean isCustomNameVisible() { return getHandle().isCustomNameVisible(); } @Override public void sendMessage(String message) { } @Override public void sendMessage(String... messages) { } @Override public void sendMessage(UUID sender, String message) { this.sendMessage(message); // Most entities don't know about senders } @Override public void sendMessage(UUID sender, String... messages) { this.sendMessage(messages); // Most entities don't know about senders } @Override public String getName() { return CraftChatMessage.fromComponent(getHandle().getName()); } @Override public boolean isPermissionSet(String name) { return getPermissibleBase().isPermissionSet(name); } @Override public boolean isPermissionSet(Permission perm) { return CraftEntity.getPermissibleBase().isPermissionSet(perm); } @Override public boolean hasPermission(String name) { return getPermissibleBase().hasPermission(name); } @Override public boolean hasPermission(Permission perm) { return getPermissibleBase().hasPermission(perm); } @Override public PermissionAttachment addAttachment(Plugin plugin, String name, boolean value) { return getPermissibleBase().addAttachment(plugin, name, value); } @Override public PermissionAttachment addAttachment(Plugin plugin) { return getPermissibleBase().addAttachment(plugin); } @Override public PermissionAttachment addAttachment(Plugin plugin, String name, boolean value, int ticks) { return getPermissibleBase().addAttachment(plugin, name, value, ticks); } @Override public PermissionAttachment addAttachment(Plugin plugin, int ticks) { return getPermissibleBase().addAttachment(plugin, ticks); } @Override public void removeAttachment(PermissionAttachment attachment) { getPermissibleBase().removeAttachment(attachment); } @Override public void recalculatePermissions() { getPermissibleBase().recalculatePermissions(); } @Override public Set getEffectivePermissions() { return getPermissibleBase().getEffectivePermissions(); } @Override public boolean isOp() { return getPermissibleBase().isOp(); } @Override public void setOp(boolean value) { getPermissibleBase().setOp(value); } @Override public void setGlowing(boolean flag) { getHandle().setGlowingTag(flag); } @Override public boolean isGlowing() { return getHandle().isCurrentlyGlowing(); } @Override public void setInvulnerable(boolean flag) { getHandle().setInvulnerable(flag); } @Override public boolean isInvulnerable() { return getHandle().isInvulnerableTo(DamageSource.GENERIC); } @Override public boolean isSilent() { return getHandle().isSilent(); } @Override public void setSilent(boolean flag) { getHandle().setSilent(flag); } @Override public boolean hasGravity() { return !getHandle().isNoGravity(); } @Override public void setGravity(boolean gravity) { getHandle().setNoGravity(!gravity); } @Override public int getPortalCooldown() { return getHandle().portalCooldown; } @Override public void setPortalCooldown(int cooldown) { getHandle().portalCooldown = cooldown; } @Override public Set getScoreboardTags() { return getHandle().getTags(); } @Override public boolean addScoreboardTag(String tag) { return getHandle().addTag(tag); } @Override public boolean removeScoreboardTag(String tag) { return getHandle().removeTag(tag); } @Override public PistonMoveReaction getPistonMoveReaction() { return PistonMoveReaction.getById(getHandle().getPistonPushReaction().ordinal()); } @Override public BlockFace getFacing() { // Use this method over getDirection because it handles boats and minecarts. return CraftBlock.notchToBlockFace(getHandle().getMotionDirection()); } @Override public CraftPersistentDataContainer getPersistentDataContainer() { return persistentDataContainer; } @Override public Pose getPose() { return Pose.values()[getHandle().getPose().ordinal()]; } public void storeBukkitValues(NBTTagCompound c) { if (!this.persistentDataContainer.isEmpty()) { c.put("BukkitValues", this.persistentDataContainer.toTagCompound()); } } public void readBukkitValues(NBTTagCompound c) { NBTBase base = c.get("BukkitValues"); if (base instanceof NBTTagCompound) { this.persistentDataContainer.putAll((NBTTagCompound) base); } } protected NBTTagCompound save() { NBTTagCompound nbttagcompound = new NBTTagCompound(); nbttagcompound.putString("id", getHandle().getEncodeId()); getHandle().saveWithoutId(nbttagcompound); return nbttagcompound; } // re-sends the spawn entity packet to updated values which cannot be updated otherwise protected void update() { if (!getHandle().isAlive()) { return; } WorldServer world = ((CraftWorld) getWorld()).getHandle(); PlayerChunkMap.EntityTracker entityTracker = world.getChunkSource().chunkMap.entityMap.get(getEntityId()); if (entityTracker == null) { return; } entityTracker.broadcast(getHandle().getAddEntityPacket()); } private static PermissibleBase getPermissibleBase() { if (perm == null) { perm = new PermissibleBase(new ServerOperator() { @Override public boolean isOp() { return false; } @Override public void setOp(boolean value) { } }); } return perm; } }