From 5260db44b6f361f59a8af0df4d8db9c0e77a414b Mon Sep 17 00:00:00 2001 From: Patrick Seidel Date: Thu, 21 Mar 2013 16:51:35 -0400 Subject: [PATCH 1/9] Add method to send fake sign updates to players. Adds BUKKIT-2300 -Testing commit - Phou Lee --- .../minecraft/server/PlayerConnection.java | 7 +---- .../net/minecraft/server/TileEntitySign.java | 26 +++++++++++-------- .../bukkit/craftbukkit/block/CraftSign.java | 22 +++++++++++----- .../craftbukkit/entity/CraftPlayer.java | 22 ++++++++++++++++ 4 files changed, 53 insertions(+), 24 deletions(-) diff --git a/src/main/java/net/minecraft/server/PlayerConnection.java b/src/main/java/net/minecraft/server/PlayerConnection.java index ca6b33c949..be2bca23e8 100644 --- a/src/main/java/net/minecraft/server/PlayerConnection.java +++ b/src/main/java/net/minecraft/server/PlayerConnection.java @@ -1583,12 +1583,7 @@ public void a(PacketPlayInUpdateSign packetplayinupdatesign) { this.server.getPluginManager().callEvent(event); if (!event.isCancelled()) { - for (int l = 0; l < 4; ++l) { - tileentitysign1.lines[l] = event.getLine(l); - if(tileentitysign1.lines[l] == null) { - tileentitysign1.lines[l] = ""; - } - } + tileentitysign1.lines = org.bukkit.craftbukkit.block.CraftSign.sanitizeLines(event.getLines()); tileentitysign1.isEditable = false; } // System.arraycopy(packetplayinupdatesign.f(), 0, tileentitysign1.lines, 0, 4); diff --git a/src/main/java/net/minecraft/server/TileEntitySign.java b/src/main/java/net/minecraft/server/TileEntitySign.java index c504dbe641..552919c4c5 100644 --- a/src/main/java/net/minecraft/server/TileEntitySign.java +++ b/src/main/java/net/minecraft/server/TileEntitySign.java @@ -30,17 +30,7 @@ public void a(NBTTagCompound nbttagcompound) { } public Packet getUpdatePacket() { - String[] astring = new String[4]; - - // CraftBukkit start - Limit sign text to 15 chars per line - for (int i = 0; i < 4; ++i) { - astring[i] = this.lines[i]; - - if (this.lines[i].length() > 15) { - astring[i] = this.lines[i].substring(0, 15); - } - } - // CraftBukkit end + String[] astring = sanitizeLines(this.lines); // CraftBukkit - call sign line sanitizer to limit line length return new PacketPlayOutUpdateSign(this.x, this.y, this.z, astring); } @@ -56,4 +46,18 @@ public void a(EntityHuman entityhuman) { public EntityHuman b() { return this.k; } + + // CraftBukkit start - central method to limit sign text to 15 chars per line + public static String[] sanitizeLines(String[] lines) { + String[] astring = new String[4]; + for (int i = 0; i < 4; ++i) { + astring[i] = lines[i]; + + if (lines[i].length() > 15) { + astring[i] = lines[i].substring(0, 15); + } + } + return astring; + } + // CraftBukkit end } diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftSign.java b/src/main/java/org/bukkit/craftbukkit/block/CraftSign.java index 16471009fa..77717d5b2b 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftSign.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftSign.java @@ -35,16 +35,24 @@ public boolean update(boolean force, boolean applyPhysics) { boolean result = super.update(force, applyPhysics); if (result) { - for(int i = 0; i < 4; i++) { - if(lines[i] != null) { - sign.lines[i] = lines[i]; - } else { - sign.lines[i] = ""; - } - } + sign.lines = sanitizeLines(lines); sign.update(); } return result; } + + public static String[] sanitizeLines(String[] lines) { + String[] astring = new String[4]; + + for (int i = 0; i < 4; i++) { + if (i < lines.length && lines[i] != null) { + astring[i] = lines[i]; + } else { + astring[i] = ""; + } + } + + return TileEntitySign.sanitizeLines(astring); + } } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java index 4c19370980..17c16dc692 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java @@ -31,6 +31,7 @@ import org.bukkit.conversations.Conversation; import org.bukkit.conversations.ConversationAbandonedEvent; import org.bukkit.conversations.ManuallyAbandonedConversationCanceller; +import org.bukkit.craftbukkit.block.CraftSign; import org.bukkit.craftbukkit.conversations.ConversationTracker; import org.bukkit.craftbukkit.CraftEffect; import org.bukkit.craftbukkit.CraftOfflinePlayer; @@ -368,6 +369,27 @@ public void sendBlockChange(Location loc, int material, byte data) { getHandle().playerConnection.sendPacket(packet); } + @Override + public void sendSignChange(Location loc, String[] lines) { + if (getHandle().playerConnection == null) { + return; + } + + if (lines == null) { + lines = new String[4]; + } + + Validate.notNull(loc, "Location can not be null"); + if (lines.length < 4) { + throw new IllegalArgumentException("Must have at least 4 lines"); + } + + // Limit to 15 chars per line and set null lines to blank + String[] astring = CraftSign.sanitizeLines(lines); + + getHandle().playerConnection.sendPacket(new PacketPlayOutUpdateSign(loc.getBlockX(), loc.getBlockY(), loc.getBlockZ(), astring)); + } + @Override public boolean sendChunkChange(Location loc, int sx, int sy, int sz, byte[] data) { if (getHandle().playerConnection == null) return false; From 907bbd40d2f77ca61f9be5991cddbbc43b779d63 Mon Sep 17 00:00:00 2001 From: leex5047 Date: Tue, 15 Apr 2014 17:56:06 -0500 Subject: [PATCH 2/9] EntityZombie & EntitySkeleton shared about 30-40 lines of code. Since this chunk of code is big, we decided to extract it into the abstract class. Now both classes use the method from the abstract class. --- .../net/minecraft/server/EntityMonster.java | 33 +++++++++++++++++++ .../net/minecraft/server/EntitySkeleton.java | 30 +---------------- .../net/minecraft/server/EntityZombie.java | 31 ++--------------- 3 files changed, 36 insertions(+), 58 deletions(-) diff --git a/src/main/java/net/minecraft/server/EntityMonster.java b/src/main/java/net/minecraft/server/EntityMonster.java index 6e02e2a5b8..a593bfcd9d 100644 --- a/src/main/java/net/minecraft/server/EntityMonster.java +++ b/src/main/java/net/minecraft/server/EntityMonster.java @@ -1,5 +1,6 @@ package net.minecraft.server; +import org.bukkit.event.entity.EntityCombustEvent; import org.bukkit.event.entity.EntityTargetEvent; // CraftBukkit public abstract class EntityMonster extends EntityCreature implements IMonster { @@ -8,6 +9,38 @@ public EntityMonster(World world) { super(world); this.b = 5; } + + protected void worldStuff() { + float f = this.d(1.0F); + + if (f > 0.5F && this.random.nextFloat() * 30.0F < (f - 0.4F) * 2.0F && this.world.i(MathHelper.floor(this.locX), MathHelper.floor(this.locY), MathHelper.floor(this.locZ))) { + boolean flag = true; + ItemStack itemstack = this.getEquipment(4); + + if (itemstack != null) { + if (itemstack.g()) { + itemstack.setData(itemstack.j() + this.random.nextInt(2)); + if (itemstack.j() >= itemstack.l()) { + this.a(itemstack); + this.setEquipment(4, (ItemStack) null); + } + } + + flag = false; + } + + if (flag) { + // CraftBukkit start + EntityCombustEvent event = new EntityCombustEvent(this.getBukkitEntity(), 8); + this.world.getServer().getPluginManager().callEvent(event); + + if (!event.isCancelled()) { + this.setOnFire(event.getDuration()); + } + // CraftBukkit end + } + } + } public void e() { this.ba(); diff --git a/src/main/java/net/minecraft/server/EntitySkeleton.java b/src/main/java/net/minecraft/server/EntitySkeleton.java index cb25df17a5..83979c20c2 100644 --- a/src/main/java/net/minecraft/server/EntitySkeleton.java +++ b/src/main/java/net/minecraft/server/EntitySkeleton.java @@ -72,35 +72,7 @@ public EnumMonsterType getMonsterType() { public void e() { if (this.world.w() && !this.world.isStatic) { - float f = this.d(1.0F); - - if (f > 0.5F && this.random.nextFloat() * 30.0F < (f - 0.4F) * 2.0F && this.world.i(MathHelper.floor(this.locX), MathHelper.floor(this.locY), MathHelper.floor(this.locZ))) { - boolean flag = true; - ItemStack itemstack = this.getEquipment(4); - - if (itemstack != null) { - if (itemstack.g()) { - itemstack.setData(itemstack.j() + this.random.nextInt(2)); - if (itemstack.j() >= itemstack.l()) { - this.a(itemstack); - this.setEquipment(4, (ItemStack) null); - } - } - - flag = false; - } - - if (flag) { - // CraftBukkit start - EntityCombustEvent event = new EntityCombustEvent(this.getBukkitEntity(), 8); - this.world.getServer().getPluginManager().callEvent(event); - - if (!event.isCancelled()) { - this.setOnFire(event.getDuration()); - } - // CraftBukkit end - } - } + worldStuff(); } if (this.world.isStatic && this.getSkeletonType() == 1) { diff --git a/src/main/java/net/minecraft/server/EntityZombie.java b/src/main/java/net/minecraft/server/EntityZombie.java index b751d01c2a..5d978dc814 100644 --- a/src/main/java/net/minecraft/server/EntityZombie.java +++ b/src/main/java/net/minecraft/server/EntityZombie.java @@ -120,35 +120,7 @@ public void setVillager(boolean flag) { public void e() { if (this.world.w() && !this.world.isStatic && !this.isBaby()) { - float f = this.d(1.0F); - - if (f > 0.5F && this.random.nextFloat() * 30.0F < (f - 0.4F) * 2.0F && this.world.i(MathHelper.floor(this.locX), MathHelper.floor(this.locY), MathHelper.floor(this.locZ))) { - boolean flag = true; - ItemStack itemstack = this.getEquipment(4); - - if (itemstack != null) { - if (itemstack.g()) { - itemstack.setData(itemstack.j() + this.random.nextInt(2)); - if (itemstack.j() >= itemstack.l()) { - this.a(itemstack); - this.setEquipment(4, (ItemStack) null); - } - } - - flag = false; - } - - if (flag) { - // CraftBukkit start - EntityCombustEvent event = new EntityCombustEvent(this.getBukkitEntity(), 8); - this.world.getServer().getPluginManager().callEvent(event); - - if (!event.isCancelled()) { - this.setOnFire(event.getDuration()); - } - // CraftBukkit end - } - } + worldStuff(); } if (this.al() && this.getGoalTarget() != null && this.vehicle instanceof EntityChicken) { @@ -158,6 +130,7 @@ public void e() { super.e(); } + public boolean damageEntity(DamageSource damagesource, float f) { if (!super.damageEntity(damagesource, f)) { return false; From eee5f12c2d5aab726e95b827a0ce2ddb0c5098b9 Mon Sep 17 00:00:00 2001 From: leex5047 Date: Tue, 15 Apr 2014 18:11:02 -0500 Subject: [PATCH 3/9] We shorten the method a from EntityBlaze. We were able to extract two smaller methods from it called setTicks() and shootFireballs(). This was done to make the code more readable. --- .../net/minecraft/server/EntityBlaze.java | 55 +++++++++++-------- .../craftbukkit/entity/CraftMonster.java | 2 + 2 files changed, 33 insertions(+), 24 deletions(-) diff --git a/src/main/java/net/minecraft/server/EntityBlaze.java b/src/main/java/net/minecraft/server/EntityBlaze.java index 790185c556..a73d370a37 100644 --- a/src/main/java/net/minecraft/server/EntityBlaze.java +++ b/src/main/java/net/minecraft/server/EntityBlaze.java @@ -80,30 +80,8 @@ protected void a(Entity entity, float f) { double d2 = entity.locZ - this.locZ; if (this.attackTicks == 0) { - ++this.br; - if (this.br == 1) { - this.attackTicks = 60; - this.a(true); - } else if (this.br <= 4) { - this.attackTicks = 6; - } else { - this.attackTicks = 100; - this.br = 0; - this.a(false); - } - - if (this.br > 1) { - float f1 = MathHelper.c(f) * 0.5F; - - this.world.a((EntityHuman) null, 1009, (int) this.locX, (int) this.locY, (int) this.locZ, 0); - - for (int i = 0; i < 1; ++i) { - EntitySmallFireball entitysmallfireball = new EntitySmallFireball(this.world, this, d0 + this.random.nextGaussian() * (double) f1, d1, d2 + this.random.nextGaussian() * (double) f1); - - entitysmallfireball.locY = this.locY + (double) (this.length / 2.0F) + 0.5D; - this.world.addEntity(entitysmallfireball); - } - } + setTicks(); + shootFireballs(f, d0, d1, d2); } this.yaw = (float) (Math.atan2(d2, d0) * 180.0D / 3.1415927410125732D) - 90.0F; @@ -111,6 +89,35 @@ protected void a(Entity entity, float f) { } } + private void setTicks() { + ++this.br; + if (this.br == 1) { + this.attackTicks = 60; + this.a(true); + } else if (this.br <= 4) { + this.attackTicks = 6; + } else { + this.attackTicks = 100; + this.br = 0; + this.a(false); + } + } + + private void shootFireballs(float f, double d0, double d1, double d2) { + if (this.br > 1) { + float f1 = MathHelper.c(f) * 0.5F; + + this.world.a((EntityHuman) null, 1009, (int) this.locX, (int) this.locY, (int) this.locZ, 0); + + for (int i = 0; i < 1; ++i) { + EntitySmallFireball entitysmallfireball = new EntitySmallFireball(this.world, this, d0 + this.random.nextGaussian() * (double) f1, d1, d2 + this.random.nextGaussian() * (double) f1); + + entitysmallfireball.locY = this.locY + (double) (this.length / 2.0F) + 0.5D; + this.world.addEntity(entitysmallfireball); + } + } + } + protected void b(float f) {} protected Item getLoot() { diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftMonster.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftMonster.java index 72dedbc8f4..2e6b330f0d 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftMonster.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftMonster.java @@ -20,4 +20,6 @@ public EntityMonster getHandle() { public String toString() { return "CraftMonster"; } + + } From 6fedc92f443eb73d15abc87ee00e089ca06651ba Mon Sep 17 00:00:00 2001 From: leex5047 Date: Tue, 15 Apr 2014 18:28:18 -0500 Subject: [PATCH 4/9] We used CodePro's Similar Code to find duplications. Duplication lines were found within EntityBlaze and EntitySpider. We were able to extract the duplicated method and put it in EntityMonster. Tests were green. --- .../java/net/minecraft/server/EntityBlaze.java | 16 ++-------------- .../java/net/minecraft/server/EntityMonster.java | 13 +++++++++++++ 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/src/main/java/net/minecraft/server/EntityBlaze.java b/src/main/java/net/minecraft/server/EntityBlaze.java index a73d370a37..b319917f68 100644 --- a/src/main/java/net/minecraft/server/EntityBlaze.java +++ b/src/main/java/net/minecraft/server/EntityBlaze.java @@ -93,13 +93,13 @@ private void setTicks() { ++this.br; if (this.br == 1) { this.attackTicks = 60; - this.a(true); + aa(true); } else if (this.br <= 4) { this.attackTicks = 6; } else { this.attackTicks = 100; this.br = 0; - this.a(false); + aa(false); } } @@ -148,18 +148,6 @@ public boolean bZ() { return (this.datawatcher.getByte(16) & 1) != 0; } - public void a(boolean flag) { - byte b0 = this.datawatcher.getByte(16); - - if (flag) { - b0 = (byte) (b0 | 1); - } else { - b0 &= -2; - } - - this.datawatcher.watch(16, Byte.valueOf(b0)); - } - protected boolean j_() { return true; } diff --git a/src/main/java/net/minecraft/server/EntityMonster.java b/src/main/java/net/minecraft/server/EntityMonster.java index a593bfcd9d..de14655d3e 100644 --- a/src/main/java/net/minecraft/server/EntityMonster.java +++ b/src/main/java/net/minecraft/server/EntityMonster.java @@ -199,4 +199,17 @@ protected void aC() { protected boolean aF() { return true; } + + public void aa(boolean flag) { + byte b0 = this.datawatcher.getByte(16); + + if (flag) { + b0 = (byte) (b0 | 1); + } else { + b0 &= -2; + } + + this.datawatcher.watch(16, Byte.valueOf(b0)); + } + } From 6f586909268eaa727f05c692dc7ec541e334028f Mon Sep 17 00:00:00 2001 From: leex5047 Date: Wed, 23 Apr 2014 21:10:40 -0500 Subject: [PATCH 5/9] We tried reflection on switch statments in craftart. We could not figure out how to do this so instead we moved on to other refactorings. Next, we applied polymorphism to getEntity() in CraftEntity. We got about 1/5 of it done. All the tests seem to pass. Ran into issues with classes with no source code. We worked around this by just throwing the logic into the appropriate super class. --- .../java/net/minecraft/server/Entity.java | 5 ++ .../net/minecraft/server/EntityBlaze.java | 9 +++ .../net/minecraft/server/EntityChicken.java | 9 +++ .../java/net/minecraft/server/EntityCow.java | 9 +++ .../net/minecraft/server/EntityCreature.java | 69 +++++++++++++++++++ .../net/minecraft/server/EntityCreeper.java | 8 +++ .../net/minecraft/server/EntityEnderman.java | 8 +++ .../net/minecraft/server/EntityHorse.java | 9 +++ .../net/minecraft/server/EntityHuman.java | 8 +++ .../net/minecraft/server/EntityLiving.java | 8 +++ .../net/minecraft/server/EntityMonster.java | 9 +++ .../minecraft/server/EntityMushroomCow.java | 9 +++ .../java/net/minecraft/server/EntityPig.java | 8 +++ .../net/minecraft/server/EntityPigZombie.java | 9 +++ .../net/minecraft/server/EntitySheep.java | 9 +++ .../minecraft/server/EntitySilverfish.java | 8 +++ .../net/minecraft/server/EntitySkeleton.java | 8 +++ .../java/net/minecraft/server/EntityWolf.java | 10 +++ .../net/minecraft/server/EntityZombie.java | 9 +++ .../java/org/bukkit/craftbukkit/CraftArt.java | 9 +++ .../craftbukkit/entity/CraftEntity.java | 49 +------------ .../craftbukkit/entity/CraftOcelot.java | 6 ++ 22 files changed, 237 insertions(+), 48 deletions(-) diff --git a/src/main/java/net/minecraft/server/Entity.java b/src/main/java/net/minecraft/server/Entity.java index 9d933cba52..1685091987 100644 --- a/src/main/java/net/minecraft/server/Entity.java +++ b/src/main/java/net/minecraft/server/Entity.java @@ -19,6 +19,7 @@ import org.bukkit.event.vehicle.VehicleBlockCollisionEvent; import org.bukkit.event.vehicle.VehicleEnterEvent; import org.bukkit.event.vehicle.VehicleExitEvent; +import org.bukkit.craftbukkit.CraftServer; import org.bukkit.craftbukkit.CraftWorld; import org.bukkit.craftbukkit.entity.CraftEntity; import org.bukkit.craftbukkit.entity.CraftPlayer; @@ -1878,4 +1879,8 @@ public IChatBaseComponent getScoreboardDisplayName() { } public void i(int i) {} + + public CraftEntity makeCraftEntity(CraftServer server, Entity entity) { + throw new AssertionError("Unknown entity " + entity == null ? null : entity.getClass()); + } } diff --git a/src/main/java/net/minecraft/server/EntityBlaze.java b/src/main/java/net/minecraft/server/EntityBlaze.java index b319917f68..57d101f81e 100644 --- a/src/main/java/net/minecraft/server/EntityBlaze.java +++ b/src/main/java/net/minecraft/server/EntityBlaze.java @@ -1,5 +1,10 @@ package net.minecraft.server; +import org.bukkit.craftbukkit.CraftServer; +import org.bukkit.craftbukkit.entity.CraftBlaze; +import org.bukkit.craftbukkit.entity.CraftEntity; +import org.bukkit.craftbukkit.entity.CraftMushroomCow; + public class EntityBlaze extends EntityMonster { private float bp = 0.5F; @@ -11,6 +16,10 @@ public EntityBlaze(World world) { this.fireProof = true; this.b = 10; } + + @Override + public CraftEntity makeCraftEntity(CraftServer server, Entity entity){ + return new CraftBlaze(server, (EntityBlaze) entity); } protected void aC() { super.aC(); diff --git a/src/main/java/net/minecraft/server/EntityChicken.java b/src/main/java/net/minecraft/server/EntityChicken.java index f65ddccba8..fbfe9e3d29 100644 --- a/src/main/java/net/minecraft/server/EntityChicken.java +++ b/src/main/java/net/minecraft/server/EntityChicken.java @@ -1,5 +1,9 @@ package net.minecraft.server; +import org.bukkit.craftbukkit.CraftServer; +import org.bukkit.craftbukkit.entity.CraftChicken; +import org.bukkit.craftbukkit.entity.CraftEntity; +import org.bukkit.craftbukkit.entity.CraftMushroomCow; import org.bukkit.craftbukkit.util.CraftMagicNumbers; // CraftBukkit public class EntityChicken extends EntityAnimal { @@ -26,6 +30,11 @@ public EntityChicken(World world) { this.goalSelector.a(7, new PathfinderGoalRandomLookaround(this)); } + @Override + public CraftEntity makeCraftEntity(CraftServer server, Entity entity){ + return new CraftChicken(server, (EntityChicken) entity); + } + public boolean bj() { return true; } diff --git a/src/main/java/net/minecraft/server/EntityCow.java b/src/main/java/net/minecraft/server/EntityCow.java index 43c1243b15..82d72fd791 100644 --- a/src/main/java/net/minecraft/server/EntityCow.java +++ b/src/main/java/net/minecraft/server/EntityCow.java @@ -1,6 +1,10 @@ package net.minecraft.server; // CraftBukkit start +import org.bukkit.craftbukkit.CraftServer; +import org.bukkit.craftbukkit.entity.CraftCow; +import org.bukkit.craftbukkit.entity.CraftEntity; +import org.bukkit.craftbukkit.entity.CraftHumanEntity; import org.bukkit.craftbukkit.event.CraftEventFactory; import org.bukkit.craftbukkit.inventory.CraftItemStack; import org.bukkit.craftbukkit.util.CraftMagicNumbers; @@ -21,6 +25,11 @@ public EntityCow(World world) { this.goalSelector.a(6, new PathfinderGoalLookAtPlayer(this, EntityHuman.class, 6.0F)); this.goalSelector.a(7, new PathfinderGoalRandomLookaround(this)); } + + @Override + public CraftEntity makeCraftEntity(CraftServer server, Entity entity){ + return new CraftCow(server, (EntityCow) entity); + } public boolean bj() { return true; diff --git a/src/main/java/net/minecraft/server/EntityCreature.java b/src/main/java/net/minecraft/server/EntityCreature.java index ef10d16454..119ef72a79 100644 --- a/src/main/java/net/minecraft/server/EntityCreature.java +++ b/src/main/java/net/minecraft/server/EntityCreature.java @@ -2,8 +2,39 @@ import java.util.UUID; +import org.bukkit.craftbukkit.CraftServer; +import org.bukkit.craftbukkit.entity.CraftCreature; +import org.bukkit.craftbukkit.entity.CraftAnimals; +import org.bukkit.craftbukkit.entity.CraftChicken; +import org.bukkit.craftbukkit.entity.CraftCow; +import org.bukkit.craftbukkit.entity.CraftBlaze; +import org.bukkit.craftbukkit.entity.CraftCaveSpider; +import org.bukkit.craftbukkit.entity.CraftCreeper; +import org.bukkit.craftbukkit.entity.CraftEnderman; // CraftBukkit start import org.bukkit.craftbukkit.entity.CraftEntity; +import org.bukkit.craftbukkit.entity.CraftGiant; +import org.bukkit.craftbukkit.entity.CraftHorse; +import org.bukkit.craftbukkit.entity.CraftHumanEntity; +import org.bukkit.craftbukkit.entity.CraftIronGolem; +import org.bukkit.craftbukkit.entity.CraftMonster; +import org.bukkit.craftbukkit.entity.CraftMushroomCow; +import org.bukkit.craftbukkit.entity.CraftOcelot; +import org.bukkit.craftbukkit.entity.CraftPig; +import org.bukkit.craftbukkit.entity.CraftPigZombie; +import org.bukkit.craftbukkit.entity.CraftPlayer; +import org.bukkit.craftbukkit.entity.CraftSheep; +import org.bukkit.craftbukkit.entity.CraftSilverfish; +import org.bukkit.craftbukkit.entity.CraftSkeleton; +import org.bukkit.craftbukkit.entity.CraftSnowman; +import org.bukkit.craftbukkit.entity.CraftSpider; +import org.bukkit.craftbukkit.entity.CraftSquid; +import org.bukkit.craftbukkit.entity.CraftVillager; +import org.bukkit.craftbukkit.entity.CraftWaterMob; +import org.bukkit.craftbukkit.entity.CraftWitch; +import org.bukkit.craftbukkit.entity.CraftWither; +import org.bukkit.craftbukkit.entity.CraftWolf; +import org.bukkit.craftbukkit.entity.CraftZombie; import org.bukkit.event.entity.EntityTargetEvent; import org.bukkit.event.entity.EntityUnleashEvent; // CraftBukkit end @@ -21,6 +52,44 @@ public abstract class EntityCreature extends EntityInsentient { private PathfinderGoal bs = new PathfinderGoalMoveTowardsRestriction(this, 1.0D); private boolean bt; + @Override + public CraftEntity makeCraftEntity(CraftServer server, Entity entity){ + + if (entity instanceof EntityAnimal) { + if (entity instanceof EntityTameableAnimal) { + return entity.makeCraftEntity(server, entity); + } + else if (entity instanceof EntitySheep || entity instanceof EntityHorse || entity instanceof EntityChicken || entity instanceof EntityCow) { return entity.makeCraftEntity(server, entity); } + + return new CraftAnimals(server, (EntityAnimal) entity); + } + // Monsters + else if (entity instanceof EntityMonster) { + //return new CraftAnimals(server, (EntityAnimal) entity); + if (entity instanceof EntityGiantZombie) { return new CraftGiant(server, (EntityGiantZombie) 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); } + } + + return entity.makeCraftEntity(server, entity); + } + // Water Animals + else if (entity instanceof EntityWaterAnimal) { + if (entity instanceof EntitySquid) { return new CraftSquid(server, (EntitySquid) entity); } + else { return new CraftWaterMob(server, (EntityWaterAnimal) 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 EntityVillager) { return new CraftVillager(server, (EntityVillager) entity); } + + return new CraftCreature(server, (EntityCreature) entity); + } + public EntityCreature(World world) { super(world); } diff --git a/src/main/java/net/minecraft/server/EntityCreeper.java b/src/main/java/net/minecraft/server/EntityCreeper.java index e5d72b79a5..a8b81263a6 100644 --- a/src/main/java/net/minecraft/server/EntityCreeper.java +++ b/src/main/java/net/minecraft/server/EntityCreeper.java @@ -1,6 +1,10 @@ package net.minecraft.server; // CraftBukkit start +import org.bukkit.craftbukkit.CraftServer; +import org.bukkit.craftbukkit.entity.CraftCreeper; +import org.bukkit.craftbukkit.entity.CraftEntity; +import org.bukkit.craftbukkit.entity.CraftMushroomCow; import org.bukkit.craftbukkit.event.CraftEventFactory; import org.bukkit.event.entity.ExplosionPrimeEvent; // CraftBukkit end @@ -25,6 +29,10 @@ public EntityCreeper(World world) { this.targetSelector.a(1, new PathfinderGoalNearestAttackableTarget(this, EntityHuman.class, 0, true)); this.targetSelector.a(2, new PathfinderGoalHurtByTarget(this, false)); } + + @Override + public CraftEntity makeCraftEntity(CraftServer server, Entity entity){ + return new CraftCreeper(server, (EntityCreeper) entity); } protected void aC() { super.aC(); diff --git a/src/main/java/net/minecraft/server/EntityEnderman.java b/src/main/java/net/minecraft/server/EntityEnderman.java index 0f02e7d62e..2cb211796d 100644 --- a/src/main/java/net/minecraft/server/EntityEnderman.java +++ b/src/main/java/net/minecraft/server/EntityEnderman.java @@ -4,6 +4,10 @@ // CraftBukkit start import org.bukkit.Location; +import org.bukkit.craftbukkit.CraftServer; +import org.bukkit.craftbukkit.entity.CraftEnderman; +import org.bukkit.craftbukkit.entity.CraftEntity; +import org.bukkit.craftbukkit.entity.CraftMushroomCow; import org.bukkit.craftbukkit.event.CraftEventFactory; import org.bukkit.event.entity.EntityTeleportEvent; // CraftBukkit end @@ -30,6 +34,10 @@ protected void aC() { this.getAttributeInstance(GenericAttributes.d).setValue(0.30000001192092896D); this.getAttributeInstance(GenericAttributes.e).setValue(7.0D); } + + @Override + public CraftEntity makeCraftEntity(CraftServer server, Entity entity){ + return new CraftEnderman(server, (EntityEnderman) entity); } protected void c() { super.c(); diff --git a/src/main/java/net/minecraft/server/EntityHorse.java b/src/main/java/net/minecraft/server/EntityHorse.java index 30f25c3e47..e347c631d5 100644 --- a/src/main/java/net/minecraft/server/EntityHorse.java +++ b/src/main/java/net/minecraft/server/EntityHorse.java @@ -3,6 +3,10 @@ import java.util.Iterator; import java.util.List; +import org.bukkit.craftbukkit.CraftServer; +import org.bukkit.craftbukkit.entity.CraftEntity; +import org.bukkit.craftbukkit.entity.CraftHorse; +import org.bukkit.craftbukkit.entity.CraftMushroomCow; // CraftBukkit start import org.bukkit.craftbukkit.event.CraftEventFactory; import org.bukkit.event.entity.EntityDamageEvent; @@ -57,6 +61,11 @@ public EntityHorse(World world) { this.goalSelector.a(8, new PathfinderGoalRandomLookaround(this)); this.loadChest(); } + + @Override + public CraftEntity makeCraftEntity(CraftServer server, Entity entity){ + return new CraftHorse(server, (EntityHorse) entity); + } protected void c() { super.c(); diff --git a/src/main/java/net/minecraft/server/EntityHuman.java b/src/main/java/net/minecraft/server/EntityHuman.java index 58b7b96422..dd7908422d 100644 --- a/src/main/java/net/minecraft/server/EntityHuman.java +++ b/src/main/java/net/minecraft/server/EntityHuman.java @@ -8,9 +8,12 @@ import net.minecraft.util.com.google.common.base.Charsets; import net.minecraft.util.com.mojang.authlib.GameProfile; +import org.bukkit.craftbukkit.CraftServer; +import org.bukkit.craftbukkit.entity.CraftEntity; // CraftBukkit start import org.bukkit.craftbukkit.entity.CraftHumanEntity; import org.bukkit.craftbukkit.entity.CraftItem; +import org.bukkit.craftbukkit.entity.CraftPlayer; import org.bukkit.craftbukkit.inventory.CraftItemStack; import org.bukkit.entity.Player; import org.bukkit.event.entity.EntityCombustByEntityEvent; @@ -67,6 +70,11 @@ public CraftHumanEntity getBukkitEntity() { private int h; private final GameProfile i; public EntityFishingHook hookedFish; + + @Override + public CraftEntity makeCraftEntity(CraftServer server, Entity entity){ + return new CraftPlayer(server, (EntityPlayer) entity); + } public EntityHuman(World world, GameProfile gameprofile) { super(world); diff --git a/src/main/java/net/minecraft/server/EntityLiving.java b/src/main/java/net/minecraft/server/EntityLiving.java index f90e2a31f5..7035d44bc1 100644 --- a/src/main/java/net/minecraft/server/EntityLiving.java +++ b/src/main/java/net/minecraft/server/EntityLiving.java @@ -7,6 +7,9 @@ import java.util.Random; import java.util.UUID; +import org.bukkit.craftbukkit.CraftServer; +import org.bukkit.craftbukkit.entity.CraftEntity; +import org.bukkit.craftbukkit.entity.CraftHumanEntity; // CraftBukkit start import org.bukkit.craftbukkit.event.CraftEventFactory; import org.bukkit.event.entity.EntityDamageEvent; @@ -78,6 +81,11 @@ public abstract class EntityLiving extends Entity { public int expToDrop; public int maxAirTicks = 300; // CraftBukkit end + + @Override + public CraftEntity makeCraftEntity(CraftServer server, Entity entity){ + return new CraftHumanEntity(server, (EntityHuman) entity); + } public EntityLiving(World world) { super(world); diff --git a/src/main/java/net/minecraft/server/EntityMonster.java b/src/main/java/net/minecraft/server/EntityMonster.java index de14655d3e..1d540ae339 100644 --- a/src/main/java/net/minecraft/server/EntityMonster.java +++ b/src/main/java/net/minecraft/server/EntityMonster.java @@ -1,5 +1,9 @@ package net.minecraft.server; +import org.bukkit.craftbukkit.CraftServer; +import org.bukkit.craftbukkit.entity.CraftEntity; +import org.bukkit.craftbukkit.entity.CraftMonster; +import org.bukkit.craftbukkit.entity.CraftMushroomCow; import org.bukkit.event.entity.EntityCombustEvent; import org.bukkit.event.entity.EntityTargetEvent; // CraftBukkit @@ -10,6 +14,11 @@ public EntityMonster(World world) { this.b = 5; } + @Override + public CraftEntity makeCraftEntity(CraftServer server, Entity entity){ + return new CraftMonster(server, (EntityMonster) entity); + } + protected void worldStuff() { float f = this.d(1.0F); diff --git a/src/main/java/net/minecraft/server/EntityMushroomCow.java b/src/main/java/net/minecraft/server/EntityMushroomCow.java index b4e430611a..c126e5368d 100644 --- a/src/main/java/net/minecraft/server/EntityMushroomCow.java +++ b/src/main/java/net/minecraft/server/EntityMushroomCow.java @@ -1,5 +1,9 @@ package net.minecraft.server; +import org.bukkit.craftbukkit.CraftServer; +import org.bukkit.craftbukkit.entity.CraftCow; +import org.bukkit.craftbukkit.entity.CraftEntity; +import org.bukkit.craftbukkit.entity.CraftMushroomCow; import org.bukkit.event.player.PlayerShearEntityEvent; // CraftBukkit public class EntityMushroomCow extends EntityCow { @@ -8,6 +12,11 @@ public EntityMushroomCow(World world) { super(world); this.a(0.9F, 1.3F); } + + @Override + public CraftEntity makeCraftEntity(CraftServer server, Entity entity){ + return new CraftMushroomCow(server, (EntityMushroomCow) entity); + } public boolean a(EntityHuman entityhuman) { ItemStack itemstack = entityhuman.inventory.getItemInHand(); diff --git a/src/main/java/net/minecraft/server/EntityPig.java b/src/main/java/net/minecraft/server/EntityPig.java index 7e249ad22f..95ccfcb08f 100644 --- a/src/main/java/net/minecraft/server/EntityPig.java +++ b/src/main/java/net/minecraft/server/EntityPig.java @@ -1,6 +1,9 @@ package net.minecraft.server; // CraftBukkit start +import org.bukkit.craftbukkit.CraftServer; +import org.bukkit.craftbukkit.entity.CraftEntity; +import org.bukkit.craftbukkit.entity.CraftPig; import org.bukkit.craftbukkit.event.CraftEventFactory; import org.bukkit.craftbukkit.util.CraftMagicNumbers; // CraftBukkit end @@ -8,6 +11,11 @@ public class EntityPig extends EntityAnimal { private final PathfinderGoalPassengerCarrotStick bp; + + @Override + public CraftEntity makeCraftEntity(CraftServer server, Entity entity){ + return new CraftPig(server, (EntityPig) entity); + } public EntityPig(World world) { super(world); diff --git a/src/main/java/net/minecraft/server/EntityPigZombie.java b/src/main/java/net/minecraft/server/EntityPigZombie.java index 38d1442224..c568d8516a 100644 --- a/src/main/java/net/minecraft/server/EntityPigZombie.java +++ b/src/main/java/net/minecraft/server/EntityPigZombie.java @@ -3,6 +3,10 @@ import java.util.List; import java.util.UUID; +import org.bukkit.craftbukkit.CraftServer; +import org.bukkit.craftbukkit.entity.CraftEntity; +import org.bukkit.craftbukkit.entity.CraftMushroomCow; +import org.bukkit.craftbukkit.entity.CraftPigZombie; // CraftBukkit start import org.bukkit.craftbukkit.inventory.CraftItemStack; import org.bukkit.event.entity.EntityTargetEvent; @@ -21,6 +25,11 @@ public EntityPigZombie(World world) { this.fireProof = true; } + @Override + public CraftEntity makeCraftEntity(CraftServer server, Entity entity){ + return new CraftPigZombie(server, (EntityPigZombie) entity); + } + protected void aC() { super.aC(); this.getAttributeInstance(bp).setValue(0.0D); diff --git a/src/main/java/net/minecraft/server/EntitySheep.java b/src/main/java/net/minecraft/server/EntitySheep.java index 47e60923b7..724007695d 100644 --- a/src/main/java/net/minecraft/server/EntitySheep.java +++ b/src/main/java/net/minecraft/server/EntitySheep.java @@ -2,6 +2,10 @@ import java.util.Random; +import org.bukkit.craftbukkit.CraftServer; +import org.bukkit.craftbukkit.entity.CraftEntity; +import org.bukkit.craftbukkit.entity.CraftMushroomCow; +import org.bukkit.craftbukkit.entity.CraftSheep; // CraftBukkit start import org.bukkit.event.entity.SheepRegrowWoolEvent; import org.bukkit.event.player.PlayerShearEntityEvent; @@ -31,6 +35,11 @@ public EntitySheep(World world) { this.bq.setItem(1, new ItemStack(Items.INK_SACK, 1, 0)); this.bq.resultInventory = new InventoryCraftResult(); // CraftBukkit - add result slot for event } + + @Override + public CraftEntity makeCraftEntity(CraftServer server, Entity entity){ + return new CraftSheep(server, (EntitySheep) entity); + } protected boolean bj() { return true; diff --git a/src/main/java/net/minecraft/server/EntitySilverfish.java b/src/main/java/net/minecraft/server/EntitySilverfish.java index 821e7a35c8..87bfe0ed88 100644 --- a/src/main/java/net/minecraft/server/EntitySilverfish.java +++ b/src/main/java/net/minecraft/server/EntitySilverfish.java @@ -2,6 +2,10 @@ import net.minecraft.util.org.apache.commons.lang3.tuple.ImmutablePair; +import org.bukkit.craftbukkit.CraftServer; +import org.bukkit.craftbukkit.entity.CraftEntity; +import org.bukkit.craftbukkit.entity.CraftMushroomCow; +import org.bukkit.craftbukkit.entity.CraftSilverfish; import org.bukkit.craftbukkit.event.CraftEventFactory; // CraftBukkit public class EntitySilverfish extends EntityMonster { @@ -23,6 +27,10 @@ protected void aC() { protected boolean g_() { return false; } + + @Override + public CraftEntity makeCraftEntity(CraftServer server, Entity entity){ + return new CraftSilverfish(server, (EntitySilverfish) entity); } protected Entity findTarget() { double d0 = 8.0D; diff --git a/src/main/java/net/minecraft/server/EntitySkeleton.java b/src/main/java/net/minecraft/server/EntitySkeleton.java index 83979c20c2..4ff0dc0426 100644 --- a/src/main/java/net/minecraft/server/EntitySkeleton.java +++ b/src/main/java/net/minecraft/server/EntitySkeleton.java @@ -2,6 +2,10 @@ import java.util.Calendar; +import org.bukkit.craftbukkit.CraftServer; +import org.bukkit.craftbukkit.entity.CraftEntity; +import org.bukkit.craftbukkit.entity.CraftMushroomCow; +import org.bukkit.craftbukkit.entity.CraftSkeleton; import org.bukkit.event.entity.EntityCombustEvent; // CraftBukkit public class EntitySkeleton extends EntityMonster implements IRangedEntity { @@ -23,6 +27,10 @@ public EntitySkeleton(World world) { this.bZ(); } } + + @Override + public CraftEntity makeCraftEntity(CraftServer server, Entity entity){ + return new CraftSkeleton(server, (EntitySkeleton) entity); } protected void aC() { super.aC(); diff --git a/src/main/java/net/minecraft/server/EntityWolf.java b/src/main/java/net/minecraft/server/EntityWolf.java index 097f4f5694..4d3ac0f815 100644 --- a/src/main/java/net/minecraft/server/EntityWolf.java +++ b/src/main/java/net/minecraft/server/EntityWolf.java @@ -1,5 +1,10 @@ package net.minecraft.server; +import org.bukkit.craftbukkit.CraftServer; +import org.bukkit.craftbukkit.entity.CraftEntity; +import org.bukkit.craftbukkit.entity.CraftMushroomCow; +import org.bukkit.craftbukkit.entity.CraftWolf; + public class EntityWolf extends EntityTameableAnimal { private float bq; @@ -29,6 +34,11 @@ public EntityWolf(World world) { this.targetSelector.a(4, new PathfinderGoalRandomTargetNonTamed(this, EntitySheep.class, 200, false)); this.setTamed(false); } + + @Override + public CraftEntity makeCraftEntity(CraftServer server, Entity entity){ + return new CraftWolf(server, (EntityWolf) entity); + } protected void aC() { super.aC(); diff --git a/src/main/java/net/minecraft/server/EntityZombie.java b/src/main/java/net/minecraft/server/EntityZombie.java index 5d978dc814..93c339ea0b 100644 --- a/src/main/java/net/minecraft/server/EntityZombie.java +++ b/src/main/java/net/minecraft/server/EntityZombie.java @@ -5,8 +5,12 @@ import java.util.UUID; +import org.bukkit.craftbukkit.CraftServer; +import org.bukkit.craftbukkit.entity.CraftEntity; //CraftBukkit start import org.bukkit.craftbukkit.entity.CraftLivingEntity; +import org.bukkit.craftbukkit.entity.CraftMushroomCow; +import org.bukkit.craftbukkit.entity.CraftZombie; import org.bukkit.event.entity.EntityCombustByEntityEvent; import org.bukkit.event.entity.EntityCombustEvent; //CraftBukkit end @@ -39,6 +43,11 @@ public EntityZombie(World world) { this.targetSelector.a(2, new PathfinderGoalNearestAttackableTarget(this, EntityVillager.class, 0, false)); this.a(0.6F, 1.8F); } + + @Override + public CraftEntity makeCraftEntity(CraftServer server, Entity entity){ + return new CraftZombie(server, (EntityZombie) entity); + } protected void aC() { super.aC(); diff --git a/src/main/java/org/bukkit/craftbukkit/CraftArt.java b/src/main/java/org/bukkit/craftbukkit/CraftArt.java index f617e9e2ea..31217db0be 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftArt.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftArt.java @@ -2,6 +2,7 @@ import net.minecraft.server.EnumArt; import org.bukkit.Art; +import java.lang.reflect.Method; // Safety class, will break if either side changes public class CraftArt { @@ -40,6 +41,14 @@ public static Art NotchToBukkit(EnumArt art) { } public static EnumArt BukkitToNotch(Art art) { + +// try { +// return EnumArt.valueOf(art.toString()); +// } catch (IllegalArgumentException ignore) { +// throw new AssertionError(art); +// } + + switch (art) { case KEBAB: return EnumArt.KEBAB; case AZTEC: return EnumArt.AZTEC; diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java index fe0f2006e5..9af809cbe7 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java @@ -38,54 +38,7 @@ public static CraftEntity getEntity(CraftServer server, Entity entity) { else { return new CraftHumanEntity(server, (EntityHuman) 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 EntityOcelot) { return new CraftOcelot(server, (EntityOcelot) entity); } - } - else if (entity instanceof EntitySheep) { return new CraftSheep(server, (EntitySheep) entity); } - else if (entity instanceof EntityHorse) { return new CraftHorse(server, (EntityHorse) 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 { 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 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 { return new CraftMonster(server, (EntityMonster) entity); } - } - // Water Animals - else if (entity instanceof EntityWaterAnimal) { - if (entity instanceof EntitySquid) { return new CraftSquid(server, (EntitySquid) entity); } - else { return new CraftWaterMob(server, (EntityWaterAnimal) 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 EntityVillager) { return new CraftVillager(server, (EntityVillager) entity); } - else { return new CraftCreature(server, (EntityCreature) entity); } + entity.makeCraftEntity(server, entity); } // Slimes are a special (and broken) case else if (entity instanceof EntitySlime) { diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftOcelot.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftOcelot.java index 37cc315c6b..e2c7b8ab2c 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftOcelot.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftOcelot.java @@ -1,5 +1,7 @@ package org.bukkit.craftbukkit.entity; +import net.minecraft.server.Entity; +import net.minecraft.server.EntityMushroomCow; import net.minecraft.server.EntityOcelot; import org.apache.commons.lang.Validate; import org.bukkit.craftbukkit.CraftServer; @@ -11,6 +13,10 @@ public CraftOcelot(CraftServer server, EntityOcelot wolf) { super(server, wolf); } + public CraftEntity makeCraftEntity(CraftServer server, Entity entity){ + return new CraftOcelot(server, (EntityOcelot) entity); + } + @Override public EntityOcelot getHandle() { return (EntityOcelot) entity; From d7fedc0a060b4c4eafb066cba997e1dde739cd7c Mon Sep 17 00:00:00 2001 From: leex5047 Date: Thu, 24 Apr 2014 11:46:56 -0500 Subject: [PATCH 6/9] On date: 4/24 in class we went over Hashmap for a bit and we got the idea that we could use it on the CraftArt switch statements. After some time fiddling with it (and some help from Nic) we were able to construct a Hashmap that both switch statements can access. Hashmap is static so we had to use a static enclosement to populate the KV pairs. --- .../java/org/bukkit/craftbukkit/CraftArt.java | 113 +++++++----------- 1 file changed, 45 insertions(+), 68 deletions(-) diff --git a/src/main/java/org/bukkit/craftbukkit/CraftArt.java b/src/main/java/org/bukkit/craftbukkit/CraftArt.java index 31217db0be..85564f680e 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftArt.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftArt.java @@ -2,82 +2,59 @@ import net.minecraft.server.EnumArt; import org.bukkit.Art; -import java.lang.reflect.Method; + +import java.util.EnumMap; +import java.util.Map; // Safety class, will break if either side changes public class CraftArt { - + static Map enumMap = new EnumMap(Art.class); + + static { + generateEnumMap(); + } + public static Art NotchToBukkit(EnumArt art) { - switch (art) { - case KEBAB: return Art.KEBAB; - case AZTEC: return Art.AZTEC; - case ALBAN: return Art.ALBAN; - case AZTEC2: return Art.AZTEC2; - case BOMB: return Art.BOMB; - case PLANT: return Art.PLANT; - case WASTELAND: return Art.WASTELAND; - case POOL: return Art.POOL; - case COURBET: return Art.COURBET; - case SEA: return Art.SEA; - case SUNSET: return Art.SUNSET; - case CREEBET: return Art.CREEBET; - case WANDERER: return Art.WANDERER; - case GRAHAM: return Art.GRAHAM; - case MATCH: return Art.MATCH; - case BUST: return Art.BUST; - case STAGE: return Art.STAGE; - case VOID: return Art.VOID; - case SKULL_AND_ROSES: return Art.SKULL_AND_ROSES; - case FIGHTERS: return Art.FIGHTERS; - case POINTER: return Art.POINTER; - case PIGSCENE: return Art.PIGSCENE; - case BURNINGSKULL: return Art.BURNINGSKULL; - case SKELETON: return Art.SKELETON; - case DONKEYKONG: return Art.DONKEYKONG; - case WITHER: return Art.WITHER; - default: - throw new AssertionError(art); + + for(Art s : enumMap.keySet()){ + if(enumMap.get(s).equals(art)) return s; } + throw new AssertionError(art); } public static EnumArt BukkitToNotch(Art art) { + + if(enumMap.get(art)!=null) return enumMap.get(art); + + throw new AssertionError(art); + } -// try { -// return EnumArt.valueOf(art.toString()); -// } catch (IllegalArgumentException ignore) { -// throw new AssertionError(art); -// } - - - switch (art) { - case KEBAB: return EnumArt.KEBAB; - case AZTEC: return EnumArt.AZTEC; - case ALBAN: return EnumArt.ALBAN; - case AZTEC2: return EnumArt.AZTEC2; - case BOMB: return EnumArt.BOMB; - case PLANT: return EnumArt.PLANT; - case WASTELAND: return EnumArt.WASTELAND; - case POOL: return EnumArt.POOL; - case COURBET: return EnumArt.COURBET; - case SEA: return EnumArt.SEA; - case SUNSET: return EnumArt.SUNSET; - case CREEBET: return EnumArt.CREEBET; - case WANDERER: return EnumArt.WANDERER; - case GRAHAM: return EnumArt.GRAHAM; - case MATCH: return EnumArt.MATCH; - case BUST: return EnumArt.BUST; - case STAGE: return EnumArt.STAGE; - case VOID: return EnumArt.VOID; - case SKULL_AND_ROSES: return EnumArt.SKULL_AND_ROSES; - case FIGHTERS: return EnumArt.FIGHTERS; - case POINTER: return EnumArt.POINTER; - case PIGSCENE: return EnumArt.PIGSCENE; - case BURNINGSKULL: return EnumArt.BURNINGSKULL; - case SKELETON: return EnumArt.SKELETON; - case DONKEYKONG: return EnumArt.DONKEYKONG; - case WITHER: return EnumArt.WITHER; - default: - throw new AssertionError(art); - } + private static void generateEnumMap() { + enumMap.put(Art.KEBAB, EnumArt.KEBAB); + enumMap.put(Art.AZTEC, EnumArt.AZTEC); + enumMap.put(Art.ALBAN, EnumArt.ALBAN); + enumMap.put(Art.AZTEC2, EnumArt.AZTEC2); + enumMap.put(Art.BOMB, EnumArt.BOMB); + enumMap.put(Art.PLANT, EnumArt.PLANT); + enumMap.put(Art.WASTELAND, EnumArt.WASTELAND); + enumMap.put(Art.POOL, EnumArt.POOL); + enumMap.put(Art.COURBET, EnumArt.COURBET); + enumMap.put(Art.SEA, EnumArt.SEA); + enumMap.put(Art.SUNSET, EnumArt.SUNSET); + enumMap.put(Art.CREEBET, EnumArt.CREEBET); + enumMap.put(Art.WANDERER, EnumArt.WANDERER); + enumMap.put(Art.GRAHAM, EnumArt.GRAHAM); + enumMap.put(Art.MATCH, EnumArt.MATCH); + enumMap.put(Art.BUST, EnumArt.BUST); + enumMap.put(Art.STAGE, EnumArt.STAGE); + enumMap.put(Art.VOID, EnumArt.VOID); + enumMap.put(Art.SKULL_AND_ROSES, EnumArt.SKULL_AND_ROSES); + enumMap.put(Art.FIGHTERS, EnumArt.FIGHTERS); + enumMap.put(Art.POINTER, EnumArt.POINTER); + enumMap.put(Art.PIGSCENE, EnumArt.PIGSCENE); + enumMap.put(Art.BURNINGSKULL, EnumArt.BURNINGSKULL); + enumMap.put(Art.SKELETON, EnumArt.SKELETON); + enumMap.put(Art.DONKEYKONG, EnumArt.DONKEYKONG); + enumMap.put(Art.WITHER, EnumArt.WITHER); } } From e1f9e30d1f53568dad12fe7d7f803c1b00daa804 Mon Sep 17 00:00:00 2001 From: leex5047 Date: Wed, 30 Apr 2014 18:02:16 -0500 Subject: [PATCH 7/9] Removed switch statment in generateTree() by using a Hashtable to hold the values instead. As a result code looks clearer. --- .../org/bukkit/craftbukkit/CraftWorld.java | 73 +++++++------------ 1 file changed, 26 insertions(+), 47 deletions(-) diff --git a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java index a4ede348ff..5964c2f099 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java @@ -4,12 +4,15 @@ import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; +import java.util.Hashtable; import java.util.List; +import java.util.Map; import java.util.Random; import java.util.Set; import java.util.UUID; import net.minecraft.server.*; +import net.minecraft.server.BlockSapling.TreeGenerator; import org.apache.commons.lang.Validate; import org.bukkit.BlockChangeDelegate; @@ -353,58 +356,34 @@ public LightningStrike strikeLightningEffect(Location loc) { public boolean generateTree(Location loc, TreeType type) { return generateTree(loc, type, world); } + + static Map genType = new Hashtable(); + + static{ + genType.put(TreeType.BIG_TREE,new WorldGenBigTree(true)); + genType.put(TreeType.BIRCH,new WorldGenForest(true, false)); + genType.put(TreeType.REDWOOD,new WorldGenTaiga2(true)); + genType.put(TreeType.TALL_REDWOOD,new WorldGenTaiga1()); + genType.put(TreeType.JUNGLE,new WorldGenJungleTree(true, 10, 20, 3, 3)); + genType.put(TreeType.SMALL_JUNGLE,new WorldGenTrees(true, 4 + rand.nextInt(7), 3, 3, false)); + genType.put(TreeType.JUNGLE_BUSH,new WorldGenGroundBush(3, 0)); + genType.put(TreeType.RED_MUSHROOM,new WorldGenHugeMushroom(1)); + genType.put(TreeType.BROWN_MUSHROOM,new WorldGenHugeMushroom(0)); + genType.put(TreeType.SWAMP,new WorldGenSwampTree()); + genType.put(TreeType.ACACIA,new WorldGenAcaciaTree(true)); + genType.put(TreeType.DARK_OAK,new WorldGenForestTree(true)); + genType.put(TreeType.MEGA_REDWOOD,new WorldGenMegaTree(true, rand.nextBoolean())); + genType.put(TreeType.TALL_REDWOOD,new WorldGenForest(true, true)); + genType.put(TreeType.TREE,null); + } public boolean generateTree(Location loc, TreeType type, BlockChangeDelegate delegate) { BlockSapling.TreeGenerator gen; - switch (type) { - case BIG_TREE: - gen = new WorldGenBigTree(true); - break; - case BIRCH: - gen = new WorldGenForest(true, false); - break; - case REDWOOD: - gen = new WorldGenTaiga2(true); - break; - case TALL_REDWOOD: - gen = new WorldGenTaiga1(); - break; - case JUNGLE: - gen = new WorldGenJungleTree(true, 10, 20, 3, 3); // Magic values as in BlockSapling - break; - case SMALL_JUNGLE: - gen = new WorldGenTrees(true, 4 + rand.nextInt(7), 3, 3, false); - break; - case JUNGLE_BUSH: - gen = new WorldGenGroundBush(3, 0); - break; - case RED_MUSHROOM: - gen = new WorldGenHugeMushroom(1); - break; - case BROWN_MUSHROOM: - gen = new WorldGenHugeMushroom(0); - break; - case SWAMP: - gen = new WorldGenSwampTree(); - break; - case ACACIA: - gen = new WorldGenAcaciaTree(true); - break; - case DARK_OAK: - gen = new WorldGenForestTree(true); - break; - case MEGA_REDWOOD: - gen = new WorldGenMegaTree(true, rand.nextBoolean()); - break; - case TALL_BIRCH: - gen = new WorldGenForest(true, true); - break; - case TREE: - default: + if(genType.get(type)!=null){ + gen = (TreeGenerator) genType.get(type); + }else{ gen = new WorldGenTrees(true); - break; } - return gen.generate(new CraftBlockChangeDelegate(delegate), rand, loc.getBlockX(), loc.getBlockY(), loc.getBlockZ()); } From 13585205ffe8a0309016365efb7526d17cd9490c Mon Sep 17 00:00:00 2001 From: leex5047 Date: Wed, 30 Apr 2014 18:05:24 -0500 Subject: [PATCH 8/9] Only removed the method artType since it was not needed and instead just populated the Map there. --- .../java/org/bukkit/craftbukkit/CraftArt.java | 34 ++++++++----------- 1 file changed, 15 insertions(+), 19 deletions(-) diff --git a/src/main/java/org/bukkit/craftbukkit/CraftArt.java b/src/main/java/org/bukkit/craftbukkit/CraftArt.java index 85564f680e..8fb5c82ede 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftArt.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftArt.java @@ -11,25 +11,6 @@ public class CraftArt { static Map enumMap = new EnumMap(Art.class); static { - generateEnumMap(); - } - - public static Art NotchToBukkit(EnumArt art) { - - for(Art s : enumMap.keySet()){ - if(enumMap.get(s).equals(art)) return s; - } - throw new AssertionError(art); - } - - public static EnumArt BukkitToNotch(Art art) { - - if(enumMap.get(art)!=null) return enumMap.get(art); - - throw new AssertionError(art); - } - - private static void generateEnumMap() { enumMap.put(Art.KEBAB, EnumArt.KEBAB); enumMap.put(Art.AZTEC, EnumArt.AZTEC); enumMap.put(Art.ALBAN, EnumArt.ALBAN); @@ -57,4 +38,19 @@ private static void generateEnumMap() { enumMap.put(Art.DONKEYKONG, EnumArt.DONKEYKONG); enumMap.put(Art.WITHER, EnumArt.WITHER); } + + public static Art NotchToBukkit(EnumArt art) { + + for(Art s : enumMap.keySet()){ + if(enumMap.get(s).equals(art)) return s; + } + throw new AssertionError(art); + } + + public static EnumArt BukkitToNotch(Art art) { + + if(enumMap.get(art)!=null) return enumMap.get(art); + + throw new AssertionError(art); + } } From ac4e6168af670a121611d579ac0353b584dc2376 Mon Sep 17 00:00:00 2001 From: leex5047 Date: Wed, 30 Apr 2014 18:08:50 -0500 Subject: [PATCH 9/9] Removed switch statment in getName() did this by populating a Maptable with the ids as the keys and the effect types as the values. Makes the code a bit easier to read. --- .../potion/CraftPotionEffectType.java | 82 ++++++++----------- 1 file changed, 32 insertions(+), 50 deletions(-) diff --git a/src/main/java/org/bukkit/craftbukkit/potion/CraftPotionEffectType.java b/src/main/java/org/bukkit/craftbukkit/potion/CraftPotionEffectType.java index b59d142a3f..e370773867 100644 --- a/src/main/java/org/bukkit/craftbukkit/potion/CraftPotionEffectType.java +++ b/src/main/java/org/bukkit/craftbukkit/potion/CraftPotionEffectType.java @@ -1,12 +1,42 @@ package org.bukkit.craftbukkit.potion; +import java.util.Hashtable; +import java.util.Map; + import net.minecraft.server.MobEffectList; import org.bukkit.potion.PotionEffectType; public class CraftPotionEffectType extends PotionEffectType { private final MobEffectList handle; - + static Map effectType = new Hashtable(); + + static { + effectType.put(1, "SPEED"); + effectType.put(2, "SLOW"); + effectType.put(3, "FAST_DIGGING"); + effectType.put(4, "SLOW_DIGGING"); + effectType.put(5, "INCREASE_DAMAGE"); + effectType.put(6, "HEAL"); + effectType.put(7, "HARM"); + effectType.put(8, "JUMP"); + effectType.put(9, "CONFUSION"); + effectType.put(10, "REGENERATION"); + effectType.put(11, "DAMAGE_RESISTANCE"); + effectType.put(12, "FIRE_RESISTANCE"); + effectType.put(13, "WATER_BREATHING"); + effectType.put(14, "INVISIBILITY"); + effectType.put(15, "BLINDNESS"); + effectType.put(16, "NIGHT_VISION"); + effectType.put(17, "HUNGER"); + effectType.put(18, "WEAKNESS"); + effectType.put(19, "POISON"); + effectType.put(20, "WITHER"); + effectType.put(21, "HEALTH_BOOST"); + effectType.put(22, "ABSORPTION"); + effectType.put(23, "SATURATION"); + } + public CraftPotionEffectType(MobEffectList handle) { super(handle.id); this.handle = handle; @@ -23,56 +53,8 @@ public MobEffectList getHandle() { @Override public String getName() { - switch (handle.id) { - case 1: - return "SPEED"; - case 2: - return "SLOW"; - case 3: - return "FAST_DIGGING"; - case 4: - return "SLOW_DIGGING"; - case 5: - return "INCREASE_DAMAGE"; - case 6: - return "HEAL"; - case 7: - return "HARM"; - case 8: - return "JUMP"; - case 9: - return "CONFUSION"; - case 10: - return "REGENERATION"; - case 11: - return "DAMAGE_RESISTANCE"; - case 12: - return "FIRE_RESISTANCE"; - case 13: - return "WATER_BREATHING"; - case 14: - return "INVISIBILITY"; - case 15: - return "BLINDNESS"; - case 16: - return "NIGHT_VISION"; - case 17: - return "HUNGER"; - case 18: - return "WEAKNESS"; - case 19: - return "POISON"; - case 20: - return "WITHER"; - case 21: - return "HEALTH_BOOST"; - case 22: - return "ABSORPTION"; - case 23: - return "SATURATION"; - default: + if(effectType.get(handle.id)!=null) return effectType.get(handle.id); return "UNKNOWN_EFFECT_TYPE_" + handle.id; - } } @Override