1087 lines
46 KiB
Java

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.CraftSpawnCategory;
import org.bukkit.craftbukkit.util.CraftVector;
import org.bukkit.entity.Pose;
import org.bukkit.entity.SpawnCategory;
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<org.bukkit.entity.Entity> getNearbyEntities(double x, double y, double z) {
Preconditions.checkState(!entity.generation, "Cannot get nearby entities during world generation");
List<Entity> notchEntityList = entity.level.getEntities(entity, entity.getBoundingBox().inflate(x, y, z), Predicates.alwaysTrue());
List<org.bukkit.entity.Entity> bukkitEntityList = new java.util.ArrayList<org.bukkit.entity.Entity>(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<org.bukkit.entity.Entity> getPassengers() {
return Lists.newArrayList(Lists.transform(getHandle().passengers, new Function<Entity, org.bukkit.entity.Entity>() {
@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<MetadataValue> 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<PermissionAttachmentInfo> 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<String> 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()];
}
@Override
public SpawnCategory getSpawnCategory() {
return CraftSpawnCategory.toBukkit(getHandle().getType().getCategory());
}
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;
}
}