package org.bukkit.craftbukkit.entity;
import cpw.mods.fml.common.registry.EntityRegistry;
import net.minecraft.entity.Entity;
import net.minecraftforge.cauldron.entity.CraftCustomEntity;
import net.minecraftforge.common.DimensionManager;
import net.minecraftforge.common.util.FakePlayerFactory;
import org.bukkit.EntityEffect;
import org.bukkit.Location;
import org.bukkit.Server;
import org.bukkit.World;
import org.bukkit.craftbukkit.CraftServer;
import org.bukkit.craftbukkit.CraftWorld;
import org.bukkit.event.entity.EntityDamageEvent;
import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause;
import org.bukkit.metadata.MetadataValue;
import org.bukkit.plugin.Plugin;
import org.bukkit.util.Vector;
import org.ultramine.core.service.InjectService;
import org.ultramine.mods.bukkit.CraftPlayerCache;
import org.ultramine.mods.bukkit.interfaces.IMixinEntityRegistry;
import org.ultramine.mods.bukkit.interfaces.entity.IMixinEntity;
import org.ultramine.mods.bukkit.interfaces.entity.projectile.IMixinEntityArrow;
import org.ultramine.mods.bukkit.interfaces.world.IMixinWorld;
import org.ultramine.mods.bukkit.util.BukkitEnumHelper;
import java.util.List;
import java.util.Map;
import java.util.UUID;
// Cauldron start
// Cauldron end
public abstract class CraftEntity implements org.bukkit.entity.Entity
{
@InjectService
private static CraftPlayerCache cPlayerCache;
protected final CraftServer server;
protected net.minecraft.entity.Entity entity;
private EntityDamageEvent lastDamageEvent;
public CraftEntity(final CraftServer server, final net.minecraft.entity.Entity entity)
{
this.server = server;
this.entity = entity;
}
public static CraftEntity getEntity(CraftServer server, net.minecraft.entity.Entity entity)
{
/**
* Order is *EXTREMELY* important -- keep it right! =D
*/
if(entity instanceof net.minecraft.entity.EntityLivingBase)
{
// Players
if(entity instanceof net.minecraft.entity.player.EntityPlayer)
{
if(entity instanceof net.minecraft.entity.player.EntityPlayerMP)
{
return cPlayerCache.getOrCreate((net.minecraft.entity.player.EntityPlayerMP) entity);
}
// Cauldron start - support fake player classes from mods
// This case is never hit in vanilla
//else { return new CraftHumanEntity(server, (net.minecraft.entity.player.EntityPlayer) entity); }
else
{
return new CraftPlayer(server, FakePlayerFactory.get(DimensionManager.getWorld(entity.worldObj.provider.dimensionId), ((net.minecraft.entity.player.EntityPlayer) entity).getGameProfile()));
}
// Cauldron end
}
else if(entity instanceof net.minecraft.entity.EntityCreature)
{
// Animals
if(entity instanceof net.minecraft.entity.passive.EntityAnimal)
{
if(entity instanceof net.minecraft.entity.passive.EntityChicken)
{
return new CraftChicken(server, (net.minecraft.entity.passive.EntityChicken) entity);
}
else if(entity instanceof net.minecraft.entity.passive.EntityCow)
{
if(entity instanceof net.minecraft.entity.passive.EntityMooshroom)
{
return new CraftMushroomCow(server, (net.minecraft.entity.passive.EntityMooshroom) entity);
}
else
{
return new CraftCow(server, (net.minecraft.entity.passive.EntityCow) entity);
}
}
else if(entity instanceof net.minecraft.entity.passive.EntityPig)
{
return new CraftPig(server, (net.minecraft.entity.passive.EntityPig) entity);
}
else if(entity instanceof net.minecraft.entity.passive.EntityTameable)
{
if(entity instanceof net.minecraft.entity.passive.EntityWolf)
{
return new CraftWolf(server, (net.minecraft.entity.passive.EntityWolf) entity);
}
else if(entity instanceof net.minecraft.entity.passive.EntityOcelot)
{
return new CraftOcelot(server, (net.minecraft.entity.passive.EntityOcelot) entity);
} // Cauldron
else
{
return new CraftTameableAnimal(server, (net.minecraft.entity.passive.EntityTameable) entity);
} // Cauldron
}
else if(entity instanceof net.minecraft.entity.passive.EntitySheep)
{
return new CraftSheep(server, (net.minecraft.entity.passive.EntitySheep) entity);
}
else if(entity instanceof net.minecraft.entity.passive.EntityHorse)
{
return new CraftHorse(server, (net.minecraft.entity.passive.EntityHorse) entity);
}
else
{
return new CraftAnimals(server, (net.minecraft.entity.passive.EntityAnimal) entity);
}
}
// Monsters
else if(entity instanceof net.minecraft.entity.monster.EntityMob)
{
if(entity instanceof net.minecraft.entity.monster.EntityZombie)
{
if(entity instanceof net.minecraft.entity.monster.EntityPigZombie)
{
return new CraftPigZombie(server, (net.minecraft.entity.monster.EntityPigZombie) entity);
}
else
{
return new CraftZombie(server, (net.minecraft.entity.monster.EntityZombie) entity);
}
}
else if(entity instanceof net.minecraft.entity.monster.EntityCreeper)
{
return new CraftCreeper(server, (net.minecraft.entity.monster.EntityCreeper) entity);
}
else if(entity instanceof net.minecraft.entity.monster.EntityEnderman)
{
return new CraftEnderman(server, (net.minecraft.entity.monster.EntityEnderman) entity);
}
else if(entity instanceof net.minecraft.entity.monster.EntitySilverfish)
{
return new CraftSilverfish(server, (net.minecraft.entity.monster.EntitySilverfish) entity);
}
else if(entity instanceof net.minecraft.entity.monster.EntityGiantZombie)
{
return new CraftGiant(server, (net.minecraft.entity.monster.EntityGiantZombie) entity);
}
else if(entity instanceof net.minecraft.entity.monster.EntitySkeleton)
{
return new CraftSkeleton(server, (net.minecraft.entity.monster.EntitySkeleton) entity);
}
else if(entity instanceof net.minecraft.entity.monster.EntityBlaze)
{
return new CraftBlaze(server, (net.minecraft.entity.monster.EntityBlaze) entity);
}
else if(entity instanceof net.minecraft.entity.monster.EntityWitch)
{
return new CraftWitch(server, (net.minecraft.entity.monster.EntityWitch) entity);
}
else if(entity instanceof net.minecraft.entity.boss.EntityWither)
{
return new CraftWither(server, (net.minecraft.entity.boss.EntityWither) entity);
}
else if(entity instanceof net.minecraft.entity.monster.EntitySpider)
{
if(entity instanceof net.minecraft.entity.monster.EntityCaveSpider)
{
return new CraftCaveSpider(server, (net.minecraft.entity.monster.EntityCaveSpider) entity);
}
else
{
return new CraftSpider(server, (net.minecraft.entity.monster.EntitySpider) entity);
}
}
else
{
return new CraftMonster(server, (net.minecraft.entity.monster.EntityMob) entity);
}
}
// Water Animals
else if(entity instanceof net.minecraft.entity.passive.EntityWaterMob)
{
if(entity instanceof net.minecraft.entity.passive.EntitySquid)
{
return new CraftSquid(server, (net.minecraft.entity.passive.EntitySquid) entity);
}
else
{
return new CraftWaterMob(server, (net.minecraft.entity.passive.EntityWaterMob) entity);
}
}
else if(entity instanceof net.minecraft.entity.monster.EntityGolem)
{
if(entity instanceof net.minecraft.entity.monster.EntitySnowman)
{
return new CraftSnowman(server, (net.minecraft.entity.monster.EntitySnowman) entity);
}
else if(entity instanceof net.minecraft.entity.monster.EntityIronGolem)
{
return new CraftIronGolem(server, (net.minecraft.entity.monster.EntityIronGolem) entity);
}
else
{
return new CraftLivingEntity(server, (net.minecraft.entity.EntityLivingBase) entity);
} // Cauldron
}
else if(entity instanceof net.minecraft.entity.passive.EntityVillager)
{
return new CraftVillager(server, (net.minecraft.entity.passive.EntityVillager) entity);
}
else
{
return new CraftCreature(server, (net.minecraft.entity.EntityCreature) entity);
}
}
// Slimes are a special (and broken) case
else if(entity instanceof net.minecraft.entity.monster.EntitySlime)
{
if(entity instanceof net.minecraft.entity.monster.EntityMagmaCube)
{
return new CraftMagmaCube(server, (net.minecraft.entity.monster.EntityMagmaCube) entity);
}
else
{
return new CraftSlime(server, (net.minecraft.entity.monster.EntitySlime) entity);
}
}
// Flying
else if(entity instanceof net.minecraft.entity.EntityFlying)
{
if(entity instanceof net.minecraft.entity.monster.EntityGhast)
{
return new CraftGhast(server, (net.minecraft.entity.monster.EntityGhast) entity);
}
else
{
return new CraftFlying(server, (net.minecraft.entity.EntityFlying) entity);
}
}
else if(entity instanceof net.minecraft.entity.boss.EntityDragon)
{
return new CraftEnderDragon(server, (net.minecraft.entity.boss.EntityDragon) entity);
}
// Ambient
else if(entity instanceof net.minecraft.entity.passive.EntityAmbientCreature)
{
if(entity instanceof net.minecraft.entity.passive.EntityBat)
{
return new CraftBat(server, (net.minecraft.entity.passive.EntityBat) entity);
}
else
{
return new CraftAmbient(server, (net.minecraft.entity.passive.EntityAmbientCreature) entity);
}
}
else
{
return new CraftLivingEntity(server, (net.minecraft.entity.EntityLivingBase) entity);
}
}
else if(entity instanceof net.minecraft.entity.boss.EntityDragonPart)
{
net.minecraft.entity.boss.EntityDragonPart part = (net.minecraft.entity.boss.EntityDragonPart) entity;
if(part.entityDragonObj instanceof net.minecraft.entity.boss.EntityDragon)
{
return new CraftEnderDragonPart(server, (net.minecraft.entity.boss.EntityDragonPart) entity);
}
else
{
return new CraftComplexPart(server, (net.minecraft.entity.boss.EntityDragonPart) entity);
}
}
else if(entity instanceof net.minecraft.entity.item.EntityXPOrb)
{
return new CraftExperienceOrb(server, (net.minecraft.entity.item.EntityXPOrb) entity);
}
else if(entity instanceof net.minecraft.entity.projectile.EntityArrow)
{
return new CraftArrow(server, (net.minecraft.entity.projectile.EntityArrow) entity);
}
else if(entity instanceof net.minecraft.entity.item.EntityBoat)
{
return new CraftBoat(server, (net.minecraft.entity.item.EntityBoat) entity);
}
else if(entity instanceof net.minecraft.entity.projectile.EntityThrowable)
{
if(entity instanceof net.minecraft.entity.projectile.EntityEgg)
{
return new CraftEgg(server, (net.minecraft.entity.projectile.EntityEgg) entity);
}
else if(entity instanceof net.minecraft.entity.projectile.EntitySnowball)
{
return new CraftSnowball(server, (net.minecraft.entity.projectile.EntitySnowball) entity);
}
else if(entity instanceof net.minecraft.entity.projectile.EntityPotion)
{
return new CraftThrownPotion(server, (net.minecraft.entity.projectile.EntityPotion) entity);
}
else if(entity instanceof net.minecraft.entity.item.EntityEnderPearl)
{
return new CraftEnderPearl(server, (net.minecraft.entity.item.EntityEnderPearl) entity);
}
else if(entity instanceof net.minecraft.entity.item.EntityExpBottle)
{
return new CraftThrownExpBottle(server, (net.minecraft.entity.item.EntityExpBottle) entity);
}
else
{
return new CraftProjectile(server, (net.minecraft.entity.projectile.EntityThrowable) entity);
} // Cauldron
}
else if(entity instanceof net.minecraft.entity.item.EntityFallingBlock)
{
return new CraftFallingSand(server, (net.minecraft.entity.item.EntityFallingBlock) entity);
}
else if(entity instanceof net.minecraft.entity.projectile.EntityFireball)
{
if(entity instanceof net.minecraft.entity.projectile.EntitySmallFireball)
{
return new CraftSmallFireball(server, (net.minecraft.entity.projectile.EntitySmallFireball) entity);
}
else if(entity instanceof net.minecraft.entity.projectile.EntityLargeFireball)
{
return new CraftLargeFireball(server, (net.minecraft.entity.projectile.EntityLargeFireball) entity);
}
else if(entity instanceof net.minecraft.entity.projectile.EntityWitherSkull)
{
return new CraftWitherSkull(server, (net.minecraft.entity.projectile.EntityWitherSkull) entity);
}
else
{
return new CraftFireball(server, (net.minecraft.entity.projectile.EntityFireball) entity);
}
}
else if(entity instanceof net.minecraft.entity.item.EntityEnderEye)
{
return new CraftEnderSignal(server, (net.minecraft.entity.item.EntityEnderEye) entity);
}
else if(entity instanceof net.minecraft.entity.item.EntityEnderCrystal)
{
return new CraftEnderCrystal(server, (net.minecraft.entity.item.EntityEnderCrystal) entity);
}
else if(entity instanceof net.minecraft.entity.projectile.EntityFishHook)
{
return new CraftFish(server, (net.minecraft.entity.projectile.EntityFishHook) entity);
}
else if(entity instanceof net.minecraft.entity.item.EntityItem)
{
return new CraftItem(server, (net.minecraft.entity.item.EntityItem) entity);
}
else if(entity instanceof net.minecraft.entity.effect.EntityWeatherEffect)
{
if(entity instanceof net.minecraft.entity.effect.EntityLightningBolt)
{
return new CraftLightningStrike(server, (net.minecraft.entity.effect.EntityLightningBolt) entity);
}
else
{
return new CraftWeather(server, (net.minecraft.entity.effect.EntityWeatherEffect) entity);
}
}
else if(entity instanceof net.minecraft.entity.item.EntityMinecart)
{
if(entity instanceof net.minecraft.entity.item.EntityMinecartFurnace)
{
return new CraftMinecartFurnace(server, (net.minecraft.entity.item.EntityMinecartFurnace) entity);
}
else if(entity instanceof net.minecraft.entity.item.EntityMinecartChest)
{
return new CraftMinecartChest(server, (net.minecraft.entity.item.EntityMinecartChest) entity);
}
else if(entity instanceof net.minecraft.entity.item.EntityMinecartTNT)
{
return new CraftMinecartTNT(server, (net.minecraft.entity.item.EntityMinecartTNT) entity);
}
else if(entity instanceof net.minecraft.entity.item.EntityMinecartHopper)
{
return new CraftMinecartHopper(server, (net.minecraft.entity.item.EntityMinecartHopper) entity);
}
else if(entity instanceof net.minecraft.entity.ai.EntityMinecartMobSpawner)
{
return new CraftMinecartMobSpawner(server, (net.minecraft.entity.ai.EntityMinecartMobSpawner) entity);
}
else if(entity instanceof net.minecraft.entity.item.EntityMinecartEmpty)
{
return new CraftMinecartRideable(server, (net.minecraft.entity.item.EntityMinecartEmpty) entity);
}
else if(entity instanceof net.minecraft.entity.EntityMinecartCommandBlock)
{
return new CraftMinecartCommand(server, (net.minecraft.entity.EntityMinecartCommandBlock) entity);
}
else
{
return new CraftMinecart(server, (net.minecraft.entity.item.EntityMinecart) entity);
} // Cauldron - other minecarts (Steve's Carts)
}
else if(entity instanceof net.minecraft.entity.EntityHanging)
{
if(entity instanceof net.minecraft.entity.item.EntityPainting)
{
return new CraftPainting(server, (net.minecraft.entity.item.EntityPainting) entity);
}
else if(entity instanceof net.minecraft.entity.item.EntityItemFrame)
{
return new CraftItemFrame(server, (net.minecraft.entity.item.EntityItemFrame) entity);
}
else if(entity instanceof net.minecraft.entity.EntityLeashKnot)
{
return new CraftLeash(server, (net.minecraft.entity.EntityLeashKnot) entity);
}
else
{
return new CraftHanging(server, (net.minecraft.entity.EntityHanging) entity);
}
}
else if(entity instanceof net.minecraft.entity.item.EntityTNTPrimed)
{
return new CraftTNTPrimed(server, (net.minecraft.entity.item.EntityTNTPrimed) entity);
}
else if(entity instanceof net.minecraft.entity.item.EntityFireworkRocket)
{
return new CraftFirework(server, (net.minecraft.entity.item.EntityFireworkRocket) entity);
}
// Cauldron - used for custom entities that extend Entity directly
else if(entity instanceof net.minecraft.entity.Entity)
{
return new CraftCustomEntity(server, (net.minecraft.entity.Entity) entity);
}
throw new AssertionError("Unknown entity " + entity == null ? null : entity.getClass() + ": " + entity); // Cauldron - show the entity that caused exception
}
// Cauldron start - copy of getEntity() but operates on classes instead of instances, for EntityRegistry registerBukkitType
public static Class<? extends org.bukkit.entity.Entity> getEntityClass(Class<? extends net.minecraft.entity.Entity> nmsClass)
{
/**
* Order is *EXTREMELY* important -- keep it right! =D
*/
// pbpaste|perl -pe's/entity instanceof ([\w.]+)/$1.class.isAssignableFrom(nmsClass)/g'|perl -pe's/return new (\w+)([^;\n]+)/return $1.class/g'
if(net.minecraft.entity.EntityLivingBase.class.isAssignableFrom(nmsClass))
{
// Players
if(net.minecraft.entity.player.EntityPlayer.class.isAssignableFrom(nmsClass))
{
if(net.minecraft.entity.player.EntityPlayerMP.class.isAssignableFrom(nmsClass))
{
return CraftPlayer.class;
}
// support fake player classes from mods
// This case is never hit in vanilla
//else { return CraftHumanEntity.class; }
else
{
return CraftPlayer.class;
}
}
else if(net.minecraft.entity.EntityCreature.class.isAssignableFrom(nmsClass))
{
// Animals
if(net.minecraft.entity.passive.EntityAnimal.class.isAssignableFrom(nmsClass))
{
if(net.minecraft.entity.passive.EntityChicken.class.isAssignableFrom(nmsClass))
{
return CraftChicken.class;
}
else if(net.minecraft.entity.passive.EntityCow.class.isAssignableFrom(nmsClass))
{
if(net.minecraft.entity.passive.EntityMooshroom.class.isAssignableFrom(nmsClass))
{
return CraftMushroomCow.class;
}
else
{
return CraftCow.class;
}
}
else if(net.minecraft.entity.passive.EntityPig.class.isAssignableFrom(nmsClass))
{
return CraftPig.class;
}
else if(net.minecraft.entity.passive.EntityTameable.class.isAssignableFrom(nmsClass))
{
if(net.minecraft.entity.passive.EntityWolf.class.isAssignableFrom(nmsClass))
{
return CraftWolf.class;
}
else if(net.minecraft.entity.passive.EntityOcelot.class.isAssignableFrom(nmsClass))
{
return CraftOcelot.class;
} // Cauldron
else
{
return CraftTameableAnimal.class;
}
}
else if(net.minecraft.entity.passive.EntitySheep.class.isAssignableFrom(nmsClass))
{
return CraftSheep.class;
}
else if(net.minecraft.entity.passive.EntityHorse.class.isAssignableFrom(nmsClass))
{
return CraftHorse.class;
}
else
{
return CraftAnimals.class;
}
}
// Monsters
else if(net.minecraft.entity.monster.EntityMob.class.isAssignableFrom(nmsClass))
{
if(net.minecraft.entity.monster.EntityZombie.class.isAssignableFrom(nmsClass))
{
if(net.minecraft.entity.monster.EntityPigZombie.class.isAssignableFrom(nmsClass))
{
return CraftPigZombie.class;
}
else
{
return CraftZombie.class;
}
}
else if(net.minecraft.entity.monster.EntityCreeper.class.isAssignableFrom(nmsClass))
{
return CraftCreeper.class;
}
else if(net.minecraft.entity.monster.EntityEnderman.class.isAssignableFrom(nmsClass))
{
return CraftEnderman.class;
}
else if(net.minecraft.entity.monster.EntitySilverfish.class.isAssignableFrom(nmsClass))
{
return CraftSilverfish.class;
}
else if(net.minecraft.entity.monster.EntityGiantZombie.class.isAssignableFrom(nmsClass))
{
return CraftGiant.class;
}
else if(net.minecraft.entity.monster.EntitySkeleton.class.isAssignableFrom(nmsClass))
{
return CraftSkeleton.class;
}
else if(net.minecraft.entity.monster.EntityBlaze.class.isAssignableFrom(nmsClass))
{
return CraftBlaze.class;
}
else if(net.minecraft.entity.monster.EntityWitch.class.isAssignableFrom(nmsClass))
{
return CraftWitch.class;
}
else if(net.minecraft.entity.boss.EntityWither.class.isAssignableFrom(nmsClass))
{
return CraftWither.class;
}
else if(net.minecraft.entity.monster.EntitySpider.class.isAssignableFrom(nmsClass))
{
if(net.minecraft.entity.monster.EntityCaveSpider.class.isAssignableFrom(nmsClass))
{
return CraftCaveSpider.class;
}
else
{
return CraftSpider.class;
}
}
else
{
return CraftMonster.class;
}
}
// Water Animals
else if(net.minecraft.entity.passive.EntityWaterMob.class.isAssignableFrom(nmsClass))
{
if(net.minecraft.entity.passive.EntitySquid.class.isAssignableFrom(nmsClass))
{
return CraftSquid.class;
}
else
{
return CraftWaterMob.class;
}
}
else if(net.minecraft.entity.monster.EntityGolem.class.isAssignableFrom(nmsClass))
{
if(net.minecraft.entity.monster.EntitySnowman.class.isAssignableFrom(nmsClass))
{
return CraftSnowman.class;
}
else if(net.minecraft.entity.monster.EntityIronGolem.class.isAssignableFrom(nmsClass))
{
return CraftIronGolem.class;
}
else
{
return CraftLivingEntity.class;
}
}
else if(net.minecraft.entity.passive.EntityVillager.class.isAssignableFrom(nmsClass))
{
return CraftVillager.class;
}
else
{
return CraftCreature.class;
}
}
// Slimes are a special (and broken) case
else if(net.minecraft.entity.monster.EntitySlime.class.isAssignableFrom(nmsClass))
{
if(net.minecraft.entity.monster.EntityMagmaCube.class.isAssignableFrom(nmsClass))
{
return CraftMagmaCube.class;
}
else
{
return CraftSlime.class;
}
}
// Flying
else if(net.minecraft.entity.EntityFlying.class.isAssignableFrom(nmsClass))
{
if(net.minecraft.entity.monster.EntityGhast.class.isAssignableFrom(nmsClass))
{
return CraftGhast.class;
}
else
{
return CraftFlying.class;
}
}
else if(net.minecraft.entity.boss.EntityDragon.class.isAssignableFrom(nmsClass))
{
return CraftEnderDragon.class;
}
// Ambient
else if(net.minecraft.entity.passive.EntityAmbientCreature.class.isAssignableFrom(nmsClass))
{
if(net.minecraft.entity.passive.EntityBat.class.isAssignableFrom(nmsClass))
{
return CraftBat.class;
}
else
{
return CraftAmbient.class;
}
}
else
{
return CraftLivingEntity.class;
}
}
else if(net.minecraft.entity.boss.EntityDragonPart.class.isAssignableFrom(nmsClass))
{
/* Cauldron - no instance, best we can say is this is a CraftComplexPart
net.minecraft.entity.boss.EntityDragonPart part = (net.minecraft.entity.boss.EntityDragonPart) entity;
if (part.entityDragonObj instanceof net.minecraft.entity.boss.EntityDragon) { return CraftEnderDragonPart.class; }
else { return CraftComplexPart.class; }
*/
return CraftComplexPart.class;
}
else if(net.minecraft.entity.item.EntityXPOrb.class.isAssignableFrom(nmsClass))
{
return CraftExperienceOrb.class;
}
else if(net.minecraft.entity.projectile.EntityArrow.class.isAssignableFrom(nmsClass))
{
return CraftArrow.class;
}
else if(net.minecraft.entity.item.EntityBoat.class.isAssignableFrom(nmsClass))
{
return CraftBoat.class;
}
else if(net.minecraft.entity.projectile.EntityThrowable.class.isAssignableFrom(nmsClass))
{
if(net.minecraft.entity.projectile.EntityEgg.class.isAssignableFrom(nmsClass))
{
return CraftEgg.class;
}
else if(net.minecraft.entity.projectile.EntitySnowball.class.isAssignableFrom(nmsClass))
{
return CraftSnowball.class;
}
else if(net.minecraft.entity.projectile.EntityPotion.class.isAssignableFrom(nmsClass))
{
return CraftThrownPotion.class;
}
else if(net.minecraft.entity.item.EntityEnderPearl.class.isAssignableFrom(nmsClass))
{
return CraftEnderPearl.class;
}
else if(net.minecraft.entity.item.EntityExpBottle.class.isAssignableFrom(nmsClass))
{
return CraftThrownExpBottle.class;
}
else
{
return CraftProjectile.class;
} // Cauldron
}
else if(net.minecraft.entity.item.EntityFallingBlock.class.isAssignableFrom(nmsClass))
{
return CraftFallingSand.class;
}
else if(net.minecraft.entity.projectile.EntityFireball.class.isAssignableFrom(nmsClass))
{
if(net.minecraft.entity.projectile.EntitySmallFireball.class.isAssignableFrom(nmsClass))
{
return CraftSmallFireball.class;
}
else if(net.minecraft.entity.projectile.EntityLargeFireball.class.isAssignableFrom(nmsClass))
{
return CraftLargeFireball.class;
}
else if(net.minecraft.entity.projectile.EntityWitherSkull.class.isAssignableFrom(nmsClass))
{
return CraftWitherSkull.class;
}
else
{
return CraftFireball.class;
}
}
else if(net.minecraft.entity.item.EntityEnderEye.class.isAssignableFrom(nmsClass))
{
return CraftEnderSignal.class;
}
else if(net.minecraft.entity.item.EntityEnderCrystal.class.isAssignableFrom(nmsClass))
{
return CraftEnderCrystal.class;
}
else if(net.minecraft.entity.projectile.EntityFishHook.class.isAssignableFrom(nmsClass))
{
return CraftFish.class;
}
else if(net.minecraft.entity.item.EntityItem.class.isAssignableFrom(nmsClass))
{
return CraftItem.class;
}
else if(net.minecraft.entity.effect.EntityWeatherEffect.class.isAssignableFrom(nmsClass))
{
if(net.minecraft.entity.effect.EntityLightningBolt.class.isAssignableFrom(nmsClass))
{
return CraftLightningStrike.class;
}
else
{
return CraftWeather.class;
}
}
else if(net.minecraft.entity.item.EntityMinecart.class.isAssignableFrom(nmsClass))
{
if(net.minecraft.entity.item.EntityMinecartFurnace.class.isAssignableFrom(nmsClass))
{
return CraftMinecartFurnace.class;
}
else if(net.minecraft.entity.item.EntityMinecartChest.class.isAssignableFrom(nmsClass))
{
return CraftMinecartChest.class;
}
else if(net.minecraft.entity.item.EntityMinecartTNT.class.isAssignableFrom(nmsClass))
{
return CraftMinecartTNT.class;
}
else if(net.minecraft.entity.item.EntityMinecartHopper.class.isAssignableFrom(nmsClass))
{
return CraftMinecartHopper.class;
}
else if(net.minecraft.entity.ai.EntityMinecartMobSpawner.class.isAssignableFrom(nmsClass))
{
return CraftMinecartMobSpawner.class;
}
else if(net.minecraft.entity.item.EntityMinecartEmpty.class.isAssignableFrom(nmsClass))
{
return CraftMinecartRideable.class;
}
else if(net.minecraft.entity.EntityMinecartCommandBlock.class.isAssignableFrom(nmsClass))
{
return CraftMinecartCommand.class;
}
else
{
return CraftMinecart.class;
} // Cauldron - other minecarts (Steve's Carts)
}
else if(net.minecraft.entity.EntityHanging.class.isAssignableFrom(nmsClass))
{
if(net.minecraft.entity.item.EntityPainting.class.isAssignableFrom(nmsClass))
{
return CraftPainting.class;
}
else if(net.minecraft.entity.item.EntityItemFrame.class.isAssignableFrom(nmsClass))
{
return CraftItemFrame.class;
}
else if(net.minecraft.entity.EntityLeashKnot.class.isAssignableFrom(nmsClass))
{
return CraftLeash.class;
}
else
{
return CraftHanging.class;
}
}
else if(net.minecraft.entity.item.EntityTNTPrimed.class.isAssignableFrom(nmsClass))
{
return CraftTNTPrimed.class;
}
else if(net.minecraft.entity.item.EntityFireworkRocket.class.isAssignableFrom(nmsClass))
{
return CraftFirework.class;
}
// Cauldron - used for custom entities that extend Entity directly
else if(net.minecraft.entity.Entity.class.isAssignableFrom(nmsClass))
{
return CraftCustomEntity.class;
}
throw new AssertionError("Unknown entity class " + nmsClass == null ? null : nmsClass); // Cauldron - show the entity that caused exception
}
// add Bukkit wrappers
public static void initMappings()
{
for(Map.Entry<Class<? extends Entity>, String> entry : ((IMixinEntityRegistry) EntityRegistry.instance()).getEntityTypeMap().entrySet())
{
Class<? extends Entity> entityClass = entry.getKey();
String entityName = entry.getValue();
int entityId = getEntityTypeIDfromClass(entityClass);
Class<? extends org.bukkit.entity.Entity> bukkitEntityClass = CraftEntity.getEntityClass(entityClass);
BukkitEnumHelper.addBukkitEntityType(entityName, bukkitEntityClass, entityId, false);
}
}
// Lookup entity id from NMS entity class
private static int getEntityTypeIDfromClass(Class entityClass)
{
// check both maps, since mods can add to either
Map<Class, Integer> classToIDMapping = cpw.mods.fml.relauncher.ReflectionHelper.getPrivateValue(net.minecraft.entity.EntityList.class, null, "field_75624_e", "classToIDMapping");
if(classToIDMapping.containsKey(entityClass))
{
return classToIDMapping.get(entityClass);
}
Map<Integer, Class> IDtoClassMapping = cpw.mods.fml.relauncher.ReflectionHelper.getPrivateValue(net.minecraft.entity.EntityList.class, null, "field_75623_d", "IDtoClassMapping");
for(Map.Entry<Integer, Class> entry : IDtoClassMapping.entrySet())
{
int entityId = entry.getKey();
Class thisEntityClass = entry.getValue();
if(thisEntityClass.getName().equals(entityClass.getName()))
{
return entityId;
}
}
// if there is no entity ID, choose a negative integer based on the class name
return -Math.abs(entityClass.getName().hashCode() ^ (entityClass.getName().hashCode() >>> 16));
}
// Cauldron end
public Location getLocation()
{
return new Location(getWorld(), entity.posX, entity.posY, entity.posZ, entity.rotationYaw, entity.rotationPitch);
}
public Location getLocation(Location loc)
{
if(loc != null)
{
loc.setWorld(getWorld());
loc.setX(entity.posX);
loc.setY(entity.posY);
loc.setZ(entity.posZ);
loc.setYaw(entity.rotationYaw);
loc.setPitch(entity.rotationPitch);
}
return loc;
}
public Vector getVelocity()
{
return new Vector(entity.motionX, entity.motionY, entity.motionZ);
}
public void setVelocity(Vector vel)
{
entity.motionX = vel.getX();
entity.motionY = vel.getY();
entity.motionZ = vel.getZ();
entity.velocityChanged = true;
}
public boolean isOnGround()
{
if(entity instanceof net.minecraft.entity.projectile.EntityArrow)
{
return ((IMixinEntityArrow) entity).isInGround();
}
return entity.onGround;
}
public World getWorld()
{
// Cauldron start - fixes MFR proxy worlds used with grinder/slaughterhouse
if(((IMixinWorld) entity.worldObj).getWorld() == null)
{
return ((IMixinWorld) DimensionManager.getWorld(0)).getWorld();
}
// Cauldron end
return ((IMixinWorld) entity.worldObj).getWorld();
}
public boolean teleport(Location location)
{
return teleport(location, TeleportCause.PLUGIN);
}
public boolean teleport(Location location, TeleportCause cause)
{
if(entity.ridingEntity != null || entity.riddenByEntity != null || entity.isDead)
{
return false;
}
// Spigot start
net.minecraft.world.WorldServer newWorld = ((CraftWorld) location.getWorld()).getHandle();
if(newWorld != entity.worldObj)
{
((IMixinEntity) entity).teleportTo(location, cause.isPortal());
return true;
}
// Spigot
entity.setPositionAndRotation(location.getX(), location.getY(), location.getZ(), location.getYaw(), location.getPitch());
// entity.setLocation() throws no event, and so cannot be cancelled
return true;
}
public boolean teleport(org.bukkit.entity.Entity destination)
{
return teleport(destination.getLocation());
}
public boolean teleport(org.bukkit.entity.Entity destination, TeleportCause cause)
{
return teleport(destination.getLocation(), cause);
}
public List<org.bukkit.entity.Entity> getNearbyEntities(double x, double y, double z)
{
@SuppressWarnings("unchecked")
List<net.minecraft.entity.Entity> notchEntityList = entity.worldObj.getEntitiesWithinAABBExcludingEntity(entity, entity.boundingBox.expand(x, y, z));
List<org.bukkit.entity.Entity> bukkitEntityList = new java.util.ArrayList<org.bukkit.entity.Entity>(notchEntityList.size());
for(net.minecraft.entity.Entity e : notchEntityList)
{
bukkitEntityList.add(((IMixinEntity) e).getBukkitEntity());
}
return bukkitEntityList;
}
public int getEntityId()
{
return entity.getEntityId();
}
public int getFireTicks()
{
return ((IMixinEntity) entity).getFireTicks();
}
public int getMaxFireTicks()
{
return entity.fireResistance;
}
public void setFireTicks(int ticks)
{
((IMixinEntity) entity).setFireTicks(ticks);
}
public void remove()
{
entity.isDead = true;
}
public boolean isDead()
{
return !entity.isEntityAlive();
}
public boolean isValid()
{
return entity.isEntityAlive();// && entity.valid;
}
public Server getServer()
{
return server;
}
public Vector getMomentum()
{
return getVelocity();
}
public void setMomentum(Vector value)
{
setVelocity(value);
}
public org.bukkit.entity.Entity getPassenger()
{
return isEmpty() ? null : ((IMixinEntity) getHandle().riddenByEntity).getBukkitEntity();
}
public boolean setPassenger(org.bukkit.entity.Entity passenger)
{
if(passenger instanceof CraftEntity)
{
((IMixinEntity) ((CraftEntity) passenger).getHandle()).setPassengerOf(getHandle());
return true;
}
else
{
return false;
}
}
public boolean isEmpty()
{
return getHandle().riddenByEntity == null;
}
public boolean eject()
{
if(getHandle().riddenByEntity == null)
{
return false;
}
((IMixinEntity) getHandle().riddenByEntity).setPassengerOf(null);
return true;
}
public float getFallDistance()
{
return getHandle().fallDistance;
}
public void setFallDistance(float distance)
{
getHandle().fallDistance = distance;
}
public void setLastDamageCause(EntityDamageEvent event)
{
lastDamageEvent = event;
}
public EntityDamageEvent getLastDamageCause()
{
return lastDamageEvent;
}
public UUID getUniqueId()
{
return getHandle().getUniqueID();
}
public int getTicksLived()
{
return getHandle().ticksExisted;
}
public void setTicksLived(int value)
{
if(value <= 0)
{
throw new IllegalArgumentException("Age must be at least 1 tick");
}
getHandle().ticksExisted = value;
}
public net.minecraft.entity.Entity getHandle()
{
return entity;
}
public void playEffect(EntityEffect type)
{
this.getHandle().worldObj.setEntityState(getHandle(), type.getData());
}
public void setHandle(final net.minecraft.entity.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;
}
public void setMetadata(String metadataKey, MetadataValue newMetadataValue)
{
server.getEntityMetadata().setMetadata(this, metadataKey, newMetadataValue);
}
public List<MetadataValue> getMetadata(String metadataKey)
{
return server.getEntityMetadata().getMetadata(this, metadataKey);
}
public boolean hasMetadata(String metadataKey)
{
return server.getEntityMetadata().hasMetadata(this, metadataKey);
}
public void removeMetadata(String metadataKey, Plugin owningPlugin)
{
server.getEntityMetadata().removeMetadata(this, metadataKey, owningPlugin);
}
public boolean isInsideVehicle()
{
return getHandle().ridingEntity != null;
}
public boolean leaveVehicle()
{
if(getHandle().ridingEntity == null)
{
return false;
}
((IMixinEntity) getHandle()).setPassengerOf(null);
return true;
}
public org.bukkit.entity.Entity getVehicle()
{
if(getHandle().ridingEntity == null)
{
return null;
}
return ((IMixinEntity) getHandle().ridingEntity).getBukkitEntity();
}
// Spigot start
private final Spigot spigot = new Spigot()
{
@Override
public boolean isInvulnerable()
{
return getHandle().isEntityInvulnerable();
}
};
public Spigot spigot()
{
return spigot;
}
// Spigot end
}