Fork of Poseidon providing Bukkit #1060 to older Beta versions (b1.0-b1.7.3)
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}