Fork of Poseidon providing Bukkit #1060 to older Beta versions (b1.0-b1.7.3)
at develop 314 lines 12 kB view raw
1package org.bukkit.craftbukkit.entity; 2 3import com.google.common.collect.MapMaker; 4import net.minecraft.server.*; 5import org.bukkit.Bukkit; 6import org.bukkit.Location; 7import org.bukkit.Server; 8import org.bukkit.World; 9import org.bukkit.craftbukkit.CraftServer; 10import org.bukkit.craftbukkit.CraftWorld; 11import org.bukkit.event.entity.EntityDamageEvent; 12import org.bukkit.util.Vector; 13 14import java.util.List; 15import java.util.Map; 16import java.util.UUID; 17 18public abstract class CraftEntity implements org.bukkit.entity.Entity { 19 private static final Map<String, CraftPlayer> players = new MapMaker().softValues().makeMap(); 20 protected final CraftServer server; 21 protected Entity entity; 22 private EntityDamageEvent lastDamageEvent; 23 24 public CraftEntity(final CraftServer server, final Entity entity) { 25 this.server = server; 26 this.entity = entity; 27 } 28 29 public static CraftEntity getEntity(CraftServer server, Entity entity) { 30 /** 31 * Order is *EXTREMELY* important -- keep it right! =D 32 */ 33 if (entity instanceof EntityLiving) { 34 // Players 35 if (entity instanceof EntityHuman) { 36 if (entity instanceof EntityPlayer) { 37 return getPlayer((EntityPlayer) entity); 38 } else { 39 return new CraftHumanEntity(server, (EntityHuman) entity); 40 } 41 } else if (entity instanceof EntityCreature) { 42 // Animals 43 if (entity instanceof EntityAnimal) { 44 if (entity instanceof EntityChicken) { 45 return new CraftChicken(server, (EntityChicken) entity); 46 } else if (entity instanceof EntityCow) { 47 return new CraftCow(server, (EntityCow) entity); 48 } else if (entity instanceof EntityPig) { 49 return new CraftPig(server, (EntityPig) entity); 50 } else if (entity instanceof EntityWolf) { 51 return new CraftWolf(server, (EntityWolf) entity); 52 } else if (entity instanceof EntitySheep) { 53 return new CraftSheep(server, (EntitySheep) entity); 54 } else { 55 return new CraftAnimals(server, (EntityAnimal) entity); 56 } 57 } 58 // Monsters 59 else if (entity instanceof EntityMonster) { 60 if (entity instanceof EntityZombie) { 61 if (entity instanceof EntityPigZombie) { 62 return new CraftPigZombie(server, (EntityPigZombie) entity); 63 } else { 64 return new CraftZombie(server, (EntityZombie) entity); 65 } 66 } else if (entity instanceof EntityCreeper) { 67 return new CraftCreeper(server, (EntityCreeper) entity); 68 } else if (entity instanceof EntityGiantZombie) { 69 return new CraftGiant(server, (EntityGiantZombie) entity); 70 } else if (entity instanceof EntitySkeleton) { 71 return new CraftSkeleton(server, (EntitySkeleton) entity); 72 } else if (entity instanceof EntitySpider) { 73 return new CraftSpider(server, (EntitySpider) entity); 74 } else { 75 return new CraftMonster(server, (EntityMonster) entity); 76 } 77 } 78 // Water Animals 79 else if (entity instanceof EntityWaterAnimal) { 80 if (entity instanceof EntitySquid) { 81 return new CraftSquid(server, (EntitySquid) entity); 82 } else { 83 return new CraftWaterMob(server, (EntityWaterAnimal) entity); 84 } 85 } else { 86 return new CraftCreature(server, (EntityCreature) entity); 87 } 88 } 89 // Slimes are a special (and broken) case 90 else if (entity instanceof EntitySlime) { 91 return new CraftSlime(server, (EntitySlime) entity); 92 } 93 // Flying 94 else if (entity instanceof EntityFlying) { 95 if (entity instanceof EntityGhast) { 96 return new CraftGhast(server, (EntityGhast) entity); 97 } else { 98 return new CraftFlying(server, (EntityFlying) entity); 99 } 100 } else { 101 return new CraftLivingEntity(server, (EntityLiving) entity); 102 } 103 } else if (entity instanceof EntityArrow) { 104 return new CraftArrow(server, (EntityArrow) entity); 105 } else if (entity instanceof EntityBoat) { 106 return new CraftBoat(server, (EntityBoat) entity); 107 } else if (entity instanceof EntityEgg) { 108 return new CraftEgg(server, (EntityEgg) entity); 109 } else if (entity instanceof EntityFallingSand) { 110 return new CraftFallingSand(server, (EntityFallingSand) entity); 111 } else if (entity instanceof EntityFireball) { 112 return new CraftFireball(server, (EntityFireball) entity); 113 } else if (entity instanceof EntityFish) { 114 return new CraftFish(server, (EntityFish) entity); 115 } else if (entity instanceof EntityItem) { 116 return new CraftItem(server, (EntityItem) entity); 117 } else if (entity instanceof EntityWeather) { 118 if (entity instanceof EntityWeatherStorm) { 119 return new CraftLightningStrike(server, (EntityWeatherStorm) entity); 120 } else { 121 return new CraftWeather(server, (EntityWeather) entity); 122 } 123 } else if (entity instanceof EntityMinecart) { 124 EntityMinecart mc = (EntityMinecart) entity; 125 if (mc.type == CraftMinecart.Type.StorageMinecart.getId()) { 126 return new CraftStorageMinecart(server, mc); 127 } else if (mc.type == CraftMinecart.Type.PoweredMinecart.getId()) { 128 return new CraftPoweredMinecart(server, mc); 129 } else { 130 return new CraftMinecart(server, mc); 131 } 132 } else if (entity instanceof EntityPainting) { 133 return new CraftPainting(server, (EntityPainting) entity); 134 } else if (entity instanceof EntitySnowball) { 135 return new CraftSnowball(server, (EntitySnowball) entity); 136 } else if (entity instanceof EntityTNTPrimed) { 137 return new CraftTNTPrimed(server, (EntityTNTPrimed) entity); 138 } else throw new IllegalArgumentException("Unknown entity"); 139 } 140 141 public Location getLocation() { 142 return new Location(getWorld(), entity.locX, entity.locY, entity.locZ, entity.yaw, entity.pitch); 143 } 144 145 public Vector getVelocity() { 146 return new Vector(entity.motX, entity.motY, entity.motZ); 147 } 148 149 public void setVelocity(Vector vel) { 150 entity.motX = vel.getX(); 151 entity.motY = vel.getY(); 152 entity.motZ = vel.getZ(); 153 entity.velocityChanged = true; 154 } 155 156 public World getWorld() { 157 return ((WorldServer) entity.world).getWorld(); 158 } 159 160 public boolean teleport(Location location) { 161 entity.world = ((CraftWorld) location.getWorld()).getHandle(); 162 entity.setLocation(location.getX(), location.getY(), location.getZ(), location.getYaw(), location.getPitch()); 163 // entity.setLocation() throws no event, and so cannot be cancelled 164 return true; 165 } 166 167 public boolean teleport(org.bukkit.entity.Entity destination) { 168 return teleport(destination.getLocation()); 169 } 170 171 public List<org.bukkit.entity.Entity> getNearbyEntities(double x, double y, double z) { 172 @SuppressWarnings("unchecked") List<Entity> notchEntityList = entity.world.b(entity, entity.boundingBox.b(x, y, z)); 173 List<org.bukkit.entity.Entity> bukkitEntityList = new java.util.ArrayList<org.bukkit.entity.Entity>(notchEntityList.size()); 174 175 for (Entity e : notchEntityList) { 176 bukkitEntityList.add(e.getBukkitEntity()); 177 } 178 return bukkitEntityList; 179 } 180 181 public int getEntityId() { 182 return entity.id; 183 } 184 185 public int getFireTicks() { 186 return entity.fireTicks; 187 } 188 189 public int getMaxFireTicks() { 190 return entity.maxFireTicks; 191 } 192 193 public void setFireTicks(int ticks) { 194 entity.fireTicks = ticks; 195 } 196 197 public void remove() { 198 entity.dead = true; 199 } 200 201 public boolean isDead() { 202 return entity.dead; 203 } 204 205 public Entity getHandle() { 206 return entity; 207 } 208 209 public void setHandle(final Entity entity) { 210 this.entity = entity; 211 } 212 213 @Override 214 public boolean equals(Object obj) { 215 if (obj == null) { 216 return false; 217 } 218 if (getClass() != obj.getClass()) { 219 return false; 220 } 221 final CraftEntity other = (CraftEntity) obj; 222 if (this.server != other.server && (this.server == null || !this.server.equals(other.server))) { 223 return false; 224 } 225 if (this.entity != other.entity && (this.entity == null || !this.entity.equals(other.entity))) { 226 return false; 227 } 228 return true; 229 } 230 231 @Override 232 public int hashCode() { 233 int hash = 7; 234 hash = 89 * hash + (this.server != null ? this.server.hashCode() : 0); 235 hash = 89 * hash + (this.entity != null ? this.entity.hashCode() : 0); 236 return hash; 237 } 238 239 @Override 240 public String toString() { 241 return "CraftEntity{" + "id=" + getEntityId() + '}'; 242 } 243 244 public Server getServer() { 245 return server; 246 } 247 248 public Vector getMomentum() { 249 return getVelocity(); 250 } 251 252 public void setMomentum(Vector value) { 253 setVelocity(value); 254 } 255 256 public org.bukkit.entity.Entity getPassenger() { 257 return isEmpty() ? null : (CraftEntity) getHandle().passenger.getBukkitEntity(); 258 } 259 260 public boolean setPassenger(org.bukkit.entity.Entity passenger) { 261 if (passenger instanceof CraftEntity) { 262 ((CraftEntity) passenger).getHandle().setPassengerOf(getHandle()); 263 return true; 264 } else { 265 return false; 266 } 267 } 268 269 public boolean isEmpty() { 270 return getHandle().passenger == null; 271 } 272 273 public boolean eject() { 274 if (getHandle().passenger == null) { 275 return false; 276 } 277 278 getHandle().passenger.setPassengerOf(null); 279 return true; 280 } 281 282 public float getFallDistance() { 283 return getHandle().fallDistance; 284 } 285 286 public void setFallDistance(float distance) { 287 getHandle().fallDistance = distance; 288 } 289 290 public void setLastDamageCause(EntityDamageEvent event) { 291 lastDamageEvent = event; 292 } 293 294 public EntityDamageEvent getLastDamageCause() { 295 return lastDamageEvent; 296 } 297 298 public UUID getUniqueId() { 299 return getHandle().uniqueId; 300 } 301 302 private static CraftPlayer getPlayer(EntityPlayer entity) { 303 CraftPlayer result = players.get(entity.name); 304 305 if (result == null) { 306 result = new CraftPlayer((CraftServer) Bukkit.getServer(), entity); 307 players.put(entity.name, result); 308 } else { 309 result.setHandle(entity); 310 } 311 312 return result; 313 } 314}