From 23b67643741d5754af4de020a29d557078f9f81d Mon Sep 17 00:00:00 2001 From: feildmaster Date: Wed, 19 Dec 2012 22:03:52 -0600 Subject: Update CraftBukkit to Minecraft 1.4.6 --- pom.xml | 8 +- .../java/net/minecraft/server/BlockDispenser.java | 8 +- .../java/net/minecraft/server/BlockDragonEgg.java | 1 + .../java/net/minecraft/server/BlockLeaves.java | 6 +- src/main/java/net/minecraft/server/BlockLever.java | 2 +- src/main/java/net/minecraft/server/BlockSkull.java | 2 +- src/main/java/net/minecraft/server/BlockSoil.java | 4 + src/main/java/net/minecraft/server/BlockTNT.java | 2 +- .../java/net/minecraft/server/BlockTripwire.java | 2 +- src/main/java/net/minecraft/server/BlockVine.java | 2 +- src/main/java/net/minecraft/server/Chunk.java | 8 +- .../net/minecraft/server/ChunkRegionLoader.java | 16 +- .../java/net/minecraft/server/ChunkSection.java | 12 +- src/main/java/net/minecraft/server/Container.java | 4 +- .../java/net/minecraft/server/ContainerAnvil.java | 78 +- .../minecraft/server/ContainerEnchantTable.java | 3 +- .../java/net/minecraft/server/ContainerPlayer.java | 2 +- .../net/minecraft/server/ContainerWorkbench.java | 2 +- .../java/net/minecraft/server/ControllerLook.java | 10 +- .../java/net/minecraft/server/CraftingManager.java | 17 +- .../java/net/minecraft/server/DedicatedServer.java | 12 +- .../server/DedicatedServerConnectionThread.java | 22 +- .../net/minecraft/server/DispenseBehaviorItem.java | 2 +- .../minecraft/server/DispenseBehaviorMinecart.java | 4 +- .../server/DispenseBehaviorMonsterEgg.java | 4 - .../java/net/minecraft/server/Enchantment.java | 25 + src/main/java/net/minecraft/server/Entity.java | 50 +- .../java/net/minecraft/server/EntityAgeable.java | 10 +- .../java/net/minecraft/server/EntityArrow.java | 45 +- .../java/net/minecraft/server/EntityBlaze.java | 2 +- .../java/net/minecraft/server/EntityCreature.java | 16 +- .../net/minecraft/server/EntityEnderDragon.java | 114 +- .../net/minecraft/server/EntityEnderPearl.java | 8 +- .../java/net/minecraft/server/EntityEnderman.java | 33 +- .../net/minecraft/server/EntityExperienceOrb.java | 4 +- .../net/minecraft/server/EntityFallingBlock.java | 19 +- .../java/net/minecraft/server/EntityFireball.java | 8 +- .../net/minecraft/server/EntityFishingHook.java | 38 +- .../java/net/minecraft/server/EntityGhast.java | 21 +- .../java/net/minecraft/server/EntityHuman.java | 168 +- src/main/java/net/minecraft/server/EntityItem.java | 127 +- .../net/minecraft/server/EntityLargeFireball.java | 2 + .../java/net/minecraft/server/EntityLightning.java | 18 +- .../java/net/minecraft/server/EntityLiving.java | 384 ++--- .../java/net/minecraft/server/EntityMagmaCube.java | 2 +- .../java/net/minecraft/server/EntityMinecart.java | 100 +- .../java/net/minecraft/server/EntityMonster.java | 8 +- .../net/minecraft/server/EntityMushroomCow.java | 2 +- .../java/net/minecraft/server/EntityPigZombie.java | 4 +- .../java/net/minecraft/server/EntityPlayer.java | 152 +- .../java/net/minecraft/server/EntityPotion.java | 2 +- .../net/minecraft/server/EntitySilverfish.java | 6 +- .../java/net/minecraft/server/EntitySkeleton.java | 12 +- .../java/net/minecraft/server/EntitySlime.java | 12 +- .../java/net/minecraft/server/EntitySpider.java | 2 +- .../java/net/minecraft/server/EntitySquid.java | 48 +- .../java/net/minecraft/server/EntityTracker.java | 4 +- .../net/minecraft/server/EntityTrackerEntry.java | 44 +- .../java/net/minecraft/server/EntityWitch.java | 8 +- .../java/net/minecraft/server/EntityWither.java | 22 +- src/main/java/net/minecraft/server/EntityWolf.java | 14 +- .../java/net/minecraft/server/EntityZombie.java | 16 +- src/main/java/net/minecraft/server/Explosion.java | 7 +- .../java/net/minecraft/server/FoodMetaData.java | 4 +- src/main/java/net/minecraft/server/ItemBlock.java | 2 +- src/main/java/net/minecraft/server/ItemBoat.java | 1 + src/main/java/net/minecraft/server/ItemBow.java | 8 +- src/main/java/net/minecraft/server/ItemDye.java | 4 +- src/main/java/net/minecraft/server/ItemFood.java | 40 +- .../net/minecraft/server/ItemInWorldManager.java | 413 ----- .../java/net/minecraft/server/ItemMinecart.java | 2 +- .../java/net/minecraft/server/ItemMonsterEgg.java | 14 +- src/main/java/net/minecraft/server/ItemSkull.java | 6 +- src/main/java/net/minecraft/server/ItemStack.java | 22 +- src/main/java/net/minecraft/server/ItemStep.java | 2 +- .../java/net/minecraft/server/MinecraftServer.java | 21 +- .../java/net/minecraft/server/NetLoginHandler.java | 220 --- .../net/minecraft/server/NetServerHandler.java | 1619 -------------------- .../java/net/minecraft/server/NetworkManager.java | 26 +- src/main/java/net/minecraft/server/Packet.java | 5 +- .../minecraft/server/Packet20NamedEntitySpawn.java | 4 +- .../net/minecraft/server/Packet2Handshake.java | 4 +- .../java/net/minecraft/server/Packet3Chat.java | 4 +- .../net/minecraft/server/Packet51MapChunk.java | 16 +- .../net/minecraft/server/Packet56MapChunkBulk.java | 29 +- .../net/minecraft/server/PathfinderGoalBreed.java | 2 +- .../net/minecraft/server/PendingConnection.java | 218 +++ .../java/net/minecraft/server/PlayerChunk.java | 167 ++ .../java/net/minecraft/server/PlayerChunkMap.java | 303 ++++ .../net/minecraft/server/PlayerConnection.java | 1611 +++++++++++++++++++ .../java/net/minecraft/server/PlayerInstance.java | 168 -- .../minecraft/server/PlayerInteractManager.java | 413 +++++ .../java/net/minecraft/server/PlayerInventory.java | 2 + src/main/java/net/minecraft/server/PlayerList.java | 832 ++++++++++ .../java/net/minecraft/server/PlayerManager.java | 303 ---- .../java/net/minecraft/server/PropertyManager.java | 3 - .../java/net/minecraft/server/RecipeArmorDye.java | 123 ++ .../java/net/minecraft/server/RecipeFireworks.java | 176 +++ .../java/net/minecraft/server/RecipeMapClone.java | 82 + .../java/net/minecraft/server/RecipesArmorDye.java | 123 -- .../java/net/minecraft/server/RecipesMapClone.java | 88 -- .../server/ServerConfigurationManagerAbstract.java | 825 ---------- .../java/net/minecraft/server/ShapedRecipes.java | 20 +- .../net/minecraft/server/ThreadLoginVerifier.java | 32 +- .../net/minecraft/server/TileEntityMobSpawner.java | 88 +- src/main/java/net/minecraft/server/World.java | 184 +-- .../java/net/minecraft/server/WorldManager.java | 14 +- .../java/net/minecraft/server/WorldServer.java | 104 +- .../org/bukkit/craftbukkit/CraftOfflinePlayer.java | 2 +- .../java/org/bukkit/craftbukkit/CraftServer.java | 54 +- .../java/org/bukkit/craftbukkit/CraftWorld.java | 10 +- .../craftbukkit/enchantments/CraftEnchantment.java | 2 + .../org/bukkit/craftbukkit/entity/CraftEntity.java | 1 + .../bukkit/craftbukkit/entity/CraftFirework.java | 28 + .../craftbukkit/entity/CraftHumanEntity.java | 10 +- .../org/bukkit/craftbukkit/entity/CraftItem.java | 4 +- .../craftbukkit/entity/CraftLivingEntity.java | 4 +- .../org/bukkit/craftbukkit/entity/CraftPlayer.java | 86 +- .../craftbukkit/event/CraftEventFactory.java | 2 +- .../generator/CustomChunkGenerator.java | 6 +- .../craftbukkit/inventory/CraftContainer.java | 2 +- .../craftbukkit/inventory/CraftMetaItem.java | 2 +- .../org/bukkit/craftbukkit/util/LazyPlayerSet.java | 2 +- 123 files changed, 5428 insertions(+), 4924 deletions(-) delete mode 100644 src/main/java/net/minecraft/server/ItemInWorldManager.java delete mode 100644 src/main/java/net/minecraft/server/NetLoginHandler.java delete mode 100644 src/main/java/net/minecraft/server/NetServerHandler.java create mode 100644 src/main/java/net/minecraft/server/PendingConnection.java create mode 100644 src/main/java/net/minecraft/server/PlayerChunk.java create mode 100644 src/main/java/net/minecraft/server/PlayerChunkMap.java create mode 100644 src/main/java/net/minecraft/server/PlayerConnection.java delete mode 100644 src/main/java/net/minecraft/server/PlayerInstance.java create mode 100644 src/main/java/net/minecraft/server/PlayerInteractManager.java create mode 100644 src/main/java/net/minecraft/server/PlayerList.java delete mode 100644 src/main/java/net/minecraft/server/PlayerManager.java create mode 100644 src/main/java/net/minecraft/server/RecipeArmorDye.java create mode 100644 src/main/java/net/minecraft/server/RecipeFireworks.java create mode 100644 src/main/java/net/minecraft/server/RecipeMapClone.java delete mode 100644 src/main/java/net/minecraft/server/RecipesArmorDye.java delete mode 100644 src/main/java/net/minecraft/server/RecipesMapClone.java delete mode 100644 src/main/java/net/minecraft/server/ServerConfigurationManagerAbstract.java create mode 100644 src/main/java/org/bukkit/craftbukkit/entity/CraftFirework.java diff --git a/pom.xml b/pom.xml index a92acad6..19a9175f 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ org.bukkit craftbukkit jar - 1.4.5-R1.1-SNAPSHOT + 1.4.6-R0.1-SNAPSHOT CraftBukkit http://www.bukkit.org @@ -12,8 +12,8 @@ UTF-8 unknown 4.11 - 1.4.5 - 1_4_5 + 1.4.6 + 1_4_6 @@ -288,7 +288,7 @@ 2.11 ${basedir}/target/test-server - + org/bukkit/craftbukkit/updater/BukkitDLUpdaterServiceTest.java org/bukkit/craftbukkit/inventory/ItemStackBookTest.java org/bukkit/craftbukkit/inventory/ItemStackLeatherTest.java diff --git a/src/main/java/net/minecraft/server/BlockDispenser.java b/src/main/java/net/minecraft/server/BlockDispenser.java index 68483094..5cb21c83 100644 --- a/src/main/java/net/minecraft/server/BlockDispenser.java +++ b/src/main/java/net/minecraft/server/BlockDispenser.java @@ -5,8 +5,8 @@ import java.util.Random; public class BlockDispenser extends BlockContainer { public static final IRegistry a = new RegistryDefault(new DispenseBehaviorItem()); - private Random b = new Random(); public static boolean eventFired = false; // CraftBukkit + private Random b = new Random(); protected BlockDispenser(int i) { super(i, Material.STONE); @@ -160,7 +160,7 @@ public class BlockDispenser extends BlockContainer { EntityItem entityitem = new EntityItem(world, (double) ((float) i + f), (double) ((float) j + f1), (double) ((float) k + f2), new ItemStack(itemstack.id, k1, itemstack.getData())); if (itemstack.hasTag()) { - entityitem.itemStack.setTag((NBTTagCompound) itemstack.getTag().clone()); + entityitem.getItemStack().setTag((NBTTagCompound) itemstack.getTag().clone()); } float f3 = 0.05F; @@ -179,9 +179,9 @@ public class BlockDispenser extends BlockContainer { public static IPosition a(ISourceBlock isourceblock) { EnumFacing enumfacing = EnumFacing.a(isourceblock.h()); - double d0 = isourceblock.getX() + 0.6D * (double) enumfacing.c(); + double d0 = isourceblock.getX() + 0.7D * (double) enumfacing.c(); double d1 = isourceblock.getY(); - double d2 = isourceblock.getZ() + 0.6D * (double) enumfacing.e(); + double d2 = isourceblock.getZ() + 0.7D * (double) enumfacing.e(); return new Position(d0, d1, d2); } diff --git a/src/main/java/net/minecraft/server/BlockDragonEgg.java b/src/main/java/net/minecraft/server/BlockDragonEgg.java index 5deafecd..2c461253 100644 --- a/src/main/java/net/minecraft/server/BlockDragonEgg.java +++ b/src/main/java/net/minecraft/server/BlockDragonEgg.java @@ -8,6 +8,7 @@ public class BlockDragonEgg extends Block { public BlockDragonEgg(int i, int j) { super(i, j, Material.DRAGON_EGG); + this.a(0.0625F, 0.0F, 0.0625F, 0.9375F, 1.0F, 0.9375F); } public void onPlace(World world, int i, int j, int k) { diff --git a/src/main/java/net/minecraft/server/BlockLeaves.java b/src/main/java/net/minecraft/server/BlockLeaves.java index cea559f3..e06e0675 100644 --- a/src/main/java/net/minecraft/server/BlockLeaves.java +++ b/src/main/java/net/minecraft/server/BlockLeaves.java @@ -163,7 +163,7 @@ public class BlockLeaves extends BlockTransparant { } public void a(World world, EntityHuman entityhuman, int i, int j, int k, int l) { - if (!world.isStatic && entityhuman.bT() != null && entityhuman.bT().id == Item.SHEARS.id) { + if (!world.isStatic && entityhuman.bS() != null && entityhuman.bS().id == Item.SHEARS.id) { entityhuman.a(StatisticList.C[this.id], 1); this.b(world, i, j, k, new ItemStack(Block.LEAVES.id, 1, l & 3)); } else { @@ -182,4 +182,8 @@ public class BlockLeaves extends BlockTransparant { public int a(int i, int j) { return (j & 3) == 1 ? this.textureId + 80 : ((j & 3) == 3 ? this.textureId + 144 : this.textureId); } + + protected ItemStack f_(int i) { + return new ItemStack(this.id, 1, i & 3); + } } diff --git a/src/main/java/net/minecraft/server/BlockLever.java b/src/main/java/net/minecraft/server/BlockLever.java index 5b290f60..11489b14 100644 --- a/src/main/java/net/minecraft/server/BlockLever.java +++ b/src/main/java/net/minecraft/server/BlockLever.java @@ -65,7 +65,7 @@ public class BlockLever extends Block { return k1 + j1; } - public static int d(int i) { + public static int e(int i) { switch (i) { case 0: return 0; diff --git a/src/main/java/net/minecraft/server/BlockSkull.java b/src/main/java/net/minecraft/server/BlockSkull.java index d5fd3ad3..de166a1b 100644 --- a/src/main/java/net/minecraft/server/BlockSkull.java +++ b/src/main/java/net/minecraft/server/BlockSkull.java @@ -155,7 +155,7 @@ public class BlockSkull extends BlockContainer { if (!world.isStatic) { entitywither = new EntityWither(world); entitywither.setPositionRotation((double) i + 0.5D, (double) j - 1.45D, (double) (k + i1) + 1.5D, 90.0F, 0.0F); - entitywither.aw = 90.0F; + entitywither.ax = 90.0F; entitywither.m(); if (world.addEntity(entitywither, SpawnReason.BUILD_WITHER)) { diff --git a/src/main/java/net/minecraft/server/BlockSoil.java b/src/main/java/net/minecraft/server/BlockSoil.java index dfff34c3..21641570 100644 --- a/src/main/java/net/minecraft/server/BlockSoil.java +++ b/src/main/java/net/minecraft/server/BlockSoil.java @@ -56,6 +56,10 @@ public class BlockSoil extends Block { public void a(World world, int i, int j, int k, Entity entity, float f) { if (!world.isStatic && world.random.nextFloat() < f - 0.5F) { + if (!(entity instanceof EntityHuman) && !world.getGameRules().getBoolean("mobGriefing")) { + return; + } + // CraftBukkit start - interact soil org.bukkit.event.Cancellable cancellable; if (entity instanceof EntityHuman) { diff --git a/src/main/java/net/minecraft/server/BlockTNT.java b/src/main/java/net/minecraft/server/BlockTNT.java index 20906744..c9c0ec0f 100644 --- a/src/main/java/net/minecraft/server/BlockTNT.java +++ b/src/main/java/net/minecraft/server/BlockTNT.java @@ -53,7 +53,7 @@ public class BlockTNT extends Block { } public boolean interact(World world, int i, int j, int k, EntityHuman entityhuman, int l, float f, float f1, float f2) { - if (entityhuman.bT() != null && entityhuman.bT().id == Item.FLINT_AND_STEEL.id) { + if (entityhuman.bS() != null && entityhuman.bS().id == Item.FLINT_AND_STEEL.id) { this.postBreak(world, i, j, k, 1); world.setTypeId(i, j, k, 0); return true; diff --git a/src/main/java/net/minecraft/server/BlockTripwire.java b/src/main/java/net/minecraft/server/BlockTripwire.java index 191526a5..dc31e0c2 100644 --- a/src/main/java/net/minecraft/server/BlockTripwire.java +++ b/src/main/java/net/minecraft/server/BlockTripwire.java @@ -76,7 +76,7 @@ public class BlockTripwire extends Block { public void a(World world, int i, int j, int k, int l, EntityHuman entityhuman) { if (!world.isStatic) { - if (entityhuman.bT() != null && entityhuman.bT().id == Item.SHEARS.id) { + if (entityhuman.bS() != null && entityhuman.bS().id == Item.SHEARS.id) { world.setData(i, j, k, l | 8); } } diff --git a/src/main/java/net/minecraft/server/BlockVine.java b/src/main/java/net/minecraft/server/BlockVine.java index 7217e32f..03064def 100644 --- a/src/main/java/net/minecraft/server/BlockVine.java +++ b/src/main/java/net/minecraft/server/BlockVine.java @@ -299,7 +299,7 @@ public class BlockVine extends Block { } public void a(World world, EntityHuman entityhuman, int i, int j, int k, int l) { - if (!world.isStatic && entityhuman.bT() != null && entityhuman.bT().id == Item.SHEARS.id) { + if (!world.isStatic && entityhuman.bS() != null && entityhuman.bS().id == Item.SHEARS.id) { entityhuman.a(StatisticList.C[this.id], 1); this.b(world, i, j, k, new ItemStack(Block.VINE, 1, 0)); } else { diff --git a/src/main/java/net/minecraft/server/Chunk.java b/src/main/java/net/minecraft/server/Chunk.java index 8732e7a8..9b6d1341 100644 --- a/src/main/java/net/minecraft/server/Chunk.java +++ b/src/main/java/net/minecraft/server/Chunk.java @@ -88,7 +88,7 @@ public class Chunk { int k1 = j1 >> 4; if (this.sections[k1] == null) { - this.sections[k1] = new ChunkSection(k1 << 4); + this.sections[k1] = new ChunkSection(k1 << 4, !world.worldProvider.f); } this.sections[k1].a(l, j1 & 15, i1, b0); @@ -387,7 +387,7 @@ public class Chunk { return false; } - chunksection = this.sections[j >> 4] = new ChunkSection(j >> 4 << 4); + chunksection = this.sections[j >> 4] = new ChunkSection(j >> 4 << 4, !world.worldProvider.f); flag = j >= k1; } @@ -498,14 +498,14 @@ public class Chunk { public int getBrightness(EnumSkyBlock enumskyblock, int i, int j, int k) { ChunkSection chunksection = this.sections[j >> 4]; - return chunksection == null ? (this.d(i, j, k) ? enumskyblock.c : 0) : (enumskyblock == EnumSkyBlock.SKY ? chunksection.c(i, j & 15, k) : (enumskyblock == EnumSkyBlock.BLOCK ? chunksection.d(i, j & 15, k) : enumskyblock.c)); + return chunksection == null ? (this.d(i, j, k) ? enumskyblock.c : 0) : (enumskyblock == EnumSkyBlock.SKY ? (this.world.worldProvider.f ? 0 : chunksection.c(i, j & 15, k)) : (enumskyblock == EnumSkyBlock.BLOCK ? chunksection.d(i, j & 15, k) : enumskyblock.c)); } public void a(EnumSkyBlock enumskyblock, int i, int j, int k, int l) { ChunkSection chunksection = this.sections[j >> 4]; if (chunksection == null) { - chunksection = this.sections[j >> 4] = new ChunkSection(j >> 4 << 4); + chunksection = this.sections[j >> 4] = new ChunkSection(j >> 4 << 4, !world.worldProvider.f); this.initLighting(); } diff --git a/src/main/java/net/minecraft/server/ChunkRegionLoader.java b/src/main/java/net/minecraft/server/ChunkRegionLoader.java index 7926c1dc..88c33d06 100644 --- a/src/main/java/net/minecraft/server/ChunkRegionLoader.java +++ b/src/main/java/net/minecraft/server/ChunkRegionLoader.java @@ -194,6 +194,7 @@ public class ChunkRegionLoader implements IAsyncChunkSaver, IChunkLoader { nbttagcompound.setBoolean("TerrainPopulated", chunk.done); ChunkSection[] achunksection = chunk.i(); NBTTagList nbttaglist = new NBTTagList("Sections"); + boolean flag = !world.worldProvider.f; ChunkSection[] achunksection1 = achunksection; int i = achunksection.length; @@ -211,8 +212,13 @@ public class ChunkRegionLoader implements IAsyncChunkSaver, IChunkLoader { } nbttagcompound1.setByteArray("Data", chunksection.j().a); - nbttagcompound1.setByteArray("SkyLight", chunksection.l().a); nbttagcompound1.setByteArray("BlockLight", chunksection.k().a); + if (flag) { + nbttagcompound1.setByteArray("SkyLight", chunksection.l().a); + } else { + nbttagcompound1.setByteArray("SkyLight", new byte[chunksection.k().a.length]); + } + nbttaglist.add(nbttagcompound1); } } @@ -285,11 +291,12 @@ public class ChunkRegionLoader implements IAsyncChunkSaver, IChunkLoader { NBTTagList nbttaglist = nbttagcompound.getList("Sections"); byte b0 = 16; ChunkSection[] achunksection = new ChunkSection[b0]; + boolean flag = !world.worldProvider.f; for (int k = 0; k < nbttaglist.size(); ++k) { NBTTagCompound nbttagcompound1 = (NBTTagCompound) nbttaglist.get(k); byte b1 = nbttagcompound1.getByte("Y"); - ChunkSection chunksection = new ChunkSection(b1 << 4); + ChunkSection chunksection = new ChunkSection(b1 << 4, flag); chunksection.a(nbttagcompound1.getByteArray("Blocks")); if (nbttagcompound1.hasKey("Add")) { @@ -297,8 +304,11 @@ public class ChunkRegionLoader implements IAsyncChunkSaver, IChunkLoader { } chunksection.b(new NibbleArray(nbttagcompound1.getByteArray("Data"), 4)); - chunksection.d(new NibbleArray(nbttagcompound1.getByteArray("SkyLight"), 4)); chunksection.c(new NibbleArray(nbttagcompound1.getByteArray("BlockLight"), 4)); + if (flag) { + chunksection.d(new NibbleArray(nbttagcompound1.getByteArray("SkyLight"), 4)); + } + chunksection.recalcBlockCounts(); achunksection[b1] = chunksection; } diff --git a/src/main/java/net/minecraft/server/ChunkSection.java b/src/main/java/net/minecraft/server/ChunkSection.java index 31262a35..90e0636d 100644 --- a/src/main/java/net/minecraft/server/ChunkSection.java +++ b/src/main/java/net/minecraft/server/ChunkSection.java @@ -11,16 +11,18 @@ public class ChunkSection { private NibbleArray blockLight; private NibbleArray skyLight; - public ChunkSection(int i) { + public ChunkSection(int i, boolean flag) { this.yPos = i; this.blockIds = new byte[4096]; this.blockData = new NibbleArray(this.blockIds.length, 4); - this.skyLight = new NibbleArray(this.blockIds.length, 4); this.blockLight = new NibbleArray(this.blockIds.length, 4); + if (flag) { + this.skyLight = new NibbleArray(this.blockIds.length, 4); + } } // CraftBukkit start - public ChunkSection(int y, byte[] blkIds, byte[] extBlkIds) { + public ChunkSection(int y, boolean flag, byte[] blkIds, byte[] extBlkIds) { this.yPos = y; this.blockIds = blkIds; if (extBlkIds != null) { @@ -28,7 +30,9 @@ public class ChunkSection { } this.blockData = new NibbleArray(this.blockIds.length, 4); this.blockLight = new NibbleArray(this.blockIds.length, 4); - this.skyLight = new NibbleArray(this.blockIds.length, 4); + if (flag) { + this.skyLight = new NibbleArray(this.blockIds.length, 4); + } this.recalcBlockCounts(); } // CraftBukkit end diff --git a/src/main/java/net/minecraft/server/Container.java b/src/main/java/net/minecraft/server/Container.java index 8bc961aa..9ecefea0 100644 --- a/src/main/java/net/minecraft/server/Container.java +++ b/src/main/java/net/minecraft/server/Container.java @@ -186,7 +186,7 @@ public abstract class Container { slot.a(entityhuman, playerinventory.getCarried()); } else if (slot.isAllowed(itemstack3)) { - if (itemstack1.id == itemstack3.id && (!itemstack1.usesData() || itemstack1.getData() == itemstack3.getData()) && ItemStack.equals(itemstack1, itemstack3)) { + if (itemstack1.id == itemstack3.id && itemstack1.getData() == itemstack3.getData() && ItemStack.equals(itemstack1, itemstack3)) { l = j == 0 ? itemstack3.count : 1; if (l > slot.a() - itemstack1.count) { l = slot.a() - itemstack1.count; @@ -241,10 +241,12 @@ public abstract class Container { if ((slot.inventory != playerinventory || !slot.isAllowed(itemstack1)) && itemstack1 != null) { if (l > -1) { playerinventory.pickup(itemstack1); + slot.a(itemstack2.count); slot.set((ItemStack) null); slot.a(entityhuman, itemstack2); } } else { + slot.a(itemstack2.count); slot.set(itemstack1); slot.a(entityhuman, itemstack2); } diff --git a/src/main/java/net/minecraft/server/ContainerAnvil.java b/src/main/java/net/minecraft/server/ContainerAnvil.java index eabc7b14..febfa1df 100644 --- a/src/main/java/net/minecraft/server/ContainerAnvil.java +++ b/src/main/java/net/minecraft/server/ContainerAnvil.java @@ -72,6 +72,7 @@ public class ContainerAnvil extends Container { ItemStack itemstack1 = itemstack.cloneItemStack(); ItemStack itemstack2 = this.g.getItem(1); Map map = EnchantmentManager.a(itemstack1); + boolean flag = false; int k = b0 + itemstack.getRepairCost() + (itemstack2 == null ? 0 : itemstack2.getRepairCost()); this.l = 0; @@ -79,10 +80,12 @@ public class ContainerAnvil extends Container { int i1; int j1; int k1; - Enchantment enchantment; + int l1; Iterator iterator; + Enchantment enchantment; if (itemstack2 != null) { + flag = itemstack2.id == Item.ENCHANTED_BOOK.id && Item.ENCHANTED_BOOK.g(itemstack2).size() > 0; if (itemstack1.f() && Item.byId[itemstack1.id].a(itemstack, itemstack2)) { l = Math.min(itemstack1.i(), itemstack1.k() / 4); if (l <= 0) { @@ -100,19 +103,19 @@ public class ContainerAnvil extends Container { this.l = i1; } else { - if (itemstack1.id != itemstack2.id || !itemstack1.f()) { + if (!flag && (itemstack1.id != itemstack2.id || !itemstack1.f())) { this.f.setItem(0, (ItemStack) null); this.a = 0; return; } - if (itemstack1.f()) { + if (itemstack1.f() && !flag) { l = itemstack.k() - itemstack.i(); i1 = itemstack2.k() - itemstack2.i(); j1 = i1 + itemstack1.k() * 12 / 100; - int l1 = l + j1; + int i2 = l + j1; - k1 = itemstack1.k() - l1; + k1 = itemstack1.k() - i2; if (k1 < 0) { k1 = 0; } @@ -131,45 +134,50 @@ public class ContainerAnvil extends Container { j1 = ((Integer) iterator.next()).intValue(); enchantment = Enchantment.byId[j1]; k1 = map.containsKey(Integer.valueOf(j1)) ? ((Integer) map.get(Integer.valueOf(j1))).intValue() : 0; - int i2 = ((Integer) map1.get(Integer.valueOf(j1))).intValue(); + l1 = ((Integer) map1.get(Integer.valueOf(j1))).intValue(); int j2; - if (k1 == i2) { - ++i2; - j2 = i2; + if (k1 == l1) { + ++l1; + j2 = l1; } else { - j2 = Math.max(i2, k1); + j2 = Math.max(l1, k1); + } + + l1 = j2; + int k2 = l1 - k1; + boolean flag1 = enchantment.canEnchant(itemstack); + + if (this.n.abilities.canInstantlyBuild) { + flag1 = true; } - i2 = j2; - int k2 = i2 - k1; - boolean flag = true; Iterator iterator1 = map.keySet().iterator(); while (iterator1.hasNext()) { int l2 = ((Integer) iterator1.next()).intValue(); if (l2 != j1 && !enchantment.a(Enchantment.byId[l2])) { - flag = false; + flag1 = false; i += k2; } } - if (flag) { - if (i2 > enchantment.getMaxLevel()) { - i2 = enchantment.getMaxLevel(); + if (flag1) { + if (l1 > enchantment.getMaxLevel()) { + l1 = enchantment.getMaxLevel(); } - map.put(Integer.valueOf(j1), Integer.valueOf(i2)); - byte b1 = 0; + map.put(Integer.valueOf(j1), Integer.valueOf(l1)); + int i3 = 0; switch (enchantment.getRandomWeight()) { case 1: - b1 = 8; + i3 = 8; break; case 2: - b1 = 4; + i3 = 4; case 3: case 4: @@ -181,14 +189,14 @@ public class ContainerAnvil extends Container { break; case 5: - b1 = 2; + i3 = 2; break; case 10: - b1 = 1; + i3 = 1; } - i += b1 * k2; + i += i3 * k2; } } } @@ -206,21 +214,19 @@ public class ContainerAnvil extends Container { l = 0; - byte b2; - - for (iterator = map.keySet().iterator(); iterator.hasNext(); k += l + k1 * b2) { + for (iterator = map.keySet().iterator(); iterator.hasNext(); k += l + k1 * l1) { j1 = ((Integer) iterator.next()).intValue(); enchantment = Enchantment.byId[j1]; k1 = ((Integer) map.get(Integer.valueOf(j1))).intValue(); - b2 = 0; + l1 = 0; ++l; switch (enchantment.getRandomWeight()) { case 1: - b2 = 8; + l1 = 8; break; case 2: - b2 = 4; + l1 = 4; case 3: case 4: @@ -232,14 +238,22 @@ public class ContainerAnvil extends Container { break; case 5: - b2 = 2; + l1 = 2; break; case 10: - b2 = 1; + l1 = 1; + } + + if (flag) { + l1 = Math.max(1, l1 / 2); } } + if (flag) { + k = Math.max(1, k / 2); + } + this.a = k + i; if (i <= 0) { itemstack1 = null; diff --git a/src/main/java/net/minecraft/server/ContainerEnchantTable.java b/src/main/java/net/minecraft/server/ContainerEnchantTable.java index 9f660607..c0d99318 100644 --- a/src/main/java/net/minecraft/server/ContainerEnchantTable.java +++ b/src/main/java/net/minecraft/server/ContainerEnchantTable.java @@ -1,6 +1,5 @@ package net.minecraft.server; -import java.util.Iterator; import java.util.List; import java.util.Random; @@ -152,6 +151,7 @@ public class ContainerEnchantTable extends Container { if (this.costs[i] > 0 && itemstack != null && (entityhuman.expLevel >= this.costs[i] || entityhuman.abilities.canInstantlyBuild)) { if (!this.world.isStatic) { List list = EnchantmentManager.b(this.l, itemstack, this.costs[i]); + boolean flag = itemstack.id == Item.BOOK.id; if (list != null) { // CraftBukkit start @@ -170,6 +170,7 @@ public class ContainerEnchantTable extends Container { return false; } + // TODO: Apply Diffs entityhuman.levelDown(-level); for (Map.Entry entry : event.getEnchantsToAdd().entrySet()) { try { diff --git a/src/main/java/net/minecraft/server/ContainerPlayer.java b/src/main/java/net/minecraft/server/ContainerPlayer.java index 51661ad5..5c850f8b 100644 --- a/src/main/java/net/minecraft/server/ContainerPlayer.java +++ b/src/main/java/net/minecraft/server/ContainerPlayer.java @@ -61,7 +61,7 @@ public class ContainerPlayer extends Container { } EntityPlayer player = (EntityPlayer) super.listeners.get(0); // TODO: Is this _always_ correct? Seems like it. - player.netServerHandler.sendPacket(new Packet103SetSlot(player.activeContainer.windowId, 0, craftResult)); + player.playerConnection.sendPacket(new Packet103SetSlot(player.activeContainer.windowId, 0, craftResult)); // CraftBukkit end } diff --git a/src/main/java/net/minecraft/server/ContainerWorkbench.java b/src/main/java/net/minecraft/server/ContainerWorkbench.java index 7c32df51..eb2fe72a 100644 --- a/src/main/java/net/minecraft/server/ContainerWorkbench.java +++ b/src/main/java/net/minecraft/server/ContainerWorkbench.java @@ -63,7 +63,7 @@ public class ContainerWorkbench extends Container { } EntityPlayer player = (EntityPlayer) super.listeners.get(0); // TODO: Is this _always_ correct? Seems like it. - player.netServerHandler.sendPacket(new Packet103SetSlot(player.activeContainer.windowId, 0, craftResult)); + player.playerConnection.sendPacket(new Packet103SetSlot(player.activeContainer.windowId, 0, craftResult)); // CraftBukkit end } diff --git a/src/main/java/net/minecraft/server/ControllerLook.java b/src/main/java/net/minecraft/server/ControllerLook.java index 52595428..bed36954 100644 --- a/src/main/java/net/minecraft/server/ControllerLook.java +++ b/src/main/java/net/minecraft/server/ControllerLook.java @@ -53,20 +53,20 @@ public class ControllerLook { // CraftBukkit end this.a.pitch = this.a(this.a.pitch, f1, this.c); - this.a.ay = this.a(this.a.ay, f, this.b); + this.a.az = this.a(this.a.az, f, this.b); } else { - this.a.ay = this.a(this.a.ay, this.a.aw, 10.0F); + this.a.az = this.a(this.a.az, this.a.ax, 10.0F); } - float f2 = MathHelper.g(this.a.ay - this.a.aw); + float f2 = MathHelper.g(this.a.az - this.a.ax); if (!this.a.getNavigation().f()) { if (f2 < -75.0F) { - this.a.ay = this.a.aw - 75.0F; + this.a.az = this.a.ax - 75.0F; } if (f2 > 75.0F) { - this.a.ay = this.a.aw + 75.0F; + this.a.az = this.a.ax + 75.0F; } } } diff --git a/src/main/java/net/minecraft/server/CraftingManager.java b/src/main/java/net/minecraft/server/CraftingManager.java index 8867b56f..e33bc55e 100644 --- a/src/main/java/net/minecraft/server/CraftingManager.java +++ b/src/main/java/net/minecraft/server/CraftingManager.java @@ -29,9 +29,10 @@ public class CraftingManager { (new RecipesCrafting()).a(this); (new RecipesArmor()).a(this); (new RecipesDyes()).a(this); - this.recipes.add(new RecipesArmorDye()); - this.recipes.add(new RecipesMapClone()); - this.recipes.add(new RecipesMapExtend()); + this.recipes.add(new RecipeArmorDye()); + this.recipes.add(new RecipeMapClone()); + this.recipes.add(new RecipeMapExtend()); + this.recipes.add(new RecipeFireworks()); this.registerShapedRecipe(new ItemStack(Item.PAPER, 3), new Object[] { "###", Character.valueOf('#'), Item.SUGAR_CANE}); this.registerShapelessRecipe(new ItemStack(Item.BOOK, 1), new Object[] { Item.PAPER, Item.PAPER, Item.PAPER, Item.LEATHER}); this.registerShapelessRecipe(new ItemStack(Item.BOOK_AND_QUILL, 1), new Object[] { Item.BOOK, new ItemStack(Item.INK_SACK, 1, 0), Item.FEATHER}); @@ -54,6 +55,7 @@ public class CraftingManager { this.registerShapedRecipe(new ItemStack(Block.STEP, 6, 1), new Object[] { "###", Character.valueOf('#'), Block.SANDSTONE}); this.registerShapedRecipe(new ItemStack(Block.STEP, 6, 4), new Object[] { "###", Character.valueOf('#'), Block.BRICK}); this.registerShapedRecipe(new ItemStack(Block.STEP, 6, 5), new Object[] { "###", Character.valueOf('#'), Block.SMOOTH_BRICK}); + this.registerShapedRecipe(new ItemStack(Block.STEP, 6, 6), new Object[] { "###", Character.valueOf('#'), Block.NETHER_BRICK}); this.registerShapedRecipe(new ItemStack(Block.WOOD_STEP, 6, 0), new Object[] { "###", Character.valueOf('#'), new ItemStack(Block.WOOD, 1, 0)}); this.registerShapedRecipe(new ItemStack(Block.WOOD_STEP, 6, 2), new Object[] { "###", Character.valueOf('#'), new ItemStack(Block.WOOD, 1, 2)}); this.registerShapedRecipe(new ItemStack(Block.WOOD_STEP, 6, 1), new Object[] { "###", Character.valueOf('#'), new ItemStack(Block.WOOD, 1, 1)}); @@ -93,7 +95,7 @@ public class CraftingManager { this.registerShapedRecipe(new ItemStack(Block.SPRUCE_WOOD_STAIRS, 4), new Object[] { "# ", "## ", "###", Character.valueOf('#'), new ItemStack(Block.WOOD, 1, 1)}); this.registerShapedRecipe(new ItemStack(Block.JUNGLE_WOOD_STAIRS, 4), new Object[] { "# ", "## ", "###", Character.valueOf('#'), new ItemStack(Block.WOOD, 1, 3)}); this.registerShapedRecipe(new ItemStack(Item.FISHING_ROD, 1), new Object[] { " #", " #X", "# X", Character.valueOf('#'), Item.STICK, Character.valueOf('X'), Item.STRING}); - this.registerShapedRecipe(new ItemStack(Item.CARROT_STICK, 1), new Object[] { "# ", " X", Character.valueOf('#'), Item.FISHING_ROD, Character.valueOf('X'), Item.CARROT}); + this.registerShapedRecipe(new ItemStack(Item.CARROT_STICK, 1), new Object[] { "# ", " X", Character.valueOf('#'), Item.FISHING_ROD, Character.valueOf('X'), Item.CARROT}).c(); this.registerShapedRecipe(new ItemStack(Block.COBBLESTONE_STAIRS, 4), new Object[] { "# ", "## ", "###", Character.valueOf('#'), Block.COBBLESTONE}); this.registerShapedRecipe(new ItemStack(Block.BRICK_STAIRS, 4), new Object[] { "# ", "## ", "###", Character.valueOf('#'), Block.BRICK}); this.registerShapedRecipe(new ItemStack(Block.STONE_STAIRS, 4), new Object[] { "# ", "## ", "###", Character.valueOf('#'), Block.SMOOTH_BRICK}); @@ -136,7 +138,7 @@ public class CraftingManager { // CraftBukkit end // CraftBukkit - default -> public - public void registerShapedRecipe(ItemStack itemstack, Object... aobject) { + public ShapedRecipes registerShapedRecipe(ItemStack itemstack, Object... aobject) { String s = ""; int i = 0; int j = 0; @@ -191,7 +193,10 @@ public class CraftingManager { } } - this.recipes.add(new ShapedRecipes(j, k, aitemstack, itemstack)); + ShapedRecipes shapedrecipes = new ShapedRecipes(j, k, aitemstack, itemstack); + + this.recipes.add(shapedrecipes); + return shapedrecipes; } // CraftBukkit - default -> public diff --git a/src/main/java/net/minecraft/server/DedicatedServer.java b/src/main/java/net/minecraft/server/DedicatedServer.java index 3b0ec70b..92013756 100644 --- a/src/main/java/net/minecraft/server/DedicatedServer.java +++ b/src/main/java/net/minecraft/server/DedicatedServer.java @@ -47,7 +47,7 @@ public class DedicatedServer extends MinecraftServer implements IMinecraftServer System.setErr(new PrintStream(new LoggerOutputStream(log, Level.SEVERE), true)); // CraftBukkit end - log.info("Starting minecraft server version 1.4.5"); + log.info("Starting minecraft server version 1.4.6"); if (Runtime.getRuntime().maxMemory() / 1024L / 1024L < 512L) { log.warning("To start the server with more ram, launch it as \"java -Xmx1024M -Xms1024M -jar minecraft_server.jar\""); } @@ -101,6 +101,8 @@ public class DedicatedServer extends MinecraftServer implements IMinecraftServer return false; } + this.a((PlayerList) (new DedicatedPlayerList(this))); // CraftBukkit + if (!this.getOnlineMode()) { log.warning("**** SERVER IS RUNNING IN OFFLINE/INSECURE MODE!"); log.warning("The server will make no attempt to authenticate usernames. Beware."); @@ -108,7 +110,7 @@ public class DedicatedServer extends MinecraftServer implements IMinecraftServer log.warning("To change this, set \"online-mode\" to \"true\" in the server.properties file."); } - this.a((ServerConfigurationManagerAbstract) (new ServerConfigurationManager(this))); + // this.a((PlayerList) (new DedicatedPlayerList(this))); // CraftBukkit - moved up this.convertable = new WorldLoaderServer(server.getWorldContainer()); // CraftBukkit - moved from MinecraftServer constructor long j = System.nanoTime(); @@ -264,8 +266,8 @@ public class DedicatedServer extends MinecraftServer implements IMinecraftServer return true; } - public ServerConfigurationManager am() { - return (ServerConfigurationManager) super.getServerConfigurationManager(); + public DedicatedPlayerList am() { + return (DedicatedPlayerList) super.getPlayerList(); } public ServerConnection ae() { @@ -319,7 +321,7 @@ public class DedicatedServer extends MinecraftServer implements IMinecraftServer return this.propertyManager.getInt("spawn-protection", super.getSpawnProtection()); } - public ServerConfigurationManagerAbstract getServerConfigurationManager() { + public PlayerList getPlayerList() { return this.am(); } } diff --git a/src/main/java/net/minecraft/server/DedicatedServerConnectionThread.java b/src/main/java/net/minecraft/server/DedicatedServerConnectionThread.java index 311265fc..25e2ac1d 100644 --- a/src/main/java/net/minecraft/server/DedicatedServerConnectionThread.java +++ b/src/main/java/net/minecraft/server/DedicatedServerConnectionThread.java @@ -38,20 +38,20 @@ public class DedicatedServerConnectionThread extends Thread { synchronized (this.b) { for (int i = 0; i < this.b.size(); ++i) { - NetLoginHandler netloginhandler = (NetLoginHandler) this.b.get(i); + PendingConnection pendingconnection = (PendingConnection) this.b.get(i); try { - netloginhandler.c(); + pendingconnection.c(); } catch (Exception exception) { - netloginhandler.disconnect("Internal server error"); - a.log(Level.WARNING, "Failed to handle packet for " + netloginhandler.getName() + ": " + exception, exception); + pendingconnection.disconnect("Internal server error"); + a.log(Level.WARNING, "Failed to handle packet for " + pendingconnection.getName() + ": " + exception, exception); } - if (netloginhandler.c) { + if (pendingconnection.c) { this.b.remove(i--); } - netloginhandler.networkManager.a(); + pendingconnection.networkManager.a(); } } } @@ -83,9 +83,9 @@ public class DedicatedServerConnectionThread extends Thread { this.c.put(inetaddress, Long.valueOf(i)); } - NetLoginHandler netloginhandler = new NetLoginHandler(this.f.d(), socket, "Connection #" + this.d++); + PendingConnection pendingconnection = new PendingConnection(this.f.d(), socket, "Connection #" + this.d++); - this.a(netloginhandler); + this.a(pendingconnection); } catch (IOException ioexception) { a.warning("DSCT: " + ioexception.getMessage()); // CraftBukkit } @@ -94,14 +94,14 @@ public class DedicatedServerConnectionThread extends Thread { System.out.println("Closing listening thread"); } - private void a(NetLoginHandler netloginhandler) { - if (netloginhandler == null) { + private void a(PendingConnection pendingconnection) { + if (pendingconnection == null) { throw new IllegalArgumentException("Got null pendingconnection!"); } else { List list = this.b; synchronized (this.b) { - this.b.add(netloginhandler); + this.b.add(pendingconnection); } } } diff --git a/src/main/java/net/minecraft/server/DispenseBehaviorItem.java b/src/main/java/net/minecraft/server/DispenseBehaviorItem.java index 1e7161ac..42e08a23 100644 --- a/src/main/java/net/minecraft/server/DispenseBehaviorItem.java +++ b/src/main/java/net/minecraft/server/DispenseBehaviorItem.java @@ -61,7 +61,7 @@ public class DispenseBehaviorItem implements IDispenseBehavior { return false; } - entityitem.itemStack = CraftItemStack.asNMSCopy(event.getItem()); + entityitem.setItemStack(CraftItemStack.asNMSCopy(event.getItem())); entityitem.motX = event.getVelocity().getX(); entityitem.motY = event.getVelocity().getY(); entityitem.motZ = event.getVelocity().getZ(); diff --git a/src/main/java/net/minecraft/server/DispenseBehaviorMinecart.java b/src/main/java/net/minecraft/server/DispenseBehaviorMinecart.java index 1ec5310e..2da34d37 100644 --- a/src/main/java/net/minecraft/server/DispenseBehaviorMinecart.java +++ b/src/main/java/net/minecraft/server/DispenseBehaviorMinecart.java @@ -28,10 +28,10 @@ public class DispenseBehaviorMinecart extends DispenseBehaviorItem { int l = world.getTypeId(i, j, k); double d3; - if (BlockMinecartTrack.d(l)) { + if (BlockMinecartTrack.e(l)) { d3 = 0.0D; } else { - if (l != 0 || !BlockMinecartTrack.d(world.getTypeId(i, j - 1, k))) { + if (l != 0 || !BlockMinecartTrack.e(world.getTypeId(i, j - 1, k))) { return this.c.a(isourceblock, itemstack); } diff --git a/src/main/java/net/minecraft/server/DispenseBehaviorMonsterEgg.java b/src/main/java/net/minecraft/server/DispenseBehaviorMonsterEgg.java index 66ad86ec..e5a011bc 100644 --- a/src/main/java/net/minecraft/server/DispenseBehaviorMonsterEgg.java +++ b/src/main/java/net/minecraft/server/DispenseBehaviorMonsterEgg.java @@ -52,8 +52,4 @@ public class DispenseBehaviorMonsterEgg extends DispenseBehaviorItem { // CraftBukkit end return itemstack; } - - protected void a(ISourceBlock isourceblock) { - isourceblock.k().triggerEffect(1002, isourceblock.getBlockX(), isourceblock.getBlockY(), isourceblock.getBlockZ(), 0); - } } diff --git a/src/main/java/net/minecraft/server/Enchantment.java b/src/main/java/net/minecraft/server/Enchantment.java index 293c3876..fec45c46 100644 --- a/src/main/java/net/minecraft/server/Enchantment.java +++ b/src/main/java/net/minecraft/server/Enchantment.java @@ -1,9 +1,12 @@ package net.minecraft.server; +import java.util.ArrayList; + public abstract class Enchantment { // CraftBukkit - update CraftEnchant.getName(i) if this changes public static final Enchantment[] byId = new Enchantment[256]; + public static final Enchantment[] c; public static final Enchantment PROTECTION_ENVIRONMENTAL = new EnchantmentProtection(0, 10, 0); public static final Enchantment PROTECTION_FIRE = new EnchantmentProtection(1, 5, 1); public static final Enchantment PROTECTION_FALL = new EnchantmentProtection(2, 5, 2); @@ -11,6 +14,7 @@ public abstract class Enchantment { public static final Enchantment PROTECTION_PROJECTILE = new EnchantmentProtection(4, 5, 4); public static final Enchantment OXYGEN = new EnchantmentOxygen(5, 2); public static final Enchantment WATER_WORKER = new EnchantmentWaterWorker(6, 2); + public static final Enchantment THORNS = new EnchantmentThorns(7, 1); public static final Enchantment DAMAGE_ALL = new EnchantmentWeaponDamage(16, 10, 0); public static final Enchantment DAMAGE_UNDEAD = new EnchantmentWeaponDamage(17, 5, 1); public static final Enchantment DAMAGE_ARTHROPODS = new EnchantmentWeaponDamage(18, 5, 2); @@ -89,4 +93,25 @@ public abstract class Enchantment { return s + " " + LocaleI18n.get("enchantment.level." + i); } + + public boolean canEnchant(ItemStack itemstack) { + return this.slot.canEnchant(itemstack.getItem()); + } + + static { + ArrayList arraylist = new ArrayList(); + Enchantment[] aenchantment = byId; + int i = aenchantment.length; + + for (int j = 0; j < i; ++j) { + Enchantment enchantment = aenchantment[j]; + + + if (enchantment != null) { + arraylist.add(enchantment); + } + } + + c = (Enchantment[]) arraylist.toArray(new Enchantment[0]); + } } diff --git a/src/main/java/net/minecraft/server/Entity.java b/src/main/java/net/minecraft/server/Entity.java index ba09ace7..1b1cd912 100644 --- a/src/main/java/net/minecraft/server/Entity.java +++ b/src/main/java/net/minecraft/server/Entity.java @@ -99,11 +99,11 @@ public abstract class Entity { public boolean am; public int portalCooldown; protected boolean ao; - private int h; + protected int ap; public int dimension; - protected int aq; + protected int ar; private boolean invulnerable; - public EnumEntitySize ar; + public EnumEntitySize as; public UUID uniqueId = UUID.randomUUID(); // CraftBukkit public boolean valid = false; // CraftBukkit @@ -139,9 +139,9 @@ public abstract class Entity { this.fireProof = false; this.datawatcher = new DataWatcher(); this.ah = false; - this.aq = 0; + this.ar = 0; this.invulnerable = false; - this.ar = EnumEntitySize.SIZE_2; + this.as = EnumEntitySize.SIZE_2; this.world = world; this.setPosition(0.0D, 0.0D, 0.0D); if (world != null) { @@ -177,17 +177,17 @@ public abstract class Entity { float f2 = f % 2.0F; if ((double) f2 < 0.375D) { - this.ar = EnumEntitySize.SIZE_1; + this.as = EnumEntitySize.SIZE_1; } else if ((double) f2 < 0.75D) { - this.ar = EnumEntitySize.SIZE_2; + this.as = EnumEntitySize.SIZE_2; } else if ((double) f2 < 1.0D) { - this.ar = EnumEntitySize.SIZE_3; + this.as = EnumEntitySize.SIZE_3; } else if ((double) f2 < 1.375D) { - this.ar = EnumEntitySize.SIZE_4; + this.as = EnumEntitySize.SIZE_4; } else if ((double) f2 < 1.75D) { - this.ar = EnumEntitySize.SIZE_5; + this.as = EnumEntitySize.SIZE_5; } else { - this.ar = EnumEntitySize.SIZE_6; + this.as = EnumEntitySize.SIZE_6; } } @@ -243,7 +243,6 @@ public abstract class Entity { this.vehicle = null; } - ++this.ticksLived; this.P = this.Q; this.lastX = this.locX; this.lastY = this.locY; @@ -259,8 +258,8 @@ public abstract class Entity { i = this.z(); if (this.ao) { if (true || minecraftserver.getAllowNether()) { // CraftBukkit - if (this.vehicle == null && this.h++ >= i) { - this.h = i; + if (this.vehicle == null && this.ap++ >= i) { + this.ap = i; this.portalCooldown = this.ab(); byte b0; @@ -276,12 +275,12 @@ public abstract class Entity { this.ao = false; } } else { - if (this.h > 0) { - this.h -= 4; + if (this.ap > 0) { + this.ap -= 4; } - if (this.h < 0) { - this.h = 0; + if (this.ap < 0) { + this.ap = 0; } } @@ -398,6 +397,7 @@ public abstract class Entity { public void setOnFire(int i) { int j = i * 20; + j = EnchantmentProtection.a(this, j); if (this.fireTicks < j) { this.fireTicks = j; } @@ -760,7 +760,7 @@ public abstract class Entity { } } - protected void makeSound(String s, float f, float f1) { + public void makeSound(String s, float f, float f1) { this.world.makeSound(this, s, f, f1); } @@ -868,7 +868,7 @@ public abstract class Entity { int l = this.world.getTypeId(i, j, k); if (l != 0 && Block.byId[l].material == material) { - float f = BlockFluids.d(this.world.getData(i, j, k)) - 0.11111111F; + float f = BlockFluids.e(this.world.getData(i, j, k)) - 0.11111111F; float f1 = (float) (j + 1) - f; return d0 < (double) f1; @@ -1341,7 +1341,7 @@ public abstract class Entity { } public void V() { - if (!(this.passenger instanceof EntityHuman) || !((EntityHuman) this.passenger).bW()) { + if (!(this.passenger instanceof EntityHuman) || !((EntityHuman) this.passenger).bV()) { this.passenger.T = this.T; this.passenger.U = this.U + this.X() + this.passenger.W(); this.passenger.V = this.V; @@ -1478,7 +1478,7 @@ public abstract class Entity { double d1 = this.lastZ - this.locZ; if (!this.world.isStatic && !this.ao) { - this.aq = Direction.a(d0, d1); + this.ar = Direction.a(d0, d1); } this.ao = true; @@ -1722,7 +1722,7 @@ public abstract class Entity { entity.d(nbttagcompound); this.e(nbttagcompound); this.portalCooldown = entity.portalCooldown; - this.aq = entity.aq; + this.ar = entity.ar; } public void b(int i) { @@ -1737,7 +1737,7 @@ public abstract class Entity { this.world.kill(this); this.dead = false; this.world.methodProfiler.a("reposition"); - minecraftserver.getServerConfigurationManager().a(this, j, worldserver, worldserver1); + minecraftserver.getPlayerList().a(this, j, worldserver, worldserver1); this.world.methodProfiler.c("reloading"); Entity entity = EntityTypes.createEntityByName(EntityTypes.b(this), worldserver1); @@ -1763,7 +1763,7 @@ public abstract class Entity { } public int at() { - return this.aq; + return this.ar; } public boolean au() { diff --git a/src/main/java/net/minecraft/server/EntityAgeable.java b/src/main/java/net/minecraft/server/EntityAgeable.java index aecf2458..845a9023 100644 --- a/src/main/java/net/minecraft/server/EntityAgeable.java +++ b/src/main/java/net/minecraft/server/EntityAgeable.java @@ -22,16 +22,12 @@ public abstract class EntityAgeable extends EntityCreature { entityageable.setAge(-24000); entityageable.setPositionRotation(this.locX, this.locY, this.locZ, 0.0F, 0.0F); this.world.addEntity(entityageable, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.SPAWNER_EGG); // CraftBukkit - - // CraftBukkit start if (!entityhuman.abilities.canInstantlyBuild) { - itemstack.count--; - - if (itemstack.count == 0) { - entityhuman.inventory.setItem(entityhuman.inventory.itemInHandIndex, null); + --itemstack.count; + if (itemstack.count == 0) { // CraftBukkit - allow less than 0 stacks as "infinit" + entityhuman.inventory.setItem(entityhuman.inventory.itemInHandIndex, (ItemStack) null); } } - // CraftBukkit end } } } diff --git a/src/main/java/net/minecraft/server/EntityArrow.java b/src/main/java/net/minecraft/server/EntityArrow.java index fdad5657..dfc1f567 100644 --- a/src/main/java/net/minecraft/server/EntityArrow.java +++ b/src/main/java/net/minecraft/server/EntityArrow.java @@ -21,17 +21,19 @@ public class EntityArrow extends Entity implements IProjectile { public int shake = 0; public Entity shooter; private int j; - private int as = 0; + private int at = 0; private double damage = 2.0D; - private int au; + private int av; public EntityArrow(World world) { super(world); + this.l = 10.0D; this.a(0.5F, 0.5F); } public EntityArrow(World world, double d0, double d1, double d2) { super(world); + this.l = 10.0D; this.a(0.5F, 0.5F); this.setPosition(d0, d1, d2); this.height = 0.0F; @@ -39,6 +41,7 @@ public class EntityArrow extends Entity implements IProjectile { public EntityArrow(World world, EntityLiving entityliving, EntityLiving entityliving1, float f, float f1) { super(world); + this.l = 10.0D; this.shooter = entityliving; if (entityliving instanceof EntityHuman) { this.fromPlayer = 1; @@ -66,6 +69,7 @@ public class EntityArrow extends Entity implements IProjectile { public EntityArrow(World world, EntityLiving entityliving, float f) { super(world); + this.l = 10.0D; this.shooter = entityliving; if (entityliving instanceof EntityHuman) { this.fromPlayer = 1; @@ -149,10 +153,10 @@ public class EntityArrow extends Entity implements IProjectile { this.motY *= (double) (this.random.nextFloat() * 0.2F); this.motZ *= (double) (this.random.nextFloat() * 0.2F); this.j = 0; - this.as = 0; + this.at = 0; } } else { - ++this.as; + ++this.at; Vec3D vec3d = this.world.getVec3DPool().create(this.locX, this.locY, this.locZ); Vec3D vec3d1 = this.world.getVec3DPool().create(this.locX + this.motX, this.locY + this.motY, this.locZ + this.motZ); MovingObjectPosition movingobjectposition = this.world.rayTrace(vec3d, vec3d1, false, true); @@ -173,7 +177,7 @@ public class EntityArrow extends Entity implements IProjectile { for (l = 0; l < list.size(); ++l) { Entity entity1 = (Entity) list.get(l); - if (entity1.L() && (entity1 != this.shooter || this.as >= 5)) { + if (entity1.L() && (entity1 != this.shooter || this.at >= 5)) { f1 = 0.3F; AxisAlignedBB axisalignedbb1 = entity1.boundingBox.grow((double) f1, (double) f1, (double) f1); MovingObjectPosition movingobjectposition1 = axisalignedbb1.a(vec3d, vec3d1); @@ -194,6 +198,7 @@ public class EntityArrow extends Entity implements IProjectile { } float f2; + float f3; if (movingobjectposition != null) { // CraftBukkit start @@ -219,7 +224,7 @@ public class EntityArrow extends Entity implements IProjectile { // CraftBukkit start - moved damage call if (movingobjectposition.entity.damageEntity(damagesource, i1)) { - if (this.isBurning() && (!(movingobjectposition.entity instanceof EntityPlayer) || !(this.shooter instanceof EntityPlayer) || this.world.pvpMode)) { // CraftBukkit - abide by pvp setting if destination is a player. + if (this.isBurning() && !(movingobjectposition.entity instanceof EntityEnderman) && (!(movingobjectposition.entity instanceof EntityPlayer) || !(this.shooter instanceof EntityPlayer) || this.world.pvpMode)) { // CraftBukkit - abide by pvp setting if destination is a player. EntityCombustByEntityEvent combustEvent = new EntityCombustByEntityEvent(this.getBukkitEntity(), entity.getBukkitEntity(), 5); org.bukkit.Bukkit.getPluginManager().callEvent(combustEvent); @@ -231,30 +236,37 @@ public class EntityArrow extends Entity implements IProjectile { // if (movingobjectposition.entity.damageEntity(damagesource, i1)) { // CraftBukkit - moved up if (movingobjectposition.entity instanceof EntityLiving) { - if (!this.world.isStatic) { - EntityLiving entityliving = (EntityLiving) movingobjectposition.entity; + EntityLiving entityliving = (EntityLiving) movingobjectposition.entity; + if (!this.world.isStatic) { entityliving.r(entityliving.bJ() + 1); } - if (this.au > 0) { - float f3 = MathHelper.sqrt(this.motX * this.motX + this.motZ * this.motZ); + if (this.av > 0) { + f3 = MathHelper.sqrt(this.motX * this.motX + this.motZ * this.motZ); if (f3 > 0.0F) { - movingobjectposition.entity.g(this.motX * (double) this.au * 0.6000000238418579D / (double) f3, 0.1D, this.motZ * (double) this.au * 0.6000000238418579D / (double) f3); + movingobjectposition.entity.g(this.motX * (double) this.av * 0.6000000238418579D / (double) f3, 0.1D, this.motZ * (double) this.av * 0.6000000238418579D / (double) f3); } } + + EnchantmentThorns.a(this.shooter, entityliving, this.random); + if (this.shooter != null && movingobjectposition.entity != this.shooter && movingobjectposition.entity instanceof EntityHuman && this.shooter instanceof EntityPlayer) { + ((EntityPlayer) this.shooter).playerConnection.sendPacket(new Packet70Bed(6, 0)); + } } this.makeSound("random.bowhit", 1.0F, 1.2F / (this.random.nextFloat() * 0.2F + 0.9F)); - this.die(); + if (!(movingobjectposition.entity instanceof EntityEnderman)) { + this.die(); + } } else { this.motX *= -0.10000000149011612D; this.motY *= -0.10000000149011612D; this.motZ *= -0.10000000149011612D; this.yaw += 180.0F; this.lastYaw += 180.0F; - this.as = 0; + this.at = 0; } } else { this.d = movingobjectposition.b; @@ -314,9 +326,8 @@ public class EntityArrow extends Entity implements IProjectile { f1 = 0.05F; if (this.H()) { for (int j1 = 0; j1 < 4; ++j1) { - float f5 = 0.25F; - - this.world.addParticle("bubble", this.locX - this.motX * (double) f5, this.locY - this.motY * (double) f5, this.locZ - this.motZ * (double) f5, this.motX, this.motY, this.motZ); + f3 = 0.25F; + this.world.addParticle("bubble", this.locX - this.motX * (double) f3, this.locY - this.motY * (double) f3, this.locZ - this.motZ * (double) f3, this.motX, this.motY, this.motZ); } f4 = 0.8F; @@ -406,7 +417,7 @@ public class EntityArrow extends Entity implements IProjectile { } public void a(int i) { - this.au = i; + this.av = i; } public boolean aq() { diff --git a/src/main/java/net/minecraft/server/EntityBlaze.java b/src/main/java/net/minecraft/server/EntityBlaze.java index ac7a779e..74739a21 100644 --- a/src/main/java/net/minecraft/server/EntityBlaze.java +++ b/src/main/java/net/minecraft/server/EntityBlaze.java @@ -10,7 +10,7 @@ public class EntityBlaze extends EntityMonster { super(world); this.texture = "/mob/fire.png"; this.fireProof = true; - this.bc = 10; + this.bd = 10; } public int getMaxHealth() { diff --git a/src/main/java/net/minecraft/server/EntityCreature.java b/src/main/java/net/minecraft/server/EntityCreature.java index 95ec5835..d75c3c87 100644 --- a/src/main/java/net/minecraft/server/EntityCreature.java +++ b/src/main/java/net/minecraft/server/EntityCreature.java @@ -73,7 +73,7 @@ public abstract class EntityCreature extends EntityLiving { this.world.methodProfiler.b(); if (!this.b && this.target != null && (this.pathEntity == null || this.random.nextInt(20) == 0)) { this.pathEntity = this.world.findPath(this, this.target, f, true, false, false, true); - } else if (!this.b && (this.pathEntity == null && this.random.nextInt(180) == 0 || this.random.nextInt(120) == 0 || this.c > 0) && this.bA < 100) { + } else if (!this.b && (this.pathEntity == null && this.random.nextInt(180) == 0 || this.random.nextInt(120) == 0 || this.c > 0) && this.bB < 100) { this.i(); } @@ -97,7 +97,7 @@ public abstract class EntityCreature extends EntityLiving { } } - this.bE = false; + this.bF = false; if (vec3d != null) { double d1 = vec3d.c - this.locX; double d2 = vec3d.e - this.locZ; @@ -106,7 +106,7 @@ public abstract class EntityCreature extends EntityLiving { float f2 = (float) (org.bukkit.craftbukkit.TrigMath.atan2(d2, d1) * 180.0D / 3.1415927410125732D) - 90.0F; float f3 = MathHelper.g(f2 - this.yaw); - this.bC = this.bG; + this.bD = this.bH; if (f3 > 30.0F) { f3 = 30.0F; } @@ -123,12 +123,12 @@ public abstract class EntityCreature extends EntityLiving { this.yaw = (float) (Math.atan2(d5, d4) * 180.0D / 3.1415927410125732D) - 90.0F; f3 = (f4 - this.yaw + 90.0F) * 3.1415927F / 180.0F; - this.bB = -MathHelper.sin(f3) * this.bC * 1.0F; - this.bC = MathHelper.cos(f3) * this.bC * 1.0F; + this.bC = -MathHelper.sin(f3) * this.bC * 1.0F; + this.bD = MathHelper.cos(f3) * this.bC * 1.0F; } if (d3 > 0.0D) { - this.bE = true; + this.bF = true; } } @@ -137,11 +137,11 @@ public abstract class EntityCreature extends EntityLiving { } if (this.positionChanged && !this.k()) { - this.bE = true; + this.bF = true; } if (this.random.nextFloat() < 0.8F && (flag || flag1)) { - this.bE = true; + this.bF = true; } this.world.methodProfiler.b(); diff --git a/src/main/java/net/minecraft/server/EntityEnderDragon.java b/src/main/java/net/minecraft/server/EntityEnderDragon.java index 066ee78c..7d2cf37e 100644 --- a/src/main/java/net/minecraft/server/EntityEnderDragon.java +++ b/src/main/java/net/minecraft/server/EntityEnderDragon.java @@ -25,20 +25,20 @@ public class EntityEnderDragon extends EntityLiving implements IComplex { public EntityComplexPart h; public EntityComplexPart i; public EntityComplexPart j; - public EntityComplexPart bI; public EntityComplexPart bJ; public EntityComplexPart bK; - public float bL = 0.0F; + public EntityComplexPart bL; public float bM = 0.0F; - public boolean bN = false; + public float bN = 0.0F; public boolean bO = false; - private Entity bR; - public int bP = 0; - public EntityEnderCrystal bQ = null; + public boolean bP = false; + private Entity bS; + public int bQ = 0; + public EntityEnderCrystal bR = null; public EntityEnderDragon(World world) { super(world); - this.children = new EntityComplexPart[] { this.g = new EntityComplexPart(this, "head", 6.0F, 6.0F), this.h = new EntityComplexPart(this, "body", 8.0F, 8.0F), this.i = new EntityComplexPart(this, "tail", 4.0F, 4.0F), this.j = new EntityComplexPart(this, "tail", 4.0F, 4.0F), this.bI = new EntityComplexPart(this, "tail", 4.0F, 4.0F), this.bJ = new EntityComplexPart(this, "wing", 4.0F, 4.0F), this.bK = new EntityComplexPart(this, "wing", 4.0F, 4.0F)}; + this.children = new EntityComplexPart[] { this.g = new EntityComplexPart(this, "head", 6.0F, 6.0F), this.h = new EntityComplexPart(this, "body", 8.0F, 8.0F), this.i = new EntityComplexPart(this, "tail", 4.0F, 4.0F), this.j = new EntityComplexPart(this, "tail", 4.0F, 4.0F), this.bJ = new EntityComplexPart(this, "tail", 4.0F, 4.0F), this.bK = new EntityComplexPart(this, "wing", 4.0F, 4.0F), this.bL = new EntityComplexPart(this, "wing", 4.0F, 4.0F)}; this.setHealth(this.getMaxHealth()); this.texture = "/mob/enderdragon/ender.png"; this.a(16.0F, 8.0F); @@ -84,14 +84,14 @@ public class EntityEnderDragon extends EntityLiving implements IComplex { if (!this.world.isStatic) { this.datawatcher.watch(16, Integer.valueOf(this.health)); } else { - f = MathHelper.cos(this.bM * 3.1415927F * 2.0F); - f1 = MathHelper.cos(this.bL * 3.1415927F * 2.0F); + f = MathHelper.cos(this.bN * 3.1415927F * 2.0F); + f1 = MathHelper.cos(this.bM * 3.1415927F * 2.0F); if (f1 <= -0.3F && f >= -0.3F) { - this.world.b(this.locX, this.locY, this.locZ, "mob.enderdragon.wings", 5.0F, 0.8F + this.random.nextFloat() * 0.3F); + this.world.a(this.locX, this.locY, this.locZ, "mob.enderdragon.wings", 5.0F, 0.8F + this.random.nextFloat() * 0.3F, false); } } - this.bL = this.bM; + this.bM = this.bN; float f2; if (this.health <= 0) { @@ -103,10 +103,10 @@ public class EntityEnderDragon extends EntityLiving implements IComplex { this.h(); f = 0.2F / (MathHelper.sqrt(this.motX * this.motX + this.motZ * this.motZ) * 10.0F + 1.0F); f *= (float) Math.pow(2.0D, this.motY); - if (this.bO) { - this.bM += f * 0.5F; + if (this.bP) { + this.bN += f * 0.5F; } else { - this.bM += f; + this.bN += f; } this.yaw = MathHelper.g(this.yaw); @@ -130,14 +130,14 @@ public class EntityEnderDragon extends EntityLiving implements IComplex { float f3; if (this.world.isStatic) { - if (this.bs > 0) { - d0 = this.locX + (this.bt - this.locX) / (double) this.bs; - d1 = this.locY + (this.bu - this.locY) / (double) this.bs; - d2 = this.locZ + (this.bv - this.locZ) / (double) this.bs; + if (this.bt > 0) { + d0 = this.locX + (this.bt - this.locX) / (double) this.bt; + d1 = this.locY + (this.bu - this.locY) / (double) this.bt; + d2 = this.locZ + (this.bv - this.locZ) / (double) this.bt; d3 = MathHelper.g(this.bw - (double) this.yaw); - this.yaw = (float) ((double) this.yaw + d3 / (double) this.bs); - this.pitch = (float) ((double) this.pitch + (this.bx - (double) this.pitch) / (double) this.bs); - --this.bs; + this.yaw = (float) ((double) this.yaw + d3 / (double) this.bt); + this.pitch = (float) ((double) this.pitch + (this.bx - (double) this.pitch) / (double) this.bt); + --this.bt; this.setPosition(d0, d1, d2); this.b(this.yaw, this.pitch); } @@ -146,9 +146,9 @@ public class EntityEnderDragon extends EntityLiving implements IComplex { d1 = this.b - this.locY; d2 = this.c - this.locZ; d3 = d0 * d0 + d1 * d1 + d2 * d2; - if (this.bR != null) { - this.a = this.bR.locX; - this.c = this.bR.locZ; + if (this.bS != null) { + this.a = this.bS.locX; + this.c = this.bS.locZ; double d4 = this.a - this.locX; double d5 = this.c - this.locZ; double d6 = Math.sqrt(d4 * d4 + d5 * d5); @@ -158,13 +158,13 @@ public class EntityEnderDragon extends EntityLiving implements IComplex { d7 = 10.0D; } - this.b = this.bR.boundingBox.b + d7; + this.b = this.bS.boundingBox.b + d7; } else { this.a += this.random.nextGaussian() * 2.0D; this.c += this.random.nextGaussian() * 2.0D; } - if (this.bN || d3 < 100.0D || d3 > 22500.0D || this.positionChanged || this.G) { + if (this.bO || d3 < 100.0D || d3 > 22500.0D || this.positionChanged || this.G) { this.i(); } @@ -199,7 +199,7 @@ public class EntityEnderDragon extends EntityLiving implements IComplex { f4 = 0.0F; } - this.bD *= 0.8F; + this.bE *= 0.8F; float f5 = MathHelper.sqrt(this.motX * this.motX + this.motZ * this.motZ) * 1.0F + 1.0F; double d10 = Math.sqrt(this.motX * this.motX + this.motZ * this.motZ) * 1.0D + 1.0D; @@ -207,13 +207,13 @@ public class EntityEnderDragon extends EntityLiving implements IComplex { d10 = 40.0D; } - this.bD = (float) ((double) this.bD + d9 * (0.699999988079071D / d10 / (double) f5)); - this.yaw += this.bD * 0.1F; + this.bE = (float) ((double) this.bE + d9 * (0.699999988079071D / d10 / (double) f5)); + this.yaw += this.bE * 0.1F; float f6 = (float) (2.0D / (d10 + 1.0D)); float f7 = 0.06F; this.a(0.0F, -1.0F, f7 * (f4 * f6 + (1.0F - f6))); - if (this.bO) { + if (this.bP) { this.move(this.motX * 0.800000011920929D, this.motY * 0.800000011920929D, this.motZ * 0.800000011920929D); } else { this.move(this.motX, this.motY, this.motZ); @@ -228,17 +228,17 @@ public class EntityEnderDragon extends EntityLiving implements IComplex { this.motY *= 0.9100000262260437D; } - this.aw = this.yaw; + this.ax = this.yaw; this.g.width = this.g.length = 3.0F; this.i.width = this.i.length = 2.0F; this.j.width = this.j.length = 2.0F; - this.bI.width = this.bI.length = 2.0F; + this.bJ.width = this.bJ.length = 2.0F; this.h.length = 3.0F; this.h.width = 5.0F; - this.bJ.length = 2.0F; - this.bJ.width = 4.0F; - this.bK.length = 3.0F; + this.bK.length = 2.0F; this.bK.width = 4.0F; + this.bL.length = 3.0F; + this.bL.width = 4.0F; f1 = (float) (this.a(5, 1.0F)[1] - this.a(10, 1.0F)[1]) * 10.0F / 180.0F * 3.1415927F; f2 = MathHelper.cos(f1); float f9 = -MathHelper.sin(f1); @@ -248,21 +248,21 @@ public class EntityEnderDragon extends EntityLiving implements IComplex { this.h.j_(); this.h.setPositionRotation(this.locX + (double) (f11 * 0.5F), this.locY, this.locZ - (double) (f12 * 0.5F), 0.0F, 0.0F); - this.bJ.j_(); - this.bJ.setPositionRotation(this.locX + (double) (f12 * 4.5F), this.locY + 2.0D, this.locZ + (double) (f11 * 4.5F), 0.0F, 0.0F); this.bK.j_(); - this.bK.setPositionRotation(this.locX - (double) (f12 * 4.5F), this.locY + 2.0D, this.locZ - (double) (f11 * 4.5F), 0.0F, 0.0F); + this.bK.setPositionRotation(this.locX + (double) (f12 * 4.5F), this.locY + 2.0D, this.locZ + (double) (f11 * 4.5F), 0.0F, 0.0F); + this.bL.j_(); + this.bL.setPositionRotation(this.locX - (double) (f12 * 4.5F), this.locY + 2.0D, this.locZ - (double) (f11 * 4.5F), 0.0F, 0.0F); if (!this.world.isStatic && this.hurtTicks == 0) { - this.a(this.world.getEntities(this, this.bJ.boundingBox.grow(4.0D, 2.0D, 4.0D).d(0.0D, -2.0D, 0.0D))); this.a(this.world.getEntities(this, this.bK.boundingBox.grow(4.0D, 2.0D, 4.0D).d(0.0D, -2.0D, 0.0D))); + this.a(this.world.getEntities(this, this.bL.boundingBox.grow(4.0D, 2.0D, 4.0D).d(0.0D, -2.0D, 0.0D))); this.b(this.world.getEntities(this, this.g.boundingBox.grow(1.0D, 1.0D, 1.0D))); } double[] adouble = this.a(5, 1.0F); double[] adouble1 = this.a(0, 1.0F); - f3 = MathHelper.sin(this.yaw * 3.1415927F / 180.0F - this.bD * 0.01F); - float f13 = MathHelper.cos(this.yaw * 3.1415927F / 180.0F - this.bD * 0.01F); + f3 = MathHelper.sin(this.yaw * 3.1415927F / 180.0F - this.bE * 0.01F); + float f13 = MathHelper.cos(this.yaw * 3.1415927F / 180.0F - this.bE * 0.01F); this.g.j_(); this.g.setPositionRotation(this.locX + (double) (f3 * 5.5F * f2), this.locY + (adouble1[1] - adouble[1]) * 1.0D + (double) (f9 * 5.5F), this.locZ - (double) (f13 * 5.5F * f2), 0.0F, 0.0F); @@ -279,7 +279,7 @@ public class EntityEnderDragon extends EntityLiving implements IComplex { } if (j == 2) { - entitycomplexpart = this.bI; + entitycomplexpart = this.bJ; } double[] adouble2 = this.a(12 + j * 2, 1.0F); @@ -300,13 +300,13 @@ public class EntityEnderDragon extends EntityLiving implements IComplex { } private void h() { - if (this.bQ != null) { - if (this.bQ.dead) { + if (this.bR != null) { + if (this.bR.dead) { if (!this.world.isStatic) { this.a(this.g, DamageSource.EXPLOSION, 10); } - this.bQ = null; + this.bR = null; } else if (this.ticksLived % 10 == 0 && this.health < this.getMaxHealth()) { // CraftBukkit start EntityRegainHealthEvent event = new EntityRegainHealthEvent(this.getBukkitEntity(), 1, EntityRegainHealthEvent.RegainReason.ENDER_CRYSTAL); @@ -336,7 +336,7 @@ public class EntityEnderDragon extends EntityLiving implements IComplex { } } - this.bQ = entityendercrystal; + this.bR = entityendercrystal; } } @@ -382,9 +382,9 @@ public class EntityEnderDragon extends EntityLiving implements IComplex { } private void i() { - this.bN = false; + this.bO = false; if (this.random.nextInt(2) == 0 && !this.world.players.isEmpty()) { - this.bR = (Entity) this.world.players.get(this.random.nextInt(this.world.players.size())); + this.bS = (Entity) this.world.players.get(this.random.nextInt(this.world.players.size())); } else { boolean flag = false; @@ -401,7 +401,7 @@ public class EntityEnderDragon extends EntityLiving implements IComplex { flag = d0 * d0 + d1 * d1 + d2 * d2 > 100.0D; } while (!flag); - this.bR = null; + this.bS = null; } } @@ -482,7 +482,7 @@ public class EntityEnderDragon extends EntityLiving implements IComplex { this.a = this.locX + (double) (f1 * 5.0F) + (double) ((this.random.nextFloat() - 0.5F) * 2.0F); this.b = this.locY + (double) (this.random.nextFloat() * 3.0F) + 1.0D; this.c = this.locZ - (double) (f2 * 5.0F) + (double) ((this.random.nextFloat() - 0.5F) * 2.0F); - this.bR = null; + this.bS = null; if (damagesource.getEntity() instanceof EntityHuman || damagesource == DamageSource.EXPLOSION) { this.dealDamage(damagesource, i); } @@ -499,8 +499,8 @@ public class EntityEnderDragon extends EntityLiving implements IComplex { } protected void aP() { - ++this.bP; - if (this.bP >= 180 && this.bP <= 200) { + ++this.bQ; + if (this.bQ >= 180 && this.bQ <= 200) { float f = (this.random.nextFloat() - 0.5F) * 8.0F; float f1 = (this.random.nextFloat() - 0.5F) * 4.0F; float f2 = (this.random.nextFloat() - 0.5F) * 8.0F; @@ -512,7 +512,7 @@ public class EntityEnderDragon extends EntityLiving implements IComplex { int j; if (!this.world.isStatic) { - if (this.bP > 150 && this.bP % 5 == 0) { + if (this.bQ > 150 && this.bQ % 5 == 0) { i = expToDrop / 12; // CraftBukkit - drop experience as dragon falls from sky. use experience drop from death event. This is now set in getExpReward() while (i > 0) { @@ -522,14 +522,14 @@ public class EntityEnderDragon extends EntityLiving implements IComplex { } } - if (this.bP == 1) { + if (this.bQ == 1) { this.world.e(1018, (int) this.locX, (int) this.locY, (int) this.locZ, 0); } } this.move(0.0D, 0.10000000149011612D, 0.0D); - this.aw = this.yaw += 20.0F; - if (this.bP == 200 && !this.world.isStatic) { + this.ax = this.yaw += 20.0F; + if (this.bQ == 200 && !this.world.isStatic) { i = expToDrop - 10 * (expToDrop / 12); // CraftBukkit - drop the remaining experience while (i > 0) { @@ -599,7 +599,7 @@ public class EntityEnderDragon extends EntityLiving implements IComplex { for (Iterator it = this.world.players.iterator(); it.hasNext();) { EntityHuman entity = (EntityHuman) it.next(); if (entity instanceof EntityPlayer) { - ((EntityPlayer) entity).netServerHandler.sendPacket(packet); + ((EntityPlayer) entity).playerConnection.sendPacket(packet); } } } diff --git a/src/main/java/net/minecraft/server/EntityEnderPearl.java b/src/main/java/net/minecraft/server/EntityEnderPearl.java index e173f625..fa2ccc48 100644 --- a/src/main/java/net/minecraft/server/EntityEnderPearl.java +++ b/src/main/java/net/minecraft/server/EntityEnderPearl.java @@ -29,7 +29,7 @@ public class EntityEnderPearl extends EntityProjectile { if (this.getShooter() != null && this.getShooter() instanceof EntityPlayer) { EntityPlayer entityplayer = (EntityPlayer) this.getShooter(); - if (!entityplayer.netServerHandler.disconnected && entityplayer.world == this.world) { + if (!entityplayer.playerConnection.disconnected && entityplayer.world == this.world) { // CraftBukkit start org.bukkit.craftbukkit.entity.CraftPlayer player = entityplayer.getBukkitEntity(); org.bukkit.Location location = getBukkitEntity().getLocation(); @@ -39,14 +39,14 @@ public class EntityEnderPearl extends EntityProjectile { PlayerTeleportEvent teleEvent = new PlayerTeleportEvent(player, player.getLocation(), location, PlayerTeleportEvent.TeleportCause.ENDER_PEARL); Bukkit.getPluginManager().callEvent(teleEvent); - if (!teleEvent.isCancelled() && !entityplayer.netServerHandler.disconnected) { - entityplayer.netServerHandler.teleport(teleEvent.getTo()); + if (!teleEvent.isCancelled() && !entityplayer.playerConnection.disconnected) { + entityplayer.playerConnection.teleport(teleEvent.getTo()); this.getShooter().fallDistance = 0.0F; EntityDamageByEntityEvent damageEvent = new EntityDamageByEntityEvent(this.getBukkitEntity(), player, EntityDamageByEntityEvent.DamageCause.FALL, 5); Bukkit.getPluginManager().callEvent(damageEvent); - if (!damageEvent.isCancelled() && !entityplayer.netServerHandler.disconnected) { + if (!damageEvent.isCancelled() && !entityplayer.playerConnection.disconnected) { entityplayer.invulnerableTicks = -1; // Remove spawning invulnerability player.setLastDamageCause(damageEvent); entityplayer.damageEntity(DamageSource.FALL, damageEvent.getDamage()); diff --git a/src/main/java/net/minecraft/server/EntityEnderman.java b/src/main/java/net/minecraft/server/EntityEnderman.java index eb331932..15b5516b 100644 --- a/src/main/java/net/minecraft/server/EntityEnderman.java +++ b/src/main/java/net/minecraft/server/EntityEnderman.java @@ -15,7 +15,7 @@ public class EntityEnderman extends EntityMonster { public EntityEnderman(World world) { super(world); this.texture = "/mob/enderman.png"; - this.bG = 0.2F; + this.bH = 0.2F; this.a(0.6F, 2.9F); this.X = 1.0F; } @@ -87,7 +87,7 @@ public class EntityEnderman extends EntityMonster { this.damageEntity(DamageSource.DROWN, 1); } - this.bG = this.target != null ? 6.5F : 0.3F; + this.bH = this.target != null ? 6.5F : 0.3F; int i; if (!this.world.isStatic && this.world.getGameRules().getBoolean("mobGriefing")) { @@ -143,13 +143,13 @@ public class EntityEnderman extends EntityMonster { } } - if (this.G()) { + if (this.G() || this.isBurning()) { this.target = null; this.f(false); this.m(); } - this.bE = false; + this.bF = false; if (this.target != null) { this.a(this.target, 100.0F, 100.0F); } @@ -157,8 +157,8 @@ public class EntityEnderman extends EntityMonster { if (!this.world.isStatic && this.isAlive()) { if (this.target != null) { if (this.target instanceof EntityHuman && this.d((EntityHuman) this.target)) { - this.bB = this.bC = 0.0F; - this.bG = 0.0F; + this.bC = this.bD = 0.0F; + this.bH = 0.0F; if (this.target.e((Entity) this) < 16.0D) { this.m(); } @@ -317,20 +317,19 @@ public class EntityEnderman extends EntityMonster { public boolean damageEntity(DamageSource damagesource, int i) { if (this.isInvulnerable()) { return false; - } else if (damagesource instanceof EntityDamageSourceIndirect) { - for (int j = 0; j < 64; ++j) { - if (this.m()) { - return true; + } else { + this.f(true); + if (damagesource instanceof EntityDamageSourceIndirect) { + for (int j = 0; j < 64; ++j) { + if (this.m()) { + return true; + } } - } - return false; - } else { - if (damagesource.getEntity() instanceof EntityHuman) { - this.f(true); + return false; + } else { + return super.damageEntity(damagesource, i); } - - return super.damageEntity(damagesource, i); } } diff --git a/src/main/java/net/minecraft/server/EntityExperienceOrb.java b/src/main/java/net/minecraft/server/EntityExperienceOrb.java index a733b6a8..f5fc9cde 100644 --- a/src/main/java/net/minecraft/server/EntityExperienceOrb.java +++ b/src/main/java/net/minecraft/server/EntityExperienceOrb.java @@ -150,8 +150,8 @@ public class EntityExperienceOrb extends Entity { public void c_(EntityHuman entityhuman) { if (!this.world.isStatic) { - if (this.c == 0 && entityhuman.bR == 0) { - entityhuman.bR = 2; + if (this.c == 0 && entityhuman.bS == 0) { + entityhuman.bS = 2; this.makeSound("random.orb", 0.1F, 0.5F * ((this.random.nextFloat() - this.random.nextFloat()) * 0.7F + 1.8F)); entityhuman.receive(this, 1); entityhuman.giveExp(CraftEventFactory.callPlayerExpChangeEvent(entityhuman, this.value).getAmount()); // CraftBukkit - this.value to event.getAmount() diff --git a/src/main/java/net/minecraft/server/EntityFallingBlock.java b/src/main/java/net/minecraft/server/EntityFallingBlock.java index 2f142ae1..1daf7bee 100644 --- a/src/main/java/net/minecraft/server/EntityFallingBlock.java +++ b/src/main/java/net/minecraft/server/EntityFallingBlock.java @@ -25,7 +25,7 @@ public class EntityFallingBlock extends Entity { this.dropItem = true; this.e = false; this.hurtEntities = false; - this.fallHurtMax = 20; + this.fallHurtMax = 40; this.fallHurtAmount = 2.0F; } @@ -39,7 +39,7 @@ public class EntityFallingBlock extends Entity { this.dropItem = true; this.e = false; this.hurtEntities = false; - this.fallHurtMax = 20; + this.fallHurtMax = 40; this.fallHurtAmount = 2.0F; this.id = i; this.data = j; @@ -84,12 +84,13 @@ public class EntityFallingBlock extends Entity { int k = MathHelper.floor(this.locZ); if (this.c == 1) { - if (this.c == 1 && this.world.getTypeId(i, j, k) == this.id && this.world.getData(i, j, k) == this.data && !CraftEventFactory.callEntityChangeBlockEvent(this, i, j, k, 0, 0).isCancelled()) { // CraftBukkit - compare data and call event - this.world.setTypeId(i, j, k, 0); - } else { + // CraftBukkit - compare data and call event + if (this.c != 1 || this.world.getTypeId(i, j, k) != this.id || this.world.getData(i, j, k) != this.data || CraftEventFactory.callEntityChangeBlockEvent(this, i, j, k, 0, 0).isCancelled()) { this.die(); - return; // CraftBukkit + return; } + + this.world.setTypeId(i, j, k, 0); } if (this.onGround) { @@ -196,4 +197,10 @@ public class EntityFallingBlock extends Entity { public void e(boolean flag) { this.hurtEntities = flag; } + + public void a(CrashReportSystemDetails crashreportsystemdetails) { + super.a(crashreportsystemdetails); + crashreportsystemdetails.a("Immitating block ID", Integer.valueOf(this.id)); + crashreportsystemdetails.a("Immitating block data", Integer.valueOf(this.data)); + } } diff --git a/src/main/java/net/minecraft/server/EntityFireball.java b/src/main/java/net/minecraft/server/EntityFireball.java index c016f925..d8f34ef8 100644 --- a/src/main/java/net/minecraft/server/EntityFireball.java +++ b/src/main/java/net/minecraft/server/EntityFireball.java @@ -13,7 +13,7 @@ public abstract class EntityFireball extends Entity { private boolean i = false; public EntityLiving shooter; private int j; - private int as = 0; + private int at = 0; public double dirX; public double dirY; public double dirZ; @@ -86,9 +86,9 @@ public abstract class EntityFireball extends Entity { this.motY *= (double) (this.random.nextFloat() * 0.2F); this.motZ *= (double) (this.random.nextFloat() * 0.2F); this.j = 0; - this.as = 0; + this.at = 0; } else { - ++this.as; + ++this.at; } Vec3D vec3d = this.world.getVec3DPool().create(this.locX, this.locY, this.locZ); @@ -108,7 +108,7 @@ public abstract class EntityFireball extends Entity { for (int j = 0; j < list.size(); ++j) { Entity entity1 = (Entity) list.get(j); - if (entity1.L() && (!entity1.i(this.shooter) || this.as >= 25)) { + if (entity1.L() && (!entity1.i(this.shooter) || this.at >= 25)) { float f = 0.3F; AxisAlignedBB axisalignedbb = entity1.boundingBox.grow((double) f, (double) f, (double) f); MovingObjectPosition movingobjectposition1 = axisalignedbb.a(vec3d, vec3d1); diff --git a/src/main/java/net/minecraft/server/EntityFishingHook.java b/src/main/java/net/minecraft/server/EntityFishingHook.java index bce96a1f..36c46cfc 100644 --- a/src/main/java/net/minecraft/server/EntityFishingHook.java +++ b/src/main/java/net/minecraft/server/EntityFishingHook.java @@ -18,14 +18,14 @@ public class EntityFishingHook extends Entity { public EntityHuman owner; private int i; private int j = 0; - private int as = 0; + private int at = 0; public Entity hooked = null; - private int at; - private double au; + private int au; private double av; private double aw; private double ax; private double ay; + private double az; public EntityFishingHook(World world) { super(world); @@ -79,20 +79,20 @@ public class EntityFishingHook extends Entity { public void j_() { super.j_(); - if (this.at > 0) { - double d0 = this.locX + (this.au - this.locX) / (double) this.at; - double d1 = this.locY + (this.av - this.locY) / (double) this.at; - double d2 = this.locZ + (this.aw - this.locZ) / (double) this.at; - double d3 = MathHelper.g(this.ax - (double) this.yaw); - - this.yaw = (float) ((double) this.yaw + d3 / (double) this.at); - this.pitch = (float) ((double) this.pitch + (this.ay - (double) this.pitch) / (double) this.at); - --this.at; + if (this.au > 0) { + double d0 = this.locX + (this.av - this.locX) / (double) this.au; + double d1 = this.locY + (this.aw - this.locY) / (double) this.au; + double d2 = this.locZ + (this.ax - this.locZ) / (double) this.au; + double d3 = MathHelper.g(this.ay - (double) this.yaw); + + this.yaw = (float) ((double) this.yaw + d3 / (double) this.au); + this.pitch = (float) ((double) this.pitch + (this.az - (double) this.pitch) / (double) this.au); + --this.au; this.setPosition(d0, d1, d2); this.b(this.yaw, this.pitch); } else { if (!this.world.isStatic) { - ItemStack itemstack = this.owner.bT(); + ItemStack itemstack = this.owner.bS(); if (this.owner.dead || !this.owner.isAlive() || itemstack == null || itemstack.getItem() != Item.FISHING_ROD || this.e(this.owner) > 1024.0D) { this.die(); @@ -230,8 +230,8 @@ public class EntityFishingHook extends Entity { } if (d6 > 0.0D) { - if (this.as > 0) { - --this.as; + if (this.at > 0) { + --this.at; } else { short short1 = 500; @@ -240,7 +240,7 @@ public class EntityFishingHook extends Entity { } if (this.random.nextInt(short1) == 0) { - this.as = this.random.nextInt(30) + 10; + this.at = this.random.nextInt(30) + 10; this.motY -= 0.20000000298023224D; this.makeSound("random.splash", 0.25F, 1.0F + (this.random.nextFloat() - this.random.nextFloat()) * 0.4F); float f3 = (float) MathHelper.floor(this.boundingBox.b); @@ -264,7 +264,7 @@ public class EntityFishingHook extends Entity { } } - if (this.as > 0) { + if (this.at > 0) { this.motY -= (double) (this.random.nextFloat() * this.random.nextFloat() * this.random.nextFloat()) * 0.2D; } @@ -329,7 +329,7 @@ public class EntityFishingHook extends Entity { this.hooked.motY += d1 * d4 + (double) MathHelper.sqrt(d3) * 0.08D; this.hooked.motZ += d2 * d4; b0 = 3; - } else if (this.as > 0) { + } else if (this.at > 0) { EntityItem entityitem = new EntityItem(this.world, this.locX, this.locY, this.locZ, new ItemStack(Item.RAW_FISH)); // CraftBukkit start PlayerFishEvent playerFishEvent = new PlayerFishEvent((Player) this.owner.getBukkitEntity(), entityitem.getBukkitEntity(), PlayerFishEvent.State.CAUGHT_FISH); @@ -353,7 +353,7 @@ public class EntityFishingHook extends Entity { entityitem.motZ = d7 * d9; this.world.addEntity(entityitem); this.owner.a(StatisticList.B, 1); - this.owner.world.addEntity(new EntityExperienceOrb(this.owner.world, this.owner.locX, this.owner.locY + 0.5D, this.owner.locZ + 0.5D, this.random.nextInt(3) + 1)); + this.owner.world.addEntity(new EntityExperienceOrb(this.owner.world, this.owner.locX, this.owner.locY + 0.5D, this.owner.locZ + 0.5D, this.random.nextInt(6) + 1)); b0 = 1; } diff --git a/src/main/java/net/minecraft/server/EntityGhast.java b/src/main/java/net/minecraft/server/EntityGhast.java index 3dc67c08..ac315640 100644 --- a/src/main/java/net/minecraft/server/EntityGhast.java +++ b/src/main/java/net/minecraft/server/EntityGhast.java @@ -16,13 +16,14 @@ public class EntityGhast extends EntityFlying implements IMonster { private int i = 0; public int f = 0; public int g = 0; + private int explosionPower = 1; public EntityGhast(World world) { super(world); this.texture = "/mob/ghast.png"; this.a(4.0F, 4.0F); this.fireProof = true; - this.bc = 5; + this.bd = 5; } public boolean damageEntity(DamageSource damagesource, int i) { @@ -129,7 +130,7 @@ public class EntityGhast extends EntityFlying implements IMonster { double d6 = this.target.boundingBox.b + (double) (this.target.length / 2.0F) - (this.locY + (double) (this.length / 2.0F)); double d7 = this.target.locZ - this.locZ; - this.aw = this.yaw = -((float) Math.atan2(d5, d7)) * 180.0F / 3.1415927F; + this.ax = this.yaw = -((float) Math.atan2(d5, d7)) * 180.0F / 3.1415927F; if (this.n(this.target)) { if (this.g == 10) { this.world.a((EntityHuman) null, 1007, (int) this.locX, (int) this.locY, (int) this.locZ, 0); @@ -139,6 +140,8 @@ public class EntityGhast extends EntityFlying implements IMonster { if (this.g == 20) { this.world.a((EntityHuman) null, 1008, (int) this.locX, (int) this.locY, (int) this.locZ, 0); EntityLargeFireball entitylargefireball = new EntityLargeFireball(this.world, this, d5, d6, d7); + + entitylargefireball.e = this.explosionPower; double d8 = 4.0D; Vec3D vec3d = this.i(1.0F); @@ -152,7 +155,7 @@ public class EntityGhast extends EntityFlying implements IMonster { --this.g; } } else { - this.aw = this.yaw = -((float) Math.atan2(this.motX, this.motZ)) * 180.0F / 3.1415927F; + this.ax = this.yaw = -((float) Math.atan2(this.motX, this.motZ)) * 180.0F / 3.1415927F; if (this.g > 0) { --this.g; } @@ -232,4 +235,16 @@ public class EntityGhast extends EntityFlying implements IMonster { public int bv() { return 1; } + + public void b(NBTTagCompound nbttagcompound) { + super.b(nbttagcompound); + nbttagcompound.setInt("ExplosionPower", this.explosionPower); + } + + public void a(NBTTagCompound nbttagcompound) { + super.a(nbttagcompound); + if (nbttagcompound.hasKey("ExplosionPower")) { + this.explosionPower = nbttagcompound.getInt("ExplosionPower"); + } + } } diff --git a/src/main/java/net/minecraft/server/EntityHuman.java b/src/main/java/net/minecraft/server/EntityHuman.java index 1e5723d3..3aec4df3 100644 --- a/src/main/java/net/minecraft/server/EntityHuman.java +++ b/src/main/java/net/minecraft/server/EntityHuman.java @@ -20,18 +20,18 @@ public abstract class EntityHuman extends EntityLiving implements ICommandListen public Container defaultContainer; public Container activeContainer; protected FoodMetaData foodData = new FoodMetaData(); - protected int bM = 0; - public byte bN = 0; - public float bO; + protected int bN = 0; + public byte bO = 0; public float bP; + public float bQ; public String name; - public int bR = 0; - public double bS; + public int bS = 0; public double bT; public double bU; public double bV; public double bW; public double bX; + public double bY; // CraftBukkit start public boolean sleeping; // protected -> public public boolean fauxSleeping; @@ -42,10 +42,10 @@ public abstract class EntityHuman extends EntityLiving implements ICommandListen } // CraftBukkit end - public ChunkCoordinates bZ; + public ChunkCoordinates ca; public int sleepTicks; // CraftBukkit - private -> public - public float ca; public float cb; + public float cc; private ChunkCoordinates c; private boolean d; private ChunkCoordinates e; @@ -56,8 +56,8 @@ public abstract class EntityHuman extends EntityLiving implements ICommandListen public float exp; private ItemStack f; private int g; - protected float cg = 0.1F; - protected float ch = 0.02F; + protected float ch = 0.1F; + protected float ci = 0.02F; private int h = 0; public EntityFishingHook hookedFish = null; @@ -69,8 +69,8 @@ public abstract class EntityHuman extends EntityLiving implements ICommandListen ChunkCoordinates chunkcoordinates = world.getSpawn(); this.setPositionRotation((double) chunkcoordinates.x + 0.5D, (double) (chunkcoordinates.y + 1), (double) chunkcoordinates.z + 0.5D, 0.0F, 0.0F); - this.aI = "humanoid"; - this.aH = 180.0F; + this.aJ = "humanoid"; + this.aI = 180.0F; this.maxFireTicks = 20; this.texture = "/mob/char.png"; } @@ -107,7 +107,7 @@ public abstract class EntityHuman extends EntityLiving implements ICommandListen } public boolean bh() { - return this.bM() && Item.byId[this.f.id].d_(this.f) == EnumAnimation.d; + return this.bM() && Item.byId[this.f.id].b_(this.f) == EnumAnimation.d; } public void j_() { @@ -127,8 +127,8 @@ public abstract class EntityHuman extends EntityLiving implements ICommandListen } } - if (this.bR > 0) { - --this.bR; + if (this.bS > 0) { + --this.bS; } if (this.isSleeping()) { @@ -161,41 +161,41 @@ public abstract class EntityHuman extends EntityLiving implements ICommandListen this.extinguish(); } - this.bS = this.bV; this.bT = this.bW; this.bU = this.bX; - double d0 = this.locX - this.bV; - double d1 = this.locY - this.bW; - double d2 = this.locZ - this.bX; + this.bV = this.bY; + double d0 = this.locX - this.bW; + double d1 = this.locY - this.bX; + double d2 = this.locZ - this.bY; double d3 = 10.0D; if (d0 > d3) { - this.bS = this.bV = this.locX; + this.bT = this.bW = this.locX; } if (d2 > d3) { - this.bU = this.bX = this.locZ; + this.bV = this.bY = this.locZ; } if (d1 > d3) { - this.bT = this.bW = this.locY; + this.bU = this.bX = this.locY; } if (d0 < -d3) { - this.bS = this.bV = this.locX; + this.bT = this.bW = this.locX; } if (d2 < -d3) { - this.bU = this.bX = this.locZ; + this.bV = this.bY = this.locZ; } if (d1 < -d3) { - this.bT = this.bW = this.locY; + this.bU = this.bX = this.locY; } - this.bV += d0 * 0.25D; - this.bX += d2 * 0.25D; - this.bW += d1 * 0.25D; + this.bW += d0 * 0.25D; + this.bY += d2 * 0.25D; + this.bX += d1 * 0.25D; this.a(StatisticList.k, 1); if (this.vehicle == null) { this.e = null; @@ -214,7 +214,7 @@ public abstract class EntityHuman extends EntityLiving implements ICommandListen return 10; } - protected void makeSound(String s, float f, float f1) { + public void makeSound(String s, float f, float f1) { this.world.a(this, s, f, f1); } @@ -275,13 +275,13 @@ public abstract class EntityHuman extends EntityLiving implements ICommandListen float f1 = this.pitch; super.U(); - this.bO = this.bP; - this.bP = 0.0F; + this.bP = this.bQ; + this.bQ = 0.0F; this.k(this.locX - d0, this.locY - d1, this.locZ - d2); if (this.vehicle instanceof EntityPig) { this.pitch = f1; this.yaw = f; - this.aw = ((EntityPig) this.vehicle).aw; + this.ax = ((EntityPig) this.vehicle).ax; } } @@ -290,8 +290,8 @@ public abstract class EntityHuman extends EntityLiving implements ICommandListen } public void c() { - if (this.bM > 0) { - --this.bM; + if (this.bN > 0) { + --this.bN; } if (this.world.difficulty == 0 && this.getHealth() < this.getMaxHealth() && this.ticksLived % 20 * 12 == 0) { @@ -300,13 +300,13 @@ public abstract class EntityHuman extends EntityLiving implements ICommandListen } this.inventory.j(); - this.bO = this.bP; + this.bP = this.bQ; super.c(); - this.aM = this.abilities.b(); - this.aN = this.ch; + this.aN = this.abilities.b(); + this.aO = this.ci; if (this.isSprinting()) { - this.aM = (float) ((double) this.aM + (double) this.abilities.b() * 0.3D); - this.aN = (float) ((double) this.aN + (double) this.ch * 0.3D); + this.aN = (float) ((double) this.aN + (double) this.abilities.b() * 0.3D); + this.aO = (float) ((double) this.aO + (double) this.ci * 0.3D); } float f = MathHelper.sqrt(this.motX * this.motX + this.motZ * this.motZ); @@ -325,8 +325,8 @@ public abstract class EntityHuman extends EntityLiving implements ICommandListen f1 = 0.0F; } - this.bP += (f - this.bP) * 0.4F; - this.ba += (f1 - this.ba) * 0.8F; + this.bQ += (f - this.bQ) * 0.4F; + this.bb += (f1 - this.bb) * 0.8F; if (this.getHealth() > 0) { List list = this.world.getEntities(this, this.boundingBox.grow(1.0D, 0.5D, 1.0D)); @@ -374,8 +374,8 @@ public abstract class EntityHuman extends EntityLiving implements ICommandListen } if (damagesource != null) { - this.motX = (double) (-MathHelper.cos((this.aW + this.yaw) * 3.1415927F / 180.0F) * 0.1F); - this.motZ = (double) (-MathHelper.sin((this.aW + this.yaw) * 3.1415927F / 180.0F) * 0.1F); + this.motX = (double) (-MathHelper.cos((this.aX + this.yaw) * 3.1415927F / 180.0F) * 0.1F); + this.motZ = (double) (-MathHelper.sin((this.aX + this.yaw) * 3.1415927F / 180.0F) * 0.1F); } else { this.motX = this.motZ = 0.0D; } @@ -393,8 +393,8 @@ public abstract class EntityHuman extends EntityLiving implements ICommandListen } } - public EntityItem bR() { - return this.a(this.inventory.splitStack(this.inventory.itemInHandIndex, 1), false); + public EntityItem f(boolean flag) { + return this.a(this.inventory.splitStack(this.inventory.itemInHandIndex, flag && this.inventory.getItemInHand() != null ? this.inventory.getItemInHand().count : 1), false); } public EntityItem drop(ItemStack itemstack) { @@ -457,9 +457,16 @@ public abstract class EntityHuman extends EntityLiving implements ICommandListen public float a(Block block) { float f = this.inventory.a(block); int i = EnchantmentManager.getDigSpeedEnchantmentLevel(this); + ItemStack itemstack = this.inventory.getItemInHand(); - if (i > 0 && this.inventory.b(block)) { - f += (float) (i * i + 1); + if (i > 0 && itemstack != null) { + float f1 = (float) (i * i + 1); + + if (!itemstack.b(block) && f <= 1.0F) { + f += f1 * 0.08F; + } else { + f += f1; + } } if (this.hasEffect(MobEffectList.FASTER_DIG)) { @@ -490,6 +497,7 @@ public abstract class EntityHuman extends EntityLiving implements ICommandListen NBTTagList nbttaglist = nbttagcompound.getList("Inventory"); this.inventory.b(nbttaglist); + this.inventory.itemInHandIndex = nbttagcompound.getInt("SelectedItemSlot"); this.sleeping = nbttagcompound.getBoolean("Sleeping"); this.sleepTicks = nbttagcompound.getShort("SleepTimer"); this.exp = nbttagcompound.getFloat("XpP"); @@ -497,7 +505,7 @@ public abstract class EntityHuman extends EntityLiving implements ICommandListen this.expTotal = nbttagcompound.getInt("XpTotal"); this.setScore(nbttagcompound.getInt("Score")); if (this.sleeping) { - this.bZ = new ChunkCoordinates(MathHelper.floor(this.locX), MathHelper.floor(this.locY), MathHelper.floor(this.locZ)); + this.ca = new ChunkCoordinates(MathHelper.floor(this.locX), MathHelper.floor(this.locY), MathHelper.floor(this.locZ)); this.a(true, true, false); } @@ -525,6 +533,7 @@ public abstract class EntityHuman extends EntityLiving implements ICommandListen public void b(NBTTagCompound nbttagcompound) { super.b(nbttagcompound); nbttagcompound.set("Inventory", this.inventory.a(new NBTTagList())); + nbttagcompound.setInt("SelectedItemSlot", this.inventory.itemInHandIndex); nbttagcompound.setBoolean("Sleeping", this.sleeping); nbttagcompound.setShort("SleepTimer", (short) this.sleepTicks); nbttagcompound.setFloat("XpP", this.exp); @@ -566,7 +575,7 @@ public abstract class EntityHuman extends EntityLiving implements ICommandListen } else if (this.abilities.isInvulnerable && !damagesource.ignoresInvulnerability()) { return false; } else { - this.bA = 0; + this.bB = 0; if (this.getHealth() <= 0) { return false; } else { @@ -622,10 +631,10 @@ public abstract class EntityHuman extends EntityLiving implements ICommandListen if (k > 0 && k <= 20) { int l = 25 - k; - int i1 = j * l + this.aS; + int i1 = j * l + this.aT; j = i1 / 25; - this.aS = i1 % 25; + this.aT = i1 % 25; } return j; @@ -670,7 +679,7 @@ public abstract class EntityHuman extends EntityLiving implements ICommandListen return this.inventory.k(); } - public float bS() { + public float bR() { int i = 0; ItemStack[] aitemstack = this.inventory.armor; int j = aitemstack.length; @@ -717,7 +726,7 @@ public abstract class EntityHuman extends EntityLiving implements ICommandListen if (entity.a(this)) { return true; } else { - ItemStack itemstack = this.bT(); + ItemStack itemstack = this.bS(); if (itemstack != null && entity instanceof EntityLiving) { if (this.abilities.canInstantlyBuild) { @@ -727,7 +736,7 @@ public abstract class EntityHuman extends EntityLiving implements ICommandListen if (itemstack.a((EntityLiving) entity)) { // CraftBukkit - bypass infinite items; <= 0 -> == 0 if (itemstack.count == 0 && !this.abilities.canInstantlyBuild) { - this.bU(); + this.bT(); } return true; @@ -738,11 +747,11 @@ public abstract class EntityHuman extends EntityLiving implements ICommandListen } } - public ItemStack bT() { + public ItemStack bS() { return this.inventory.getItemInHand(); } - public void bU() { + public void bT() { this.inventory.setItem(this.inventory.itemInHandIndex, (ItemStack) null); } @@ -823,15 +832,18 @@ public abstract class EntityHuman extends EntityLiving implements ICommandListen } this.l(entity); + if (entity instanceof EntityLiving) { + EnchantmentThorns.a(this, (EntityLiving) entity, this.random); + } } - ItemStack itemstack = this.bT(); + ItemStack itemstack = this.bS(); if (itemstack != null && entity instanceof EntityLiving) { itemstack.a((EntityLiving) entity, this); // CraftBukkit - bypass infinite items; <= 0 -> == 0 if (itemstack.count == 0) { - this.bU(); + this.bT(); } } @@ -877,7 +889,7 @@ public abstract class EntityHuman extends EntityLiving implements ICommandListen return !this.sleeping && super.inBlock(); } - public boolean bW() { + public boolean bV() { return false; } @@ -955,7 +967,7 @@ public abstract class EntityHuman extends EntityLiving implements ICommandListen this.sleeping = true; this.sleepTicks = 0; - this.bZ = new ChunkCoordinates(i, j, k); + this.ca = new ChunkCoordinates(i, j, k); this.motX = this.motZ = this.motY = 0.0D; if (!this.world.isStatic) { this.world.everyoneSleeping(); @@ -965,31 +977,31 @@ public abstract class EntityHuman extends EntityLiving implements ICommandListen } private void x(int i) { - this.ca = 0.0F; this.cb = 0.0F; + this.cc = 0.0F; switch (i) { case 0: - this.cb = -1.8F; + this.cc = -1.8F; break; case 1: - this.ca = 1.8F; + this.cb = 1.8F; break; case 2: - this.cb = 1.8F; + this.cc = 1.8F; break; case 3: - this.ca = -1.8F; + this.cb = -1.8F; } } public void a(boolean flag, boolean flag1, boolean flag2) { this.a(0.6F, 1.8F); this.e_(); - ChunkCoordinates chunkcoordinates = this.bZ; - ChunkCoordinates chunkcoordinates1 = this.bZ; + ChunkCoordinates chunkcoordinates = this.ca; + ChunkCoordinates chunkcoordinates1 = this.ca; if (chunkcoordinates != null && this.world.getTypeId(chunkcoordinates.x, chunkcoordinates.y, chunkcoordinates.z) == Block.BED.id) { BlockBed.a(this.world, chunkcoordinates.x, chunkcoordinates.y, chunkcoordinates.z, false); @@ -1029,12 +1041,12 @@ public abstract class EntityHuman extends EntityLiving implements ICommandListen } if (flag2) { - this.setRespawnPosition(this.bZ, false); + this.setRespawnPosition(this.ca, false); } } private boolean j() { - return this.world.getTypeId(this.bZ.x, this.bZ.y, this.bZ.z) == Block.BED.id; + return this.world.getTypeId(this.ca.x, this.ca.y, this.ca.z) == Block.BED.id; } public static ChunkCoordinates getBed(World world, ChunkCoordinates chunkcoordinates, boolean flag) { @@ -1121,12 +1133,12 @@ public abstract class EntityHuman extends EntityLiving implements ICommandListen if (this.abilities.isFlying && this.vehicle == null) { double d3 = this.motY; - float f2 = this.aN; + float f2 = this.aO; - this.aN = this.abilities.a(); + this.aO = this.abilities.a(); super.e(f, f1); this.motY = d3 * 0.6D; - this.aN = f2; + this.aO = f2; } else { super.e(f, f1); } @@ -1244,12 +1256,14 @@ public abstract class EntityHuman extends EntityLiving implements ICommandListen this.expLevel += i; if (this.expLevel < 0) { this.expLevel = 0; + this.exp = 0.0F; + this.expTotal = 0; } if (i > 0 && this.expLevel % 5 == 0 && (float) this.h < (float) this.ticksLived - 100.0F) { float f = this.expLevel > 30 ? 1.0F : (float) this.expLevel / 30.0F; - this.makeSound("random.levelup", f * 0.75F, 1.0F); + this.world.makeSound(this, "random.levelup", f * 0.75F, 1.0F); this.h = this.ticksLived; } } @@ -1270,11 +1284,11 @@ public abstract class EntityHuman extends EntityLiving implements ICommandListen return this.foodData; } - public boolean f(boolean flag) { + public boolean g(boolean flag) { return (flag || this.foodData.c()) && !this.abilities.isInvulnerable; } - public boolean ce() { + public boolean cd() { return this.getHealth() > 0 && this.getHealth() < this.getMaxHealth(); } @@ -1301,8 +1315,8 @@ public abstract class EntityHuman extends EntityLiving implements ICommandListen return true; } - if (this.bT() != null) { - ItemStack itemstack = this.bT(); + if (this.bS() != null) { + ItemStack itemstack = this.bS(); if (itemstack.b(block) || itemstack.a(block) > 1.0F) { return true; @@ -1345,7 +1359,7 @@ public abstract class EntityHuman extends EntityLiving implements ICommandListen this.expTotal = entityhuman.expTotal; this.exp = entityhuman.exp; this.setScore(entityhuman.getScore()); - this.aq = entityhuman.aq; + this.ar = entityhuman.ar; } else if (this.world.getGameRules().getBoolean("keepInventory")) { this.inventory.b(entityhuman.inventory); this.expLevel = entityhuman.expLevel; diff --git a/src/main/java/net/minecraft/server/EntityItem.java b/src/main/java/net/minecraft/server/EntityItem.java index a1dca162..c8776867 100644 --- a/src/main/java/net/minecraft/server/EntityItem.java +++ b/src/main/java/net/minecraft/server/EntityItem.java @@ -6,46 +6,47 @@ import org.bukkit.event.player.PlayerPickupItemEvent; // CraftBukkit public class EntityItem extends Entity { - public ItemStack itemStack; - public int age = 0; + public int age; public int pickupDelay; - private int e = 5; - public float d = (float) (Math.random() * 3.141592653589793D * 2.0D); + private int d; + public float c; private int lastTick = (int) (System.currentTimeMillis() / 50); // CraftBukkit - public EntityItem(World world, double d0, double d1, double d2, ItemStack itemstack) { + public EntityItem(World world, double d0, double d1, double d2) { super(world); + this.age = 0; + this.d = 5; + this.c = (float) (Math.random() * 3.141592653589793D * 2.0D); this.a(0.25F, 0.25F); this.height = this.length / 2.0F; this.setPosition(d0, d1, d2); - this.itemStack = itemstack; - - // CraftBukkit start - infinite item fix & nullcheck - if (this.itemStack == null) { - throw new IllegalArgumentException("Can't create an EntityItem for a null item"); - } - if (this.itemStack.count <= -1) { - this.itemStack.count = 1; - } - // CraftBukkit end - this.yaw = (float) (Math.random() * 360.0D); this.motX = (double) ((float) (Math.random() * 0.20000000298023224D - 0.10000000149011612D)); this.motY = 0.20000000298023224D; this.motZ = (double) ((float) (Math.random() * 0.20000000298023224D - 0.10000000149011612D)); } + public EntityItem(World world, double d0, double d1, double d2, ItemStack itemstack) { + this(world, d0, d1, d2); + this.setItemStack(itemstack); + } + protected boolean f_() { return false; } public EntityItem(World world) { super(world); + this.age = 0; + this.d = 5; + this.c = (float) (Math.random() * 3.141592653589793D * 2.0D); this.a(0.25F, 0.25F); this.height = this.length / 2.0F; } - protected void a() {} + protected void a() { + this.getDataWatcher().a(10, 5); + } public void j_() { super.j_(); @@ -63,7 +64,7 @@ public class EntityItem extends Entity { this.move(this.motX, this.motY, this.motZ); boolean flag = (int) this.lastX != (int) this.locX || (int) this.lastY != (int) this.locY || (int) this.lastZ != (int) this.locZ; - if (flag) { + if (flag || this.ticksLived % 25 == 0) { if (this.world.getMaterial(MathHelper.floor(this.locX), MathHelper.floor(this.locY), MathHelper.floor(this.locZ)) == Material.LAVA) { this.motY = 0.20000000298023224D; this.motX = (double) ((this.random.nextFloat() - this.random.nextFloat()) * 0.2F); @@ -72,7 +73,7 @@ public class EntityItem extends Entity { } if (!this.world.isStatic) { - this.d(); + this.g(); } } @@ -106,7 +107,7 @@ public class EntityItem extends Entity { } } - private void d() { + private void g() { Iterator iterator = this.world.a(EntityItem.class, this.boundingBox.grow(0.5D, 0.0D, 0.5D)).iterator(); while (iterator.hasNext()) { @@ -120,26 +121,26 @@ public class EntityItem extends Entity { if (entityitem == this) { return false; } else if (entityitem.isAlive() && this.isAlive()) { - if (entityitem.itemStack.getItem() != this.itemStack.getItem()) { + ItemStack itemstack = this.getItemStack(); + ItemStack itemstack1 = entityitem.getItemStack(); + + if (itemstack1.getItem() != itemstack.getItem()) { return false; - } else if (entityitem.itemStack.hasTag() ^ this.itemStack.hasTag()) { + } else if (itemstack1.hasTag() ^ itemstack.hasTag()) { return false; - } else if (entityitem.itemStack.hasTag() && !entityitem.itemStack.getTag().equals(this.itemStack.getTag())) { + } else if (itemstack1.hasTag() && !itemstack1.getTag().equals(itemstack.getTag())) { return false; - } else if (entityitem.itemStack.getItem().l() && entityitem.itemStack.getData() != this.itemStack.getData()) { + } else if (itemstack1.getItem().l() && itemstack1.getData() != itemstack.getData()) { return false; - } else if (entityitem.itemStack.count < this.itemStack.count) { + } else if (itemstack1.count < itemstack.count) { return entityitem.a(this); - } else if (entityitem.itemStack.count + this.itemStack.count > entityitem.itemStack.getMaxStackSize()) { + } else if (itemstack1.count + itemstack.count > itemstack1.getMaxStackSize()) { return false; - // CraftBukkit start - don't merge items with enchantments - } else if (entityitem.itemStack.hasEnchantments() || this.itemStack.hasEnchantments()) { - return false; - // CraftBukkit end } else { - entityitem.itemStack.count += this.itemStack.count; + itemstack1.count += itemstack.count; entityitem.pickupDelay = Math.max(entityitem.pickupDelay, this.pickupDelay); entityitem.age = Math.min(entityitem.age, this.age); + entityitem.setItemStack(itemstack1); this.die(); return true; } @@ -163,10 +164,12 @@ public class EntityItem extends Entity { public boolean damageEntity(DamageSource damagesource, int i) { if (this.isInvulnerable()) { return false; + } else if (this.getItemStack() != null && this.getItemStack().id == Item.NETHER_STAR.id && damagesource == DamageSource.EXPLOSION) { + return false; } else { this.K(); - this.e -= i; - if (this.e <= 0) { + this.d -= i; + if (this.d <= 0) { this.die(); } @@ -175,38 +178,39 @@ public class EntityItem extends Entity { } public void b(NBTTagCompound nbttagcompound) { - nbttagcompound.setShort("Health", (short) ((byte) this.e)); + nbttagcompound.setShort("Health", (short) ((byte) this.d)); nbttagcompound.setShort("Age", (short) this.age); - if (this.itemStack != null) { - nbttagcompound.setCompound("Item", this.itemStack.save(new NBTTagCompound())); + if (this.getItemStack() != null) { + nbttagcompound.setCompound("Item", this.getItemStack().save(new NBTTagCompound())); } } public void a(NBTTagCompound nbttagcompound) { - this.e = nbttagcompound.getShort("Health") & 255; + this.d = nbttagcompound.getShort("Health") & 255; this.age = nbttagcompound.getShort("Age"); NBTTagCompound nbttagcompound1 = nbttagcompound.getCompound("Item"); - this.itemStack = ItemStack.a(nbttagcompound1); - if (this.itemStack == null) { + this.setItemStack(ItemStack.a(nbttagcompound1)); + if (this.getItemStack() == null) { this.die(); } } public void c_(EntityHuman entityhuman) { - if ((!this.world.isStatic) && (this.itemStack != null)) { // CraftBukkit - nullcheck - int i = this.itemStack.count; + if (!this.world.isStatic) { + ItemStack itemstack = this.getItemStack(); + int i = itemstack.count; // CraftBukkit start - int canHold = entityhuman.inventory.canHold(this.itemStack); - int remaining = this.itemStack.count - canHold; + int canHold = entityhuman.inventory.canHold(itemstack); + int remaining = itemstack.count - canHold; if (this.pickupDelay <= 0 && canHold > 0) { - this.itemStack.count = canHold; + itemstack.count = canHold; PlayerPickupItemEvent event = new PlayerPickupItemEvent((org.bukkit.entity.Player) entityhuman.getBukkitEntity(), (org.bukkit.entity.Item) this.getBukkitEntity(), remaining); event.setCancelled(!entityhuman.canPickUpLoot); this.world.getServer().getPluginManager().callEvent(event); - this.itemStack.count = canHold + remaining; + itemstack.count = canHold + remaining; if (event.isCancelled()) { return; @@ -217,26 +221,26 @@ public class EntityItem extends Entity { } // CraftBukkit end - if (this.pickupDelay == 0 && entityhuman.inventory.pickup(this.itemStack)) { - if (this.itemStack.id == Block.LOG.id) { + if (this.pickupDelay == 0 && entityhuman.inventory.pickup(itemstack)) { + if (itemstack.id == Block.LOG.id) { entityhuman.a((Statistic) AchievementList.g); } - if (this.itemStack.id == Item.LEATHER.id) { + if (itemstack.id == Item.LEATHER.id) { entityhuman.a((Statistic) AchievementList.t); } - if (this.itemStack.id == Item.DIAMOND.id) { + if (itemstack.id == Item.DIAMOND.id) { entityhuman.a((Statistic) AchievementList.w); } - if (this.itemStack.id == Item.BLAZE_ROD.id) { + if (itemstack.id == Item.BLAZE_ROD.id) { entityhuman.a((Statistic) AchievementList.z); } this.makeSound("random.pop", 0.2F, ((this.random.nextFloat() - this.random.nextFloat()) * 0.7F + 1.0F) * 2.0F); entityhuman.receive(this, i); - if (this.itemStack.count <= 0) { + if (itemstack.count <= 0) { this.die(); } } @@ -244,8 +248,7 @@ public class EntityItem extends Entity { } public String getLocalizedName() { - if (this.itemStack == null) return LocaleI18n.get("item.unknown"); // CraftBukkit - nullcheck - return LocaleI18n.get("item." + this.itemStack.a()); + return LocaleI18n.get("item." + this.getItemStack().a()); } public boolean aq() { @@ -255,7 +258,23 @@ public class EntityItem extends Entity { public void b(int i) { super.b(i); if (!this.world.isStatic) { - this.d(); + this.g(); + } + } + + public ItemStack getItemStack() { + ItemStack itemstack = this.getDataWatcher().f(10); + + if (itemstack == null) { + System.out.println("Item entity " + this.id + " has no item?!"); + return new ItemStack(Block.STONE); + } else { + return itemstack; } } + + public void setItemStack(ItemStack itemstack) { + this.getDataWatcher().watch(10, itemstack); + this.getDataWatcher().h(10); + } } diff --git a/src/main/java/net/minecraft/server/EntityLargeFireball.java b/src/main/java/net/minecraft/server/EntityLargeFireball.java index 3f7d9502..88b0d84a 100644 --- a/src/main/java/net/minecraft/server/EntityLargeFireball.java +++ b/src/main/java/net/minecraft/server/EntityLargeFireball.java @@ -4,6 +4,8 @@ import org.bukkit.event.entity.ExplosionPrimeEvent; // CraftBukkit public class EntityLargeFireball extends EntityFireball { + public int e = 1; + public EntityLargeFireball(World world) { super(world); } diff --git a/src/main/java/net/minecraft/server/EntityLightning.java b/src/main/java/net/minecraft/server/EntityLightning.java index a8d10050..606ae347 100644 --- a/src/main/java/net/minecraft/server/EntityLightning.java +++ b/src/main/java/net/minecraft/server/EntityLightning.java @@ -104,17 +104,19 @@ public class EntityLightning extends EntityWeather { } } - if (!this.world.isStatic && this.lifeTicks >= 0 && !this.isEffect) { // CraftBukkit - double d0 = 3.0D; - List list = this.world.getEntities(this, AxisAlignedBB.a().a(this.locX - d0, this.locY - d0, this.locZ - d0, this.locX + d0, this.locY + 6.0D + d0, this.locZ + d0)); + if (this.lifeTicks >= 0 && !this.isEffect) { // CraftBukkit - add !this.isEffect + if (this.world.isStatic) { + this.world.q = 2; + } else { + double d0 = 3.0D; + List list = this.world.getEntities(this, AxisAlignedBB.a().a(this.locX - d0, this.locY - d0, this.locZ - d0, this.locX + d0, this.locY + 6.0D + d0, this.locZ + d0)); - for (int l = 0; l < list.size(); ++l) { - Entity entity = (Entity) list.get(l); + for (int l = 0; l < list.size(); ++l) { + Entity entity = (Entity) list.get(l); - entity.a(this); + entity.a(this); + } } - - this.world.r = 2; } } diff --git a/src/main/java/net/minecraft/server/EntityLiving.java b/src/main/java/net/minecraft/server/EntityLiving.java index 08ffc62c..bae495a2 100644 --- a/src/main/java/net/minecraft/server/EntityLiving.java +++ b/src/main/java/net/minecraft/server/EntityLiving.java @@ -15,57 +15,57 @@ import org.bukkit.event.entity.EntityRegainHealthEvent; public abstract class EntityLiving extends Entity { - private static final float[] b = new float[] { 0.0F, 0.0F, 0.005F, 0.01F}; - private static final float[] c = new float[] { 0.0F, 0.0F, 0.05F, 0.1F}; - private static final float[] d = new float[] { 0.0F, 0.0F, 0.005F, 0.02F}; - public static final float[] as = new float[] { 0.0F, 0.01F, 0.07F, 0.2F}; + private static final float[] b = new float[] { 0.0F, 0.0F, 0.05F, 0.1F}; + private static final float[] c = new float[] { 0.0F, 0.0F, 0.05F, 0.2F}; + private static final float[] d = new float[] { 0.0F, 0.0F, 0.05F, 0.02F}; + public static final float[] at = new float[] { 0.0F, 0.1F, 0.15F, 0.45F}; public int maxNoDamageTicks = 20; - public float au; public float av; - public float aw = 0.0F; + public float aw; public float ax = 0.0F; public float ay = 0.0F; public float az = 0.0F; - protected float aA; + public float aA = 0.0F; protected float aB; protected float aC; protected float aD; - protected boolean aE = true; + protected float aE; + protected boolean aF = true; protected String texture = "/mob/char.png"; - protected boolean aG = true; - protected float aH = 0.0F; - protected String aI = null; - protected float aJ = 1.0F; - protected int aK = 0; - protected float aL = 0.0F; - public float aM = 0.1F; - public float aN = 0.02F; - public float aO; + protected boolean aH = true; + protected float aI = 0.0F; + protected String aJ = null; + protected float aK = 1.0F; + protected int aL = 0; + protected float aM = 0.0F; + public float aN = 0.1F; + public float aO = 0.02F; public float aP; + public float aQ; protected int health = this.getMaxHealth(); - public int aR; - protected int aS; - public int aT; + public int aS; + protected int aT; + public int aU; public int hurtTicks; - public int aV; - public float aW = 0.0F; + public int aW; + public float aX = 0.0F; public int deathTicks = 0; public int attackTicks = 0; - public float aZ; public float ba; - protected boolean bb = false; - protected int bc; - public int bd = -1; - public float be = (float) (Math.random() * 0.8999999761581421D + 0.10000000149011612D); - public float bf; + public float bb; + protected boolean bc = false; + protected int bd; + public int be = -1; + public float bf = (float) (Math.random() * 0.8999999761581421D + 0.10000000149011612D); public float bg; public float bh; + public float bi; public EntityHuman killer = null; // CraftBukkit - protected -> public protected int lastDamageByPlayerTime = 0; public EntityLiving lastDamager = null; // CraftBukkit - private -> public private int f = 0; private EntityLiving g = null; - public int bk = 0; + public int bl = 0; public HashMap effects = new HashMap(); // CraftBukkit - protected -> public public boolean updateEffects = true; // CraftBukkit - private -> public private int i; @@ -76,36 +76,36 @@ public abstract class EntityLiving extends Entity { private Navigation navigation; protected final PathfinderGoalSelector goalSelector; protected final PathfinderGoalSelector targetSelector; - private EntityLiving bM; - private EntitySenses bN; - private float bO; - private ChunkCoordinates bP = new ChunkCoordinates(0, 0, 0); - private float bQ = -1.0F; + private EntityLiving bN; + private EntitySenses bO; + private float bP; + private ChunkCoordinates bQ = new ChunkCoordinates(0, 0, 0); + private float bR = -1.0F; private ItemStack[] equipment = new ItemStack[5]; public float[] dropChances = new float[5]; // CraftBukkit - protected -> public - private ItemStack[] bS = new ItemStack[5]; - public boolean bp = false; - public int bq = 0; + private ItemStack[] bT = new ItemStack[5]; + public boolean bq = false; + public int br = 0; public boolean canPickUpLoot = false; // CraftBukkit - protected -> public public boolean persistent = !this.bj(); // CraftBukkit - private -> public, change value - protected int bs; - protected double bt; + protected int bt; protected double bu; protected double bv; protected double bw; protected double bx; - float by = 0.0F; + protected double by; + float bz = 0.0F; public int lastDamage = 0; // CraftBukkit - protected -> public - protected int bA = 0; - protected float bB; + protected int bB = 0; protected float bC; protected float bD; - protected boolean bE = false; - protected float bF = 0.0F; - protected float bG = 0.7F; - private int bU = 0; - private Entity bV; - protected int bH = 0; + protected float bE; + protected boolean bF = false; + protected float bG = 0.0F; + protected float bH = 0.7F; + private int bV = 0; + private Entity bW; + protected int bI = 0; public int expToDrop = 0; // CraftBukkit public int maxAirTicks = 300; // CraftBukkit @@ -119,12 +119,12 @@ public abstract class EntityLiving extends Entity { this.jumpController = new ControllerJump(this); this.senses = new EntityAIBodyControl(this); this.navigation = new Navigation(this, world, 16.0F); - this.bN = new EntitySenses(this); - this.av = (float) (Math.random() + 1.0D) * 0.01F; + this.bO = new EntitySenses(this); + this.aw = (float) (Math.random() + 1.0D) * 0.01F; this.setPosition(this.locX, this.locY, this.locZ); - this.au = (float) Math.random() * 12398.0F; + this.av = (float) Math.random() * 12398.0F; this.yaw = (float) (Math.random() * 3.1415927410125732D * 2.0D); - this.ay = this.yaw; + this.az = this.yaw; for (int i = 0; i < this.dropChances.length; ++i) { this.dropChances[i] = 0.05F; @@ -150,7 +150,7 @@ public abstract class EntityLiving extends Entity { } public EntitySenses aA() { - return this.bN; + return this.bO; } public Random aB() { @@ -172,19 +172,19 @@ public abstract class EntityLiving extends Entity { } public int aE() { - return this.bA; + return this.bB; } public float ap() { - return this.ay; + return this.az; } public float aF() { - return this.bO; + return this.bP; } public void e(float f) { - this.bO = f; + this.bP = f; this.f(f); } @@ -194,11 +194,11 @@ public abstract class EntityLiving extends Entity { } public EntityLiving aG() { - return this.bM; + return this.bN; } public void b(EntityLiving entityliving) { - this.bM = entityliving; + this.bN = entityliving; } public boolean a(Class oclass) { @@ -239,28 +239,28 @@ public abstract class EntityLiving extends Entity { } public boolean e(int i, int j, int k) { - return this.bQ == -1.0F ? true : this.bP.e(i, j, k) < this.bQ * this.bQ; + return this.bR == -1.0F ? true : this.bQ.e(i, j, k) < this.bR * this.bR; } public void b(int i, int j, int k, int l) { - this.bP.b(i, j, k); - this.bQ = (float) l; + this.bQ.b(i, j, k); + this.bR = (float) l; } public ChunkCoordinates aJ() { - return this.bP; + return this.bQ; } public float aK() { - return this.bQ; + return this.bR; } public void aL() { - this.bQ = -1.0F; + this.bR = -1.0F; } public boolean aM() { - return this.bQ != -1.0F; + return this.bR != -1.0F; } public void c(EntityLiving entityliving) { @@ -303,11 +303,11 @@ public abstract class EntityLiving extends Entity { } public void y() { - this.aO = this.aP; + this.aP = this.aQ; super.y(); this.world.methodProfiler.a("mobBaseTick"); - if (this.isAlive() && this.random.nextInt(1000) < this.aT++) { - this.aT = -this.aN(); + if (this.isAlive() && this.random.nextInt(1000) < this.aU++) { + this.aU = -this.aN(); this.aO(); } @@ -327,7 +327,9 @@ public abstract class EntityLiving extends Entity { this.extinguish(); } - if (this.isAlive() && this.a(Material.WATER) && !this.bc() && !this.effects.containsKey(Integer.valueOf(MobEffectList.WATER_BREATHING.id))) { + boolean flag = this instanceof EntityHuman && ((EntityHuman) this).abilities.isInvulnerable; + + if (this.isAlive() && this.a(Material.WATER) && !this.bc() && !this.effects.containsKey(Integer.valueOf(MobEffectList.WATER_BREATHING.id)) && !flag) { this.setAirTicks(this.g(this.getAirTicks())); if (this.getAirTicks() == -20) { this.setAirTicks(0); @@ -360,7 +362,7 @@ public abstract class EntityLiving extends Entity { // CraftBukkit end } - this.aZ = this.ba; + this.ba = this.bb; if (this.attackTicks > 0) { --this.attackTicks; } @@ -398,9 +400,9 @@ public abstract class EntityLiving extends Entity { } this.bx(); - this.aD = this.aC; - this.ax = this.aw; - this.az = this.ay; + this.aE = this.aD; + this.ay = this.ax; + this.aA = this.az; this.lastYaw = this.yaw; this.lastPitch = this.pitch; this.world.methodProfiler.b(); @@ -453,7 +455,20 @@ public abstract class EntityLiving extends Entity { } protected int getExpValue(EntityHuman entityhuman) { - return this.bc; + if (this.bd > 0) { + int i = this.bd; + ItemStack[] aitemstack = this.getEquipment(); + + for (int j = 0; j < aitemstack.length; ++j) { + if (aitemstack[j] != null && this.dropChances[j] <= 1.0F) { + i += 1 + this.random.nextInt(3); + } + } + + return i; + } else { + return this.bd; + } } protected boolean alwaysGivesExp() { @@ -473,8 +488,8 @@ public abstract class EntityLiving extends Entity { public void U() { super.U(); - this.aA = this.aB; - this.aB = 0.0F; + this.aB = this.aC; + this.aC = 0.0F; this.fallDistance = 0.0F; } @@ -486,20 +501,20 @@ public abstract class EntityLiving extends Entity { for (i = 0; i < 5; ++i) { ItemStack itemstack = this.getEquipment(i); - if (!ItemStack.matches(itemstack, this.bS[i])) { + if (!ItemStack.matches(itemstack, this.bT[i])) { ((WorldServer) this.world).getTracker().a((Entity) this, (Packet) (new Packet5EntityEquipment(this.id, i, itemstack))); - this.bS[i] = itemstack == null ? null : itemstack.cloneItemStack(); + this.bT[i] = itemstack == null ? null : itemstack.cloneItemStack(); } } i = this.bJ(); if (i > 0) { - if (this.bk <= 0) { - this.bk = 20 * (30 - i); + if (this.bl <= 0) { + this.bl = 20 * (30 - i); } - --this.bk; - if (this.bk <= 0) { + --this.bl; + if (this.bl <= 0) { this.r(i - 1); } } @@ -509,10 +524,10 @@ public abstract class EntityLiving extends Entity { double d0 = this.locX - this.lastX; double d1 = this.locZ - this.lastZ; float f = (float) (d0 * d0 + d1 * d1); - float f1 = this.aw; + float f1 = this.ax; float f2 = 0.0F; - this.aA = this.aB; + this.aB = this.aC; float f3 = 0.0F; if (f > 0.0025000002F) { @@ -522,7 +537,7 @@ public abstract class EntityLiving extends Entity { f1 = (float) org.bukkit.craftbukkit.TrigMath.atan2(d1, d0) * 180.0F / 3.1415927F - 90.0F; } - if (this.aP > 0.0F) { + if (this.aQ > 0.0F) { f1 = this.yaw; } @@ -530,15 +545,15 @@ public abstract class EntityLiving extends Entity { f3 = 0.0F; } - this.aB += (f3 - this.aB) * 0.3F; + this.aC += (f3 - this.aC) * 0.3F; this.world.methodProfiler.a("headTurn"); if (this.be()) { this.senses.a(); } else { - float f4 = MathHelper.g(f1 - this.aw); + float f4 = MathHelper.g(f1 - this.ax); - this.aw += f4 * 0.3F; - float f5 = MathHelper.g(this.yaw - this.aw); + this.ax += f4 * 0.3F; + float f5 = MathHelper.g(this.yaw - this.ax); boolean flag = f5 < -90.0F || f5 >= 90.0F; if (f5 < -75.0F) { @@ -549,9 +564,9 @@ public abstract class EntityLiving extends Entity { f5 = 75.0F; } - this.aw = this.yaw - f5; + this.ax = this.yaw - f5; if (f5 * f5 > 2500.0F) { - this.aw += f5 * 0.2F; + this.ax += f5 * 0.2F; } if (flag) { @@ -570,12 +585,12 @@ public abstract class EntityLiving extends Entity { this.lastYaw += 360.0F; } - while (this.aw - this.ax < -180.0F) { - this.ax -= 360.0F; + while (this.ax - this.ay < -180.0F) { + this.ay -= 360.0F; } - while (this.aw - this.ax >= 180.0F) { - this.ax += 360.0F; + while (this.ax - this.ay >= 180.0F) { + this.ay += 360.0F; } while (this.pitch - this.lastPitch < -180.0F) { @@ -586,16 +601,16 @@ public abstract class EntityLiving extends Entity { this.lastPitch += 360.0F; } - while (this.ay - this.az < -180.0F) { - this.az -= 360.0F; + while (this.az - this.aA < -180.0F) { + this.aA -= 360.0F; } - while (this.ay - this.az >= 180.0F) { - this.az += 360.0F; + while (this.az - this.aA >= 180.0F) { + this.aA += 360.0F; } this.world.methodProfiler.b(); - this.aC += f2; + this.aD += f2; } // CraftBukkit start - delegate so we can handle providing a reason for health being regained @@ -640,17 +655,18 @@ public abstract class EntityLiving extends Entity { } else if (this.world.isStatic) { return false; } else { - this.bA = 0; + this.bB = 0; if (this.health <= 0) { return false; } else if (damagesource.k() && this.hasEffect(MobEffectList.FIRE_RESISTANCE)) { return false; } else { if ((damagesource == DamageSource.ANVIL || damagesource == DamageSource.FALLING_BLOCK) && this.getEquipment(4) != null) { - i = (int) ((float) i * 0.55F); + this.getEquipment(4).damage(i * 4 + this.random.nextInt(i * 2), this); + i = (int) ((float) i * 0.75F); } - this.bg = 1.5F; + this.bh = 1.5F; boolean flag = true; // CraftBukkit start @@ -673,13 +689,13 @@ public abstract class EntityLiving extends Entity { flag = false; } else { this.lastDamage = i; - this.aR = this.health; + this.aS = this.health; this.noDamageTicks = this.maxNoDamageTicks; this.d(damagesource, i); - this.hurtTicks = this.aV = 10; + this.hurtTicks = this.aW = 10; } - this.aW = 0.0F; + this.aX = 0.0F; Entity entity = damagesource.getEntity(); if (entity != null) { @@ -715,10 +731,10 @@ public abstract class EntityLiving extends Entity { d0 = (Math.random() - Math.random()) * 0.01D; } - this.aW = (float) (Math.atan2(d1, d0) * 180.0D / 3.1415927410125732D) - this.yaw; + this.aX = (float) (Math.atan2(d1, d0) * 180.0D / 3.1415927410125732D) - this.yaw; this.a(entity, i, d0, d1); } else { - this.aW = (float) ((int) (Math.random() * 2.0D) * 180); + this.aX = (float) ((int) (Math.random() * 2.0D) * 180); } } @@ -764,11 +780,11 @@ public abstract class EntityLiving extends Entity { protected int b(DamageSource damagesource, int i) { if (!damagesource.ignoresArmor()) { int j = 25 - this.aW(); - int k = i * j + this.aS; + int k = i * j + this.aT; this.k(i); i = k / 25; - this.aS = k % 25; + this.aT = k % 25; } return i; @@ -778,10 +794,10 @@ public abstract class EntityLiving extends Entity { if (this.hasEffect(MobEffectList.RESISTANCE)) { int j = (this.getEffect(MobEffectList.RESISTANCE).getAmplifier() + 1) * 5; int k = 25 - j; - int l = i * k + this.aS; + int l = i * k + this.aT; i = l / 25; - this.aS = l % 25; + this.aT = l % 25; } return i; @@ -830,15 +846,15 @@ public abstract class EntityLiving extends Entity { public void die(DamageSource damagesource) { Entity entity = damagesource.getEntity(); - if (this.aK >= 0 && entity != null) { - entity.c(this, this.aK); + if (this.aL >= 0 && entity != null) { + entity.c(this, this.aL); } if (entity != null) { entity.a(this); } - this.bb = true; + this.bc = true; if (!this.world.isStatic) { int i = 0; @@ -984,12 +1000,12 @@ public abstract class EntityLiving extends Entity { if (this.be()) { f4 = this.aF(); } else { - f4 = this.aM; + f4 = this.aN; } f4 *= f3; } else { - f4 = this.aN; + f4 = this.aO; } this.a(f, f1, f4); @@ -1054,7 +1070,7 @@ public abstract class EntityLiving extends Entity { this.motZ *= (double) f2; } - this.bf = this.bg; + this.bg = this.bh; d0 = this.locX - this.lastX; double d1 = this.locZ - this.lastZ; float f6 = MathHelper.sqrt(d0 * d0 + d1 * d1) * 4.0F; @@ -1063,8 +1079,8 @@ public abstract class EntityLiving extends Entity { f6 = 1.0F; } - this.bg += (f6 - this.bg) * 0.4F; - this.bh += this.bg; + this.bh += (f6 - this.bh) * 0.4F; + this.bi += this.bh; } public boolean g_() { @@ -1185,29 +1201,33 @@ public abstract class EntityLiving extends Entity { } public void f(float f) { - this.bC = f; + this.bD = f; } public void e(boolean flag) { - this.bE = flag; + this.bF = flag; } public void c() { - if (this.bU > 0) { - --this.bU; + if (this.bV > 0) { + --this.bV; } - if (this.bs > 0) { - double d0 = this.locX + (this.bt - this.locX) / (double) this.bs; - double d1 = this.locY + (this.bu - this.locY) / (double) this.bs; - double d2 = this.locZ + (this.bv - this.locZ) / (double) this.bs; - double d3 = MathHelper.g(this.bw - (double) this.yaw); + if (this.bt > 0) { + double d0 = this.locX + (this.bu - this.locX) / (double) this.bt; + double d1 = this.locY + (this.bv - this.locY) / (double) this.bt; + double d2 = this.locZ + (this.bw - this.locZ) / (double) this.bt; + double d3 = MathHelper.g(this.bx - (double) this.yaw); - this.yaw = (float) ((double) this.yaw + d3 / (double) this.bs); - this.pitch = (float) ((double) this.pitch + (this.bx - (double) this.pitch) / (double) this.bs); - --this.bs; + this.yaw = (float) ((double) this.yaw + d3 / (double) this.bt); + this.pitch = (float) ((double) this.pitch + (this.by - (double) this.pitch) / (double) this.bt); + --this.bt; this.setPosition(d0, d1, d2); this.b(this.yaw, this.pitch); + } else if (!this.bf()) { + this.motX *= 0.98D; + this.motY *= 0.98D; + this.motZ *= 0.98D; } if (Math.abs(this.motX) < 0.005D) { @@ -1224,10 +1244,10 @@ public abstract class EntityLiving extends Entity { this.world.methodProfiler.a("ai"); if (this.bg()) { - this.bE = false; - this.bB = 0.0F; + this.bF = false; this.bC = 0.0F; this.bD = 0.0F; + this.bE = 0.0F; } else if (this.bf()) { if (this.be()) { this.world.methodProfiler.a("newAi"); @@ -1237,35 +1257,35 @@ public abstract class EntityLiving extends Entity { this.world.methodProfiler.a("oldAi"); this.bn(); this.world.methodProfiler.b(); - this.ay = this.yaw; + this.az = this.yaw; } } this.world.methodProfiler.b(); this.world.methodProfiler.a("jump"); - if (this.bE) { + if (this.bF) { if (!this.H() && !this.J()) { - if (this.onGround && this.bU == 0) { + if (this.onGround && this.bV == 0) { this.bi(); - this.bU = 10; + this.bV = 10; } } else { this.motY += 0.03999999910593033D; } } else { - this.bU = 0; + this.bV = 0; } this.world.methodProfiler.b(); this.world.methodProfiler.a("travel"); - this.bB *= 0.98F; this.bC *= 0.98F; - this.bD *= 0.9F; - float f = this.aM; + this.bD *= 0.98F; + this.bE *= 0.9F; + float f = this.aN; - this.aM *= this.bB(); - this.e(this.bB, this.bC); - this.aM = f; + this.aN *= this.bB(); + this.e(this.bC, this.bD); + this.aN = f; this.world.methodProfiler.b(); this.world.methodProfiler.a("push"); if (!this.world.isStatic) { @@ -1275,15 +1295,15 @@ public abstract class EntityLiving extends Entity { this.world.methodProfiler.b(); this.world.methodProfiler.a("looting"); // CraftBukkit - Don't run mob pickup code on players - if (!this.world.isStatic && !(this instanceof EntityPlayer) && this.canPickUpLoot && !this.bb && this.world.getGameRules().getBoolean("mobGriefing")) { + if (!this.world.isStatic && !(this instanceof EntityPlayer) && this.canPickUpLoot && !this.bc && this.world.getGameRules().getBoolean("mobGriefing")) { List list = this.world.a(EntityItem.class, this.boundingBox.grow(1.0D, 0.0D, 1.0D)); Iterator iterator = list.iterator(); while (iterator.hasNext()) { EntityItem entityitem = (EntityItem) iterator.next(); - if (!entityitem.dead && entityitem.itemStack != null) { - ItemStack itemstack = entityitem.itemStack; + if (!entityitem.dead && entityitem.getItemStack() != null) { + ItemStack itemstack = entityitem.getItemStack(); int i = b(itemstack); if (i > -1) { @@ -1409,26 +1429,26 @@ public abstract class EntityLiving extends Entity { this.die(); } - if (this.bA > 600 && this.random.nextInt(800) == 0 && d3 > 1024.0D) { // CraftBukkit - remove this.bj() check + if (this.bB > 600 && this.random.nextInt(800) == 0 && d3 > 1024.0D) { // CraftBukkit - remove this.bj() check this.die(); } else if (d3 < 1024.0D) { - this.bA = 0; + this.bB = 0; } } // CraftBukkit start } else { - this.bA = 0; + this.bB = 0; } // CraftBukkit end } protected void bl() { - ++this.bA; + ++this.bB; this.world.methodProfiler.a("checkDespawn"); this.bk(); this.world.methodProfiler.b(); this.world.methodProfiler.a("sensing"); - this.bN.a(); + this.bO.a(); this.world.methodProfiler.b(); this.world.methodProfiler.a("targetSelector"); this.targetSelector.a(); @@ -1456,59 +1476,59 @@ public abstract class EntityLiving extends Entity { protected void bm() {} protected void bn() { - ++this.bA; + ++this.bB; this.bk(); - this.bB = 0.0F; this.bC = 0.0F; + this.bD = 0.0F; float f = 8.0F; if (this.random.nextFloat() < 0.02F) { EntityHuman entityhuman = this.world.findNearbyPlayer(this, (double) f); if (entityhuman != null) { - this.bV = entityhuman; - this.bH = 10 + this.random.nextInt(20); + this.bW = entityhuman; + this.bI = 10 + this.random.nextInt(20); } else { - this.bD = (this.random.nextFloat() - 0.5F) * 20.0F; + this.bE = (this.random.nextFloat() - 0.5F) * 20.0F; } } - if (this.bV != null) { - this.a(this.bV, 10.0F, (float) this.bp()); - if (this.bH-- <= 0 || this.bV.dead || this.bV.e((Entity) this) > (double) (f * f)) { - this.bV = null; + if (this.bW != null) { + this.a(this.bW, 10.0F, (float) this.bp()); + if (this.bI-- <= 0 || this.bW.dead || this.bW.e((Entity) this) > (double) (f * f)) { + this.bW = null; } } else { if (this.random.nextFloat() < 0.05F) { - this.bD = (this.random.nextFloat() - 0.5F) * 20.0F; + this.bE = (this.random.nextFloat() - 0.5F) * 20.0F; } - this.yaw += this.bD; - this.pitch = this.bF; + this.yaw += this.bE; + this.pitch = this.bG; } boolean flag = this.H(); boolean flag1 = this.J(); if (flag || flag1) { - this.bE = this.random.nextFloat() < 0.8F; + this.bF = this.random.nextFloat() < 0.8F; } } protected void bo() { int i = this.h(); - if (this.bp) { - ++this.bq; - if (this.bq >= i) { - this.bq = 0; - this.bp = false; + if (this.bq) { + ++this.br; + if (this.br >= i) { + this.br = 0; + this.bq = false; } } else { - this.bq = 0; + this.br = 0; } - this.aP = (float) this.bq / (float) i; + this.aQ = (float) this.br / (float) i; } public int bp() { @@ -1853,15 +1873,15 @@ public abstract class EntityLiving extends Entity { int i = this.random.nextInt(2); float f = this.world.difficulty == 3 ? 0.1F : 0.25F; - if (this.random.nextFloat() < 0.07F) { + if (this.random.nextFloat() < 0.1F) { ++i; } - if (this.random.nextFloat() < 0.07F) { + if (this.random.nextFloat() < 0.1F) { ++i; } - if (this.random.nextFloat() < 0.07F) { + if (this.random.nextFloat() < 0.1F) { ++i; } @@ -1986,14 +2006,14 @@ public abstract class EntityLiving extends Entity { protected void bF() { if (this.bD() != null && this.random.nextFloat() < b[this.world.difficulty]) { - EnchantmentManager.a(this.random, this.bD(), 5); + EnchantmentManager.a(this.random, this.bD(), 5 + this.world.difficulty * this.random.nextInt(6)); } for (int i = 0; i < 4; ++i) { ItemStack itemstack = this.q(i); if (itemstack != null && this.random.nextFloat() < c[this.world.difficulty]) { - EnchantmentManager.a(this.random, itemstack, 5); + EnchantmentManager.a(this.random, itemstack, 5 + this.world.difficulty * this.random.nextInt(6)); } } } @@ -2005,9 +2025,9 @@ public abstract class EntityLiving extends Entity { } public void bH() { - if (!this.bp || this.bq >= this.h() / 2 || this.bq < 0) { - this.bq = -1; - this.bp = true; + if (!this.bq || this.br >= this.h() / 2 || this.br < 0) { + this.br = -1; + this.bq = true; if (this.world instanceof WorldServer) { ((WorldServer) this.world).getTracker().a((Entity) this, (Packet) (new Packet18ArmAnimation(this, 1))); } diff --git a/src/main/java/net/minecraft/server/EntityMagmaCube.java b/src/main/java/net/minecraft/server/EntityMagmaCube.java index cacde68a..a6053926 100644 --- a/src/main/java/net/minecraft/server/EntityMagmaCube.java +++ b/src/main/java/net/minecraft/server/EntityMagmaCube.java @@ -6,7 +6,7 @@ public class EntityMagmaCube extends EntitySlime { super(world); this.texture = "/mob/lava.png"; this.fireProof = true; - this.aM = 0.2F; + this.aN = 0.2F; } public boolean canSpawn() { diff --git a/src/main/java/net/minecraft/server/EntityMinecart.java b/src/main/java/net/minecraft/server/EntityMinecart.java index 29edbc3d..7ae71297 100644 --- a/src/main/java/net/minecraft/server/EntityMinecart.java +++ b/src/main/java/net/minecraft/server/EntityMinecart.java @@ -26,11 +26,11 @@ public class EntityMinecart extends Entity implements IInventory { private boolean h; private static final int[][][] matrix = new int[][][] { { { 0, 0, -1}, { 0, 0, 1}}, { { -1, 0, 0}, { 1, 0, 0}}, { { -1, -1, 0}, { 1, 0, 0}}, { { -1, 0, 0}, { 1, -1, 0}}, { { 0, 0, -1}, { 0, -1, 1}}, { { 0, -1, -1}, { 0, 0, 1}}, { { 0, 0, 1}, { 1, 0, 0}}, { { 0, 0, 1}, { -1, 0, 0}}, { { 0, 0, -1}, { -1, 0, 0}}, { { 0, 0, -1}, { 1, 0, 0}}}; private int j; - private double as; private double at; private double au; private double av; private double aw; + private double ax; // CraftBukkit start public boolean slowWhenEmpty = true; @@ -237,7 +237,7 @@ public class EntityMinecart extends Entity implements IInventory { EntityItem entityitem = new EntityItem(this.world, this.locX + (double) f, this.locY + (double) f1, this.locZ + (double) f2, new ItemStack(itemstack.id, j, itemstack.getData())); if (itemstack.hasTag()) { - entityitem.itemStack.setTag((NBTTagCompound) itemstack.getTag().clone()); + entityitem.getItemStack().setTag((NBTTagCompound) itemstack.getTag().clone()); } float f3 = 0.05F; @@ -291,15 +291,57 @@ public class EntityMinecart extends Entity implements IInventory { this.world.addParticle("largesmoke", this.locX, this.locY + 0.8D, this.locZ, 0.0D, 0.0D, 0.0D); } + int i; + + if (!this.world.isStatic && this.world instanceof WorldServer) { + this.world.methodProfiler.a("portal"); + MinecraftServer minecraftserver = ((WorldServer) this.world).getMinecraftServer(); + + i = this.z(); + if (this.ao) { + if (minecraftserver.getAllowNether()) { + if (this.vehicle == null && this.ap++ >= i) { + this.ap = i; + this.portalCooldown = this.ab(); + byte b0; + + if (this.world.worldProvider.dimension == -1) { + b0 = 0; + } else { + b0 = -1; + } + + this.b(b0); + } + + this.ao = false; + } + } else { + if (this.ap > 0) { + this.ap -= 4; + } + + if (this.ap < 0) { + this.ap = 0; + } + } + + if (this.portalCooldown > 0) { + --this.portalCooldown; + } + + this.world.methodProfiler.b(); + } + if (this.world.isStatic) { if (this.j > 0) { - double d0 = this.locX + (this.as - this.locX) / (double) this.j; - double d1 = this.locY + (this.at - this.locY) / (double) this.j; - double d2 = this.locZ + (this.au - this.locZ) / (double) this.j; - double d3 = MathHelper.g(this.av - (double) this.yaw); + double d0 = this.locX + (this.at - this.locX) / (double) this.j; + double d1 = this.locY + (this.au - this.locY) / (double) this.j; + double d2 = this.locZ + (this.av - this.locZ) / (double) this.j; + double d3 = MathHelper.g(this.aw - (double) this.yaw); this.yaw = (float) ((double) this.yaw + d3 / (double) this.j); - this.pitch = (float) ((double) this.pitch + (this.aw - (double) this.pitch) / (double) this.j); + this.pitch = (float) ((double) this.pitch + (this.ax - (double) this.pitch) / (double) this.j); --this.j; this.setPosition(d0, d1, d2); this.b(this.yaw, this.pitch); @@ -312,25 +354,25 @@ public class EntityMinecart extends Entity implements IInventory { this.lastY = this.locY; this.lastZ = this.locZ; this.motY -= 0.03999999910593033D; - int i = MathHelper.floor(this.locX); - int j = MathHelper.floor(this.locY); + int j = MathHelper.floor(this.locX); + i = MathHelper.floor(this.locY); int k = MathHelper.floor(this.locZ); - if (BlockMinecartTrack.e_(this.world, i, j - 1, k)) { - --j; + if (BlockMinecartTrack.e_(this.world, j, i - 1, k)) { + --i; } // CraftBukkit double d4 = this.maxSpeed; double d5 = 0.0078125D; - int l = this.world.getTypeId(i, j, k); + int l = this.world.getTypeId(j, i, k); - if (BlockMinecartTrack.d(l)) { + if (BlockMinecartTrack.e(l)) { this.fallDistance = 0.0F; Vec3D vec3d = this.a(this.locX, this.locY, this.locZ); - int i1 = this.world.getData(i, j, k); + int i1 = this.world.getData(j, i, k); - this.locY = (double) j; + this.locY = (double) i; boolean flag = false; boolean flag1 = false; @@ -344,7 +386,7 @@ public class EntityMinecart extends Entity implements IInventory { } if (i1 >= 2 && i1 <= 5) { - this.locY = (double) (j + 1); + this.locY = (double) (i + 1); } if (i1 == 2) { @@ -405,9 +447,9 @@ public class EntityMinecart extends Entity implements IInventory { } d12 = 0.0D; - d11 = (double) i + 0.5D + (double) aint[0][0] * 0.5D; + d11 = (double) j + 0.5D + (double) aint[0][0] * 0.5D; double d13 = (double) k + 0.5D + (double) aint[0][2] * 0.5D; - double d14 = (double) i + 0.5D + (double) aint[1][0] * 0.5D; + double d14 = (double) j + 0.5D + (double) aint[1][0] * 0.5D; double d15 = (double) k + 0.5D + (double) aint[1][2] * 0.5D; d6 = d14 - d11; @@ -416,11 +458,11 @@ public class EntityMinecart extends Entity implements IInventory { double d17; if (d6 == 0.0D) { - this.locX = (double) i + 0.5D; + this.locX = (double) j + 0.5D; d12 = this.locZ - (double) k; } else if (d7 == 0.0D) { this.locZ = (double) k + 0.5D; - d12 = this.locX - (double) i; + d12 = this.locX - (double) j; } else { d16 = this.locX - d11; d17 = this.locZ - d13; @@ -454,9 +496,9 @@ public class EntityMinecart extends Entity implements IInventory { } this.move(d16, 0.0D, d17); - if (aint[0][1] != 0 && MathHelper.floor(this.locX) - i == aint[0][0] && MathHelper.floor(this.locZ) - k == aint[0][2]) { + if (aint[0][1] != 0 && MathHelper.floor(this.locX) - j == aint[0][0] && MathHelper.floor(this.locZ) - k == aint[0][2]) { this.setPosition(this.locX, this.locY + (double) aint[0][1], this.locZ); - } else if (aint[1][1] != 0 && MathHelper.floor(this.locX) - i == aint[1][0] && MathHelper.floor(this.locZ) - k == aint[1][2]) { + } else if (aint[1][1] != 0 && MathHelper.floor(this.locX) - j == aint[1][0] && MathHelper.floor(this.locZ) - k == aint[1][2]) { this.setPosition(this.locX, this.locY + (double) aint[1][1], this.locZ); } @@ -509,9 +551,9 @@ public class EntityMinecart extends Entity implements IInventory { int j1 = MathHelper.floor(this.locX); int k1 = MathHelper.floor(this.locZ); - if (j1 != i || k1 != k) { + if (j1 != j || k1 != k) { d10 = Math.sqrt(this.motX * this.motX + this.motZ * this.motZ); - this.motX = d10 * (double) (j1 - i); + this.motX = d10 * (double) (j1 - j); this.motZ = d10 * (double) (k1 - k); } @@ -541,15 +583,15 @@ public class EntityMinecart extends Entity implements IInventory { this.motX += this.motX / d21 * d22; this.motZ += this.motZ / d21 * d22; } else if (i1 == 1) { - if (this.world.t(i - 1, j, k)) { + if (this.world.t(j - 1, i, k)) { this.motX = 0.02D; - } else if (this.world.t(i + 1, j, k)) { + } else if (this.world.t(j + 1, i, k)) { this.motX = -0.02D; } } else if (i1 == 0) { - if (this.world.t(i, j, k - 1)) { + if (this.world.t(j, i, k - 1)) { this.motZ = 0.02D; - } else if (this.world.t(i, j, k + 1)) { + } else if (this.world.t(j, i, k + 1)) { this.motZ = -0.02D; } } @@ -666,7 +708,7 @@ public class EntityMinecart extends Entity implements IInventory { int l = this.world.getTypeId(i, j, k); - if (BlockMinecartTrack.d(l)) { + if (BlockMinecartTrack.e(l)) { int i1 = this.world.getData(i, j, k); d1 = (double) j; diff --git a/src/main/java/net/minecraft/server/EntityMonster.java b/src/main/java/net/minecraft/server/EntityMonster.java index 5b9337c8..2b39bbf6 100644 --- a/src/main/java/net/minecraft/server/EntityMonster.java +++ b/src/main/java/net/minecraft/server/EntityMonster.java @@ -6,7 +6,7 @@ public abstract class EntityMonster extends EntityCreature implements IMonster { public EntityMonster(World world) { super(world); - this.bc = 5; + this.bd = 5; } public void c() { @@ -14,7 +14,7 @@ public abstract class EntityMonster extends EntityCreature implements IMonster { float f = this.c(1.0F); if (f > 0.5F) { - this.bA += 2; + this.bB += 2; } super.c(); @@ -99,6 +99,10 @@ public abstract class EntityMonster extends EntityCreature implements IMonster { if (k > 0) { entity.setOnFire(k * 4); } + + if (entity instanceof EntityLiving) { + EnchantmentThorns.a(this, (EntityLiving) entity, this.random); + } } return flag; diff --git a/src/main/java/net/minecraft/server/EntityMushroomCow.java b/src/main/java/net/minecraft/server/EntityMushroomCow.java index a9f69783..29fdc834 100644 --- a/src/main/java/net/minecraft/server/EntityMushroomCow.java +++ b/src/main/java/net/minecraft/server/EntityMushroomCow.java @@ -42,7 +42,7 @@ public class EntityMushroomCow extends EntityCow { entitycow.setPositionRotation(this.locX, this.locY, this.locZ, this.yaw, this.pitch); entitycow.setHealth(this.getHealth()); - entitycow.aw = this.aw; + entitycow.ax = this.ax; this.world.addEntity(entitycow); for (int i = 0; i < 5; ++i) { diff --git a/src/main/java/net/minecraft/server/EntityPigZombie.java b/src/main/java/net/minecraft/server/EntityPigZombie.java index d3bd681e..3a07b622 100644 --- a/src/main/java/net/minecraft/server/EntityPigZombie.java +++ b/src/main/java/net/minecraft/server/EntityPigZombie.java @@ -15,7 +15,7 @@ public class EntityPigZombie extends EntityZombie { public EntityPigZombie(World world) { super(world); this.texture = "/mob/pigzombie.png"; - this.bG = 0.5F; + this.bH = 0.5F; this.fireProof = true; } @@ -24,7 +24,7 @@ public class EntityPigZombie extends EntityZombie { } public void j_() { - this.bG = this.target != null ? 0.95F : 0.5F; + this.bH = this.target != null ? 0.95F : 0.5F; if (this.soundDelay > 0 && --this.soundDelay == 0) { this.makeSound("mob.zombiepig.zpigangry", this.aX() * 2.0F, ((this.random.nextFloat() - this.random.nextFloat()) * 0.2F + 1.0F) * 1.8F); } diff --git a/src/main/java/net/minecraft/server/EntityPlayer.java b/src/main/java/net/minecraft/server/EntityPlayer.java index 775e988b..e2938a76 100644 --- a/src/main/java/net/minecraft/server/EntityPlayer.java +++ b/src/main/java/net/minecraft/server/EntityPlayer.java @@ -20,21 +20,21 @@ import org.bukkit.event.inventory.InventoryType; public class EntityPlayer extends EntityHuman implements ICrafting { private LocaleLanguage locale = new LocaleLanguage("en_US"); - public NetServerHandler netServerHandler; + public PlayerConnection playerConnection; public MinecraftServer server; - public ItemInWorldManager itemInWorldManager; + public PlayerInteractManager playerInteractManager; public double d; public double e; public final List chunkCoordIntPairQueue = new LinkedList(); public final List removeQueue = new LinkedList(); - private int ck = -99999999; private int cl = -99999999; - private boolean cm = true; + private int cm = -99999999; + private boolean cn = true; public int lastSentExp = -99999999; // CraftBukkit - private -> public public int invulnerableTicks = 60; // CraftBukkit - private -> public - private int cp = 0; private int cq = 0; - private boolean cr = true; + private int cr = 0; + private boolean cs = true; private int containerCounter = 0; public boolean h; public int ping; @@ -49,11 +49,11 @@ public class EntityPlayer extends EntityHuman implements ICrafting { public boolean keepLevel = false; // CraftBukkit end - public EntityPlayer(MinecraftServer minecraftserver, World world, String s, ItemInWorldManager iteminworldmanager) { + public EntityPlayer(MinecraftServer minecraftserver, World world, String s, PlayerInteractManager playerinteractmanager) { super(world); - iteminworldmanager.player = this; - this.itemInWorldManager = iteminworldmanager; - this.cp = minecraftserver.getServerConfigurationManager().o(); + playerinteractmanager.player = this; + this.playerInteractManager = playerinteractmanager; + this.cq = minecraftserver.getPlayerList().o(); ChunkCoordinates chunkcoordinates = world.getSpawn(); int i = chunkcoordinates.x; int j = chunkcoordinates.z; @@ -80,14 +80,14 @@ public class EntityPlayer extends EntityHuman implements ICrafting { public void a(NBTTagCompound nbttagcompound) { super.a(nbttagcompound); if (nbttagcompound.hasKey("playerGameType")) { - this.itemInWorldManager.setGameMode(EnumGamemode.a(nbttagcompound.getInt("playerGameType"))); + this.playerInteractManager.setGameMode(EnumGamemode.a(nbttagcompound.getInt("playerGameType"))); } this.getBukkitEntity().readExtraData(nbttagcompound); // CraftBukkit } public void b(NBTTagCompound nbttagcompound) { super.b(nbttagcompound); - nbttagcompound.setInt("playerGameType", this.itemInWorldManager.getGameMode().a()); + nbttagcompound.setInt("playerGameType", this.playerInteractManager.getGameMode().a()); this.getBukkitEntity().setExtraData(nbttagcompound); // CraftBukkit } @@ -112,7 +112,7 @@ public class EntityPlayer extends EntityHuman implements ICrafting { this.setPosition(position.x + 0.5, position.y, position.z + 0.5); } this.dimension = ((WorldServer) this.world).dimension; - this.itemInWorldManager.a((WorldServer) world); + this.playerInteractManager.a((WorldServer) world); } // CraftBukkit end @@ -134,7 +134,7 @@ public class EntityPlayer extends EntityHuman implements ICrafting { } public void j_() { - this.itemInWorldManager.a(); + this.playerInteractManager.a(); --this.invulnerableTicks; this.activeContainer.b(); @@ -149,7 +149,7 @@ public class EntityPlayer extends EntityHuman implements ICrafting { iterator.remove(); } - this.netServerHandler.sendPacket(new Packet29DestroyEntity(aint)); + this.playerConnection.sendPacket(new Packet29DestroyEntity(aint)); } if (!this.chunkCoordIntPairQueue.isEmpty()) { @@ -168,7 +168,7 @@ public class EntityPlayer extends EntityHuman implements ICrafting { } if (!arraylist.isEmpty()) { - this.netServerHandler.sendPacket(new Packet56MapChunkBulk(arraylist)); + this.playerConnection.sendPacket(new Packet56MapChunkBulk(arraylist)); Iterator iterator2 = arraylist1.iterator(); @@ -195,25 +195,25 @@ public class EntityPlayer extends EntityHuman implements ICrafting { for (int i = 0; i < this.inventory.getSize(); ++i) { ItemStack itemstack = this.inventory.getItem(i); - if (itemstack != null && Item.byId[itemstack.id].f() && this.netServerHandler.lowPriorityCount() <= 5) { + if (itemstack != null && Item.byId[itemstack.id].f() && this.playerConnection.lowPriorityCount() <= 5) { Packet packet = ((ItemWorldMapBase) Item.byId[itemstack.id]).c(itemstack, this.world, this); if (packet != null) { - this.netServerHandler.sendPacket(packet); + this.playerConnection.sendPacket(packet); } } } - if (this.getHealth() != this.ck || this.cl != this.foodData.a() || this.foodData.e() == 0.0F != this.cm) { - this.netServerHandler.sendPacket(new Packet8UpdateHealth(this.getHealth(), this.foodData.a(), this.foodData.e())); - this.ck = this.getHealth(); - this.cl = this.foodData.a(); - this.cm = this.foodData.e() == 0.0F; + if (this.getHealth() != this.cl || this.cm != this.foodData.a() || this.foodData.e() == 0.0F != this.cn) { + this.playerConnection.sendPacket(new Packet8UpdateHealth(this.getHealth(), this.foodData.a(), this.foodData.e())); + this.cl = this.getHealth(); + this.cm = this.foodData.a(); + this.cn = this.foodData.e() == 0.0F; } if (this.expTotal != this.lastSentExp) { this.lastSentExp = this.expTotal; - this.netServerHandler.sendPacket(new Packet43SetExperience(this.exp, this.expTotal, this.expLevel)); + this.playerConnection.sendPacket(new Packet43SetExperience(this.exp, this.expTotal, this.expLevel)); } // CraftBukkit start @@ -256,7 +256,7 @@ public class EntityPlayer extends EntityHuman implements ICrafting { String deathMessage = event.getDeathMessage(); if (deathMessage != null && deathMessage.length() > 0) { - this.server.getServerConfigurationManager().sendAll(new Packet3Chat(event.getDeathMessage())); + this.server.getPlayerList().k(event.getDeathMessage()); } // CraftBukkit - we clean the player's inventory after the EntityDeathEvent is called so plugins can get the exact state of the inventory. @@ -284,7 +284,7 @@ public class EntityPlayer extends EntityHuman implements ICrafting { // CraftBukkit - this.server.getPvP() -> this.world.pvpMode boolean flag = this.server.T() && this.world.pvpMode && "fall".equals(damagesource.translationIndex); - if (!flag && this.invulnerableTicks > 0) { + if (!flag && this.invulnerableTicks > 0 && damagesource != DamageSource.OUT_OF_WORLD) { return false; } else { // CraftBukkit - this.server.getPvP() -> this.world.pvpMode @@ -318,7 +318,7 @@ public class EntityPlayer extends EntityHuman implements ICrafting { this.a((Statistic) AchievementList.C); this.world.kill(this); this.viewingCredits = true; - this.netServerHandler.sendPacket(new Packet70Bed(4, 0)); + this.playerConnection.sendPacket(new Packet70Bed(4, 0)); } else { this.a((Statistic) AchievementList.B); /* CraftBukkit start - removed to fix our handling of The End portals @@ -334,10 +334,10 @@ public class EntityPlayer extends EntityHuman implements ICrafting { } // CraftBukkit end */ - this.server.getServerConfigurationManager().changeDimension(this, i); + this.server.getPlayerList().changeDimension(this, i); this.lastSentExp = -1; - this.ck = -1; this.cl = -1; + this.cm = -1; } } @@ -346,7 +346,7 @@ public class EntityPlayer extends EntityHuman implements ICrafting { Packet packet = tileentity.getUpdatePacket(); if (packet != null) { - this.netServerHandler.sendPacket(packet); + this.playerConnection.sendPacket(packet); } } } @@ -363,8 +363,8 @@ public class EntityPlayer extends EntityHuman implements ICrafting { Packet17EntityLocationAction packet17entitylocationaction = new Packet17EntityLocationAction(this, 0, i, j, k); this.p().getTracker().a((Entity) this, (Packet) packet17entitylocationaction); - this.netServerHandler.a(this.locX, this.locY, this.locZ, this.yaw, this.pitch); - this.netServerHandler.sendPacket(packet17entitylocationaction); + this.playerConnection.a(this.locX, this.locY, this.locZ, this.yaw, this.pitch); + this.playerConnection.sendPacket(packet17entitylocationaction); } return enumbedresult; @@ -378,8 +378,8 @@ public class EntityPlayer extends EntityHuman implements ICrafting { } super.a(flag, flag1, flag2); - if (this.netServerHandler != null) { - this.netServerHandler.a(this.locX, this.locY, this.locZ, this.yaw, this.pitch); + if (this.playerConnection != null) { + this.playerConnection.a(this.locX, this.locY, this.locZ, this.yaw, this.pitch); } } @@ -395,8 +395,8 @@ public class EntityPlayer extends EntityHuman implements ICrafting { super.setPassengerOf(entity); // CraftBukkit end - this.netServerHandler.sendPacket(new Packet39AttachEntity(this, this.vehicle)); - this.netServerHandler.a(this.locX, this.locY, this.locZ, this.yaw, this.pitch); + this.playerConnection.sendPacket(new Packet39AttachEntity(this, this.vehicle)); + this.playerConnection.a(this.locX, this.locY, this.locZ, this.yaw, this.pitch); } protected void a(double d0, boolean flag) {} @@ -417,7 +417,7 @@ public class EntityPlayer extends EntityHuman implements ICrafting { // CraftBukkit end this.nextContainerCounter(); - this.netServerHandler.sendPacket(new Packet100OpenWindow(this.containerCounter, 1, "Crafting", 9)); + this.playerConnection.sendPacket(new Packet100OpenWindow(this.containerCounter, 1, "Crafting", 9)); this.activeContainer = container; // CraftBukkit - Use container we passed to event this.activeContainer.windowId = this.containerCounter; this.activeContainer.addSlotListener(this); @@ -430,7 +430,7 @@ public class EntityPlayer extends EntityHuman implements ICrafting { // CraftBukkit end this.nextContainerCounter(); - this.netServerHandler.sendPacket(new Packet100OpenWindow(this.containerCounter, 4, "Enchanting", 9)); + this.playerConnection.sendPacket(new Packet100OpenWindow(this.containerCounter, 4, "Enchanting", 9)); this.activeContainer = container; // CraftBukkit - Use container we passed to event this.activeContainer.windowId = this.containerCounter; this.activeContainer.addSlotListener(this); @@ -443,7 +443,7 @@ public class EntityPlayer extends EntityHuman implements ICrafting { // CraftBukkit end this.nextContainerCounter(); - this.netServerHandler.sendPacket(new Packet100OpenWindow(this.containerCounter, 8, "Repairing", 9)); + this.playerConnection.sendPacket(new Packet100OpenWindow(this.containerCounter, 8, "Repairing", 9)); this.activeContainer = container; // CraftBukkit - use container we passed to event this.activeContainer.windowId = this.containerCounter; this.activeContainer.addSlotListener(this); @@ -460,7 +460,7 @@ public class EntityPlayer extends EntityHuman implements ICrafting { // CraftBukkit end this.nextContainerCounter(); - this.netServerHandler.sendPacket(new Packet100OpenWindow(this.containerCounter, 0, iinventory.getName(), iinventory.getSize())); + this.playerConnection.sendPacket(new Packet100OpenWindow(this.containerCounter, 0, iinventory.getName(), iinventory.getSize())); this.activeContainer = container; // CraftBukkit - Use container passed to event this.activeContainer.windowId = this.containerCounter; this.activeContainer.addSlotListener(this); @@ -473,7 +473,7 @@ public class EntityPlayer extends EntityHuman implements ICrafting { // CraftBukkit end this.nextContainerCounter(); - this.netServerHandler.sendPacket(new Packet100OpenWindow(this.containerCounter, 2, tileentityfurnace.getName(), tileentityfurnace.getSize())); + this.playerConnection.sendPacket(new Packet100OpenWindow(this.containerCounter, 2, tileentityfurnace.getName(), tileentityfurnace.getSize())); this.activeContainer = container; // CraftBukkit - Use container passed to event this.activeContainer.windowId = this.containerCounter; this.activeContainer.addSlotListener(this); @@ -486,7 +486,7 @@ public class EntityPlayer extends EntityHuman implements ICrafting { // CraftBukkit end this.nextContainerCounter(); - this.netServerHandler.sendPacket(new Packet100OpenWindow(this.containerCounter, 3, tileentitydispenser.getName(), tileentitydispenser.getSize())); + this.playerConnection.sendPacket(new Packet100OpenWindow(this.containerCounter, 3, tileentitydispenser.getName(), tileentitydispenser.getSize())); this.activeContainer = container; // CraftBukkit - Use container passed to event this.activeContainer.windowId = this.containerCounter; this.activeContainer.addSlotListener(this); @@ -499,7 +499,7 @@ public class EntityPlayer extends EntityHuman implements ICrafting { // CraftBukkit end this.nextContainerCounter(); - this.netServerHandler.sendPacket(new Packet100OpenWindow(this.containerCounter, 5, tileentitybrewingstand.getName(), tileentitybrewingstand.getSize())); + this.playerConnection.sendPacket(new Packet100OpenWindow(this.containerCounter, 5, tileentitybrewingstand.getName(), tileentitybrewingstand.getSize())); this.activeContainer = container; // CraftBukkit - Use container passed to event this.activeContainer.windowId = this.containerCounter; this.activeContainer.addSlotListener(this); @@ -512,7 +512,7 @@ public class EntityPlayer extends EntityHuman implements ICrafting { // CraftBukkit end this.nextContainerCounter(); - this.netServerHandler.sendPacket(new Packet100OpenWindow(this.containerCounter, 7, tileentitybeacon.getName(), tileentitybeacon.getSize())); + this.playerConnection.sendPacket(new Packet100OpenWindow(this.containerCounter, 7, tileentitybeacon.getName(), tileentitybeacon.getSize())); this.activeContainer = container; // CraftBukkit - Use container passed to event this.activeContainer.windowId = this.containerCounter; this.activeContainer.addSlotListener(this); @@ -530,7 +530,7 @@ public class EntityPlayer extends EntityHuman implements ICrafting { this.activeContainer.addSlotListener(this); InventoryMerchant inventorymerchant = ((ContainerMerchant) this.activeContainer).getMerchantInventory(); - this.netServerHandler.sendPacket(new Packet100OpenWindow(this.containerCounter, 6, inventorymerchant.getName(), inventorymerchant.getSize())); + this.playerConnection.sendPacket(new Packet100OpenWindow(this.containerCounter, 6, inventorymerchant.getName(), inventorymerchant.getSize())); MerchantRecipeList merchantrecipelist = imerchant.getOffers(this); if (merchantrecipelist != null) { @@ -540,7 +540,7 @@ public class EntityPlayer extends EntityHuman implements ICrafting { dataoutputstream.writeInt(this.containerCounter); merchantrecipelist.a(dataoutputstream); - this.netServerHandler.sendPacket(new Packet250CustomPayload("MC|TrList", bytearrayoutputstream.toByteArray())); + this.playerConnection.sendPacket(new Packet250CustomPayload("MC|TrList", bytearrayoutputstream.toByteArray())); } catch (IOException ioexception) { ioexception.printStackTrace(); } @@ -550,7 +550,7 @@ public class EntityPlayer extends EntityHuman implements ICrafting { public void a(Container container, int i, ItemStack itemstack) { if (!(container.getSlot(i) instanceof SlotResult)) { if (!this.h) { - this.netServerHandler.sendPacket(new Packet103SetSlot(container.windowId, i, itemstack)); + this.playerConnection.sendPacket(new Packet103SetSlot(container.windowId, i, itemstack)); } } } @@ -560,27 +560,27 @@ public class EntityPlayer extends EntityHuman implements ICrafting { } public void a(Container container, List list) { - this.netServerHandler.sendPacket(new Packet104WindowItems(container.windowId, list)); - this.netServerHandler.sendPacket(new Packet103SetSlot(-1, -1, this.inventory.getCarried())); + this.playerConnection.sendPacket(new Packet104WindowItems(container.windowId, list)); + this.playerConnection.sendPacket(new Packet103SetSlot(-1, -1, this.inventory.getCarried())); // CraftBukkit start - send a Set Slot to update the crafting result slot if (java.util.EnumSet.of(InventoryType.CRAFTING,InventoryType.WORKBENCH).contains(container.getBukkitView().getType())) { - this.netServerHandler.sendPacket(new Packet103SetSlot(container.windowId, 0, container.getSlot(0).getItem())); + this.playerConnection.sendPacket(new Packet103SetSlot(container.windowId, 0, container.getSlot(0).getItem())); } // CraftBukkit end } public void setContainerData(Container container, int i, int j) { - this.netServerHandler.sendPacket(new Packet105CraftProgressBar(container.windowId, i, j)); + this.playerConnection.sendPacket(new Packet105CraftProgressBar(container.windowId, i, j)); } public void closeInventory() { - this.netServerHandler.sendPacket(new Packet101CloseWindow(this.activeContainer.windowId)); + this.playerConnection.sendPacket(new Packet101CloseWindow(this.activeContainer.windowId)); this.k(); } public void broadcastCarriedItem() { if (!this.h) { - this.netServerHandler.sendPacket(new Packet103SetSlot(-1, -1, this.inventory.getCarried())); + this.playerConnection.sendPacket(new Packet103SetSlot(-1, -1, this.inventory.getCarried())); } } @@ -593,11 +593,11 @@ public class EntityPlayer extends EntityHuman implements ICrafting { if (statistic != null) { if (!statistic.f) { while (i > 100) { - this.netServerHandler.sendPacket(new Packet200Statistic(statistic.e, 100)); + this.playerConnection.sendPacket(new Packet200Statistic(statistic.e, 100)); i -= 100; } - this.netServerHandler.sendPacket(new Packet200Statistic(statistic.e, i)); + this.playerConnection.sendPacket(new Packet200Statistic(statistic.e, i)); } } } @@ -617,7 +617,7 @@ public class EntityPlayer extends EntityHuman implements ICrafting { } public void m() { - this.ck = -99999999; + this.cl = -99999999; this.lastSentExp = -1; // CraftBukkit - Added to reset } @@ -625,17 +625,17 @@ public class EntityPlayer extends EntityHuman implements ICrafting { LocaleLanguage localelanguage = LocaleLanguage.a(); String s1 = localelanguage.b(s); - this.netServerHandler.sendPacket(new Packet3Chat(s1)); + this.playerConnection.sendPacket(new Packet3Chat(s1)); } protected void n() { - this.netServerHandler.sendPacket(new Packet38EntityStatus(this.id, (byte) 9)); + this.playerConnection.sendPacket(new Packet38EntityStatus(this.id, (byte) 9)); super.n(); } public void a(ItemStack itemstack, int i) { super.a(itemstack, i); - if (itemstack != null && itemstack.getItem() != null && itemstack.getItem().d_(itemstack) == EnumAnimation.b) { + if (itemstack != null && itemstack.getItem() != null && itemstack.getItem().b_(itemstack) == EnumAnimation.b) { this.p().getTracker().sendPacketToEntity(this, new Packet18ArmAnimation(this, 5)); } } @@ -643,28 +643,28 @@ public class EntityPlayer extends EntityHuman implements ICrafting { public void copyTo(EntityHuman entityhuman, boolean flag) { super.copyTo(entityhuman, flag); this.lastSentExp = -1; - this.ck = -1; this.cl = -1; + this.cm = -1; this.removeQueue.addAll(((EntityPlayer) entityhuman).removeQueue); } protected void a(MobEffect mobeffect) { super.a(mobeffect); - this.netServerHandler.sendPacket(new Packet41MobEffect(this.id, mobeffect)); + this.playerConnection.sendPacket(new Packet41MobEffect(this.id, mobeffect)); } protected void b(MobEffect mobeffect) { super.b(mobeffect); - this.netServerHandler.sendPacket(new Packet41MobEffect(this.id, mobeffect)); + this.playerConnection.sendPacket(new Packet41MobEffect(this.id, mobeffect)); } protected void c(MobEffect mobeffect) { super.c(mobeffect); - this.netServerHandler.sendPacket(new Packet42RemoveMobEffect(this.id, mobeffect)); + this.playerConnection.sendPacket(new Packet42RemoveMobEffect(this.id, mobeffect)); } public void enderTeleportTo(double d0, double d1, double d2) { - this.netServerHandler.a(d0, d1, d2, this.yaw, this.pitch); + this.playerConnection.a(d0, d1, d2, this.yaw, this.pitch); } public void b(Entity entity) { @@ -676,8 +676,8 @@ public class EntityPlayer extends EntityHuman implements ICrafting { } public void updateAbilities() { - if (this.netServerHandler != null) { - this.netServerHandler.sendPacket(new Packet202Abilities(this.abilities)); + if (this.playerConnection != null) { + this.playerConnection.sendPacket(new Packet202Abilities(this.abilities)); } } @@ -686,20 +686,20 @@ public class EntityPlayer extends EntityHuman implements ICrafting { } public void a(EnumGamemode enumgamemode) { - this.itemInWorldManager.setGameMode(enumgamemode); - this.netServerHandler.sendPacket(new Packet70Bed(3, enumgamemode.a())); + this.playerInteractManager.setGameMode(enumgamemode); + this.playerConnection.sendPacket(new Packet70Bed(3, enumgamemode.a())); } public void sendMessage(String s) { - this.netServerHandler.sendPacket(new Packet3Chat(s)); + this.playerConnection.sendPacket(new Packet3Chat(s)); } public boolean a(int i, String s) { - return "seed".equals(s) && !this.server.T() ? true : (!"tell".equals(s) && !"help".equals(s) && !"me".equals(s) ? this.server.getServerConfigurationManager().isOp(this.name) : true); + return "seed".equals(s) && !this.server.T() ? true : (!"tell".equals(s) && !"help".equals(s) && !"me".equals(s) ? this.server.getPlayerList().isOp(this.name) : true); } public String q() { - String s = this.netServerHandler.networkManager.getSocketAddress().toString(); + String s = this.playerConnection.networkManager.getSocketAddress().toString(); s = s.substring(s.indexOf("/") + 1); s = s.substring(0, s.indexOf(":")); @@ -714,11 +714,11 @@ public class EntityPlayer extends EntityHuman implements ICrafting { int i = 256 >> packet204localeandviewdistance.f(); if (i > 3 && i < 15) { - this.cp = i; + this.cq = i; } - this.cq = packet204localeandviewdistance.g(); - this.cr = packet204localeandviewdistance.h(); + this.cr = packet204localeandviewdistance.g(); + this.cs = packet204localeandviewdistance.h(); if (this.server.I() && this.server.H().equals(this.name)) { this.server.c(packet204localeandviewdistance.i()); } @@ -731,13 +731,13 @@ public class EntityPlayer extends EntityHuman implements ICrafting { } public int getChatFlags() { - return this.cq; + return this.cr; } public void a(String s, int i) { String s1 = s + "\0" + i; // CraftBukkit - fix decompile error - this.netServerHandler.sendPacket(new Packet250CustomPayload("MC|TPack", s1.getBytes())); + this.playerConnection.sendPacket(new Packet250CustomPayload("MC|TPack", s1.getBytes())); } public ChunkCoordinates b() { diff --git a/src/main/java/net/minecraft/server/EntityPotion.java b/src/main/java/net/minecraft/server/EntityPotion.java index cf734a1b..aa6def05 100644 --- a/src/main/java/net/minecraft/server/EntityPotion.java +++ b/src/main/java/net/minecraft/server/EntityPotion.java @@ -62,7 +62,7 @@ public class EntityPotion extends EntityProjectile { protected void a(MovingObjectPosition movingobjectposition) { if (!this.world.isStatic) { - List list = Item.POTION.l(this.c); + List list = Item.POTION.g(this.c); if (list != null && !list.isEmpty()) { AxisAlignedBB axisalignedbb = this.boundingBox.grow(4.0D, 2.0D, 4.0D); diff --git a/src/main/java/net/minecraft/server/EntitySilverfish.java b/src/main/java/net/minecraft/server/EntitySilverfish.java index 5ccb3ab6..7b524cda 100644 --- a/src/main/java/net/minecraft/server/EntitySilverfish.java +++ b/src/main/java/net/minecraft/server/EntitySilverfish.java @@ -10,7 +10,7 @@ public class EntitySilverfish extends EntityMonster { super(world); this.texture = "/mob/silverfish.png"; this.a(0.3F, 0.7F); - this.bG = 0.6F; + this.bH = 0.6F; } public int getMaxHealth() { @@ -54,7 +54,7 @@ public class EntitySilverfish extends EntityMonster { protected void a(Entity entity, float f) { if (this.attackTicks <= 0 && f < 1.2F && entity.boundingBox.e > this.boundingBox.b && entity.boundingBox.b < this.boundingBox.e) { this.attackTicks = 20; - entity.damageEntity(DamageSource.mobAttack(this), this.c(entity)); + this.m(entity); } } @@ -67,7 +67,7 @@ public class EntitySilverfish extends EntityMonster { } public void j_() { - this.aw = this.yaw; + this.ax = this.yaw; super.j_(); } diff --git a/src/main/java/net/minecraft/server/EntitySkeleton.java b/src/main/java/net/minecraft/server/EntitySkeleton.java index aba1e88c..4ea580be 100644 --- a/src/main/java/net/minecraft/server/EntitySkeleton.java +++ b/src/main/java/net/minecraft/server/EntitySkeleton.java @@ -12,11 +12,11 @@ public class EntitySkeleton extends EntityMonster implements IRangedEntity { public EntitySkeleton(World world) { super(world); this.texture = "/mob/skeleton.png"; - this.bG = 0.25F; + this.bH = 0.25F; this.goalSelector.a(1, new PathfinderGoalFloat(this)); this.goalSelector.a(2, new PathfinderGoalRestrictSun(this)); - this.goalSelector.a(3, new PathfinderGoalFleeSun(this, this.bG)); - this.goalSelector.a(5, new PathfinderGoalRandomStroll(this, this.bG)); + this.goalSelector.a(3, new PathfinderGoalFleeSun(this, this.bH)); + this.goalSelector.a(5, new PathfinderGoalRandomStroll(this, this.bH)); this.goalSelector.a(6, new PathfinderGoalLookAtPlayer(this, EntityHuman.class, 8.0F)); this.goalSelector.a(6, new PathfinderGoalRandomLookaround(this)); this.targetSelector.a(1, new PathfinderGoalHurtByTarget(this, false)); @@ -201,11 +201,7 @@ public class EntitySkeleton extends EntityMonster implements IRangedEntity { this.bF(); } - if (this.random.nextFloat() >= as[this.world.difficulty]) { - ; - } - - this.canPickUpLoot = true; + this.canPickUpLoot = this.random.nextFloat() < at[this.world.difficulty]; if (this.getEquipment(4) == null) { Calendar calendar = this.world.T(); diff --git a/src/main/java/net/minecraft/server/EntitySlime.java b/src/main/java/net/minecraft/server/EntitySlime.java index c57aa010..54e50d13 100644 --- a/src/main/java/net/minecraft/server/EntitySlime.java +++ b/src/main/java/net/minecraft/server/EntitySlime.java @@ -30,7 +30,7 @@ public class EntitySlime extends EntityLiving implements IMonster { this.a(0.6F * (float) i, 0.6F * (float) i); this.setPosition(this.locX, this.locY, this.locZ); this.setHealth(this.getMaxHealth()); - this.bc = i; + this.bd = i; } public int getMaxHealth() { @@ -115,17 +115,17 @@ public class EntitySlime extends EntityLiving implements IMonster { this.jumpDelay /= 3; } - this.bE = true; + this.bF = true; if (this.q()) { this.makeSound(this.n(), this.aX(), ((this.random.nextFloat() - this.random.nextFloat()) * 0.2F + 1.0F) * 0.8F); } - this.bB = 1.0F - this.random.nextFloat() * 2.0F; - this.bC = (float) (1 * this.getSize()); + this.bC = 1.0F - this.random.nextFloat() * 2.0F; + this.bD = (float) (1 * this.getSize()); } else { - this.bE = false; + this.bF = false; if (this.onGround) { - this.bB = this.bC = 0.0F; + this.bC = this.bD = 0.0F; } } } diff --git a/src/main/java/net/minecraft/server/EntitySpider.java b/src/main/java/net/minecraft/server/EntitySpider.java index c3cfa283..9b466d49 100644 --- a/src/main/java/net/minecraft/server/EntitySpider.java +++ b/src/main/java/net/minecraft/server/EntitySpider.java @@ -8,7 +8,7 @@ public class EntitySpider extends EntityMonster { super(world); this.texture = "/mob/spider.png"; this.a(1.4F, 0.9F); - this.bG = 0.8F; + this.bH = 0.8F; } protected void a() { diff --git a/src/main/java/net/minecraft/server/EntitySquid.java b/src/main/java/net/minecraft/server/EntitySquid.java index 60218796..961d83a4 100644 --- a/src/main/java/net/minecraft/server/EntitySquid.java +++ b/src/main/java/net/minecraft/server/EntitySquid.java @@ -11,19 +11,19 @@ public class EntitySquid extends EntityWaterAnimal { public float h = 0.0F; public float i = 0.0F; public float j = 0.0F; - public float bI = 0.0F; - private float bJ = 0.0F; + public float bJ = 0.0F; private float bK = 0.0F; private float bL = 0.0F; private float bM = 0.0F; private float bN = 0.0F; private float bO = 0.0F; + private float bP = 0.0F; public EntitySquid(World world) { super(world); this.texture = "/mob/squid.png"; this.a(0.95F, 0.95F); - this.bK = 1.0F / (this.random.nextFloat() + 1.0F) * 0.2F; + this.bL = 1.0F / (this.random.nextFloat() + 1.0F) * 0.2F; } public int getMaxHealth() { @@ -72,12 +72,12 @@ public class EntitySquid extends EntityWaterAnimal { this.e = this.d; this.g = this.f; this.i = this.h; - this.bI = this.j; - this.h += this.bK; + this.bJ = this.j; + this.h += this.bL; if (this.h > 6.2831855F) { this.h -= 6.2831855F; if (this.random.nextInt(10) == 0) { - this.bK = 1.0F / (this.random.nextFloat() + 1.0F) * 0.2F; + this.bL = 1.0F / (this.random.nextFloat() + 1.0F) * 0.2F; } } @@ -88,28 +88,28 @@ public class EntitySquid extends EntityWaterAnimal { f = this.h / 3.1415927F; this.j = MathHelper.sin(f * f * 3.1415927F) * 3.1415927F * 0.25F; if ((double) f > 0.75D) { - this.bJ = 1.0F; - this.bL = 1.0F; + this.bK = 1.0F; + this.bM = 1.0F; } else { - this.bL *= 0.8F; + this.bM *= 0.8F; } } else { this.j = 0.0F; - this.bJ *= 0.9F; - this.bL *= 0.99F; + this.bK *= 0.9F; + this.bM *= 0.99F; } if (!this.world.isStatic) { - this.motX = (double) (this.bM * this.bJ); - this.motY = (double) (this.bN * this.bJ); - this.motZ = (double) (this.bO * this.bJ); + this.motX = (double) (this.bN * this.bK); + this.motY = (double) (this.bO * this.bK); + this.motZ = (double) (this.bP * this.bK); } f = MathHelper.sqrt(this.motX * this.motX + this.motZ * this.motZ); // CraftBukkit - Math -> TrigMath - this.aw += (-((float) TrigMath.atan2(this.motX, this.motZ)) * 180.0F / 3.1415927F - this.aw) * 0.1F; - this.yaw = this.aw; - this.f += 3.1415927F * this.bL * 1.5F; + this.ax += (-((float) TrigMath.atan2(this.motX, this.motZ)) * 180.0F / 3.1415927F - this.ax) * 0.1F; + this.yaw = this.ax; + this.f += 3.1415927F * this.bM * 1.5F; // CraftBukkit - Math -> TrigMath this.d += (-((float) TrigMath.atan2((double) f, this.motY)) * 180.0F / 3.1415927F - this.d) * 0.1F; } else { @@ -130,15 +130,15 @@ public class EntitySquid extends EntityWaterAnimal { } protected void bn() { - ++this.bA; - if (this.bA > 100) { - this.bM = this.bN = this.bO = 0.0F; - } else if (this.random.nextInt(50) == 0 || !this.ad || this.bM == 0.0F && this.bN == 0.0F && this.bO == 0.0F) { + ++this.bB; + if (this.bB > 100) { + this.bN = this.bO = this.bP = 0.0F; + } else if (this.random.nextInt(50) == 0 || !this.ad || this.bN == 0.0F && this.bO == 0.0F && this.bP == 0.0F) { float f = this.random.nextFloat() * 3.1415927F * 2.0F; - this.bM = MathHelper.cos(f) * 0.2F; - this.bN = -0.1F + this.random.nextFloat() * 0.2F; - this.bO = MathHelper.sin(f) * 0.2F; + this.bN = MathHelper.cos(f) * 0.2F; + this.bO = -0.1F + this.random.nextFloat() * 0.2F; + this.bP = MathHelper.sin(f) * 0.2F; } this.bk(); diff --git a/src/main/java/net/minecraft/server/EntityTracker.java b/src/main/java/net/minecraft/server/EntityTracker.java index f0ae58f5..d2d6ff0d 100644 --- a/src/main/java/net/minecraft/server/EntityTracker.java +++ b/src/main/java/net/minecraft/server/EntityTracker.java @@ -14,7 +14,7 @@ public class EntityTracker { public EntityTracker(WorldServer worldserver) { this.world = worldserver; - this.d = worldserver.getMinecraftServer().getServerConfigurationManager().a(); + this.d = worldserver.getMinecraftServer().getPlayerList().a(); } // CraftBukkit - synchronized @@ -51,6 +51,8 @@ public class EntityTracker { this.addEntity(entity, 64, 10, true); } else if (entity instanceof EntityThrownExpBottle) { this.addEntity(entity, 64, 10, true); + } else if (entity instanceof EntityFireworks) { + this.addEntity(entity, 64, 10, true); } else if (entity instanceof EntityItem) { this.addEntity(entity, 64, 20, true); } else if (entity instanceof EntityMinecart) { diff --git a/src/main/java/net/minecraft/server/EntityTrackerEntry.java b/src/main/java/net/minecraft/server/EntityTrackerEntry.java index acb36376..a026c4ce 100644 --- a/src/main/java/net/minecraft/server/EntityTrackerEntry.java +++ b/src/main/java/net/minecraft/server/EntityTrackerEntry.java @@ -86,11 +86,11 @@ public class EntityTrackerEntry { EntityPlayer j2 = (EntityPlayer) j1; i7.a(j2, i5); - if (j2.netServerHandler.lowPriorityCount() <= 5) { + if (j2.playerConnection.lowPriorityCount() <= 5) { Packet j3 = Item.MAP.c(i5, this.tracker.world, j2); if (j3 != null) { - j2.netServerHandler.sendPacket(j3); + j2.playerConnection.sendPacket(j3); } } } @@ -107,9 +107,9 @@ public class EntityTrackerEntry { if (this.tracker.vehicle == null) { ++this.u; - i = this.tracker.ar.a(this.tracker.locX); + i = this.tracker.as.a(this.tracker.locX); j = MathHelper.floor(this.tracker.locY * 32.0D); - int k = this.tracker.ar.a(this.tracker.locZ); + int k = this.tracker.as.a(this.tracker.locZ); int l = MathHelper.d(this.tracker.yaw * 256.0F / 360.0F); int i1 = MathHelper.d(this.tracker.pitch * 256.0F / 360.0F); int j1 = i - this.xLoc; @@ -200,9 +200,9 @@ public class EntityTrackerEntry { this.xRot = j; } - this.xLoc = this.tracker.ar.a(this.tracker.locX); + this.xLoc = this.tracker.as.a(this.tracker.locX); this.yLoc = MathHelper.floor(this.tracker.locY * 32.0D); - this.zLoc = this.tracker.ar.a(this.tracker.locZ); + this.zLoc = this.tracker.as.a(this.tracker.locZ); DataWatcher datawatcher2 = this.tracker.getDataWatcher(); if (datawatcher2.a()) { @@ -254,14 +254,14 @@ public class EntityTrackerEntry { while (iterator.hasNext()) { EntityPlayer entityplayer = (EntityPlayer) iterator.next(); - entityplayer.netServerHandler.sendPacket(packet); + entityplayer.playerConnection.sendPacket(packet); } } public void broadcastIncludingSelf(Packet packet) { this.broadcast(packet); if (this.tracker instanceof EntityPlayer) { - ((EntityPlayer) this.tracker).netServerHandler.sendPacket(packet); + ((EntityPlayer) this.tracker).playerConnection.sendPacket(packet); } } @@ -303,20 +303,20 @@ public class EntityTrackerEntry { this.trackedPlayers.add(entityplayer); Packet packet = this.b(); - entityplayer.netServerHandler.sendPacket(packet); - if (this.tracker instanceof EntityItemFrame) { - entityplayer.netServerHandler.sendPacket(new Packet40EntityMetadata(this.tracker.id, this.tracker.getDataWatcher(), true)); + entityplayer.playerConnection.sendPacket(packet); + if (!this.tracker.getDataWatcher().d()) { + entityplayer.playerConnection.sendPacket(new Packet40EntityMetadata(this.tracker.id, this.tracker.getDataWatcher(), true)); } this.j = this.tracker.motX; this.k = this.tracker.motY; this.l = this.tracker.motZ; if (this.isMoving && !(packet instanceof Packet24MobSpawn)) { - entityplayer.netServerHandler.sendPacket(new Packet28EntityVelocity(this.tracker.id, this.tracker.motX, this.tracker.motY, this.tracker.motZ)); + entityplayer.playerConnection.sendPacket(new Packet28EntityVelocity(this.tracker.id, this.tracker.motX, this.tracker.motY, this.tracker.motZ)); } if (this.tracker.vehicle != null) { - entityplayer.netServerHandler.sendPacket(new Packet39AttachEntity(this.tracker, this.tracker.vehicle)); + entityplayer.playerConnection.sendPacket(new Packet39AttachEntity(this.tracker, this.tracker.vehicle)); } if (this.tracker instanceof EntityLiving) { @@ -324,7 +324,7 @@ public class EntityTrackerEntry { ItemStack itemstack = ((EntityLiving) this.tracker).getEquipment(i); if (itemstack != null) { - entityplayer.netServerHandler.sendPacket(new Packet5EntityEquipment(this.tracker.id, i, itemstack)); + entityplayer.playerConnection.sendPacket(new Packet5EntityEquipment(this.tracker.id, i, itemstack)); } } } @@ -333,7 +333,7 @@ public class EntityTrackerEntry { EntityHuman entityhuman = (EntityHuman) this.tracker; if (entityhuman.isSleeping()) { - entityplayer.netServerHandler.sendPacket(new Packet17EntityLocationAction(this.tracker, 0, MathHelper.floor(this.tracker.locX), MathHelper.floor(this.tracker.locY), MathHelper.floor(this.tracker.locZ))); + entityplayer.playerConnection.sendPacket(new Packet17EntityLocationAction(this.tracker, 0, MathHelper.floor(this.tracker.locX), MathHelper.floor(this.tracker.locY), MathHelper.floor(this.tracker.locZ))); } } @@ -349,7 +349,7 @@ public class EntityTrackerEntry { while (iterator.hasNext()) { MobEffect mobeffect = (MobEffect) iterator.next(); - entityplayer.netServerHandler.sendPacket(new Packet41MobEffect(this.tracker.id, mobeffect)); + entityplayer.playerConnection.sendPacket(new Packet41MobEffect(this.tracker.id, mobeffect)); } } } @@ -361,7 +361,7 @@ public class EntityTrackerEntry { } private boolean d(EntityPlayer entityplayer) { - return entityplayer.p().getPlayerManager().a(entityplayer, this.tracker.ai, this.tracker.ak); + return entityplayer.p().getPlayerChunkMap().a(entityplayer, this.tracker.ai, this.tracker.ak); } public void scanPlayers(List list) { @@ -379,13 +379,7 @@ public class EntityTrackerEntry { } if (this.tracker instanceof EntityItem) { - EntityItem entityitem = (EntityItem) this.tracker; - Packet21PickupSpawn entityminecart0 = new Packet21PickupSpawn(entityitem); - - entityitem.locX = (double) entityminecart0.b / 32.0D; - entityitem.locY = (double) entityminecart0.c / 32.0D; - entityitem.locZ = (double) entityminecart0.d / 32.0D; - return entityminecart0; + return new Packet23VehicleSpawn(this.tracker, 2, 1); } else if (this.tracker instanceof EntityPlayer) { return new Packet20NamedEntitySpawn((EntityHuman) this.tracker); } else { @@ -426,6 +420,8 @@ public class EntityTrackerEntry { return new Packet23VehicleSpawn(this.tracker, 65); } else if (this.tracker instanceof EntityEnderSignal) { return new Packet23VehicleSpawn(this.tracker, 72); + } else if (this.tracker instanceof EntityFireworks) { + return new Packet23VehicleSpawn(this.tracker, 76); } else { Packet23VehicleSpawn packet23vehiclespawn; diff --git a/src/main/java/net/minecraft/server/EntityWitch.java b/src/main/java/net/minecraft/server/EntityWitch.java index 5d0c6b6a..f7a32e5f 100644 --- a/src/main/java/net/minecraft/server/EntityWitch.java +++ b/src/main/java/net/minecraft/server/EntityWitch.java @@ -11,10 +11,10 @@ public class EntityWitch extends EntityMonster implements IRangedEntity { public EntityWitch(World world) { super(world); this.texture = "/mob/villager/witch.png"; - this.bG = 0.25F; + this.bH = 0.25F; this.goalSelector.a(1, new PathfinderGoalFloat(this)); - this.goalSelector.a(2, new PathfinderGoalArrowAttack(this, this.bG, 60, 10.0F)); - this.goalSelector.a(2, new PathfinderGoalRandomStroll(this, this.bG)); + this.goalSelector.a(2, new PathfinderGoalArrowAttack(this, this.bH, 60, 10.0F)); + this.goalSelector.a(2, new PathfinderGoalRandomStroll(this, this.bH)); this.goalSelector.a(3, new PathfinderGoalLookAtPlayer(this, EntityHuman.class, 8.0F)); this.goalSelector.a(3, new PathfinderGoalRandomLookaround(this)); this.targetSelector.a(1, new PathfinderGoalHurtByTarget(this, false)); @@ -63,7 +63,7 @@ public class EntityWitch extends EntityMonster implements IRangedEntity { this.setEquipment(0, (ItemStack) null); if (itemstack != null && itemstack.id == Item.POTION.id) { - List list = Item.POTION.l(itemstack); + List list = Item.POTION.g(itemstack); if (list != null) { Iterator iterator = list.iterator(); diff --git a/src/main/java/net/minecraft/server/EntityWither.java b/src/main/java/net/minecraft/server/EntityWither.java index 8cf3a5cc..45bcf23e 100644 --- a/src/main/java/net/minecraft/server/EntityWither.java +++ b/src/main/java/net/minecraft/server/EntityWither.java @@ -16,7 +16,7 @@ public class EntityWither extends EntityMonster implements IRangedEntity { private int[] h = new int[2]; private int[] i = new int[2]; private int j; - private static final IEntitySelector bI = new EntitySelectorNotUndead(); + private static final IEntitySelector bJ = new EntitySelectorNotUndead(); public EntityWither(World world) { super(world); @@ -24,16 +24,16 @@ public class EntityWither extends EntityMonster implements IRangedEntity { this.texture = "/mob/wither.png"; this.a(0.9F, 4.0F); this.fireProof = true; - this.bG = 0.6F; + this.bH = 0.6F; this.getNavigation().e(true); this.goalSelector.a(0, new PathfinderGoalFloat(this)); - this.goalSelector.a(2, new PathfinderGoalArrowAttack(this, this.bG, 40, 20.0F)); - this.goalSelector.a(5, new PathfinderGoalRandomStroll(this, this.bG)); + this.goalSelector.a(2, new PathfinderGoalArrowAttack(this, this.bH, 40, 20.0F)); + this.goalSelector.a(5, new PathfinderGoalRandomStroll(this, this.bH)); this.goalSelector.a(6, new PathfinderGoalLookAtPlayer(this, EntityHuman.class, 8.0F)); this.goalSelector.a(7, new PathfinderGoalRandomLookaround(this)); this.targetSelector.a(1, new PathfinderGoalHurtByTarget(this, false)); - this.targetSelector.a(2, new PathfinderGoalNearestAttackableTarget(this, EntityLiving.class, 30.0F, 0, false, false, bI)); - this.bc = 50; + this.targetSelector.a(2, new PathfinderGoalNearestAttackableTarget(this, EntityLiving.class, 30.0F, 0, false, false, bJ)); + this.bd = 50; } protected void a() { @@ -139,7 +139,7 @@ public class EntityWither extends EntityMonster implements IRangedEntity { this.d[i] = this.b(this.d[i], f1, 40.0F); this.e[i] = this.b(this.e[i], f, 10.0F); } else { - this.e[i] = this.b(this.e[i], this.aw, 10.0F); + this.e[i] = this.b(this.e[i], this.ax, 10.0F); } } @@ -222,7 +222,7 @@ public class EntityWither extends EntityMonster implements IRangedEntity { this.c(i, 0); } } else { - List list = this.world.a(EntityLiving.class, this.boundingBox.grow(20.0D, 8.0D, 20.0D), bI); + List list = this.world.a(EntityLiving.class, this.boundingBox.grow(20.0D, 8.0D, 20.0D), bJ); for (int i1 = 0; i1 < 10 && !list.isEmpty(); ++i1) { EntityLiving entityliving = (EntityLiving) list.get(this.random.nextInt(list.size())); @@ -311,7 +311,7 @@ public class EntityWither extends EntityMonster implements IRangedEntity { if (i <= 0) { return this.locX; } else { - float f = (this.aw + (float) (180 * (i - 1))) / 180.0F * 3.1415927F; + float f = (this.ax + (float) (180 * (i - 1))) / 180.0F * 3.1415927F; float f1 = MathHelper.cos(f); return this.locX + (double) f1 * 1.3D; @@ -326,7 +326,7 @@ public class EntityWither extends EntityMonster implements IRangedEntity { if (i <= 0) { return this.locZ; } else { - float f = (this.aw + (float) (180 * (i - 1))) / 180.0F * 3.1415927F; + float f = (this.ax + (float) (180 * (i - 1))) / 180.0F * 3.1415927F; float f1 = MathHelper.sin(f); return this.locZ + (double) f1 * 1.3D; @@ -418,7 +418,7 @@ public class EntityWither extends EntityMonster implements IRangedEntity { } protected void bk() { - this.bA = 0; + this.bB = 0; } public boolean L() { diff --git a/src/main/java/net/minecraft/server/EntityWolf.java b/src/main/java/net/minecraft/server/EntityWolf.java index 74e98c49..cd71c1dc 100644 --- a/src/main/java/net/minecraft/server/EntityWolf.java +++ b/src/main/java/net/minecraft/server/EntityWolf.java @@ -13,15 +13,15 @@ public class EntityWolf extends EntityTameableAnimal { super(world); this.texture = "/mob/wolf.png"; this.a(0.6F, 0.8F); - this.bG = 0.3F; + this.bH = 0.3F; this.getNavigation().a(true); this.goalSelector.a(1, new PathfinderGoalFloat(this)); this.goalSelector.a(2, this.d); this.goalSelector.a(3, new PathfinderGoalLeapAtTarget(this, 0.4F)); - this.goalSelector.a(4, new PathfinderGoalMeleeAttack(this, this.bG, true)); - this.goalSelector.a(5, new PathfinderGoalFollowOwner(this, this.bG, 10.0F, 2.0F)); - this.goalSelector.a(6, new PathfinderGoalBreed(this, this.bG)); - this.goalSelector.a(7, new PathfinderGoalRandomStroll(this, this.bG)); + this.goalSelector.a(4, new PathfinderGoalMeleeAttack(this, this.bH, true)); + this.goalSelector.a(5, new PathfinderGoalFollowOwner(this, this.bH, 10.0F, 2.0F)); + this.goalSelector.a(6, new PathfinderGoalBreed(this, this.bH)); + this.goalSelector.a(7, new PathfinderGoalRandomStroll(this, this.bH)); this.goalSelector.a(8, new PathfinderGoalBeg(this, 8.0F)); this.goalSelector.a(9, new PathfinderGoalLookAtPlayer(this, EntityHuman.class, 8.0F)); this.goalSelector.a(9, new PathfinderGoalRandomLookaround(this)); @@ -119,7 +119,7 @@ public class EntityWolf extends EntityTameableAnimal { } if (this.bM()) { - this.bH = 10; + this.bI = 10; } if (this.G()) { @@ -220,7 +220,7 @@ public class EntityWolf extends EntityTameableAnimal { if (entityhuman.name.equalsIgnoreCase(this.getOwnerName()) && !this.world.isStatic && !this.c(itemstack)) { this.d.a(!this.isSitting()); - this.bE = false; + this.bF = false; this.setPathEntity((PathEntity) null); } } else if (itemstack != null && itemstack.id == Item.BONE.id && !this.isAngry()) { diff --git a/src/main/java/net/minecraft/server/EntityZombie.java b/src/main/java/net/minecraft/server/EntityZombie.java index a0934a25..87a63e13 100644 --- a/src/main/java/net/minecraft/server/EntityZombie.java +++ b/src/main/java/net/minecraft/server/EntityZombie.java @@ -11,15 +11,15 @@ public class EntityZombie extends EntityMonster { public EntityZombie(World world) { super(world); this.texture = "/mob/zombie.png"; - this.bG = 0.23F; + this.bH = 0.23F; this.getNavigation().b(true); this.goalSelector.a(0, new PathfinderGoalFloat(this)); this.goalSelector.a(1, new PathfinderGoalBreakDoor(this)); - this.goalSelector.a(2, new PathfinderGoalMeleeAttack(this, EntityHuman.class, this.bG, false)); - this.goalSelector.a(3, new PathfinderGoalMeleeAttack(this, EntityVillager.class, this.bG, true)); - this.goalSelector.a(4, new PathfinderGoalMoveTowardsRestriction(this, this.bG)); - this.goalSelector.a(5, new PathfinderGoalMoveThroughVillage(this, this.bG, false)); - this.goalSelector.a(6, new PathfinderGoalRandomStroll(this, this.bG)); + this.goalSelector.a(2, new PathfinderGoalMeleeAttack(this, EntityHuman.class, this.bH, false)); + this.goalSelector.a(3, new PathfinderGoalMeleeAttack(this, EntityVillager.class, this.bH, true)); + this.goalSelector.a(4, new PathfinderGoalMoveTowardsRestriction(this, this.bH)); + this.goalSelector.a(5, new PathfinderGoalMoveThroughVillage(this, this.bH, false)); + this.goalSelector.a(6, new PathfinderGoalRandomStroll(this, this.bH)); this.goalSelector.a(7, new PathfinderGoalLookAtPlayer(this, EntityHuman.class, 8.0F)); this.goalSelector.a(7, new PathfinderGoalRandomLookaround(this)); this.targetSelector.a(1, new PathfinderGoalHurtByTarget(this, false)); @@ -235,7 +235,7 @@ public class EntityZombie extends EntityMonster { } public void bG() { - this.canPickUpLoot = this.random.nextFloat() < as[this.world.difficulty]; + this.canPickUpLoot = this.random.nextFloat() < at[this.world.difficulty]; if (this.world.random.nextFloat() < 0.05F) { this.setVillager(true); } @@ -253,7 +253,7 @@ public class EntityZombie extends EntityMonster { } public boolean a(EntityHuman entityhuman) { - ItemStack itemstack = entityhuman.bT(); + ItemStack itemstack = entityhuman.bS(); if (itemstack != null && itemstack.getItem() == Item.GOLDEN_APPLE && itemstack.getData() == 0 && this.isVillager() && this.hasEffect(MobEffectList.WEAKNESS)) { if (!entityhuman.abilities.canInstantlyBuild) { diff --git a/src/main/java/net/minecraft/server/Explosion.java b/src/main/java/net/minecraft/server/Explosion.java index fae57de1..ba2f88f0 100644 --- a/src/main/java/net/minecraft/server/Explosion.java +++ b/src/main/java/net/minecraft/server/Explosion.java @@ -144,10 +144,11 @@ public class Explosion { if (!event.isCancelled()) { damagee.setLastDamageCause(event); entity.damageEntity(DamageSource.EXPLOSION, event.getDamage()); + double d11 = EnchantmentProtection.a(entity, d10); - entity.motX += d0 * d10; - entity.motY += d1 * d10; - entity.motZ += d2 * d10; + entity.motX += d0 * d11; + entity.motY += d1 * d11; + entity.motZ += d2 * d11; if (entity instanceof EntityHuman) { this.l.put((EntityHuman) entity, this.world.getVec3DPool().create(d0 * d10, d1 * d10, d2 * d10)); } diff --git a/src/main/java/net/minecraft/server/FoodMetaData.java b/src/main/java/net/minecraft/server/FoodMetaData.java index 2bd3af14..c311f57e 100644 --- a/src/main/java/net/minecraft/server/FoodMetaData.java +++ b/src/main/java/net/minecraft/server/FoodMetaData.java @@ -39,12 +39,12 @@ public class FoodMetaData { this.foodLevel = event.getFoodLevel(); } - ((EntityPlayer) entityhuman).netServerHandler.sendPacket(new Packet8UpdateHealth(entityhuman.getHealth(), this.foodLevel, this.saturationLevel)); + ((EntityPlayer) entityhuman).playerConnection.sendPacket(new Packet8UpdateHealth(entityhuman.getHealth(), this.foodLevel, this.saturationLevel)); // CraftBukkit end } } - if (this.foodLevel >= 18 && entityhuman.ce()) { + if (this.foodLevel >= 18 && entityhuman.cd()) { ++this.foodTickTimer; if (this.foodTickTimer >= 80) { // CraftBukkit - added RegainReason diff --git a/src/main/java/net/minecraft/server/ItemBlock.java b/src/main/java/net/minecraft/server/ItemBlock.java index f952b38b..fd34f906 100644 --- a/src/main/java/net/minecraft/server/ItemBlock.java +++ b/src/main/java/net/minecraft/server/ItemBlock.java @@ -101,7 +101,7 @@ public class ItemBlock extends Item { } } - public String c_(ItemStack itemstack) { + public String d(ItemStack itemstack) { return Block.byId[this.id].a(); } diff --git a/src/main/java/net/minecraft/server/ItemBoat.java b/src/main/java/net/minecraft/server/ItemBoat.java index 5bd2e943..cb9b38d5 100644 --- a/src/main/java/net/minecraft/server/ItemBoat.java +++ b/src/main/java/net/minecraft/server/ItemBoat.java @@ -73,6 +73,7 @@ public class ItemBoat extends Item { EntityBoat entityboat = new EntityBoat(world, (double) ((float) i + 0.5F), (double) ((float) j + 1.0F), (double) ((float) k + 0.5F)); + entityboat.yaw = (float) (((MathHelper.floor((double) (entityhuman.yaw * 4.0F / 360.0F) + 0.5D) & 3) - 1) * 90); if (!world.getCubes(entityboat, entityboat.boundingBox.grow(-0.1D, -0.1D, -0.1D)).isEmpty()) { return itemstack; } diff --git a/src/main/java/net/minecraft/server/ItemBow.java b/src/main/java/net/minecraft/server/ItemBow.java index 90c3bd44..f62ec9a7 100644 --- a/src/main/java/net/minecraft/server/ItemBow.java +++ b/src/main/java/net/minecraft/server/ItemBow.java @@ -13,7 +13,7 @@ public class ItemBow extends Item { boolean flag = entityhuman.abilities.canInstantlyBuild || EnchantmentManager.getEnchantmentLevel(Enchantment.ARROW_INFINITE.id, itemstack) > 0; if (flag || entityhuman.inventory.e(Item.ARROW.id)) { - int j = this.a(itemstack) - i; + int j = this.c_(itemstack) - i; float f = (float) j / 20.0F; f = (f * f + f * 2.0F) / 3.0F; @@ -74,17 +74,17 @@ public class ItemBow extends Item { return itemstack; } - public int a(ItemStack itemstack) { + public int c_(ItemStack itemstack) { return 72000; } - public EnumAnimation d_(ItemStack itemstack) { + public EnumAnimation b_(ItemStack itemstack) { return EnumAnimation.e; } public ItemStack a(ItemStack itemstack, World world, EntityHuman entityhuman) { if (entityhuman.abilities.canInstantlyBuild || entityhuman.inventory.e(Item.ARROW.id)) { - entityhuman.a(itemstack, this.a(itemstack)); + entityhuman.a(itemstack, this.c_(itemstack)); } return itemstack; diff --git a/src/main/java/net/minecraft/server/ItemDye.java b/src/main/java/net/minecraft/server/ItemDye.java index e8c1684a..75cbf7de 100644 --- a/src/main/java/net/minecraft/server/ItemDye.java +++ b/src/main/java/net/minecraft/server/ItemDye.java @@ -8,7 +8,7 @@ import org.bukkit.event.entity.SheepDyeWoolEvent; public class ItemDye extends Item { public static final String[] a = new String[] { "black", "red", "green", "brown", "blue", "purple", "cyan", "silver", "gray", "pink", "lime", "yellow", "lightBlue", "magenta", "orange", "white"}; - public static final int[] b = new int[] { 1973019, 11743532, 3887386, 5320730, 2437522, 8073150, 2651799, 2651799, 4408131, 14188952, 4312372, 14602026, 6719955, 12801229, 15435844, 15790320}; + public static final int[] b = new int[] { 1973019, 11743532, 3887386, 5320730, 2437522, 8073150, 2651799, 11250603, 4408131, 14188952, 4312372, 14602026, 6719955, 12801229, 15435844, 15790320}; public ItemDye(int i) { super(i); @@ -17,7 +17,7 @@ public class ItemDye extends Item { this.a(CreativeModeTab.l); } - public String c_(ItemStack itemstack) { + public String d(ItemStack itemstack) { int i = MathHelper.a(itemstack.getData(), 0, 15); return super.getName() + "." + a[i]; diff --git a/src/main/java/net/minecraft/server/ItemFood.java b/src/main/java/net/minecraft/server/ItemFood.java index 5a3862d2..28fbe430 100644 --- a/src/main/java/net/minecraft/server/ItemFood.java +++ b/src/main/java/net/minecraft/server/ItemFood.java @@ -5,18 +5,18 @@ public class ItemFood extends Item { public final int a; private final int b; private final float c; - private final boolean cl; - private boolean cm; - private int cn; - private int co; - private int cp; - private float cq; + private final boolean co; + private boolean cp; + private int cq; + private int cr; + private int cs; + private float ct; public ItemFood(int i, int j, float f, boolean flag) { super(i); this.a = 32; this.b = j; - this.cl = flag; + this.co = flag; this.c = f; this.a(CreativeModeTab.h); } @@ -36,7 +36,7 @@ public class ItemFood extends Item { entityhuman.getFoodData().eat(event.getFoodLevel() - oldFoodLevel, this.getSaturationModifier()); } - ((EntityPlayer) entityhuman).netServerHandler.sendPacket(new Packet8UpdateHealth(entityhuman.getHealth(), entityhuman.getFoodData().foodLevel, entityhuman.getFoodData().saturationLevel)); + ((EntityPlayer) entityhuman).playerConnection.sendPacket(new Packet8UpdateHealth(entityhuman.getHealth(), entityhuman.getFoodData().foodLevel, entityhuman.getFoodData().saturationLevel)); // CraftBukkit end world.makeSound(entityhuman, "random.burp", 0.5F, world.random.nextFloat() * 0.1F + 0.9F); @@ -45,22 +45,22 @@ public class ItemFood extends Item { } protected void c(ItemStack itemstack, World world, EntityHuman entityhuman) { - if (!world.isStatic && this.cn > 0 && world.random.nextFloat() < this.cq) { - entityhuman.addEffect(new MobEffect(this.cn, this.co * 20, this.cp)); + if (!world.isStatic && this.cq > 0 && world.random.nextFloat() < this.ct) { + entityhuman.addEffect(new MobEffect(this.cq, this.cr * 20, this.cs)); } } - public int a(ItemStack itemstack) { + public int c_(ItemStack itemstack) { return 32; } - public EnumAnimation d_(ItemStack itemstack) { + public EnumAnimation b_(ItemStack itemstack) { return EnumAnimation.b; } public ItemStack a(ItemStack itemstack, World world, EntityHuman entityhuman) { - if (entityhuman.f(this.cm)) { - entityhuman.a(itemstack, this.a(itemstack)); + if (entityhuman.g(this.cp)) { + entityhuman.a(itemstack, this.c_(itemstack)); } return itemstack; @@ -75,19 +75,19 @@ public class ItemFood extends Item { } public boolean i() { - return this.cl; + return this.co; } public ItemFood a(int i, int j, int k, float f) { - this.cn = i; - this.co = j; - this.cp = k; - this.cq = f; + this.cq = i; + this.cr = j; + this.cs = k; + this.ct = f; return this; } public ItemFood j() { - this.cm = true; + this.cp = true; return this; } } diff --git a/src/main/java/net/minecraft/server/ItemInWorldManager.java b/src/main/java/net/minecraft/server/ItemInWorldManager.java deleted file mode 100644 index 9410b4b7..00000000 --- a/src/main/java/net/minecraft/server/ItemInWorldManager.java +++ /dev/null @@ -1,413 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit start -import org.bukkit.event.block.BlockBreakEvent; -import org.bukkit.craftbukkit.event.CraftEventFactory; -import org.bukkit.event.Event; -import org.bukkit.event.block.Action; -import org.bukkit.event.player.PlayerInteractEvent; -// CraftBukkit end - -public class ItemInWorldManager { - - public World world; - public EntityPlayer player; - private EnumGamemode gamemode; - private boolean d; - private int lastDigTick; - private int f; - private int g; - private int h; - private int currentTick; - private boolean j; - private int k; - private int l; - private int m; - private int n; - private int o; - - public ItemInWorldManager(World world) { - this.gamemode = EnumGamemode.NONE; - this.o = -1; - this.world = world; - } - - // CraftBukkit start - keep this for backwards compatibility - public ItemInWorldManager(WorldServer world) { - this((World) world); - } - // CraftBukkit end - - public void setGameMode(EnumGamemode enumgamemode) { - this.gamemode = enumgamemode; - enumgamemode.a(this.player.abilities); - this.player.updateAbilities(); - } - - public EnumGamemode getGameMode() { - return this.gamemode; - } - - public boolean isCreative() { - return this.gamemode.d(); - } - - public void b(EnumGamemode enumgamemode) { - if (this.gamemode == EnumGamemode.NONE) { - this.gamemode = enumgamemode; - } - - this.setGameMode(this.gamemode); - } - - public void a() { - this.currentTick = (int) (System.currentTimeMillis() / 50); // CraftBukkit - int i; - float f; - int j; - - if (this.j) { - i = this.currentTick - this.n; - int k = this.world.getTypeId(this.k, this.l, this.m); - - if (k == 0) { - this.j = false; - } else { - Block block = Block.byId[k]; - - f = block.getDamage(this.player, this.player.world, this.k, this.l, this.m) * (float) (i + 1); - j = (int) (f * 10.0F); - if (j != this.o) { - this.world.g(this.player.id, this.k, this.l, this.m, j); - this.o = j; - } - - if (f >= 1.0F) { - this.j = false; - this.breakBlock(this.k, this.l, this.m); - } - } - } else if (this.d) { - i = this.world.getTypeId(this.f, this.g, this.h); - Block block1 = Block.byId[i]; - - if (block1 == null) { - this.world.g(this.player.id, this.f, this.g, this.h, -1); - this.o = -1; - this.d = false; - } else { - int l = this.currentTick - this.lastDigTick; - - f = block1.getDamage(this.player, this.player.world, this.f, this.g, this.h) * (float) (l + 1); - j = (int) (f * 10.0F); - if (j != this.o) { - this.world.g(this.player.id, this.f, this.g, this.h, j); - this.o = j; - } - } - } - } - - public void dig(int i, int j, int k, int l) { - // this.world.douseFire((EntityHuman) null, i, j, k, l); // CraftBukkit - moved down - // CraftBukkit - PlayerInteractEvent event = CraftEventFactory.callPlayerInteractEvent(this.player, Action.LEFT_CLICK_BLOCK, i, j, k, l, this.player.inventory.getItemInHand()); - - if (!this.gamemode.isAdventure() || this.player.f(i, j, k)) { - // CraftBukkit start - if (event.isCancelled()) { - // Let the client know the block still exists - ((EntityPlayer) this.player).netServerHandler.sendPacket(new Packet53BlockChange(i, j, k, this.world)); - // Update any tile entity data for this block - TileEntity tileentity = this.world.getTileEntity(i, j, k); - if (tileentity != null) { - this.player.netServerHandler.sendPacket(tileentity.getUpdatePacket()); - } - return; - } - // CraftBukkit end - if (this.isCreative()) { - if (!this.world.douseFire((EntityHuman) null, i, j, k, l)) { - this.breakBlock(i, j, k); - } - } else { - this.world.douseFire(this.player, i, j, k, l); - this.lastDigTick = this.currentTick; - float f = 1.0F; - int i1 = this.world.getTypeId(i, j, k); - // CraftBukkit start - Swings at air do *NOT* exist. - if (event.useInteractedBlock() == Event.Result.DENY) { - // If we denied a door from opening, we need to send a correcting update to the client, as it already opened the door. - if (i1 == Block.WOODEN_DOOR.id) { - // For some reason *BOTH* the bottom/top part have to be marked updated. - boolean bottom = (this.world.getData(i, j, k) & 8) == 0; - ((EntityPlayer) this.player).netServerHandler.sendPacket(new Packet53BlockChange(i, j, k, this.world)); - ((EntityPlayer) this.player).netServerHandler.sendPacket(new Packet53BlockChange(i, j + (bottom ? 1 : -1), k, this.world)); - } else if (i1 == Block.TRAP_DOOR.id) { - ((EntityPlayer) this.player).netServerHandler.sendPacket(new Packet53BlockChange(i, j, k, this.world)); - } - } else if (i1 > 0) { - Block.byId[i1].attack(this.world, i, j, k, this.player); - // Allow fire punching to be blocked - this.world.douseFire((EntityHuman) null, i, j, k, l); - } - - // Handle hitting a block - if (i1 > 0) { - f = Block.byId[i1].getDamage(this.player, this.world, i, j, k); - } - - if (event.useItemInHand() == Event.Result.DENY) { - // If we 'insta destroyed' then the client needs to be informed. - if (f > 1.0f) { - ((EntityPlayer) this.player).netServerHandler.sendPacket(new Packet53BlockChange(i, j, k, this.world)); - } - return; - } - org.bukkit.event.block.BlockDamageEvent blockEvent = CraftEventFactory.callBlockDamageEvent(this.player, i, j, k, this.player.inventory.getItemInHand(), f >= 1.0f); - - if (blockEvent.isCancelled()) { - // Let the client know the block still exists - ((EntityPlayer) this.player).netServerHandler.sendPacket(new Packet53BlockChange(i, j, k, this.world)); - return; - } - - if (blockEvent.getInstaBreak()) { - f = 2.0f; - } - // CraftBukkit end - - if (i1 > 0 && f >= 1.0F) { - this.breakBlock(i, j, k); - } else { - this.d = true; - this.f = i; - this.g = j; - this.h = k; - int j1 = (int) (f * 10.0F); - - this.world.g(this.player.id, i, j, k, j1); - this.o = j1; - } - } - } - } - - public void a(int i, int j, int k) { - if (i == this.f && j == this.g && k == this.h) { - this.currentTick = (int) (System.currentTimeMillis() / 50); // CraftBukkit - int l = this.currentTick - this.lastDigTick; - int i1 = this.world.getTypeId(i, j, k); - - if (i1 != 0) { - Block block = Block.byId[i1]; - float f = block.getDamage(this.player, this.player.world, i, j, k) * (float) (l + 1); - - if (f >= 0.7F) { - this.d = false; - this.world.g(this.player.id, i, j, k, -1); - this.breakBlock(i, j, k); - } else if (!this.j) { - this.d = false; - this.j = true; - this.k = i; - this.l = j; - this.m = k; - this.n = this.lastDigTick; - } - } - // CraftBukkit start - force blockreset to client - } else { - ((EntityPlayer) this.player).netServerHandler.sendPacket(new Packet53BlockChange(i, j, k, this.world)); - // CraftBukkit end - } - } - - public void c(int i, int j, int k) { - this.d = false; - this.world.g(this.player.id, this.f, this.g, this.h, -1); - } - - private boolean d(int i, int j, int k) { - Block block = Block.byId[this.world.getTypeId(i, j, k)]; - int l = this.world.getData(i, j, k); - - if (block != null) { - block.a(this.world, i, j, k, l, this.player); - } - - boolean flag = this.world.setTypeId(i, j, k, 0); - - if (block != null && flag) { - block.postBreak(this.world, i, j, k, l); - } - - return flag; - } - - public boolean breakBlock(int i, int j, int k) { - // CraftBukkit start - BlockBreakEvent event = null; - - if (this.player instanceof EntityPlayer) { - org.bukkit.block.Block block = this.world.getWorld().getBlockAt(i, j, k); - - // Tell client the block is gone immediately then process events - if (world.getTileEntity(i, j, k) == null) { - Packet53BlockChange packet = new Packet53BlockChange(i, j, k, this.world); - - packet.material = 0; - packet.data = 0; - ((EntityPlayer) this.player).netServerHandler.sendPacket(packet); - } - - event = new BlockBreakEvent(block, this.player.getBukkitEntity()); - - // Adventure mode pre-cancel - event.setCancelled(this.gamemode.isAdventure() && !this.player.f(i, j, k)); - - // Calculate default block experience - Block nmsBlock = Block.byId[block.getTypeId()]; - - if (nmsBlock != null && !event.isCancelled() && !this.isCreative() && this.player.b(nmsBlock)) { - // Copied from Block.a(world, entityhuman, int, int, int, int) - if (!(nmsBlock.s_() && EnchantmentManager.hasSilkTouchEnchantment(this.player))) { - int data = block.getData(); - int bonusLevel = EnchantmentManager.getBonusBlockLootEnchantmentLevel(this.player); - - event.setExpToDrop(nmsBlock.getExpDrop(this.world, data, bonusLevel)); - } - } - - this.world.getServer().getPluginManager().callEvent(event); - - if (event.isCancelled()) { - // Let the client know the block still exists - ((EntityPlayer) this.player).netServerHandler.sendPacket(new Packet53BlockChange(i, j, k, this.world)); - // Update any tile entity data for this block - TileEntity tileentity = this.world.getTileEntity(i, j, k); - if (tileentity != null) { - this.player.netServerHandler.sendPacket(tileentity.getUpdatePacket()); - } - return false; - } - } - - if (false) { // Never trigger - // CraftBukkit end - return false; - } else { - int l = this.world.getTypeId(i, j, k); - if (Block.byId[l] == null) return false; // CraftBukkit - a plugin set block to air without cancelling - int i1 = this.world.getData(i, j, k); - - // CraftBukkit start - special case skulls, their item data comes from a tile entity - if (l == Block.SKULL.id && !this.isCreative()) { - Block.SKULL.dropNaturally(world, i, j, k, i1, 1.0F, 0); - return this.d(i, j, k); - } - // CraftBukkit end - - this.world.a(this.player, 2001, i, j, k, l + (this.world.getData(i, j, k) << 12)); - boolean flag = this.d(i, j, k); - - if (this.isCreative()) { - this.player.netServerHandler.sendPacket(new Packet53BlockChange(i, j, k, this.world)); - } else { - ItemStack itemstack = this.player.bT(); - boolean flag1 = this.player.b(Block.byId[l]); - - if (itemstack != null) { - itemstack.a(this.world, l, i, j, k, this.player); - if (itemstack.count == 0) { - this.player.bU(); - } - } - - if (flag && flag1) { - Block.byId[l].a(this.world, this.player, i, j, k, i1); - } - } - - // CraftBukkit start - drop event experience - if (flag && event != null) { - Block.byId[l].f(this.world, i, j, k, event.getExpToDrop()); - } - // CraftBukkit end - - return flag; - } - } - - public boolean useItem(EntityHuman entityhuman, World world, ItemStack itemstack) { - int i = itemstack.count; - int j = itemstack.getData(); - ItemStack itemstack1 = itemstack.a(world, entityhuman); - - if (itemstack1 == itemstack && (itemstack1 == null || itemstack1.count == i && itemstack1.m() <= 0 && itemstack1.getData() == j)) { - return false; - } else { - entityhuman.inventory.items[entityhuman.inventory.itemInHandIndex] = itemstack1; - if (this.isCreative()) { - itemstack1.count = i; - if (itemstack1.f()) { - itemstack1.setData(j); - } - } - - if (itemstack1.count == 0) { - entityhuman.inventory.items[entityhuman.inventory.itemInHandIndex] = null; - } - - if (!entityhuman.bM()) { - ((EntityPlayer) entityhuman).updateInventory(entityhuman.defaultContainer); - } - - return true; - } - } - - public boolean interact(EntityHuman entityhuman, World world, ItemStack itemstack, int i, int j, int k, int l, float f, float f1, float f2) { - int i1 = world.getTypeId(i, j, k); - - // CraftBukkit start - Interact - boolean result = false; - if (i1 > 0) { - PlayerInteractEvent event = CraftEventFactory.callPlayerInteractEvent(entityhuman, Action.RIGHT_CLICK_BLOCK, i, j, k, l, itemstack); - if (event.useInteractedBlock() == Event.Result.DENY) { - // If we denied a door from opening, we need to send a correcting update to the client, as it already opened the door. - if (i1 == Block.WOODEN_DOOR.id) { - boolean bottom = (world.getData(i, j, k) & 8) == 0; - ((EntityPlayer) entityhuman).netServerHandler.sendPacket(new Packet53BlockChange(i, j + (bottom ? 1 : -1), k, world)); - } - result = (event.useItemInHand() != Event.Result.ALLOW); - } else { - result = Block.byId[i1].interact(world, i, j, k, entityhuman, l, f, f1, f2); - } - - if (itemstack != null && !result) { - int j1 = itemstack.getData(); - int k1 = itemstack.count; - - result = itemstack.placeItem(entityhuman, world, i, j, k, l, f, f1, f2); - - // The item count should not decrement in Creative mode. - if (this.isCreative()) { - itemstack.setData(j1); - itemstack.count = k1; - } - } - - // If we have 'true' and no explicit deny *or* an explicit allow -- run the item part of the hook - if (itemstack != null && ((!result && event.useItemInHand() != Event.Result.DENY) || event.useItemInHand() == Event.Result.ALLOW)) { - this.useItem(entityhuman, world, itemstack); - } - } - return result; - // CraftBukkit end - } - - public void a(WorldServer worldserver) { - this.world = worldserver; - } -} diff --git a/src/main/java/net/minecraft/server/ItemMinecart.java b/src/main/java/net/minecraft/server/ItemMinecart.java index a0c1d88d..cd06b9b7 100644 --- a/src/main/java/net/minecraft/server/ItemMinecart.java +++ b/src/main/java/net/minecraft/server/ItemMinecart.java @@ -14,7 +14,7 @@ public class ItemMinecart extends Item { public boolean interactWith(ItemStack itemstack, EntityHuman entityhuman, World world, int i, int j, int k, int l, float f, float f1, float f2) { int i1 = world.getTypeId(i, j, k); - if (BlockMinecartTrack.d(i1)) { + if (BlockMinecartTrack.e(i1)) { if (!world.isStatic) { // CraftBukkit start - Minecarts org.bukkit.event.player.PlayerInteractEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerInteractEvent(entityhuman, org.bukkit.event.block.Action.RIGHT_CLICK_BLOCK, i, j, k, l, itemstack); diff --git a/src/main/java/net/minecraft/server/ItemMonsterEgg.java b/src/main/java/net/minecraft/server/ItemMonsterEgg.java index cb8fc639..ead857e4 100644 --- a/src/main/java/net/minecraft/server/ItemMonsterEgg.java +++ b/src/main/java/net/minecraft/server/ItemMonsterEgg.java @@ -8,7 +8,7 @@ public class ItemMonsterEgg extends Item { this.a(CreativeModeTab.f); } - public String j(ItemStack itemstack) { + public String i(ItemStack itemstack) { String s = ("" + LocaleI18n.get(this.getName() + ".name")).trim(); String s1 = EntityTypes.b(itemstack.getData()); @@ -50,11 +50,15 @@ public class ItemMonsterEgg extends Item { for (int j = 0; j < 1; ++j) { entity = EntityTypes.a(i, world); - if (entity != null && entity instanceof EntityLiving) { // CraftBukkit - entity.setPositionRotation(d0, d1, d2, world.random.nextFloat() * 360.0F, 0.0F); - ((EntityLiving) entity).bG(); + if (entity != null && entity instanceof EntityLiving) { + EntityLiving entityliving = (EntityLiving) entity; + + entity.setPositionRotation(d0, d1, d2, MathHelper.g(world.random.nextFloat() * 360.0F), 0.0F); + entityliving.az = entityliving.yaw; + entityliving.ax = entityliving.yaw; + entityliving.bG(); world.addEntity(entity, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.SPAWNER_EGG); // CraftBukkit - ((EntityLiving) entity).aO(); + entityliving.aO(); } } diff --git a/src/main/java/net/minecraft/server/ItemSkull.java b/src/main/java/net/minecraft/server/ItemSkull.java index 1dcc3be8..facd5d44 100644 --- a/src/main/java/net/minecraft/server/ItemSkull.java +++ b/src/main/java/net/minecraft/server/ItemSkull.java @@ -89,7 +89,7 @@ public class ItemSkull extends Item { return i; } - public String c_(ItemStack itemstack) { + public String d(ItemStack itemstack) { int i = itemstack.getData(); if (i < 0 || i >= a.length) { @@ -99,7 +99,7 @@ public class ItemSkull extends Item { return super.getName() + "." + a[i]; } - public String j(ItemStack itemstack) { - return itemstack.getData() == 3 && itemstack.hasTag() && itemstack.getTag().hasKey("SkullOwner") ? LocaleI18n.get("item.skull.player.name", new Object[] { itemstack.getTag().getString("SkullOwner")}) : super.j(itemstack); + public String l(ItemStack itemstack) { + return itemstack.getData() == 3 && itemstack.hasTag() && itemstack.getTag().hasKey("SkullOwner") ? LocaleI18n.get("item.skull.player.name", new Object[] { itemstack.getTag().getString("SkullOwner")}) : super.l(itemstack); } } diff --git a/src/main/java/net/minecraft/server/ItemStack.java b/src/main/java/net/minecraft/server/ItemStack.java index d0a60c2d..a09d8d89 100644 --- a/src/main/java/net/minecraft/server/ItemStack.java +++ b/src/main/java/net/minecraft/server/ItemStack.java @@ -149,9 +149,17 @@ public final class ItemStack { public void damage(int i, EntityLiving entityliving) { if (this.f()) { if (i > 0 && entityliving instanceof EntityHuman) { - int j = EnchantmentManager.getDurabilityEnchantmentLevel(entityliving); + int j = EnchantmentManager.getEnchantmentLevel(Enchantment.DURABILITY.id, this); + int k = 0; - if (j > 0 && entityliving.world.random.nextInt(j + 1) > 0) { + for (int l = 0; j > 0 && l < i; ++l) { + if (EnchantmentDurability.a(this, j, entityliving.world.random)) { + ++k; + } + } + + i -= k; + if (i <= 0) { return; } } @@ -237,7 +245,7 @@ public final class ItemStack { } public String a() { - return Item.byId[this.id].c_(this); + return Item.byId[this.id].d(this); } public static ItemStack b(ItemStack itemstack) { @@ -262,11 +270,11 @@ public final class ItemStack { } public int m() { - return this.getItem().a(this); + return this.getItem().c_(this); } public EnumAnimation n() { - return this.getItem().d_(this); + return this.getItem().b_(this); } public void b(World world, EntityHuman entityhuman, int i) { @@ -290,7 +298,7 @@ public final class ItemStack { } public String r() { - String s = this.getItem().j(this); + String s = this.getItem().l(this); if (this.tag != null && this.tag.hasKey("display")) { NBTTagCompound nbttagcompound = this.tag.getCompound("display"); @@ -320,7 +328,7 @@ public final class ItemStack { } public boolean v() { - return !this.getItem().k(this) ? false : !this.hasEnchantments(); + return !this.getItem().d_(this) ? false : !this.hasEnchantments(); } public void addEnchantment(Enchantment enchantment, int i) { diff --git a/src/main/java/net/minecraft/server/ItemStep.java b/src/main/java/net/minecraft/server/ItemStep.java index f1ab801c..8501394c 100644 --- a/src/main/java/net/minecraft/server/ItemStep.java +++ b/src/main/java/net/minecraft/server/ItemStep.java @@ -19,7 +19,7 @@ public class ItemStep extends ItemBlock { return i; } - public String c_(ItemStack itemstack) { + public String d(ItemStack itemstack) { return this.b.d(itemstack.getData()); } diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java index 6b10bfcb..2f200385 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java @@ -39,7 +39,7 @@ public abstract class MinecraftServer implements ICommandListener, Runnable, IMo private String serverIp; private int s = -1; // public WorldServer[] worldServer; // CraftBukkit - removed! - private ServerConfigurationManagerAbstract t; + private PlayerList t; private boolean isRunning = true; private boolean isStopped = false; private int ticks = 0; @@ -126,6 +126,7 @@ public abstract class MinecraftServer implements ICommandListener, Runnable, IMo BlockDispenser.a.a(Item.EXP_BOTTLE, new DispenseBehaviorExpBottle(this)); BlockDispenser.a.a(Item.POTION, new DispenseBehaviorPotion(this)); BlockDispenser.a.a(Item.MONSTER_EGG, new DispenseBehaviorMonsterEgg(this)); + BlockDispenser.a.a(Item.FIREWORKS, new DispenseBehaviorFireworks(this)); BlockDispenser.a.a(Item.FIREBALL, new DispenseBehaviorFireball(this)); DispenseBehaviorMinecart dispensebehaviorminecart = new DispenseBehaviorMinecart(this); @@ -537,9 +538,9 @@ public abstract class MinecraftServer implements ICommandListener, Runnable, IMo // Send timeupdates to everyone, it will get the right time from the world the player is in. if (this.ticks % 20 == 0) { - for (int i = 0; i < this.getServerConfigurationManager().players.size(); ++i) { - EntityPlayer entityplayer = (EntityPlayer) this.getServerConfigurationManager().players.get(i); - entityplayer.netServerHandler.sendPacket(new Packet4UpdateTime(entityplayer.world.getTime(), entityplayer.getPlayerTime())); // Add support for per player time + for (int i = 0; i < this.getPlayerList().players.size(); ++i) { + EntityPlayer entityplayer = (EntityPlayer) this.getPlayerList().players.get(i); + entityplayer.playerConnection.sendPacket(new Packet4UpdateTime(entityplayer.world.getTime(), entityplayer.getPlayerTime())); // Add support for per player time } } @@ -757,7 +758,7 @@ public abstract class MinecraftServer implements ICommandListener, Runnable, IMo } public String getVersion() { - return "1.4.5"; + return "1.4.6"; } public int y() { @@ -1085,7 +1086,7 @@ public abstract class MinecraftServer implements ICommandListener, Runnable, IMo public abstract boolean T(); public boolean getOnlineMode() { - return this.onlineMode; + return this.server.getOnlineMode(); // CraftBukkit } public void setOnlineMode(boolean flag) { @@ -1146,12 +1147,12 @@ public abstract class MinecraftServer implements ICommandListener, Runnable, IMo return this.isStopped; } - public ServerConfigurationManagerAbstract getServerConfigurationManager() { + public PlayerList getPlayerList() { return this.t; } - public void a(ServerConfigurationManagerAbstract serverconfigurationmanagerabstract) { - this.t = serverconfigurationmanagerabstract; + public void a(PlayerList playerlist) { + this.t = playerlist; } public void a(EnumGamemode enumgamemode) { @@ -1186,7 +1187,7 @@ public abstract class MinecraftServer implements ICommandListener, Runnable, IMo return 16; } - public static ServerConfigurationManagerAbstract a(MinecraftServer minecraftserver) { + public static PlayerList a(MinecraftServer minecraftserver) { return minecraftserver.t; } } diff --git a/src/main/java/net/minecraft/server/NetLoginHandler.java b/src/main/java/net/minecraft/server/NetLoginHandler.java deleted file mode 100644 index 977c89c3..00000000 --- a/src/main/java/net/minecraft/server/NetLoginHandler.java +++ /dev/null @@ -1,220 +0,0 @@ -package net.minecraft.server; - -import java.io.Serializable; -import java.net.InetAddress; -import java.net.Socket; -import java.security.PrivateKey; -import java.security.PublicKey; -import java.util.Arrays; -import java.util.Iterator; -import java.util.List; -import java.util.Random; -import java.util.logging.Logger; -import javax.crypto.SecretKey; - -public class NetLoginHandler extends NetHandler { - - private byte[] d; - public static Logger logger = Logger.getLogger("Minecraft"); - private static Random random = new Random(); - public NetworkManager networkManager; - public boolean c = false; - private MinecraftServer server; - private int g = 0; - private String h = null; - private volatile boolean i = false; - private String loginKey = Long.toString(random.nextLong(), 16); // CraftBukkit - Security fix - private SecretKey k = null; - public String hostname = ""; // CraftBukkit - add field - private boolean login = false; // CraftBukkit - - public NetLoginHandler(MinecraftServer minecraftserver, Socket socket, String s) throws java.io.IOException { // CraftBukkit - throws IOException - this.server = minecraftserver; - this.networkManager = new NetworkManager(socket, s, this, minecraftserver.F().getPrivate()); - this.networkManager.e = 0; - } - - // CraftBukkit start - public Socket getSocket() { - return this.networkManager.getSocket(); - } - // CraftBukkit end - - public void c() { - if (this.i) { - this.d(); - } - - if (this.g++ == 600) { - this.disconnect("Took too long to log in"); - } else { - this.networkManager.b(); - } - } - - public void disconnect(String s) { - try { - logger.info("Disconnecting " + this.getName() + ": " + s); - this.networkManager.queue(new Packet255KickDisconnect(s)); - this.networkManager.d(); - this.c = true; - } catch (Exception exception) { - exception.printStackTrace(); - } - } - - public void a(Packet2Handshake packet2handshake) { - // CraftBukkit start - this.hostname = packet2handshake.c == null ? "" : packet2handshake.c + ':' + packet2handshake.d; - // CraftBukkit end - this.h = packet2handshake.f(); - if (!this.h.equals(StripColor.a(this.h))) { - this.disconnect("Invalid username!"); - } else { - PublicKey publickey = this.server.F().getPublic(); - - if (packet2handshake.d() != 49) { - if (packet2handshake.d() > 49) { - this.disconnect("Outdated server!"); - } else { - this.disconnect("Outdated client!"); - } - } else { - this.loginKey = this.server.getOnlineMode() ? Long.toString(random.nextLong(), 16) : "-"; - this.d = new byte[4]; - random.nextBytes(this.d); - this.networkManager.queue(new Packet253KeyRequest(this.loginKey, publickey, this.d)); - } - } - } - - public void a(Packet252KeyResponse packet252keyresponse) { - PrivateKey privatekey = this.server.F().getPrivate(); - - this.k = packet252keyresponse.a(privatekey); - if (!Arrays.equals(this.d, packet252keyresponse.b(privatekey))) { - this.disconnect("Invalid client reply"); - } - - this.networkManager.queue(new Packet252KeyResponse()); - } - - public void a(Packet205ClientCommand packet205clientcommand) { - if (packet205clientcommand.a == 0) { - if (this.server.getOnlineMode()) { - // CraftBukkit start - if (this.login) { - this.disconnect("Duplicate login"); - return; - } - this.login = true; - // CraftBukkit end - (new ThreadLoginVerifier(this, server.server)).start(); // CraftBukkit - add CraftServer - } else { - this.i = true; - } - } - } - - public void a(Packet1Login packet1login) {} - - public void d() { - // CraftBukkit start - EntityPlayer s = this.server.getServerConfigurationManager().attemptLogin(this, this.h, this.hostname); - - if (s == null) { - return; - // CraftBukkit end - } else { - EntityPlayer entityplayer = this.server.getServerConfigurationManager().processLogin(s); // CraftBukkit - this.h -> s - - if (entityplayer != null) { - this.server.getServerConfigurationManager().a((INetworkManager) this.networkManager, entityplayer); - } - } - - this.c = true; - } - - public void a(String s, Object[] aobject) { - logger.info(this.getName() + " lost connection"); - this.c = true; - } - - public void a(Packet254GetInfo packet254getinfo) { - if (this.networkManager.getSocket() == null) return; // CraftBukkit - fix NPE when a client queries a server that is unable to handle it. - try { - ServerConfigurationManagerAbstract serverconfigurationmanagerabstract = this.server.getServerConfigurationManager(); - String s = null; - // CraftBukkit - org.bukkit.event.server.ServerListPingEvent pingEvent = org.bukkit.craftbukkit.event.CraftEventFactory.callServerListPingEvent(this.server.server, getSocket().getInetAddress(), this.server.getMotd(), serverconfigurationmanagerabstract.getPlayerCount(), serverconfigurationmanagerabstract.getMaxPlayers()); - - if (packet254getinfo.a == 1) { - // CraftBukkit start - fix decompile issues, don't create a list from an array - Object[] list = new Object[] { 1, 49, this.server.getVersion(), pingEvent.getMotd(), serverconfigurationmanagerabstract.getPlayerCount(), pingEvent.getMaxPlayers() }; - - for (Object object : list) { - if (s == null) { - s = "\u00A7"; - } else { - s = s + "\0"; - } - - s += org.apache.commons.lang.StringUtils.replace(object.toString(), "\0", ""); - } - // CraftBukkit end - } else { - // CraftBukkit - s = pingEvent.getMotd() + "\u00A7" + serverconfigurationmanagerabstract.getPlayerCount() + "\u00A7" + pingEvent.getMaxPlayers(); - } - - InetAddress inetaddress = null; - - if (this.networkManager.getSocket() != null) { - inetaddress = this.networkManager.getSocket().getInetAddress(); - } - - this.networkManager.queue(new Packet255KickDisconnect(s)); - this.networkManager.d(); - if (inetaddress != null && this.server.ae() instanceof DedicatedServerConnection) { - ((DedicatedServerConnection) this.server.ae()).a(inetaddress); - } - - this.c = true; - } catch (Exception exception) { - exception.printStackTrace(); - } - } - - public void onUnhandledPacket(Packet packet) { - this.disconnect("Protocol error"); - } - - public String getName() { - return this.h != null ? this.h + " [" + this.networkManager.getSocketAddress().toString() + "]" : this.networkManager.getSocketAddress().toString(); - } - - public boolean a() { - return true; - } - - static String a(NetLoginHandler netloginhandler) { - return netloginhandler.loginKey; - } - - static MinecraftServer b(NetLoginHandler netloginhandler) { - return netloginhandler.server; - } - - static SecretKey c(NetLoginHandler netloginhandler) { - return netloginhandler.k; - } - - static String d(NetLoginHandler netloginhandler) { - return netloginhandler.h; - } - - static boolean a(NetLoginHandler netloginhandler, boolean flag) { - return netloginhandler.i = flag; - } -} diff --git a/src/main/java/net/minecraft/server/NetServerHandler.java b/src/main/java/net/minecraft/server/NetServerHandler.java deleted file mode 100644 index 88afae43..00000000 --- a/src/main/java/net/minecraft/server/NetServerHandler.java +++ /dev/null @@ -1,1619 +0,0 @@ -package net.minecraft.server; - -import java.io.ByteArrayInputStream; -import java.io.DataInputStream; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.Random; -import java.util.logging.Logger; - -// CraftBukkit start -import java.io.UnsupportedEncodingException; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.atomic.AtomicIntegerFieldUpdater; -import java.util.logging.Level; -import java.util.HashSet; - -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.craftbukkit.CraftWorld; -import org.bukkit.craftbukkit.inventory.CraftInventoryView; -import org.bukkit.craftbukkit.inventory.CraftItemStack; -import org.bukkit.craftbukkit.util.LazyPlayerSet; -import org.bukkit.craftbukkit.util.Waitable; -import org.bukkit.craftbukkit.entity.CraftPlayer; -import org.bukkit.craftbukkit.event.CraftEventFactory; -import org.bukkit.entity.Player; -import org.bukkit.event.Event; -import org.bukkit.event.block.Action; -import org.bukkit.event.block.SignChangeEvent; -import org.bukkit.event.player.AsyncPlayerChatEvent; -import org.bukkit.event.player.PlayerAnimationEvent; -import org.bukkit.event.player.PlayerChatEvent; -import org.bukkit.event.player.PlayerCommandPreprocessEvent; -import org.bukkit.event.player.PlayerInteractEntityEvent; -import org.bukkit.event.player.PlayerItemHeldEvent; -import org.bukkit.event.player.PlayerKickEvent; -import org.bukkit.event.player.PlayerMoveEvent; -import org.bukkit.event.player.PlayerTeleportEvent; -import org.bukkit.event.player.PlayerToggleSneakEvent; -import org.bukkit.event.player.PlayerToggleSprintEvent; -import org.bukkit.event.inventory.*; -import org.bukkit.event.inventory.InventoryType.SlotType; -import org.bukkit.event.player.PlayerPortalEvent; -import org.bukkit.event.player.PlayerToggleFlightEvent; -import org.bukkit.inventory.CraftingInventory; -import org.bukkit.inventory.InventoryView; -// CraftBukkit end - -public class NetServerHandler extends NetHandler { - - public static Logger logger = Logger.getLogger("Minecraft"); - public INetworkManager networkManager; - public boolean disconnected = false; - private MinecraftServer minecraftServer; - public EntityPlayer player; - private int f; - private int g; - private boolean h; - private int i; - private long j; - private static Random k = new Random(); - private long l; - private volatile int m = 0; private static final AtomicIntegerFieldUpdater chatSpamField = AtomicIntegerFieldUpdater.newUpdater(NetServerHandler.class, "m"); // CraftBukkit - multithreaded field - private int x = 0; - private double y; - private double z; - private double q; - public boolean checkMovement = true; // CraftBukkit - private -> public - private IntHashMap s = new IntHashMap(); - - public NetServerHandler(MinecraftServer minecraftserver, INetworkManager inetworkmanager, EntityPlayer entityplayer) { - this.minecraftServer = minecraftserver; - this.networkManager = inetworkmanager; - inetworkmanager.a(this); - this.player = entityplayer; - entityplayer.netServerHandler = this; - - // CraftBukkit start - this.server = minecraftserver.server; - } - - private final org.bukkit.craftbukkit.CraftServer server; - private int lastTick = MinecraftServer.currentTick; - private int lastDropTick = MinecraftServer.currentTick; - private int dropCount = 0; - private static final int PLACE_DISTANCE_SQUARED = 6 * 6; - - // Get position of last block hit for BlockDamageLevel.STOPPED - private double lastPosX = Double.MAX_VALUE; - private double lastPosY = Double.MAX_VALUE; - private double lastPosZ = Double.MAX_VALUE; - private float lastPitch = Float.MAX_VALUE; - private float lastYaw = Float.MAX_VALUE; - private boolean justTeleported = false; - - // For the packet15 hack :( - Long lastPacket; - - // Store the last block right clicked and what type it was - private int lastMaterial; - - public CraftPlayer getPlayer() { - return (this.player == null) ? null : (CraftPlayer) this.player.getBukkitEntity(); - } - private final static HashSet invalidItems = new HashSet(java.util.Arrays.asList(8, 9, 10, 11, 26, 34, 36, 43, 51, 52, 55, 59, 60, 62, 63, 64, 68, 71, 74, 75, 83, 90, 92, 93, 94, 95, 104, 105, 115, 117, 118, 119, 125, 127, 132, 137, 140, 141, 142, 144)); // TODO: Check after every update. - // CraftBukkit end - - public void d() { - this.h = false; - ++this.f; - this.minecraftServer.methodProfiler.a("packetflow"); - this.networkManager.b(); - this.minecraftServer.methodProfiler.c("keepAlive"); - if ((long) this.f - this.l > 20L) { - this.l = (long) this.f; - this.j = System.nanoTime() / 1000000L; - this.i = k.nextInt(); - this.sendPacket(new Packet0KeepAlive(this.i)); - } - - // CraftBukkit start - for (int spam; (spam = this.m) > 0 && !chatSpamField.compareAndSet(this, spam, spam - 1); ) ; - /* Use thread-safe field access instead - if (this.m > 0) { - --this.m; - } - */ - // CraftBukkit end - - if (this.x > 0) { - --this.x; - } - - this.minecraftServer.methodProfiler.c("playerTick"); - this.minecraftServer.methodProfiler.b(); - } - - public void disconnect(String s) { - if (!this.disconnected) { - // CraftBukkit start - String leaveMessage = "\u00A7e" + this.player.name + " left the game."; - - PlayerKickEvent event = new PlayerKickEvent(this.server.getPlayer(this.player), s, leaveMessage); - - if (this.server.getServer().isRunning()) { - this.server.getPluginManager().callEvent(event); - } - - if (event.isCancelled()) { - // Do not kick the player - return; - } - // Send the possibly modified leave message - s = event.getReason(); - // CraftBukkit end - - this.player.l(); - this.sendPacket(new Packet255KickDisconnect(s)); - this.networkManager.d(); - - // CraftBukkit start - leaveMessage = event.getLeaveMessage(); - if (leaveMessage != null && leaveMessage.length() > 0) { - this.minecraftServer.getServerConfigurationManager().sendAll(new Packet3Chat(leaveMessage)); - } - getPlayer().disconnect(s); - // CraftBukkit end - - this.minecraftServer.getServerConfigurationManager().disconnect(this.player); - this.disconnected = true; - } - } - - public void a(Packet10Flying packet10flying) { - WorldServer worldserver = this.minecraftServer.getWorldServer(this.player.dimension); - - this.h = true; - if (!this.player.viewingCredits) { - double d0; - - if (!this.checkMovement) { - d0 = packet10flying.y - this.z; - if (packet10flying.x == this.y && d0 * d0 < 0.01D && packet10flying.z == this.q) { - this.checkMovement = true; - } - } - - // CraftBukkit start - Player player = this.getPlayer(); - Location from = new Location(player.getWorld(), lastPosX, lastPosY, lastPosZ, lastYaw, lastPitch); // Get the Players previous Event location. - Location to = player.getLocation().clone(); // Start off the To location as the Players current location. - - // If the packet contains movement information then we update the To location with the correct XYZ. - if (packet10flying.hasPos && !(packet10flying.hasPos && packet10flying.y == -999.0D && packet10flying.stance == -999.0D)) { - to.setX(packet10flying.x); - to.setY(packet10flying.y); - to.setZ(packet10flying.z); - } - - // If the packet contains look information then we update the To location with the correct Yaw & Pitch. - if (packet10flying.hasLook) { - to.setYaw(packet10flying.yaw); - to.setPitch(packet10flying.pitch); - } - - // Prevent 40 event-calls for less than a single pixel of movement >.> - double delta = Math.pow(this.lastPosX - to.getX(), 2) + Math.pow(this.lastPosY - to.getY(), 2) + Math.pow(this.lastPosZ - to.getZ(), 2); - float deltaAngle = Math.abs(this.lastYaw - to.getYaw()) + Math.abs(this.lastPitch - to.getPitch()); - - if ((delta > 1f / 256 || deltaAngle > 10f) && (this.checkMovement && !this.player.dead)) { - this.lastPosX = to.getX(); - this.lastPosY = to.getY(); - this.lastPosZ = to.getZ(); - this.lastYaw = to.getYaw(); - this.lastPitch = to.getPitch(); - - // Skip the first time we do this - if (from.getX() != Double.MAX_VALUE) { - PlayerMoveEvent event = new PlayerMoveEvent(player, from, to); - this.server.getPluginManager().callEvent(event); - - // If the event is cancelled we move the player back to their old location. - if (event.isCancelled()) { - this.player.netServerHandler.sendPacket(new Packet13PlayerLookMove(from.getX(), from.getY() + 1.6200000047683716D, from.getY(), from.getZ(), from.getYaw(), from.getPitch(), false)); - return; - } - - /* If a Plugin has changed the To destination then we teleport the Player - there to avoid any 'Moved wrongly' or 'Moved too quickly' errors. - We only do this if the Event was not cancelled. */ - if (!to.equals(event.getTo()) && !event.isCancelled()) { - this.player.getBukkitEntity().teleport(event.getTo(), PlayerTeleportEvent.TeleportCause.UNKNOWN); - return; - } - - /* Check to see if the Players Location has some how changed during the call of the event. - This can happen due to a plugin teleporting the player instead of using .setTo() */ - if (!from.equals(this.getPlayer().getLocation()) && this.justTeleported) { - this.justTeleported = false; - return; - } - } - } - - if (Double.isNaN(packet10flying.x) || Double.isNaN(packet10flying.y) || Double.isNaN(packet10flying.z) || Double.isNaN(packet10flying.stance)) { - player.teleport(player.getWorld().getSpawnLocation(), PlayerTeleportEvent.TeleportCause.UNKNOWN); - System.err.println(player.getName() + " was caught trying to crash the server with an invalid position."); - player.kickPlayer("Nope!"); - return; - } - - if (this.checkMovement && !this.player.dead) { - // CraftBukkit end - double d1; - double d2; - double d3; - double d4; - - if (this.player.vehicle != null) { - float f = this.player.yaw; - float f1 = this.player.pitch; - - this.player.vehicle.V(); - d1 = this.player.locX; - d2 = this.player.locY; - d3 = this.player.locZ; - double d5 = 0.0D; - - d4 = 0.0D; - if (packet10flying.hasLook) { - f = packet10flying.yaw; - f1 = packet10flying.pitch; - } - - if (packet10flying.hasPos && packet10flying.y == -999.0D && packet10flying.stance == -999.0D) { - if (Math.abs(packet10flying.x) > 1.0D || Math.abs(packet10flying.z) > 1.0D) { - System.err.println(player.getName() + " was caught trying to crash the server with an invalid position."); - player.kickPlayer("Nope!"); - return; - } - - d5 = packet10flying.x; - d4 = packet10flying.z; - } - - this.player.onGround = packet10flying.g; - this.player.g(); - this.player.move(d5, 0.0D, d4); - this.player.setLocation(d1, d2, d3, f, f1); - this.player.motX = d5; - this.player.motZ = d4; - if (this.player.vehicle != null) { - worldserver.vehicleEnteredWorld(this.player.vehicle, true); - } - - if (this.player.vehicle != null) { - this.player.vehicle.V(); - } - - this.minecraftServer.getServerConfigurationManager().d(this.player); - this.y = this.player.locX; - this.z = this.player.locY; - this.q = this.player.locZ; - worldserver.playerJoinedWorld(this.player); - return; - } - - if (this.player.isSleeping()) { - this.player.g(); - this.player.setLocation(this.y, this.z, this.q, this.player.yaw, this.player.pitch); - worldserver.playerJoinedWorld(this.player); - return; - } - - d0 = this.player.locY; - this.y = this.player.locX; - this.z = this.player.locY; - this.q = this.player.locZ; - d1 = this.player.locX; - d2 = this.player.locY; - d3 = this.player.locZ; - float f2 = this.player.yaw; - float f3 = this.player.pitch; - - if (packet10flying.hasPos && packet10flying.y == -999.0D && packet10flying.stance == -999.0D) { - packet10flying.hasPos = false; - } - - if (packet10flying.hasPos) { - d1 = packet10flying.x; - d2 = packet10flying.y; - d3 = packet10flying.z; - d4 = packet10flying.stance - packet10flying.y; - if (!this.player.isSleeping() && (d4 > 1.65D || d4 < 0.1D)) { - this.disconnect("Illegal stance"); - logger.warning(this.player.name + " had an illegal stance: " + d4); - return; - } - - if (Math.abs(packet10flying.x) > 3.2E7D || Math.abs(packet10flying.z) > 3.2E7D) { - // CraftBukkit - teleport to previous position instead of kicking, players get stuck - this.a(this.y, this.z, this.q, this.player.yaw, this.player.pitch); - return; - } - } - - if (packet10flying.hasLook) { - f2 = packet10flying.yaw; - f3 = packet10flying.pitch; - } - - this.player.g(); - this.player.W = 0.0F; - this.player.setLocation(this.y, this.z, this.q, f2, f3); - if (!this.checkMovement) { - return; - } - - d4 = d1 - this.player.locX; - double d6 = d2 - this.player.locY; - double d7 = d3 - this.player.locZ; - // CraftBukkit start - min to max - double d8 = Math.max(Math.abs(d4), Math.abs(this.player.motX)); - double d9 = Math.max(Math.abs(d6), Math.abs(this.player.motY)); - double d10 = Math.max(Math.abs(d7), Math.abs(this.player.motZ)); - // CraftBukkit end - double d11 = d8 * d8 + d9 * d9 + d10 * d10; - - if (d11 > 100.0D && this.checkMovement && (!this.minecraftServer.I() || !this.minecraftServer.H().equals(this.player.name))) { // CraftBukkit - Added this.checkMovement condition to solve this check being triggered by teleports - logger.warning(this.player.name + " moved too quickly! " + d4 + "," + d6 + "," + d7 + " (" + d8 + ", " + d9 + ", " + d10 + ")"); - this.a(this.y, this.z, this.q, this.player.yaw, this.player.pitch); - return; - } - - float f4 = 0.0625F; - boolean flag = worldserver.getCubes(this.player, this.player.boundingBox.clone().shrink((double) f4, (double) f4, (double) f4)).isEmpty(); - - if (this.player.onGround && !packet10flying.g && d6 > 0.0D) { - this.player.j(0.2F); - } - - this.player.move(d4, d6, d7); - this.player.onGround = packet10flying.g; - this.player.checkMovement(d4, d6, d7); - double d12 = d6; - - d4 = d1 - this.player.locX; - d6 = d2 - this.player.locY; - if (d6 > -0.5D || d6 < 0.5D) { - d6 = 0.0D; - } - - d7 = d3 - this.player.locZ; - d11 = d4 * d4 + d6 * d6 + d7 * d7; - boolean flag1 = false; - - if (d11 > 0.0625D && !this.player.isSleeping() && !this.player.itemInWorldManager.isCreative()) { - flag1 = true; - logger.warning(this.player.name + " moved wrongly!"); - } - - this.player.setLocation(d1, d2, d3, f2, f3); - boolean flag2 = worldserver.getCubes(this.player, this.player.boundingBox.clone().shrink((double) f4, (double) f4, (double) f4)).isEmpty(); - - if (flag && (flag1 || !flag2) && !this.player.isSleeping()) { - this.a(this.y, this.z, this.q, f2, f3); - return; - } - - AxisAlignedBB axisalignedbb = this.player.boundingBox.clone().grow((double) f4, (double) f4, (double) f4).a(0.0D, -0.55D, 0.0D); - - if (!this.minecraftServer.getAllowFlight() && !this.player.abilities.canFly && !worldserver.c(axisalignedbb)) { // CraftBukkit - check abilities instead of creative mode - if (d12 >= -0.03125D) { - ++this.g; - if (this.g > 80) { - logger.warning(this.player.name + " was kicked for floating too long!"); - this.disconnect("Flying is not enabled on this server"); - return; - } - } - } else { - this.g = 0; - } - - this.player.onGround = packet10flying.g; - this.minecraftServer.getServerConfigurationManager().d(this.player); - if (this.player.itemInWorldManager.isCreative()) return; // CraftBukkit - fixed fall distance accumulating while being in Creative mode. - this.player.b(this.player.locY - d0, packet10flying.g); - } - } - } - - public void a(double d0, double d1, double d2, float f, float f1) { - // CraftBukkit start - Delegate to teleport(Location) - Player player = this.getPlayer(); - Location from = player.getLocation(); - Location to = new Location(this.getPlayer().getWorld(), d0, d1, d2, f, f1); - PlayerTeleportEvent event = new PlayerTeleportEvent(player, from, to, PlayerTeleportEvent.TeleportCause.UNKNOWN); - this.server.getPluginManager().callEvent(event); - - from = event.getFrom(); - to = event.isCancelled() ? from : event.getTo(); - - this.teleport(to); - } - - public void teleport(Location dest) { - double d0, d1, d2; - float f, f1; - - d0 = dest.getX(); - d1 = dest.getY(); - d2 = dest.getZ(); - f = dest.getYaw(); - f1 = dest.getPitch(); - - // TODO: make sure this is the best way to address this. - if (Float.isNaN(f)) { - f = 0; - } - - if (Float.isNaN(f1)) { - f1 = 0; - } - - this.lastPosX = d0; - this.lastPosY = d1; - this.lastPosZ = d2; - this.lastYaw = f; - this.lastPitch = f1; - this.justTeleported = true; - // CraftBukkit end - - this.checkMovement = false; - this.y = d0; - this.z = d1; - this.q = d2; - this.player.setLocation(d0, d1, d2, f, f1); - this.player.netServerHandler.sendPacket(new Packet13PlayerLookMove(d0, d1 + 1.6200000047683716D, d1, d2, f, f1, false)); - } - - public void a(Packet14BlockDig packet14blockdig) { - if (this.player.dead) return; // CraftBukkit - - WorldServer worldserver = this.minecraftServer.getWorldServer(this.player.dimension); - - if (packet14blockdig.e == 4) { - // CraftBukkit start - // If the ticks aren't the same then the count starts from 0 and we update the lastDropTick. - if (this.lastDropTick != MinecraftServer.currentTick) { - this.dropCount = 0; - this.lastDropTick = MinecraftServer.currentTick; - } else { - // Else we increment the drop count and check the amount. - this.dropCount++; - if (this.dropCount >= 20) { - logger.warning(this.player.name + " dropped their items too quickly!"); - this.disconnect("You dropped your items too quickly (Hacking?)"); - return; - } - } - // CraftBukkit end - this.player.bR(); - } else if (packet14blockdig.e == 5) { - this.player.bO(); - } else { - boolean flag = worldserver.worldProvider.dimension != 0 || this.minecraftServer.getServerConfigurationManager().getOPs().isEmpty() || this.minecraftServer.getServerConfigurationManager().isOp(this.player.name) || this.minecraftServer.I(); - boolean flag1 = false; - - if (packet14blockdig.e == 0 || packet14blockdig.e == 1) { // CraftBukkit - check cancelled - flag1 = true; - } - - if (packet14blockdig.e == 2) { - flag1 = true; - } - - int i = packet14blockdig.a; - int j = packet14blockdig.b; - int k = packet14blockdig.c; - - if (flag1) { - double d0 = this.player.locX - ((double) i + 0.5D); - double d1 = this.player.locY - ((double) j + 0.5D) + 1.5D; - double d2 = this.player.locZ - ((double) k + 0.5D); - double d3 = d0 * d0 + d1 * d1 + d2 * d2; - - if (d3 > 36.0D) { - return; - } - - if (j >= this.minecraftServer.getMaxBuildHeight()) { - return; - } - } - - ChunkCoordinates chunkcoordinates = worldserver.getSpawn(); - int l = MathHelper.a(i - chunkcoordinates.x); - int i1 = MathHelper.a(k - chunkcoordinates.z); - - if (l > i1) { - i1 = l; - } - - if (packet14blockdig.e == 0) { - // CraftBukkit start - if (i1 < this.server.getSpawnRadius() && !flag) { - CraftEventFactory.callPlayerInteractEvent(this.player, Action.LEFT_CLICK_BLOCK, i, j, k, l, this.player.inventory.getItemInHand()); - this.player.netServerHandler.sendPacket(new Packet53BlockChange(i, j, k, worldserver)); - // Update any tile entity data for this block - TileEntity tileentity = worldserver.getTileEntity(i, j, k); - if (tileentity != null) { - this.player.netServerHandler.sendPacket(tileentity.getUpdatePacket()); - } - // CraftBukkit end - } else { - this.player.itemInWorldManager.dig(i, j, k, packet14blockdig.face); - } - } else if (packet14blockdig.e == 2) { - this.player.itemInWorldManager.a(i, j, k); - if (worldserver.getTypeId(i, j, k) != 0) { - this.player.netServerHandler.sendPacket(new Packet53BlockChange(i, j, k, worldserver)); - } - } else if (packet14blockdig.e == 1) { - this.player.itemInWorldManager.c(i, j, k); - if (worldserver.getTypeId(i, j, k) != 0) { - this.player.netServerHandler.sendPacket(new Packet53BlockChange(i, j, k, worldserver)); - } - } else if (packet14blockdig.e == 3) { - // CraftBukkit start - logger.warning(this.player.name + " is using a modded client!"); - this.disconnect("Nope!"); - return; - /* - double d4 = this.player.locX - ((double) i + 0.5D); - double d5 = this.player.locY - ((double) j + 0.5D); - double d6 = this.player.locZ - ((double) k + 0.5D); - double d7 = d4 * d4 + d5 * d5 + d6 * d6; - - if (d7 < 256.0D) { - this.player.netServerHandler.sendPacket(new Packet53BlockChange(i, j, k, worldserver)); - } - // CraftBukkit end */ - } - } - } - - public void a(Packet15Place packet15place) { - WorldServer worldserver = this.minecraftServer.getWorldServer(this.player.dimension); - - // CraftBukkit start - if (this.player.dead) return; - - // This is a horrible hack needed because the client sends 2 packets on 'right mouse click' - // aimed at a block. We shouldn't need to get the second packet if the data is handled - // but we cannot know what the client will do, so we might still get it - // - // If the time between packets is small enough, and the 'signature' similar, we discard the - // second one. This sadly has to remain until Mojang makes their packets saner. :( - // -- Grum - - if (packet15place.getFace() == 255) { - if (packet15place.getItemStack() != null && packet15place.getItemStack().id == this.lastMaterial && this.lastPacket != null && packet15place.timestamp - this.lastPacket < 100) { - this.lastPacket = null; - return; - } - } else { - this.lastMaterial = packet15place.getItemStack() == null ? -1 : packet15place.getItemStack().id; - this.lastPacket = packet15place.timestamp; - } - - // CraftBukkit - if rightclick decremented the item, always send the update packet. - // this is not here for CraftBukkit's own functionality; rather it is to fix - // a notch bug where the item doesn't update correctly. - boolean always = false; - - // CraftBukkit end - - ItemStack itemstack = this.player.inventory.getItemInHand(); - boolean flag = false; - int i = packet15place.d(); - int j = packet15place.f(); - int k = packet15place.g(); - int l = packet15place.getFace(); - boolean flag1 = worldserver.worldProvider.dimension != 0 || this.minecraftServer.getServerConfigurationManager().getOPs().isEmpty() || this.minecraftServer.getServerConfigurationManager().isOp(this.player.name) || this.minecraftServer.I(); - - if (packet15place.getFace() == 255) { - if (itemstack == null) { - return; - } - - // CraftBukkit start - int itemstackAmount = itemstack.count; - org.bukkit.event.player.PlayerInteractEvent event = CraftEventFactory.callPlayerInteractEvent(this.player, Action.RIGHT_CLICK_AIR, itemstack); - if (event.useItemInHand() != Event.Result.DENY) { - this.player.itemInWorldManager.useItem(this.player, this.player.world, itemstack); - } - - // CraftBukkit - notch decrements the counter by 1 in the above method with food, - // snowballs and so forth, but he does it in a place that doesn't cause the - // inventory update packet to get sent - always = (itemstack.count != itemstackAmount); - // CraftBukkit end - } else if (packet15place.f() >= this.minecraftServer.getMaxBuildHeight() - 1 && (packet15place.getFace() == 1 || packet15place.f() >= this.minecraftServer.getMaxBuildHeight())) { - this.player.netServerHandler.sendPacket(new Packet3Chat("\u00A77Height limit for building is " + this.minecraftServer.getMaxBuildHeight())); - flag = true; - } else { - ChunkCoordinates chunkcoordinates = worldserver.getSpawn(); - int i1 = MathHelper.a(i - chunkcoordinates.x); - int j1 = MathHelper.a(k - chunkcoordinates.z); - - if (i1 > j1) { - j1 = i1; - } - - // CraftBukkit start - Check if we can actually do something over this large a distance - Location eyeLoc = this.getPlayer().getEyeLocation(); - if (Math.pow(eyeLoc.getX() - i, 2) + Math.pow(eyeLoc.getY() - j, 2) + Math.pow(eyeLoc.getZ() - k, 2) > PLACE_DISTANCE_SQUARED) { - return; - } - flag1 = true; // spawn protection moved to ItemBlock!!! - if (j1 > this.minecraftServer.getSpawnProtection() || flag1) { - // CraftBukkit end - this.player.itemInWorldManager.interact(this.player, worldserver, itemstack, i, j, k, l, packet15place.j(), packet15place.l(), packet15place.m()); - } - - flag = true; - } - - if (flag) { - this.player.netServerHandler.sendPacket(new Packet53BlockChange(i, j, k, worldserver)); - if (l == 0) { - --j; - } - - if (l == 1) { - ++j; - } - - if (l == 2) { - --k; - } - - if (l == 3) { - ++k; - } - - if (l == 4) { - --i; - } - - if (l == 5) { - ++i; - } - - this.player.netServerHandler.sendPacket(new Packet53BlockChange(i, j, k, worldserver)); - } - - itemstack = this.player.inventory.getItemInHand(); - if (itemstack != null && itemstack.count == 0) { - this.player.inventory.items[this.player.inventory.itemInHandIndex] = null; - itemstack = null; - } - - if (itemstack == null || itemstack.m() == 0) { - this.player.h = true; - this.player.inventory.items[this.player.inventory.itemInHandIndex] = ItemStack.b(this.player.inventory.items[this.player.inventory.itemInHandIndex]); - Slot slot = this.player.activeContainer.a((IInventory) this.player.inventory, this.player.inventory.itemInHandIndex); - - this.player.activeContainer.b(); - this.player.h = false; - // CraftBukkit - TODO CHECK IF NEEDED -- new if structure might not need 'always'. Kept it in for now, but may be able to remove in future - if (!ItemStack.matches(this.player.inventory.getItemInHand(), packet15place.getItemStack()) || always) { - this.sendPacket(new Packet103SetSlot(this.player.activeContainer.windowId, slot.g, this.player.inventory.getItemInHand())); - } - } - } - - public void a(String s, Object[] aobject) { - if (this.disconnected) return; // CraftBukkit - rarely it would send a disconnect line twice - - logger.info(this.player.name + " lost connection: " + s); - // CraftBukkit start - we need to handle custom quit messages - String quitMessage = this.minecraftServer.getServerConfigurationManager().disconnect(this.player); - if ((quitMessage != null) && (quitMessage.length() > 0)) { - this.minecraftServer.getServerConfigurationManager().sendAll(new Packet3Chat(quitMessage)); - } - // CraftBukkit end - this.disconnected = true; - if (this.minecraftServer.I() && this.player.name.equals(this.minecraftServer.H())) { - logger.info("Stopping singleplayer server as player logged out"); - this.minecraftServer.safeShutdown(); - } - } - - public void onUnhandledPacket(Packet packet) { - if (this.disconnected) return; // CraftBukkit - logger.warning(this.getClass() + " wasn\'t prepared to deal with a " + packet.getClass()); - this.disconnect("Protocol error, unexpected packet"); - } - - public void sendPacket(Packet packet) { - if (packet instanceof Packet3Chat) { - Packet3Chat packet3chat = (Packet3Chat) packet; - int i = this.player.getChatFlags(); - - if (i == 2) { - return; - } - - if (i == 1 && !packet3chat.isServer()) { - return; - } - - // CraftBukkit start - String message = packet3chat.message; - for (final String line : org.bukkit.craftbukkit.TextWrapper.wrapText(message)) { - this.networkManager.queue(new Packet3Chat(line)); - } - return; - // CraftBukkit end - } - - // CraftBukkit start - if (packet == null) { - return; - } else if (packet instanceof Packet6SpawnPosition) { - Packet6SpawnPosition packet6 = (Packet6SpawnPosition) packet; - this.player.compassTarget = new Location(this.getPlayer().getWorld(), packet6.x, packet6.y, packet6.z); - } - // CraftBukkit end - - this.networkManager.queue(packet); - } - - public void a(Packet16BlockItemSwitch packet16blockitemswitch) { - // CraftBukkit start - if (this.player.dead) return; - - if (packet16blockitemswitch.itemInHandIndex >= 0 && packet16blockitemswitch.itemInHandIndex < PlayerInventory.getHotbarSize()) { - PlayerItemHeldEvent event = new PlayerItemHeldEvent(this.getPlayer(), this.player.inventory.itemInHandIndex, packet16blockitemswitch.itemInHandIndex); - this.server.getPluginManager().callEvent(event); - // CraftBukkit end - - this.player.inventory.itemInHandIndex = packet16blockitemswitch.itemInHandIndex; - } else { - logger.warning(this.player.name + " tried to set an invalid carried item"); - this.disconnect("Nope!"); // CraftBukkit - } - } - - public void a(Packet3Chat packet3chat) { - if (this.player.getChatFlags() == 2) { - this.sendPacket(new Packet3Chat("Cannot send chat message.")); - } else { - String s = packet3chat.message; - - if (s.length() > 100) { - // CraftBukkit start - if (packet3chat.a_()) { - Waitable waitable = new Waitable() { - @Override - protected Object evaluate() { - NetServerHandler.this.disconnect("Chat message too long"); - return null; - } - }; - - this.minecraftServer.processQueue.add(waitable); - - try { - waitable.get(); - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); - } catch (ExecutionException e) { - throw new RuntimeException(e); - } - } else { - this.disconnect("Chat message too long"); - } - // CraftBukkit end - } else { - s = s.trim(); - - for (int i = 0; i < s.length(); ++i) { - if (!SharedConstants.isAllowedChatCharacter(s.charAt(i))) { - // CraftBukkit start - if (packet3chat.a_()) { - Waitable waitable = new Waitable() { - @Override - protected Object evaluate() { - NetServerHandler.this.disconnect("Illegal characters in chat"); - return null; - } - }; - - this.minecraftServer.processQueue.add(waitable); - - try { - waitable.get(); - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); - } catch (ExecutionException e) { - throw new RuntimeException(e); - } - } else { - this.disconnect("Illegal characters in chat"); - } - // CraftBukkit end - return; - } - } - - // CraftBukkit start - if (this.player.getChatFlags() == 1 && !s.startsWith("/")) { - this.sendPacket(new Packet3Chat("Cannot send chat message.")); - return; - } - - this.chat(s, packet3chat.a_()); - - // This section stays because it is only applicable to packets - if (chatSpamField.addAndGet(this, 20) > 200 && !this.minecraftServer.getServerConfigurationManager().isOp(this.player.name)) { // CraftBukkit use thread-safe spam - // CraftBukkit start - if (packet3chat.a_()) { - Waitable waitable = new Waitable() { - @Override - protected Object evaluate() { - NetServerHandler.this.disconnect("disconnect.spam"); - return null; - } - }; - - this.minecraftServer.processQueue.add(waitable); - - try { - waitable.get(); - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); - } catch (ExecutionException e) { - throw new RuntimeException(e); - } - } else { - this.disconnect("disconnect.spam"); - } - // CraftBukkit end - } - } - } - } - - public void chat(String s, boolean async) { - if (!this.player.dead) { - if (s.length() == 0) { - logger.warning(this.player.name + " tried to send an empty message"); - return; - } - - if (getPlayer().isConversing()) { - getPlayer().acceptConversationInput(s); - return; - } - - if (s.startsWith("/")) { - this.handleCommand(s); - return; - } else { - Player player = this.getPlayer(); - AsyncPlayerChatEvent event = new AsyncPlayerChatEvent(async, player, s, new LazyPlayerSet()); - this.server.getPluginManager().callEvent(event); - - if (PlayerChatEvent.getHandlerList().getRegisteredListeners().length != 0) { - // Evil plugins still listening to deprecated event - final PlayerChatEvent queueEvent = new PlayerChatEvent(player, event.getMessage(), event.getFormat(), event.getRecipients()); - queueEvent.setCancelled(event.isCancelled()); - Waitable waitable = new Waitable() { - @Override - protected Object evaluate() { - Bukkit.getPluginManager().callEvent(queueEvent); - - if (queueEvent.isCancelled()) { - return null; - } - - String message = String.format(queueEvent.getFormat(), queueEvent.getPlayer().getDisplayName(), queueEvent.getMessage()); - NetServerHandler.this.minecraftServer.console.sendMessage(message); - if (((LazyPlayerSet) queueEvent.getRecipients()).isLazy()) { - for (Object player : NetServerHandler.this.minecraftServer.getServerConfigurationManager().players) { - ((EntityPlayer) player).sendMessage(message); - } - } else { - for (Player player : queueEvent.getRecipients()) { - player.sendMessage(message); - } - } - return null; - }}; - if (async) { - minecraftServer.processQueue.add(waitable); - } else { - waitable.run(); - } - try { - waitable.get(); - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); // This is proper habit for java. If we aren't handling it, pass it on! - } catch (ExecutionException e) { - throw new RuntimeException("Exception processing chat event", e.getCause()); - } - } else { - if (event.isCancelled()) { - return; - } - - s = String.format(event.getFormat(), event.getPlayer().getDisplayName(), event.getMessage()); - minecraftServer.console.sendMessage(s); - if (((LazyPlayerSet) event.getRecipients()).isLazy()) { - for (Object recipient : minecraftServer.getServerConfigurationManager().players) { - ((EntityPlayer) recipient).sendMessage(s); - } - } else { - for (Player recipient : event.getRecipients()) { - recipient.sendMessage(s); - } - } - } - } - } - - return; - } - // CraftBukkit end - - private void handleCommand(String s) { - // CraftBukkit start - CraftPlayer player = this.getPlayer(); - - PlayerCommandPreprocessEvent event = new PlayerCommandPreprocessEvent(player, s, new LazyPlayerSet()); - this.server.getPluginManager().callEvent(event); - - if (event.isCancelled()) { - return; - } - - try { - logger.info(event.getPlayer().getName() + " issued server command: " + event.getMessage()); // CraftBukkit - if (this.server.dispatchCommand(event.getPlayer(), event.getMessage().substring(1))) { - return; - } - } catch (org.bukkit.command.CommandException ex) { - player.sendMessage(org.bukkit.ChatColor.RED + "An internal error occurred while attempting to perform this command"); - Logger.getLogger(NetServerHandler.class.getName()).log(Level.SEVERE, null, ex); - return; - } - // CraftBukkit end - - /* CraftBukkit start - No longer needed as we have already handled it in server.dispatchServerCommand above. - this.minecraftServer.getCommandHandler().a(this.player, s); - // CraftBukkit end */ - } - - public void a(Packet18ArmAnimation packet18armanimation) { - if (this.player.dead) return; // CraftBukkit - - if (packet18armanimation.b == 1) { - // CraftBukkit start - raytrace to look for 'rogue armswings' - float f = 1.0F; - float f1 = this.player.lastPitch + (this.player.pitch - this.player.lastPitch) * f; - float f2 = this.player.lastYaw + (this.player.yaw - this.player.lastYaw) * f; - double d0 = this.player.lastX + (this.player.locX - this.player.lastX) * (double) f; - double d1 = this.player.lastY + (this.player.locY - this.player.lastY) * (double) f + 1.62D - (double) this.player.height; - double d2 = this.player.lastZ + (this.player.locZ - this.player.lastZ) * (double) f; - Vec3D vec3d = this.player.world.getVec3DPool().create(d0, d1, d2); - - float f3 = MathHelper.cos(-f2 * 0.017453292F - 3.1415927F); - float f4 = MathHelper.sin(-f2 * 0.017453292F - 3.1415927F); - float f5 = -MathHelper.cos(-f1 * 0.017453292F); - float f6 = MathHelper.sin(-f1 * 0.017453292F); - float f7 = f4 * f5; - float f8 = f3 * f5; - double d3 = 5.0D; - Vec3D vec3d1 = vec3d.add((double) f7 * d3, (double) f6 * d3, (double) f8 * d3); - MovingObjectPosition movingobjectposition = this.player.world.rayTrace(vec3d, vec3d1, true); - - if (movingobjectposition == null || movingobjectposition.type != EnumMovingObjectType.TILE) { - CraftEventFactory.callPlayerInteractEvent(this.player, Action.LEFT_CLICK_AIR, this.player.inventory.getItemInHand()); - } - - // Arm swing animation - PlayerAnimationEvent event = new PlayerAnimationEvent(this.getPlayer()); - this.server.getPluginManager().callEvent(event); - - if (event.isCancelled()) return; - // CraftBukkit end - - this.player.bH(); - } - } - - public void a(Packet19EntityAction packet19entityaction) { - // CraftBukkit start - if (this.player.dead) return; - - if (packet19entityaction.animation == 1 || packet19entityaction.animation == 2) { - PlayerToggleSneakEvent event = new PlayerToggleSneakEvent(this.getPlayer(), packet19entityaction.animation == 1); - this.server.getPluginManager().callEvent(event); - - if (event.isCancelled()) { - return; - } - } - - if (packet19entityaction.animation == 4 || packet19entityaction.animation == 5) { - PlayerToggleSprintEvent event = new PlayerToggleSprintEvent(this.getPlayer(), packet19entityaction.animation == 4); - this.server.getPluginManager().callEvent(event); - - if (event.isCancelled()) { - return; - } - } - // CraftBukkit end - - if (packet19entityaction.animation == 1) { - this.player.setSneaking(true); - } else if (packet19entityaction.animation == 2) { - this.player.setSneaking(false); - } else if (packet19entityaction.animation == 4) { - this.player.setSprinting(true); - } else if (packet19entityaction.animation == 5) { - this.player.setSprinting(false); - } else if (packet19entityaction.animation == 3) { - this.player.a(false, true, true); - // this.checkMovement = false; // CraftBukkit - this is handled in teleport - } - } - - public void a(Packet255KickDisconnect packet255kickdisconnect) { - // CraftBukkit start - getPlayer().disconnect("disconnect.quitting"); - // CraftBukkit end - this.networkManager.a("disconnect.quitting", new Object[0]); - } - - public int lowPriorityCount() { - return this.networkManager.e(); - } - - public void a(Packet7UseEntity packet7useentity) { - if (this.player.dead) return; // CraftBukkit - - WorldServer worldserver = this.minecraftServer.getWorldServer(this.player.dimension); - Entity entity = worldserver.getEntity(packet7useentity.target); - - if (entity != null) { - boolean flag = this.player.n(entity); - double d0 = 36.0D; - - if (!flag) { - d0 = 9.0D; - } - - if (this.player.e(entity) < d0) { - ItemStack itemInHand = this.player.inventory.getItemInHand(); // CraftBukkit - if (packet7useentity.action == 0) { - // CraftBukkit start - PlayerInteractEntityEvent event = new PlayerInteractEntityEvent((Player) this.getPlayer(), entity.getBukkitEntity()); - this.server.getPluginManager().callEvent(event); - - if (event.isCancelled()) { - return; - } - // CraftBukkit end - this.player.p(entity); - // CraftBukkit start - update the client if the item is an infinite one - if (itemInHand != null && itemInHand.count <= -1) { - this.player.updateInventory(this.player.activeContainer); - } - } else if (packet7useentity.action == 1) { - if ((entity instanceof EntityItem) || (entity instanceof EntityExperienceOrb) || (entity instanceof EntityArrow)) { - String type = entity.getClass().getSimpleName(); - disconnect("Attacking an " + type + " is not permitted"); - System.out.println("Player " + player.name + " tried to attack an " + type + ", so I have disconnected them for exploiting."); - return; - } - - this.player.attack(entity); - - if (itemInHand != null && itemInHand.count <= -1) { - this.player.updateInventory(this.player.activeContainer); - } - // CraftBukkit end - } - } - } - } - - public void a(Packet205ClientCommand packet205clientcommand) { - if (packet205clientcommand.a == 1) { - if (this.player.viewingCredits) { - // CraftBukkit start - org.bukkit.craftbukkit.PortalTravelAgent pta = new org.bukkit.craftbukkit.PortalTravelAgent(); - Location toLocation; - - if (this.player.getBukkitEntity().getBedSpawnLocation() == null) { - CraftWorld cworld = (CraftWorld) this.server.getWorlds().get(0); - ChunkCoordinates chunkcoordinates = cworld.getHandle().getSpawn(); - toLocation = new Location(cworld, chunkcoordinates.x + 0.5, chunkcoordinates.y, chunkcoordinates.z + 0.5); - this.player.netServerHandler.sendPacket(new Packet70Bed(0, 0)); - } else { - toLocation = this.player.getBukkitEntity().getBedSpawnLocation(); - toLocation = new Location(toLocation.getWorld(), toLocation.getX() + 0.5, toLocation.getY(), toLocation.getZ() + 0.5); - } - - PlayerPortalEvent event = new PlayerPortalEvent(this.player.getBukkitEntity(), this.player.getBukkitEntity().getLocation(), toLocation, pta, PlayerPortalEvent.TeleportCause.END_PORTAL); - event.useTravelAgent(false); - - Bukkit.getServer().getPluginManager().callEvent(event); - this.player = this.minecraftServer.getServerConfigurationManager().moveToWorld(this.player, 0, true, event.getTo()); - // CraftBukkit end - } else if (this.player.p().getWorldData().isHardcore()) { - if (this.minecraftServer.I() && this.player.name.equals(this.minecraftServer.H())) { - this.player.netServerHandler.disconnect("You have died. Game over, man, it\'s game over!"); - this.minecraftServer.P(); - } else { - BanEntry banentry = new BanEntry(this.player.name); - - banentry.setReason("Death in Hardcore"); - this.minecraftServer.getServerConfigurationManager().getNameBans().add(banentry); - this.player.netServerHandler.disconnect("You have died. Game over, man, it\'s game over!"); - } - } else { - if (this.player.getHealth() > 0) { - return; - } - - this.player = this.minecraftServer.getServerConfigurationManager().moveToWorld(this.player, 0, false); - } - } - } - - public boolean b() { - return true; - } - - public void a(Packet9Respawn packet9respawn) {} - - public void handleContainerClose(Packet101CloseWindow packet101closewindow) { - if (this.player.dead) return; // CraftBukkit - - // CraftBukkit start - INVENTORY_CLOSE hook - InventoryCloseEvent event = new InventoryCloseEvent(this.player.activeContainer.getBukkitView()); - server.getPluginManager().callEvent(event); - this.player.activeContainer.transferTo(this.player.defaultContainer, getPlayer()); - // CraftBukkit end - - this.player.k(); - } - - public void a(Packet102WindowClick packet102windowclick) { - if (this.player.dead) return; // CraftBukkit - - if (this.player.activeContainer.windowId == packet102windowclick.a && this.player.activeContainer.c(this.player)) { - // CraftBukkit start - fire InventoryClickEvent - InventoryView inventory = this.player.activeContainer.getBukkitView(); - SlotType type = CraftInventoryView.getSlotType(inventory, packet102windowclick.slot); - - InventoryClickEvent event = new InventoryClickEvent(inventory, type, packet102windowclick.slot, packet102windowclick.button != 0, packet102windowclick.shift == 1); - org.bukkit.inventory.Inventory top = inventory.getTopInventory(); - if (packet102windowclick.slot == 0 && top instanceof CraftingInventory) { - org.bukkit.inventory.Recipe recipe = ((CraftingInventory) top).getRecipe(); - if (recipe != null) { - event = new CraftItemEvent(recipe, inventory, type, packet102windowclick.slot, packet102windowclick.button != 0, packet102windowclick.shift == 1); - } - } - server.getPluginManager().callEvent(event); - - ItemStack itemstack = null; - boolean defaultBehaviour = false; - - switch(event.getResult()) { - case DEFAULT: - itemstack = this.player.activeContainer.clickItem(packet102windowclick.slot, packet102windowclick.button, packet102windowclick.shift, this.player); - defaultBehaviour = true; - break; - case DENY: // Deny any change, including changes from the event - break; - case ALLOW: // Allow changes unconditionally - org.bukkit.inventory.ItemStack cursor = event.getCursor(); - if (cursor == null) { - this.player.inventory.setCarried((ItemStack) null); - } else { - this.player.inventory.setCarried(CraftItemStack.asNMSCopy(cursor)); - } - org.bukkit.inventory.ItemStack item = event.getCurrentItem(); - if (item != null) { - itemstack = CraftItemStack.asNMSCopy(item); - if (packet102windowclick.slot == -999) { - this.player.drop(itemstack); - } else { - this.player.activeContainer.getSlot(packet102windowclick.slot).set(itemstack); - } - } else if (packet102windowclick.slot != -999) { - this.player.activeContainer.getSlot(packet102windowclick.slot).set((ItemStack) null); - } - break; - } - // CraftBukkit end - - if (ItemStack.matches(packet102windowclick.item, itemstack)) { - this.player.netServerHandler.sendPacket(new Packet106Transaction(packet102windowclick.a, packet102windowclick.d, true)); - this.player.h = true; - this.player.activeContainer.b(); - this.player.broadcastCarriedItem(); - this.player.h = false; - } else { - this.s.a(this.player.activeContainer.windowId, Short.valueOf(packet102windowclick.d)); - this.player.netServerHandler.sendPacket(new Packet106Transaction(packet102windowclick.a, packet102windowclick.d, false)); - this.player.activeContainer.a(this.player, false); - ArrayList arraylist = new ArrayList(); - - for (int i = 0; i < this.player.activeContainer.c.size(); ++i) { - arraylist.add(((Slot) this.player.activeContainer.c.get(i)).getItem()); - } - - this.player.a(this.player.activeContainer, arraylist); - - // CraftBukkit start - send a Set Slot to update the crafting result slot - if(type == SlotType.RESULT && itemstack != null) - this.player.netServerHandler.sendPacket((Packet) (new Packet103SetSlot(this.player.activeContainer.windowId, 0, itemstack))); - // CraftBukkit end - } - } - } - - public void a(Packet108ButtonClick packet108buttonclick) { - if (this.player.activeContainer.windowId == packet108buttonclick.a && this.player.activeContainer.c(this.player)) { - this.player.activeContainer.a((EntityHuman) this.player, packet108buttonclick.b); - this.player.activeContainer.b(); - } - } - - public void a(Packet107SetCreativeSlot packet107setcreativeslot) { - if (this.player.itemInWorldManager.isCreative()) { - boolean flag = packet107setcreativeslot.slot < 0; - ItemStack itemstack = packet107setcreativeslot.b; - boolean flag1 = packet107setcreativeslot.slot >= 1 && packet107setcreativeslot.slot < 36 + PlayerInventory.getHotbarSize(); - // CraftBukkit - boolean flag2 = itemstack == null || itemstack.id < Item.byId.length && itemstack.id >= 0 && Item.byId[itemstack.id] != null && !invalidItems.contains(itemstack.id); - boolean flag3 = itemstack == null || itemstack.getData() >= 0 && itemstack.getData() >= 0 && itemstack.count <= 64 && itemstack.count > 0; - - // CraftBukkit start - Fire INVENTORY_CLICK event - org.bukkit.entity.HumanEntity player = this.player.getBukkitEntity(); - InventoryView inventory = new CraftInventoryView(player, player.getInventory(), this.player.defaultContainer); - SlotType slot = SlotType.QUICKBAR; - if (packet107setcreativeslot.slot == -1) { - slot = SlotType.OUTSIDE; - } - - InventoryClickEvent event = new InventoryClickEvent(inventory, slot, slot == SlotType.OUTSIDE ? -999 : packet107setcreativeslot.slot, false, false); - server.getPluginManager().callEvent(event); - org.bukkit.inventory.ItemStack item = event.getCurrentItem(); - - switch (event.getResult()) { - case ALLOW: - if (slot == SlotType.QUICKBAR) { - if (item == null) { - this.player.defaultContainer.setItem(packet107setcreativeslot.slot, (ItemStack) null); - } else { - this.player.defaultContainer.setItem(packet107setcreativeslot.slot, CraftItemStack.asNMSCopy(item)); - } - } else if (item != null) { - this.player.drop(CraftItemStack.asNMSCopy(item)); - } - return; - case DENY: - // TODO: Will this actually work? - if (packet107setcreativeslot.slot > -1) { - this.player.netServerHandler.sendPacket(new Packet103SetSlot(this.player.defaultContainer.windowId, packet107setcreativeslot.slot, CraftItemStack.asNMSCopy(item))); - } - return; - case DEFAULT: - // We do the stuff below - break; - default: - return; - } - // CraftBukkit end - - if (flag1 && flag2 && flag3) { - if (itemstack == null) { - this.player.defaultContainer.setItem(packet107setcreativeslot.slot, (ItemStack) null); - } else { - this.player.defaultContainer.setItem(packet107setcreativeslot.slot, itemstack); - } - - this.player.defaultContainer.a(this.player, true); - } else if (flag && flag2 && flag3 && this.x < 200) { - this.x += 20; - EntityItem entityitem = this.player.drop(itemstack); - - if (entityitem != null) { - entityitem.c(); - } - } - } - } - - public void a(Packet106Transaction packet106transaction) { - if (this.player.dead) return; // CraftBukkit - Short oshort = (Short) this.s.get(this.player.activeContainer.windowId); - - if (oshort != null && packet106transaction.b == oshort.shortValue() && this.player.activeContainer.windowId == packet106transaction.a && !this.player.activeContainer.c(this.player)) { - this.player.activeContainer.a(this.player, true); - } - } - - public void a(Packet130UpdateSign packet130updatesign) { - if (this.player.dead) return; // CraftBukkit - - WorldServer worldserver = this.minecraftServer.getWorldServer(this.player.dimension); - - if (worldserver.isLoaded(packet130updatesign.x, packet130updatesign.y, packet130updatesign.z)) { - TileEntity tileentity = worldserver.getTileEntity(packet130updatesign.x, packet130updatesign.y, packet130updatesign.z); - - if (tileentity instanceof TileEntitySign) { - TileEntitySign tileentitysign = (TileEntitySign) tileentity; - - if (!tileentitysign.a()) { - this.minecraftServer.warning("Player " + this.player.name + " just tried to change non-editable sign"); - this.sendPacket(new Packet130UpdateSign(packet130updatesign.x, packet130updatesign.y, packet130updatesign.z, tileentitysign.lines)); // CraftBukkit - return; - } - } - - int i; - int j; - - for (j = 0; j < 4; ++j) { - boolean flag = true; - - if (packet130updatesign.lines[j].length() > 15) { - flag = false; - } else { - for (i = 0; i < packet130updatesign.lines[j].length(); ++i) { - if (SharedConstants.allowedCharacters.indexOf(packet130updatesign.lines[j].charAt(i)) < 0) { - flag = false; - } - } - } - - if (!flag) { - packet130updatesign.lines[j] = "!?"; - } - } - - if (tileentity instanceof TileEntitySign) { - j = packet130updatesign.x; - int k = packet130updatesign.y; - - i = packet130updatesign.z; - TileEntitySign tileentitysign1 = (TileEntitySign) tileentity; - - // CraftBukkit start - Player player = this.server.getPlayer(this.player); - SignChangeEvent event = new SignChangeEvent((org.bukkit.craftbukkit.block.CraftBlock) player.getWorld().getBlockAt(j, k, i), this.server.getPlayer(this.player), packet130updatesign.lines); - 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.isEditable = false; - } - // CraftBukkit end - - tileentitysign1.update(); - worldserver.notify(j, k, i); - } - } - } - - public void a(Packet0KeepAlive packet0keepalive) { - if (packet0keepalive.a == this.i) { - int i = (int) (System.nanoTime() / 1000000L - this.j); - - this.player.ping = (this.player.ping * 3 + i) / 4; - } - } - - public boolean a() { - return true; - } - - public void a(Packet202Abilities packet202abilities) { - // CraftBukkit start - if (this.player.abilities.canFly && this.player.abilities.isFlying != packet202abilities.f()) { - PlayerToggleFlightEvent event = new PlayerToggleFlightEvent(this.server.getPlayer(this.player), packet202abilities.f()); - this.server.getPluginManager().callEvent(event); - if (!event.isCancelled()) { - this.player.abilities.isFlying = packet202abilities.f(); // Actually set the player's flying status - } - else { - this.player.updateAbilities(); // Tell the player their ability was reverted - } - } - // CraftBukkit end - } - - public void a(Packet203TabComplete packet203tabcomplete) { - StringBuilder stringbuilder = new StringBuilder(); - - String s; - - for (Iterator iterator = this.minecraftServer.a((ICommandListener) this.player, packet203tabcomplete.d()).iterator(); iterator.hasNext(); stringbuilder.append(s)) { - s = (String) iterator.next(); - if (stringbuilder.length() > 0) { - stringbuilder.append('\0'); // CraftBukkit - fix decompile issue - } - } - - this.player.netServerHandler.sendPacket(new Packet203TabComplete(stringbuilder.toString())); - } - - public void a(Packet204LocaleAndViewDistance packet204localeandviewdistance) { - this.player.a(packet204localeandviewdistance); - } - - public void a(Packet250CustomPayload packet250custompayload) { - DataInputStream datainputstream; - ItemStack itemstack; - ItemStack itemstack1; - - // CraftBukkit start - ignore empty payloads - if (packet250custompayload.length <= 0) { - return; - } - // CraftBukkit end - - if ("MC|BEdit".equals(packet250custompayload.tag)) { - try { - datainputstream = new DataInputStream(new ByteArrayInputStream(packet250custompayload.data)); - itemstack = Packet.c(datainputstream); - if (!ItemBookAndQuill.a(itemstack.getTag())) { - throw new IOException("Invalid book tag!"); - } - - itemstack1 = this.player.inventory.getItemInHand(); - if (itemstack != null && itemstack.id == Item.BOOK_AND_QUILL.id && itemstack.id == itemstack1.id) { - itemstack1.a("pages", (NBTBase) itemstack.getTag().getList("pages")); - } - } catch (Exception exception) { - exception.printStackTrace(); - } - } else if ("MC|BSign".equals(packet250custompayload.tag)) { - try { - datainputstream = new DataInputStream(new ByteArrayInputStream(packet250custompayload.data)); - itemstack = Packet.c(datainputstream); - if (!ItemWrittenBook.a(itemstack.getTag())) { - throw new IOException("Invalid book tag!"); - } - - itemstack1 = this.player.inventory.getItemInHand(); - if (itemstack != null && itemstack.id == Item.WRITTEN_BOOK.id && itemstack1.id == Item.BOOK_AND_QUILL.id) { - itemstack1.a("author", (NBTBase) (new NBTTagString("author", this.player.name))); - itemstack1.a("title", (NBTBase) (new NBTTagString("title", itemstack.getTag().getString("title")))); - itemstack1.a("pages", (NBTBase) itemstack.getTag().getList("pages")); - itemstack1.id = Item.WRITTEN_BOOK.id; - } - } catch (Exception exception1) { - // CraftBukkit start - // exception1.printStackTrace(); - // CraftBukkit end - } - } else { - int i; - - if ("MC|TrSel".equals(packet250custompayload.tag)) { - try { - datainputstream = new DataInputStream(new ByteArrayInputStream(packet250custompayload.data)); - i = datainputstream.readInt(); - Container container = this.player.activeContainer; - - if (container instanceof ContainerMerchant) { - ((ContainerMerchant) container).b(i); - } - } catch (Exception exception2) { - exception2.printStackTrace(); - } - } else { - int j; - - if ("MC|AdvCdm".equals(packet250custompayload.tag)) { - if (!this.minecraftServer.getEnableCommandBlock()) { - this.player.sendMessage(this.player.a("advMode.notEnabled", new Object[0])); - } else if (this.player.a(2, "") && this.player.abilities.canInstantlyBuild) { - try { - datainputstream = new DataInputStream(new ByteArrayInputStream(packet250custompayload.data)); - i = datainputstream.readInt(); - j = datainputstream.readInt(); - int k = datainputstream.readInt(); - String s = Packet.a(datainputstream, 256); - TileEntity tileentity = this.player.world.getTileEntity(i, j, k); - - if (tileentity != null && tileentity instanceof TileEntityCommand) { - ((TileEntityCommand) tileentity).b(s); - this.player.world.notify(i, j, k); - this.player.sendMessage("Command set: " + s); - } - } catch (Exception exception3) { - exception3.printStackTrace(); - } - } else { - this.player.sendMessage(this.player.a("advMode.notAllowed", new Object[0])); - } - } else if ("MC|Beacon".equals(packet250custompayload.tag)) { - if (this.player.activeContainer instanceof ContainerBeacon) { - try { - datainputstream = new DataInputStream(new ByteArrayInputStream(packet250custompayload.data)); - i = datainputstream.readInt(); - j = datainputstream.readInt(); - ContainerBeacon containerbeacon = (ContainerBeacon) this.player.activeContainer; - Slot slot = containerbeacon.getSlot(0); - - if (slot.d()) { - slot.a(1); - TileEntityBeacon tileentitybeacon = containerbeacon.d(); - - tileentitybeacon.d(i); - tileentitybeacon.e(j); - tileentitybeacon.update(); - } - } catch (Exception exception4) { - exception4.printStackTrace(); - } - } - } else if ("MC|ItemName".equals(packet250custompayload.tag) && this.player.activeContainer instanceof ContainerAnvil) { - ContainerAnvil containeranvil = (ContainerAnvil) this.player.activeContainer; - - if (packet250custompayload.data != null && packet250custompayload.data.length >= 1) { - String s1 = SharedConstants.a(new String(packet250custompayload.data)); - - if (s1.length() <= 30) { - containeranvil.a(s1); - } - } else { - containeranvil.a(""); - } - } - // CraftBukkit start - else if (packet250custompayload.tag.equals("REGISTER")) { - try { - String channels = new String(packet250custompayload.data, "UTF8"); - for (String channel : channels.split("\0")) { - getPlayer().addChannel(channel); - } - } catch (UnsupportedEncodingException ex) { - Logger.getLogger(NetServerHandler.class.getName()).log(Level.SEVERE, "Could not parse REGISTER payload in plugin message packet", ex); - } - } else if (packet250custompayload.tag.equals("UNREGISTER")) { - try { - String channels = new String(packet250custompayload.data, "UTF8"); - for (String channel : channels.split("\0")) { - getPlayer().removeChannel(channel); - } - } catch (UnsupportedEncodingException ex) { - Logger.getLogger(NetServerHandler.class.getName()).log(Level.SEVERE, "Could not parse UNREGISTER payload in plugin message packet", ex); - } - } else { - server.getMessenger().dispatchIncomingMessage(player.getBukkitEntity(), packet250custompayload.tag, packet250custompayload.data); - } - // CraftBukkit end - } - } - } -} diff --git a/src/main/java/net/minecraft/server/NetworkManager.java b/src/main/java/net/minecraft/server/NetworkManager.java index 25c27665..7c64e9bb 100644 --- a/src/main/java/net/minecraft/server/NetworkManager.java +++ b/src/main/java/net/minecraft/server/NetworkManager.java @@ -31,7 +31,7 @@ public class NetworkManager implements INetworkManager { private java.util.Queue inboundQueue = new java.util.concurrent.ConcurrentLinkedQueue(); // CraftBukkit - Concurrent linked queue private List highPriorityQueue = Collections.synchronizedList(new ArrayList()); private List lowPriorityQueue = Collections.synchronizedList(new ArrayList()); - private NetHandler packetListener; + private Connection connection; private boolean s = false; private Thread t; private Thread u; @@ -48,11 +48,11 @@ public class NetworkManager implements INetworkManager { private PrivateKey A = null; private int lowPriorityQueueDelay = 50; - public NetworkManager(Socket socket, String s, NetHandler nethandler, PrivateKey privatekey) throws IOException { // CraftBukkit - throws IOException + public NetworkManager(Socket socket, String s, Connection connection, PrivateKey privatekey) throws IOException { // CraftBukkit - throws IOException this.A = privatekey; this.socket = socket; this.j = socket.getRemoteSocketAddress(); - this.packetListener = nethandler; + this.connection = connection; try { socket.setSoTimeout(30000); @@ -69,8 +69,8 @@ public class NetworkManager implements INetworkManager { this.t.start(); } - public void a(NetHandler nethandler) { - this.packetListener = nethandler; + public void a(Connection connection) { + this.connection = connection; } public void queue(Packet packet) { @@ -97,7 +97,7 @@ public class NetworkManager implements INetworkManager { if (packet != null) { Packet.a(packet, this.output); if (packet instanceof Packet252KeyResponse && !this.g) { - if (!this.packetListener.a()) { + if (!this.connection.a()) { this.z = ((Packet252KeyResponse) packet).d(); } @@ -187,11 +187,11 @@ public class NetworkManager implements INetworkManager { boolean flag = false; try { - Packet packet = Packet.a(this.input, this.packetListener.a(), this.socket); + Packet packet = Packet.a(this.input, this.connection.a(), this.socket); if (packet != null) { if (packet instanceof Packet252KeyResponse && !this.f) { - if (this.packetListener.a()) { + if (this.connection.a()) { this.z = ((Packet252KeyResponse) packet).a(this.A); } @@ -203,9 +203,9 @@ public class NetworkManager implements INetworkManager { aint[i] += packet.a() + 1; if (!this.s) { - if (packet.a_() && this.packetListener.b()) { + if (packet.a_() && this.connection.b()) { this.x = 0; - packet.handle(this.packetListener); + packet.handle(this.connection); } else { this.inboundQueue.add(packet); } @@ -282,17 +282,17 @@ public class NetworkManager implements INetworkManager { Packet packet = (Packet) this.inboundQueue.poll(); // CraftBukkit - remove -> poll // CraftBukkit start - if (this.packetListener instanceof NetLoginHandler ? ((NetLoginHandler) this.packetListener).c : ((NetServerHandler) this.packetListener).disconnected) { + if (this.connection instanceof PendingConnection ? ((PendingConnection) this.connection).c : ((PlayerConnection) this.connection).disconnected) { continue; } // CraftBukkit end - packet.handle(this.packetListener); + packet.handle(this.connection); } this.a(); if (this.n && this.inboundQueue.isEmpty()) { - this.packetListener.a(this.v, this.w); + this.connection.a(this.v, this.w); } } diff --git a/src/main/java/net/minecraft/server/Packet.java b/src/main/java/net/minecraft/server/Packet.java index dc692dd0..a754da98 100644 --- a/src/main/java/net/minecraft/server/Packet.java +++ b/src/main/java/net/minecraft/server/Packet.java @@ -172,7 +172,7 @@ public abstract class Packet { public abstract void a(DataOutputStream dataoutputstream) throws IOException; // CraftBukkit - throws IOException - public abstract void handle(NetHandler nethandler); + public abstract void handle(Connection connection); public abstract int a(); @@ -267,12 +267,11 @@ public abstract class Packet { a(13, true, true, Packet13PlayerLookMove.class); a(14, false, true, Packet14BlockDig.class); a(15, false, true, Packet15Place.class); - a(16, false, true, Packet16BlockItemSwitch.class); + a(16, true, true, Packet16BlockItemSwitch.class); a(17, true, false, Packet17EntityLocationAction.class); a(18, true, true, Packet18ArmAnimation.class); a(19, false, true, Packet19EntityAction.class); a(20, true, false, Packet20NamedEntitySpawn.class); - a(21, true, false, Packet21PickupSpawn.class); a(22, true, false, Packet22Collect.class); a(23, true, false, Packet23VehicleSpawn.class); a(24, true, false, Packet24MobSpawn.class); diff --git a/src/main/java/net/minecraft/server/Packet20NamedEntitySpawn.java b/src/main/java/net/minecraft/server/Packet20NamedEntitySpawn.java index 25d4ab8c..68e48ef6 100644 --- a/src/main/java/net/minecraft/server/Packet20NamedEntitySpawn.java +++ b/src/main/java/net/minecraft/server/Packet20NamedEntitySpawn.java @@ -67,8 +67,8 @@ public class Packet20NamedEntitySpawn extends Packet { this.i.a(dataoutputstream); } - public void handle(NetHandler nethandler) { - nethandler.a(this); + public void handle(Connection connection) { + connection.a(this); } public int a() { diff --git a/src/main/java/net/minecraft/server/Packet2Handshake.java b/src/main/java/net/minecraft/server/Packet2Handshake.java index 435e7e0b..343af93d 100644 --- a/src/main/java/net/minecraft/server/Packet2Handshake.java +++ b/src/main/java/net/minecraft/server/Packet2Handshake.java @@ -28,8 +28,8 @@ public class Packet2Handshake extends Packet { dataoutputstream.writeInt(this.d); } - public void handle(NetHandler nethandler) { - nethandler.a(this); + public void handle(Connection connection) { + connection.a(this); } public int a() { diff --git a/src/main/java/net/minecraft/server/Packet3Chat.java b/src/main/java/net/minecraft/server/Packet3Chat.java index 7c0205b6..b8f3f25d 100644 --- a/src/main/java/net/minecraft/server/Packet3Chat.java +++ b/src/main/java/net/minecraft/server/Packet3Chat.java @@ -40,8 +40,8 @@ public class Packet3Chat extends Packet { a(this.message, dataoutputstream); } - public void handle(NetHandler nethandler) { - nethandler.a(this); + public void handle(Connection connection) { + connection.a(this); } public int a() { diff --git a/src/main/java/net/minecraft/server/Packet51MapChunk.java b/src/main/java/net/minecraft/server/Packet51MapChunk.java index b6d8ba57..8ae452a7 100644 --- a/src/main/java/net/minecraft/server/Packet51MapChunk.java +++ b/src/main/java/net/minecraft/server/Packet51MapChunk.java @@ -94,8 +94,8 @@ public class Packet51MapChunk extends Packet { dataoutputstream.write(this.buffer, 0, this.size); } - public void handle(NetHandler nethandler) { - nethandler.a(this); + public void handle(Connection connection) { + connection.a(this); } public int a() { @@ -152,11 +152,13 @@ public class Packet51MapChunk extends Packet { } } - for (l = 0; l < achunksection.length; ++l) { - if (achunksection[l] != null && (!flag || !achunksection[l].a()) && (i & 1 << l) != 0) { - nibblearray = achunksection[l].l(); - System.arraycopy(nibblearray.a, 0, abyte, j, nibblearray.a.length); - j += nibblearray.a.length; + if (!chunk.world.worldProvider.f) { + for (l = 0; l < achunksection.length; ++l) { + if (achunksection[l] != null && (!flag || !achunksection[l].a()) && (i & 1 << l) != 0) { + nibblearray = achunksection[l].l(); + System.arraycopy(nibblearray.a, 0, abyte, j, nibblearray.a.length); + j += nibblearray.a.length; + } } } diff --git a/src/main/java/net/minecraft/server/Packet56MapChunkBulk.java b/src/main/java/net/minecraft/server/Packet56MapChunkBulk.java index 07681a88..867ebd3a 100644 --- a/src/main/java/net/minecraft/server/Packet56MapChunkBulk.java +++ b/src/main/java/net/minecraft/server/Packet56MapChunkBulk.java @@ -17,6 +17,7 @@ public class Packet56MapChunkBulk extends Packet { private byte[] buffer; private byte[][] inflatedBuffers; private int size; + private boolean h; private byte[] buildBuffer = new byte[0]; // CraftBukkit - remove static // CraftBukkit start static final ThreadLocal localDeflater = new ThreadLocal() { @@ -38,6 +39,7 @@ public class Packet56MapChunkBulk extends Packet { this.a = new int[i]; this.b = new int[i]; this.inflatedBuffers = new byte[i][]; + this.h = !list.isEmpty() && !((Chunk) list.get(0)).world.worldProvider.f; int j = 0; for (int k = 0; k < i; ++k) { @@ -94,6 +96,7 @@ public class Packet56MapChunkBulk extends Packet { short short1 = datainputstream.readShort(); this.size = datainputstream.readInt(); + this.h = datainputstream.readBoolean(); this.c = new int[short1]; this.d = new int[short1]; this.a = new int[short1]; @@ -125,17 +128,24 @@ public class Packet56MapChunkBulk extends Packet { this.a[j] = datainputstream.readShort(); this.b[j] = datainputstream.readShort(); int k = 0; + int l = 0; - int l; + int i1; - for (l = 0; l < 16; ++l) { - k += this.a[j] >> l & 1; + for (i1 = 0; i1 < 16; ++i1) { + k += this.a[j] >> i1 & 1; + l += this.b[j] >> i1 & 1; } - l = 2048 * 5 * k + 256; - this.inflatedBuffers[j] = new byte[l]; - System.arraycopy(abyte, i, this.inflatedBuffers[j], 0, l); - i += l; + i1 = 2048 * 4 * k + 256; + i1 += 2048 * l; + if (this.h) { + i1 += 2048 * k; + } + + this.inflatedBuffers[j] = new byte[i1]; + System.arraycopy(abyte, i, this.inflatedBuffers[j], 0, i1); + i += i1; } } @@ -143,6 +153,7 @@ public class Packet56MapChunkBulk extends Packet { compress(); // CraftBukkit dataoutputstream.writeShort(this.c.length); dataoutputstream.writeInt(this.size); + dataoutputstream.writeBoolean(this.h); dataoutputstream.write(this.buffer, 0, this.size); for (int i = 0; i < this.c.length; ++i) { @@ -153,8 +164,8 @@ public class Packet56MapChunkBulk extends Packet { } } - public void handle(NetHandler nethandler) { - nethandler.a(this); + public void handle(Connection connection) { + connection.a(this); } public int a() { diff --git a/src/main/java/net/minecraft/server/PathfinderGoalBreed.java b/src/main/java/net/minecraft/server/PathfinderGoalBreed.java index d5ab4ce7..a2c57a62 100644 --- a/src/main/java/net/minecraft/server/PathfinderGoalBreed.java +++ b/src/main/java/net/minecraft/server/PathfinderGoalBreed.java @@ -85,7 +85,7 @@ public class PathfinderGoalBreed extends PathfinderGoal { this.a.addParticle("heart", this.d.locX + (double) (random.nextFloat() * this.d.width * 2.0F) - (double) this.d.width, this.d.locY + 0.5D + (double) (random.nextFloat() * this.d.length), this.d.locZ + (double) (random.nextFloat() * this.d.width * 2.0F) - (double) this.d.width, d0, d1, d2); } - this.a.addEntity(new EntityExperienceOrb(this.a, this.d.locX, this.d.locY, this.d.locZ, random.nextInt(4) + 1)); + this.a.addEntity(new EntityExperienceOrb(this.a, this.d.locX, this.d.locY, this.d.locZ, random.nextInt(7) + 1)); } } } diff --git a/src/main/java/net/minecraft/server/PendingConnection.java b/src/main/java/net/minecraft/server/PendingConnection.java new file mode 100644 index 00000000..8413a152 --- /dev/null +++ b/src/main/java/net/minecraft/server/PendingConnection.java @@ -0,0 +1,218 @@ +package net.minecraft.server; + +import java.io.Serializable; +import java.net.InetAddress; +import java.net.Socket; +import java.security.PrivateKey; +import java.security.PublicKey; +import java.util.Arrays; +import java.util.Iterator; +import java.util.List; +import java.util.Random; +import java.util.logging.Logger; +import javax.crypto.SecretKey; + +public class PendingConnection extends Connection { + + private byte[] d; + public static Logger logger = Logger.getLogger("Minecraft"); + private static Random random = new Random(); + public NetworkManager networkManager; + public boolean c = false; + private MinecraftServer server; + private int g = 0; + private String h = null; + private volatile boolean i = false; + private String loginKey = Long.toString(random.nextLong(), 16); // CraftBukkit - Security fix + private boolean k = false; + private SecretKey l = null; + public String hostname = ""; // CraftBukkit - add field + + public PendingConnection(MinecraftServer minecraftserver, Socket socket, String s) throws java.io.IOException { // CraftBukkit - throws IOException + this.server = minecraftserver; + this.networkManager = new NetworkManager(socket, s, this, minecraftserver.F().getPrivate()); + this.networkManager.e = 0; + } + + // CraftBukkit start + public Socket getSocket() { + return this.networkManager.getSocket(); + } + // CraftBukkit end + + public void c() { + if (this.i) { + this.d(); + } + + if (this.g++ == 600) { + this.disconnect("Took too long to log in"); + } else { + this.networkManager.b(); + } + } + + public void disconnect(String s) { + try { + logger.info("Disconnecting " + this.getName() + ": " + s); + this.networkManager.queue(new Packet255KickDisconnect(s)); + this.networkManager.d(); + this.c = true; + } catch (Exception exception) { + exception.printStackTrace(); + } + } + + public void a(Packet2Handshake packet2handshake) { + // CraftBukkit start + this.hostname = packet2handshake.c == null ? "" : packet2handshake.c + ':' + packet2handshake.d; + // CraftBukkit end + this.h = packet2handshake.f(); + if (!this.h.equals(StripColor.a(this.h))) { + this.disconnect("Invalid username!"); + } else { + PublicKey publickey = this.server.F().getPublic(); + + if (packet2handshake.d() != 51) { + if (packet2handshake.d() > 51) { + this.disconnect("Outdated server!"); + } else { + this.disconnect("Outdated client!"); + } + } else { + this.loginKey = this.server.getOnlineMode() ? Long.toString(random.nextLong(), 16) : "-"; + this.d = new byte[4]; + random.nextBytes(this.d); + this.networkManager.queue(new Packet253KeyRequest(this.loginKey, publickey, this.d)); + } + } + } + + public void a(Packet252KeyResponse packet252keyresponse) { + PrivateKey privatekey = this.server.F().getPrivate(); + + this.l = packet252keyresponse.a(privatekey); + if (!Arrays.equals(this.d, packet252keyresponse.b(privatekey))) { + this.disconnect("Invalid client reply"); + } + + this.networkManager.queue(new Packet252KeyResponse()); + } + + public void a(Packet205ClientCommand packet205clientcommand) { + if (packet205clientcommand.a == 0) { + if (this.server.getOnlineMode()) { + if (this.k) { + this.disconnect("Duplicate login"); + return; + } + this.k = true; + (new ThreadLoginVerifier(this, server.server)).start(); // CraftBukkit - add CraftServer + } else { + this.i = true; + } + } + } + + public void a(Packet1Login packet1login) {} + + public void d() { + // CraftBukkit start + EntityPlayer s = this.server.getPlayerList().attemptLogin(this, this.h, this.hostname); + + if (s == null) { + return; + // CraftBukkit end + } else { + EntityPlayer entityplayer = this.server.getPlayerList().processLogin(s); // CraftBukkit - this.h -> s + + if (entityplayer != null) { + this.server.getPlayerList().a((INetworkManager) this.networkManager, entityplayer); + } + } + + this.c = true; + } + + public void a(String s, Object[] aobject) { + logger.info(this.getName() + " lost connection"); + this.c = true; + } + + public void a(Packet254GetInfo packet254getinfo) { + if (this.networkManager.getSocket() == null) return; // CraftBukkit - fix NPE when a client queries a server that is unable to handle it. + try { + PlayerList playerlist = this.server.getPlayerList(); + String s = null; + // CraftBukkit + org.bukkit.event.server.ServerListPingEvent pingEvent = org.bukkit.craftbukkit.event.CraftEventFactory.callServerListPingEvent(this.server.server, getSocket().getInetAddress(), this.server.getMotd(), playerlist.getPlayerCount(), playerlist.getMaxPlayers()); + + if (packet254getinfo.a == 1) { + // CraftBukkit start - fix decompile issues, don't create a list from an array + Object[] list = new Object[] { 1, 51, this.server.getVersion(), pingEvent.getMotd(), playerlist.getPlayerCount(), pingEvent.getMaxPlayers() }; + + for (Object object : list) { + if (s == null) { + s = "\u00A7"; + } else { + s = s + "\0"; + } + + s += org.apache.commons.lang.StringUtils.replace(object.toString(), "\0", ""); + } + // CraftBukkit end + } else { + // CraftBukkit + s = pingEvent.getMotd() + "\u00A7" + playerlist.getPlayerCount() + "\u00A7" + pingEvent.getMaxPlayers(); + } + + InetAddress inetaddress = null; + + if (this.networkManager.getSocket() != null) { + inetaddress = this.networkManager.getSocket().getInetAddress(); + } + + this.networkManager.queue(new Packet255KickDisconnect(s)); + this.networkManager.d(); + if (inetaddress != null && this.server.ae() instanceof DedicatedServerConnection) { + ((DedicatedServerConnection) this.server.ae()).a(inetaddress); + } + + this.c = true; + } catch (Exception exception) { + exception.printStackTrace(); + } + } + + public void onUnhandledPacket(Packet packet) { + this.disconnect("Protocol error"); + } + + public String getName() { + return this.h != null ? this.h + " [" + this.networkManager.getSocketAddress().toString() + "]" : this.networkManager.getSocketAddress().toString(); + } + + public boolean a() { + return true; + } + + static String a(PendingConnection pendingconnection) { + return pendingconnection.loginKey; + } + + static MinecraftServer b(PendingConnection pendingconnection) { + return pendingconnection.server; + } + + static SecretKey c(PendingConnection pendingconnection) { + return pendingconnection.l; + } + + static String d(PendingConnection pendingconnection) { + return pendingconnection.h; + } + + static boolean a(PendingConnection pendingconnection, boolean flag) { + return pendingconnection.i = flag; + } +} diff --git a/src/main/java/net/minecraft/server/PlayerChunk.java b/src/main/java/net/minecraft/server/PlayerChunk.java new file mode 100644 index 00000000..53506443 --- /dev/null +++ b/src/main/java/net/minecraft/server/PlayerChunk.java @@ -0,0 +1,167 @@ +package net.minecraft.server; + +import java.util.ArrayList; +import java.util.List; + +class PlayerChunk { + + private final List b; + private final ChunkCoordIntPair location; + private short[] dirtyBlocks; + private int dirtyCount; + private int f; + private boolean loaded = false; // CraftBukkit + + final PlayerChunkMap playerChunkMap; + + public PlayerChunk(PlayerChunkMap playerchunkmap, int i, int j) { + this.playerChunkMap = playerchunkmap; + this.b = new ArrayList(); + this.dirtyBlocks = new short[64]; + this.dirtyCount = 0; + this.location = new ChunkCoordIntPair(i, j); + // CraftBukkit start + playerchunkmap.a().chunkProviderServer.getChunkAt(i, j, new Runnable() { + public void run() { + PlayerChunk.this.loaded = true; + } + }); + } + + public void a(final EntityPlayer entityplayer) { // CraftBukkit - added final to argument + if (this.b.contains(entityplayer)) { + throw new IllegalStateException("Failed to add player. " + entityplayer + " already is in chunk " + this.location.x + ", " + this.location.z); + } else { + this.b.add(entityplayer); + + // CraftBukkit start + if (this.loaded) { + entityplayer.chunkCoordIntPairQueue.add(this.location); + } else { + // Abuse getChunkAt to add another callback + this.playerChunkMap.a().chunkProviderServer.getChunkAt(this.location.x, this.location.z, new Runnable() { + public void run() { + entityplayer.chunkCoordIntPairQueue.add(PlayerChunk.this.location); + } + }); + } + // CraftBukkit end + } + } + + public void b(EntityPlayer entityplayer) { + if (this.b.contains(entityplayer)) { + entityplayer.playerConnection.sendPacket(new Packet51MapChunk(PlayerChunkMap.a(this.playerChunkMap).getChunkAt(this.location.x, this.location.z), true, 0)); + this.b.remove(entityplayer); + entityplayer.chunkCoordIntPairQueue.remove(this.location); + if (this.b.isEmpty()) { + long i = (long) this.location.x + 2147483647L | (long) this.location.z + 2147483647L << 32; + + PlayerChunkMap.b(this.playerChunkMap).remove(i); + if (this.dirtyCount > 0) { + PlayerChunkMap.c(this.playerChunkMap).remove(this); + } + + this.playerChunkMap.a().chunkProviderServer.queueUnload(this.location.x, this.location.z); + } + } + } + + public void a(int i, int j, int k) { + if (this.dirtyCount == 0) { + PlayerChunkMap.c(this.playerChunkMap).add(this); + } + + this.f |= 1 << (j >> 4); + if (this.dirtyCount < 64) { + short short1 = (short) (i << 12 | k << 8 | j); + + for (int l = 0; l < this.dirtyCount; ++l) { + if (this.dirtyBlocks[l] == short1) { + return; + } + } + + this.dirtyBlocks[this.dirtyCount++] = short1; + } + } + + public void sendAll(Packet packet) { + for (int i = 0; i < this.b.size(); ++i) { + EntityPlayer entityplayer = (EntityPlayer) this.b.get(i); + + if (!entityplayer.chunkCoordIntPairQueue.contains(this.location)) { + entityplayer.playerConnection.sendPacket(packet); + } + } + } + + public void a() { + if (this.dirtyCount != 0) { + int i; + int j; + int k; + + if (this.dirtyCount == 1) { + i = this.location.x * 16 + (this.dirtyBlocks[0] >> 12 & 15); + j = this.dirtyBlocks[0] & 255; + k = this.location.z * 16 + (this.dirtyBlocks[0] >> 8 & 15); + this.sendAll(new Packet53BlockChange(i, j, k, PlayerChunkMap.a(this.playerChunkMap))); + if (PlayerChunkMap.a(this.playerChunkMap).isTileEntity(i, j, k)) { + this.sendTileEntity(PlayerChunkMap.a(this.playerChunkMap).getTileEntity(i, j, k)); + } + } else { + int l; + + if (this.dirtyCount == 64) { + i = this.location.x * 16; + j = this.location.z * 16; + this.sendAll(new Packet51MapChunk(PlayerChunkMap.a(this.playerChunkMap).getChunkAt(this.location.x, this.location.z), (this.f == 0xFFFF), this.f)); // CraftBukkit - send everything (including biome) if all sections flagged + + for (k = 0; k < 16; ++k) { + if ((this.f & 1 << k) != 0) { + l = k << 4; + List list = PlayerChunkMap.a(this.playerChunkMap).getTileEntities(i, l, j, i + 16, l + 16, j + 16); + + for (int i1 = 0; i1 < list.size(); ++i1) { + this.sendTileEntity((TileEntity) list.get(i1)); + } + } + } + } else { + this.sendAll(new Packet52MultiBlockChange(this.location.x, this.location.z, this.dirtyBlocks, this.dirtyCount, PlayerChunkMap.a(this.playerChunkMap))); + + for (i = 0; i < this.dirtyCount; ++i) { + j = this.location.x * 16 + (this.dirtyBlocks[i] >> 12 & 15); + k = this.dirtyBlocks[i] & 255; + l = this.location.z * 16 + (this.dirtyBlocks[i] >> 8 & 15); + if (PlayerChunkMap.a(this.playerChunkMap).isTileEntity(j, k, l)) { + this.sendTileEntity(PlayerChunkMap.a(this.playerChunkMap).getTileEntity(j, k, l)); + } + } + } + } + + this.dirtyCount = 0; + this.f = 0; + } + } + + private void sendTileEntity(TileEntity tileentity) { + if (tileentity != null) { + Packet packet = tileentity.getUpdatePacket(); + + if (packet != null) { + this.sendAll(packet); + } + } + } + + static ChunkCoordIntPair a(PlayerChunk playerchunk) { + return playerchunk.location; + } + + static List b(PlayerChunk playerchunk) { + return playerchunk.b; + } +} diff --git a/src/main/java/net/minecraft/server/PlayerChunkMap.java b/src/main/java/net/minecraft/server/PlayerChunkMap.java new file mode 100644 index 00000000..f788a62e --- /dev/null +++ b/src/main/java/net/minecraft/server/PlayerChunkMap.java @@ -0,0 +1,303 @@ +package net.minecraft.server; + +import java.util.ArrayList; +import java.util.List; + +// CraftBukkit start +import java.util.Collections; +import java.util.Queue; +import java.util.Iterator; +import java.util.LinkedList; +// CraftBukkit end + +public class PlayerChunkMap { + + private final WorldServer world; + private final List managedPlayers = new ArrayList(); + private final LongHashMap c = new LongHashMap(); + private final Queue d = new java.util.concurrent.ConcurrentLinkedQueue(); // CraftBukkit ArrayList -> ConcurrentLinkedQueue + private final int e; + private final int[][] f = new int[][] { { 1, 0}, { 0, 1}, { -1, 0}, { 0, -1}}; + private boolean wasNotEmpty; // CraftBukkit + + public PlayerChunkMap(WorldServer worldserver, int i) { + if (i > 15) { + throw new IllegalArgumentException("Too big view radius!"); + } else if (i < 3) { + throw new IllegalArgumentException("Too small view radius!"); + } else { + this.e = i; + this.world = worldserver; + } + } + + public WorldServer a() { + return this.world; + } + + public void flush() { + // CraftBukkit start - use iterator + Iterator iterator = this.d.iterator(); + + while (iterator.hasNext()) { + PlayerChunk playerinstance = (PlayerChunk) iterator.next(); + playerinstance.a(); + iterator.remove(); + } + // CraftBukkit end + + // this.d.clear(); // CraftBukkit - removals are already covered + if (this.managedPlayers.isEmpty()) { + if (!wasNotEmpty) return; // CraftBukkit - only do unload when we go from non-empty to empty + WorldProvider worldprovider = this.world.worldProvider; + + if (!worldprovider.e()) { + this.world.chunkProviderServer.a(); + } + // CraftBukkit start + wasNotEmpty = false; + } else { + wasNotEmpty = true; + } + // CraftBukkit end + } + + private PlayerChunk a(int i, int j, boolean flag) { + long k = (long) i + 2147483647L | (long) j + 2147483647L << 32; + PlayerChunk playerchunk = (PlayerChunk) this.c.getEntry(k); + + if (playerchunk == null && flag) { + playerchunk = new PlayerChunk(this, i, j); + this.c.put(k, playerchunk); + } + + return playerchunk; + } + // CraftBukkit start + public final boolean isChunkInUse(int x, int z) { + PlayerChunk pi = a(x, z, false); + if (pi != null) { + return (PlayerChunk.b(pi).size() > 0); + } + return false; + } + // CraftBukkit end + + public void flagDirty(int i, int j, int k) { + int l = i >> 4; + int i1 = k >> 4; + PlayerChunk playerchunk = this.a(l, i1, false); + + if (playerchunk != null) { + playerchunk.a(i & 15, j, k & 15); + } + } + + public void addPlayer(EntityPlayer entityplayer) { + int i = (int) entityplayer.locX >> 4; + int j = (int) entityplayer.locZ >> 4; + + entityplayer.d = entityplayer.locX; + entityplayer.e = entityplayer.locZ; + + // CraftBukkit start - load nearby chunks first + List chunkList = new LinkedList(); + for (int k = i - this.e; k <= i + this.e; ++k) { + for (int l = j - this.e; l <= j + this.e; ++l) { + chunkList.add(new ChunkCoordIntPair(k, l)); + } + } + + Collections.sort(chunkList, new ChunkCoordComparator(entityplayer)); + for (ChunkCoordIntPair pair : chunkList) { + this.a(pair.x, pair.z, true).a(entityplayer); + } + // CraftBukkit end + + this.managedPlayers.add(entityplayer); + this.b(entityplayer); + } + + public void b(EntityPlayer entityplayer) { + ArrayList arraylist = new ArrayList(entityplayer.chunkCoordIntPairQueue); + int i = 0; + int j = this.e; + int k = (int) entityplayer.locX >> 4; + int l = (int) entityplayer.locZ >> 4; + int i1 = 0; + int j1 = 0; + ChunkCoordIntPair chunkcoordintpair = PlayerChunk.a(this.a(k, l, true)); + + entityplayer.chunkCoordIntPairQueue.clear(); + if (arraylist.contains(chunkcoordintpair)) { + entityplayer.chunkCoordIntPairQueue.add(chunkcoordintpair); + } + + int k1; + + for (k1 = 1; k1 <= j * 2; ++k1) { + for (int l1 = 0; l1 < 2; ++l1) { + int[] aint = this.f[i++ % 4]; + + for (int i2 = 0; i2 < k1; ++i2) { + i1 += aint[0]; + j1 += aint[1]; + chunkcoordintpair = PlayerChunk.a(this.a(k + i1, l + j1, true)); + if (arraylist.contains(chunkcoordintpair)) { + entityplayer.chunkCoordIntPairQueue.add(chunkcoordintpair); + } + } + } + } + + i %= 4; + + for (k1 = 0; k1 < j * 2; ++k1) { + i1 += this.f[i][0]; + j1 += this.f[i][1]; + chunkcoordintpair = PlayerChunk.a(this.a(k + i1, l + j1, true)); + if (arraylist.contains(chunkcoordintpair)) { + entityplayer.chunkCoordIntPairQueue.add(chunkcoordintpair); + } + } + } + + public void removePlayer(EntityPlayer entityplayer) { + int i = (int) entityplayer.d >> 4; + int j = (int) entityplayer.e >> 4; + + for (int k = i - this.e; k <= i + this.e; ++k) { + for (int l = j - this.e; l <= j + this.e; ++l) { + PlayerChunk playerchunk = this.a(k, l, false); + + if (playerchunk != null) { + playerchunk.b(entityplayer); + } + } + } + + this.managedPlayers.remove(entityplayer); + } + + private boolean a(int i, int j, int k, int l, int i1) { + int j1 = i - k; + int k1 = j - l; + + return j1 >= -i1 && j1 <= i1 ? k1 >= -i1 && k1 <= i1 : false; + } + + public void movePlayer(EntityPlayer entityplayer) { + int i = (int) entityplayer.locX >> 4; + int j = (int) entityplayer.locZ >> 4; + double d0 = entityplayer.d - entityplayer.locX; + double d1 = entityplayer.e - entityplayer.locZ; + double d2 = d0 * d0 + d1 * d1; + + if (d2 >= 64.0D) { + int k = (int) entityplayer.d >> 4; + int l = (int) entityplayer.e >> 4; + int i1 = this.e; + int j1 = i - k; + int k1 = j - l; + List chunksToLoad = new LinkedList(); // CraftBukkit + + if (j1 != 0 || k1 != 0) { + for (int l1 = i - i1; l1 <= i + i1; ++l1) { + for (int i2 = j - i1; i2 <= j + i1; ++i2) { + if (!this.a(l1, i2, k, l, i1)) { + chunksToLoad.add(new ChunkCoordIntPair(l1, i2)); // CraftBukkit + } + + if (!this.a(l1 - j1, i2 - k1, i, j, i1)) { + PlayerChunk playerchunk = this.a(l1 - j1, i2 - k1, false); + + if (playerchunk != null) { + playerchunk.b(entityplayer); + } + } + } + } + + this.b(entityplayer); + entityplayer.d = entityplayer.locX; + entityplayer.e = entityplayer.locZ; + + // CraftBukkit start - send nearest chunks first + Collections.sort(chunksToLoad, new ChunkCoordComparator(entityplayer)); + for (ChunkCoordIntPair pair : chunksToLoad) { + this.a(pair.x, pair.z, true).a(entityplayer); + } + + if (i1 > 1 || i1 < -1 || j1 > 1 || j1 < -1) { + Collections.sort(entityplayer.chunkCoordIntPairQueue, new ChunkCoordComparator(entityplayer)); + } + // CraftBukkit end + } + } + } + + public boolean a(EntityPlayer entityplayer, int i, int j) { + PlayerChunk playerchunk = this.a(i, j, false); + + return playerchunk == null ? false : PlayerChunk.b(playerchunk).contains(entityplayer) && !entityplayer.chunkCoordIntPairQueue.contains(PlayerChunk.a(playerchunk)); + } + + public static int getFurthestViewableBlock(int i) { + return i * 16 - 16; + } + + static WorldServer a(PlayerChunkMap playerchunkmap) { + return playerchunkmap.world; + } + + static LongHashMap b(PlayerChunkMap playerchunkmap) { + return playerchunkmap.c; + } + + static Queue c(PlayerChunkMap playermanager) { // CraftBukkit List -> Queue + return playermanager.d; + } + + // CraftBukkit start - sorter to load nearby chunks first + private static class ChunkCoordComparator implements java.util.Comparator { + private int x; + private int z; + + public ChunkCoordComparator (EntityPlayer entityplayer) { + x = (int) entityplayer.locX >> 4; + z = (int) entityplayer.locZ >> 4; + } + + public int compare(ChunkCoordIntPair a, ChunkCoordIntPair b) { + if (a.equals(b)) { + return 0; + } + + // Subtract current position to set center point + int ax = a.x - this.x; + int az = a.z - this.z; + int bx = b.x - this.x; + int bz = b.z - this.z; + + int result = ((ax - bx) * (ax + bx)) + ((az - bz) * (az + bz)); + if (result != 0) { + return result; + } + + if (ax < 0) { + if (bx < 0) { + return bz - az; + } else { + return -1; + } + } else { + if (bx < 0) { + return 1; + } else { + return az - bz; + } + } + } + } + // CraftBukkit end +} diff --git a/src/main/java/net/minecraft/server/PlayerConnection.java b/src/main/java/net/minecraft/server/PlayerConnection.java new file mode 100644 index 00000000..fb6a54b2 --- /dev/null +++ b/src/main/java/net/minecraft/server/PlayerConnection.java @@ -0,0 +1,1611 @@ +package net.minecraft.server; + +import java.io.ByteArrayInputStream; +import java.io.DataInputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.Random; +import java.util.logging.Logger; + +// CraftBukkit start +import java.io.UnsupportedEncodingException; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.atomic.AtomicIntegerFieldUpdater; +import java.util.logging.Level; +import java.util.HashSet; + +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.craftbukkit.CraftWorld; +import org.bukkit.craftbukkit.inventory.CraftInventoryView; +import org.bukkit.craftbukkit.inventory.CraftItemStack; +import org.bukkit.craftbukkit.util.LazyPlayerSet; +import org.bukkit.craftbukkit.util.Waitable; +import org.bukkit.craftbukkit.entity.CraftPlayer; +import org.bukkit.craftbukkit.event.CraftEventFactory; +import org.bukkit.entity.Player; +import org.bukkit.event.Event; +import org.bukkit.event.block.Action; +import org.bukkit.event.block.SignChangeEvent; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.event.player.PlayerAnimationEvent; +import org.bukkit.event.player.PlayerChatEvent; +import org.bukkit.event.player.PlayerCommandPreprocessEvent; +import org.bukkit.event.player.PlayerInteractEntityEvent; +import org.bukkit.event.player.PlayerItemHeldEvent; +import org.bukkit.event.player.PlayerKickEvent; +import org.bukkit.event.player.PlayerMoveEvent; +import org.bukkit.event.player.PlayerTeleportEvent; +import org.bukkit.event.player.PlayerToggleSneakEvent; +import org.bukkit.event.player.PlayerToggleSprintEvent; +import org.bukkit.event.inventory.*; +import org.bukkit.event.inventory.InventoryType.SlotType; +import org.bukkit.event.player.PlayerPortalEvent; +import org.bukkit.event.player.PlayerToggleFlightEvent; +import org.bukkit.inventory.CraftingInventory; +import org.bukkit.inventory.InventoryView; +// CraftBukkit end + +public class PlayerConnection extends Connection { + public static Logger logger = Logger.getLogger("Minecraft"); + public INetworkManager networkManager; + public boolean disconnected = false; + private MinecraftServer minecraftServer; + public EntityPlayer player; + private int f; + private int g; + private boolean h; + private int i; + private long j; + private static Random k = new Random(); + private long l; + private volatile int m = 0; private static final AtomicIntegerFieldUpdater chatSpamField = AtomicIntegerFieldUpdater.newUpdater(PlayerConnection.class, "m"); // CraftBukkit - multithreaded field + private int x = 0; + private double y; + private double z; + private double q; + public boolean checkMovement = true; // CraftBukkit - private -> public + private IntHashMap s = new IntHashMap(); + + public PlayerConnection(MinecraftServer minecraftserver, INetworkManager inetworkmanager, EntityPlayer entityplayer) { + this.minecraftServer = minecraftserver; + this.networkManager = inetworkmanager; + inetworkmanager.a(this); + this.player = entityplayer; + entityplayer.playerConnection = this; + + // CraftBukkit start + this.server = minecraftserver.server; + } + + private final org.bukkit.craftbukkit.CraftServer server; + private int lastTick = MinecraftServer.currentTick; + private int lastDropTick = MinecraftServer.currentTick; + private int dropCount = 0; + private static final int PLACE_DISTANCE_SQUARED = 6 * 6; + + // Get position of last block hit for BlockDamageLevel.STOPPED + private double lastPosX = Double.MAX_VALUE; + private double lastPosY = Double.MAX_VALUE; + private double lastPosZ = Double.MAX_VALUE; + private float lastPitch = Float.MAX_VALUE; + private float lastYaw = Float.MAX_VALUE; + private boolean justTeleported = false; + + // For the packet15 hack :( + Long lastPacket; + + // Store the last block right clicked and what type it was + private int lastMaterial; + + public CraftPlayer getPlayer() { + return (this.player == null) ? null : (CraftPlayer) this.player.getBukkitEntity(); + } + private final static HashSet invalidItems = new HashSet(java.util.Arrays.asList(8, 9, 10, 11, 26, 34, 36, 43, 51, 52, 55, 59, 60, 62, 63, 64, 68, 71, 74, 75, 83, 90, 92, 93, 94, 95, 104, 105, 115, 117, 118, 119, 125, 127, 132, 137, 140, 141, 142, 144)); // TODO: Check after every update. + // CraftBukkit end + + public void d() { + this.h = false; + ++this.f; + this.minecraftServer.methodProfiler.a("packetflow"); + this.networkManager.b(); + this.minecraftServer.methodProfiler.c("keepAlive"); + if ((long) this.f - this.l > 20L) { + this.l = (long) this.f; + this.j = System.nanoTime() / 1000000L; + this.i = k.nextInt(); + this.sendPacket(new Packet0KeepAlive(this.i)); + } + + // CraftBukkit start + for (int spam; (spam = this.m) > 0 && !chatSpamField.compareAndSet(this, spam, spam - 1); ) ; + /* Use thread-safe field access instead + if (this.m > 0) { + --this.m; + } + */ + // CraftBukkit end + + if (this.x > 0) { + --this.x; + } + + this.minecraftServer.methodProfiler.c("playerTick"); + this.minecraftServer.methodProfiler.b(); + } + + public void disconnect(String s) { + if (!this.disconnected) { + // CraftBukkit start + String leaveMessage = "\u00A7e" + this.player.name + " left the game."; + + PlayerKickEvent event = new PlayerKickEvent(this.server.getPlayer(this.player), s, leaveMessage); + + if (this.server.getServer().isRunning()) { + this.server.getPluginManager().callEvent(event); + } + + if (event.isCancelled()) { + // Do not kick the player + return; + } + // Send the possibly modified leave message + s = event.getReason(); + // CraftBukkit end + + this.player.l(); + this.sendPacket(new Packet255KickDisconnect(s)); + this.networkManager.d(); + + // CraftBukkit start + leaveMessage = event.getLeaveMessage(); + if (leaveMessage != null && leaveMessage.length() > 0) { + this.minecraftServer.getPlayerList().sendAll(new Packet3Chat(leaveMessage)); + } + getPlayer().disconnect(s); + // CraftBukkit end + + this.minecraftServer.getPlayerList().disconnect(this.player); + this.disconnected = true; + } + } + + public void a(Packet10Flying packet10flying) { + WorldServer worldserver = this.minecraftServer.getWorldServer(this.player.dimension); + + this.h = true; + if (!this.player.viewingCredits) { + double d0; + + if (!this.checkMovement) { + d0 = packet10flying.y - this.z; + if (packet10flying.x == this.y && d0 * d0 < 0.01D && packet10flying.z == this.q) { + this.checkMovement = true; + } + } + + // CraftBukkit start + Player player = this.getPlayer(); + Location from = new Location(player.getWorld(), lastPosX, lastPosY, lastPosZ, lastYaw, lastPitch); // Get the Players previous Event location. + Location to = player.getLocation().clone(); // Start off the To location as the Players current location. + + // If the packet contains movement information then we update the To location with the correct XYZ. + if (packet10flying.hasPos && !(packet10flying.hasPos && packet10flying.y == -999.0D && packet10flying.stance == -999.0D)) { + to.setX(packet10flying.x); + to.setY(packet10flying.y); + to.setZ(packet10flying.z); + } + + // If the packet contains look information then we update the To location with the correct Yaw & Pitch. + if (packet10flying.hasLook) { + to.setYaw(packet10flying.yaw); + to.setPitch(packet10flying.pitch); + } + + // Prevent 40 event-calls for less than a single pixel of movement >.> + double delta = Math.pow(this.lastPosX - to.getX(), 2) + Math.pow(this.lastPosY - to.getY(), 2) + Math.pow(this.lastPosZ - to.getZ(), 2); + float deltaAngle = Math.abs(this.lastYaw - to.getYaw()) + Math.abs(this.lastPitch - to.getPitch()); + + if ((delta > 1f / 256 || deltaAngle > 10f) && (this.checkMovement && !this.player.dead)) { + this.lastPosX = to.getX(); + this.lastPosY = to.getY(); + this.lastPosZ = to.getZ(); + this.lastYaw = to.getYaw(); + this.lastPitch = to.getPitch(); + + // Skip the first time we do this + if (from.getX() != Double.MAX_VALUE) { + PlayerMoveEvent event = new PlayerMoveEvent(player, from, to); + this.server.getPluginManager().callEvent(event); + + // If the event is cancelled we move the player back to their old location. + if (event.isCancelled()) { + this.player.playerConnection.sendPacket(new Packet13PlayerLookMove(from.getX(), from.getY() + 1.6200000047683716D, from.getY(), from.getZ(), from.getYaw(), from.getPitch(), false)); + return; + } + + /* If a Plugin has changed the To destination then we teleport the Player + there to avoid any 'Moved wrongly' or 'Moved too quickly' errors. + We only do this if the Event was not cancelled. */ + if (!to.equals(event.getTo()) && !event.isCancelled()) { + this.player.getBukkitEntity().teleport(event.getTo(), PlayerTeleportEvent.TeleportCause.UNKNOWN); + return; + } + + /* Check to see if the Players Location has some how changed during the call of the event. + This can happen due to a plugin teleporting the player instead of using .setTo() */ + if (!from.equals(this.getPlayer().getLocation()) && this.justTeleported) { + this.justTeleported = false; + return; + } + } + } + + if (Double.isNaN(packet10flying.x) || Double.isNaN(packet10flying.y) || Double.isNaN(packet10flying.z) || Double.isNaN(packet10flying.stance)) { + player.teleport(player.getWorld().getSpawnLocation(), PlayerTeleportEvent.TeleportCause.UNKNOWN); + System.err.println(player.getName() + " was caught trying to crash the server with an invalid position."); + player.kickPlayer("Nope!"); + return; + } + + if (this.checkMovement && !this.player.dead) { + // CraftBukkit end + double d1; + double d2; + double d3; + double d4; + + if (this.player.vehicle != null) { + float f = this.player.yaw; + float f1 = this.player.pitch; + + this.player.vehicle.V(); + d1 = this.player.locX; + d2 = this.player.locY; + d3 = this.player.locZ; + double d5 = 0.0D; + + d4 = 0.0D; + if (packet10flying.hasLook) { + f = packet10flying.yaw; + f1 = packet10flying.pitch; + } + + if (packet10flying.hasPos && packet10flying.y == -999.0D && packet10flying.stance == -999.0D) { + if (Math.abs(packet10flying.x) > 1.0D || Math.abs(packet10flying.z) > 1.0D) { + System.err.println(this.player.name + " was caught trying to crash the server with an invalid position."); + this.disconnect("Nope!"); + return; + } + + d5 = packet10flying.x; + d4 = packet10flying.z; + } + + this.player.onGround = packet10flying.g; + this.player.g(); + this.player.move(d5, 0.0D, d4); + this.player.setLocation(d1, d2, d3, f, f1); + this.player.motX = d5; + this.player.motZ = d4; + if (this.player.vehicle != null) { + worldserver.vehicleEnteredWorld(this.player.vehicle, true); + } + + if (this.player.vehicle != null) { + this.player.vehicle.V(); + } + + this.minecraftServer.getPlayerList().d(this.player); + this.y = this.player.locX; + this.z = this.player.locY; + this.q = this.player.locZ; + worldserver.playerJoinedWorld(this.player); + return; + } + + if (this.player.isSleeping()) { + this.player.g(); + this.player.setLocation(this.y, this.z, this.q, this.player.yaw, this.player.pitch); + worldserver.playerJoinedWorld(this.player); + return; + } + + d0 = this.player.locY; + this.y = this.player.locX; + this.z = this.player.locY; + this.q = this.player.locZ; + d1 = this.player.locX; + d2 = this.player.locY; + d3 = this.player.locZ; + float f2 = this.player.yaw; + float f3 = this.player.pitch; + + if (packet10flying.hasPos && packet10flying.y == -999.0D && packet10flying.stance == -999.0D) { + packet10flying.hasPos = false; + } + + if (packet10flying.hasPos) { + d1 = packet10flying.x; + d2 = packet10flying.y; + d3 = packet10flying.z; + d4 = packet10flying.stance - packet10flying.y; + if (!this.player.isSleeping() && (d4 > 1.65D || d4 < 0.1D)) { + this.disconnect("Illegal stance"); + logger.warning(this.player.name + " had an illegal stance: " + d4); + return; + } + + if (Math.abs(packet10flying.x) > 3.2E7D || Math.abs(packet10flying.z) > 3.2E7D) { + // CraftBukkit - teleport to previous position instead of kicking, players get stuck + this.a(this.y, this.z, this.q, this.player.yaw, this.player.pitch); + return; + } + } + + if (packet10flying.hasLook) { + f2 = packet10flying.yaw; + f3 = packet10flying.pitch; + } + + this.player.g(); + this.player.W = 0.0F; + this.player.setLocation(this.y, this.z, this.q, f2, f3); + if (!this.checkMovement) { + return; + } + + d4 = d1 - this.player.locX; + double d6 = d2 - this.player.locY; + double d7 = d3 - this.player.locZ; + // CraftBukkit start - min to max + double d8 = Math.max(Math.abs(d4), Math.abs(this.player.motX)); + double d9 = Math.max(Math.abs(d6), Math.abs(this.player.motY)); + double d10 = Math.max(Math.abs(d7), Math.abs(this.player.motZ)); + // CraftBukkit end + double d11 = d8 * d8 + d9 * d9 + d10 * d10; + + if (d11 > 100.0D && this.checkMovement && (!this.minecraftServer.I() || !this.minecraftServer.H().equals(this.player.name))) { // CraftBukkit - Added this.checkMovement condition to solve this check being triggered by teleports + logger.warning(this.player.name + " moved too quickly! " + d4 + "," + d6 + "," + d7 + " (" + d8 + ", " + d9 + ", " + d10 + ")"); + this.a(this.y, this.z, this.q, this.player.yaw, this.player.pitch); + return; + } + + float f4 = 0.0625F; + boolean flag = worldserver.getCubes(this.player, this.player.boundingBox.clone().shrink((double) f4, (double) f4, (double) f4)).isEmpty(); + + if (this.player.onGround && !packet10flying.g && d6 > 0.0D) { + this.player.j(0.2F); + } + + this.player.move(d4, d6, d7); + this.player.onGround = packet10flying.g; + this.player.checkMovement(d4, d6, d7); + double d12 = d6; + + d4 = d1 - this.player.locX; + d6 = d2 - this.player.locY; + if (d6 > -0.5D || d6 < 0.5D) { + d6 = 0.0D; + } + + d7 = d3 - this.player.locZ; + d11 = d4 * d4 + d6 * d6 + d7 * d7; + boolean flag1 = false; + + if (d11 > 0.0625D && !this.player.isSleeping() && !this.player.playerInteractManager.isCreative()) { + flag1 = true; + logger.warning(this.player.name + " moved wrongly!"); + } + + this.player.setLocation(d1, d2, d3, f2, f3); + boolean flag2 = worldserver.getCubes(this.player, this.player.boundingBox.clone().shrink((double) f4, (double) f4, (double) f4)).isEmpty(); + + if (flag && (flag1 || !flag2) && !this.player.isSleeping()) { + this.a(this.y, this.z, this.q, f2, f3); + return; + } + + AxisAlignedBB axisalignedbb = this.player.boundingBox.clone().grow((double) f4, (double) f4, (double) f4).a(0.0D, -0.55D, 0.0D); + + if (!this.minecraftServer.getAllowFlight() && !this.player.abilities.canFly && !worldserver.c(axisalignedbb)) { // CraftBukkit - check abilities instead of creative mode + if (d12 >= -0.03125D) { + ++this.g; + if (this.g > 80) { + logger.warning(this.player.name + " was kicked for floating too long!"); + this.disconnect("Flying is not enabled on this server"); + return; + } + } + } else { + this.g = 0; + } + + this.player.onGround = packet10flying.g; + this.minecraftServer.getPlayerList().d(this.player); + if (this.player.playerInteractManager.isCreative()) return; // CraftBukkit - fixed fall distance accumulating while being in Creative mode. + this.player.b(this.player.locY - d0, packet10flying.g); + } + } + } + + public void a(double d0, double d1, double d2, float f, float f1) { + // CraftBukkit start - Delegate to teleport(Location) + Player player = this.getPlayer(); + Location from = player.getLocation(); + Location to = new Location(this.getPlayer().getWorld(), d0, d1, d2, f, f1); + PlayerTeleportEvent event = new PlayerTeleportEvent(player, from, to, PlayerTeleportEvent.TeleportCause.UNKNOWN); + this.server.getPluginManager().callEvent(event); + + from = event.getFrom(); + to = event.isCancelled() ? from : event.getTo(); + + this.teleport(to); + } + + public void teleport(Location dest) { + double d0, d1, d2; + float f, f1; + + d0 = dest.getX(); + d1 = dest.getY(); + d2 = dest.getZ(); + f = dest.getYaw(); + f1 = dest.getPitch(); + + // TODO: make sure this is the best way to address this. + if (Float.isNaN(f)) { + f = 0; + } + + if (Float.isNaN(f1)) { + f1 = 0; + } + + this.lastPosX = d0; + this.lastPosY = d1; + this.lastPosZ = d2; + this.lastYaw = f; + this.lastPitch = f1; + this.justTeleported = true; + // CraftBukkit end + + this.checkMovement = false; + this.y = d0; + this.z = d1; + this.q = d2; + this.player.setLocation(d0, d1, d2, f, f1); + this.player.playerConnection.sendPacket(new Packet13PlayerLookMove(d0, d1 + 1.6200000047683716D, d1, d2, f, f1, false)); + } + + public void a(Packet14BlockDig packet14blockdig) { + if (this.player.dead) return; // CraftBukkit + + WorldServer worldserver = this.minecraftServer.getWorldServer(this.player.dimension); + + if (packet14blockdig.e == 4) { + // CraftBukkit start + // If the ticks aren't the same then the count starts from 0 and we update the lastDropTick. + if (this.lastDropTick != MinecraftServer.currentTick) { + this.dropCount = 0; + this.lastDropTick = MinecraftServer.currentTick; + } else { + // Else we increment the drop count and check the amount. + this.dropCount++; + if (this.dropCount >= 20) { + logger.warning(this.player.name + " dropped their items too quickly!"); + this.disconnect("You dropped your items too quickly (Hacking?)"); + return; + } + } + // CraftBukkit end + this.player.f(false); + } else if (packet14blockdig.e == 3) { + this.player.f(true); + } else if (packet14blockdig.e == 5) { + this.player.bO(); + } else { + int i = this.minecraftServer.getSpawnProtection(); + boolean flag = worldserver.worldProvider.dimension != 0 || this.minecraftServer.getPlayerList().getOPs().isEmpty() || this.minecraftServer.getPlayerList().isOp(this.player.name) || i <= 0 || this.minecraftServer.I(); + boolean flag1 = false; + + if (packet14blockdig.e == 0) { + flag1 = true; + } + + if (packet14blockdig.e == 1) { + flag1 = true; + } + + if (packet14blockdig.e == 2) { + flag1 = true; + } + + int j = packet14blockdig.a; + int k = packet14blockdig.b; + int l = packet14blockdig.c; + + if (flag1) { + double d0 = this.player.locX - ((double) j + 0.5D); + double d1 = this.player.locY - ((double) k + 0.5D) + 1.5D; + double d2 = this.player.locZ - ((double) l + 0.5D); + double d3 = d0 * d0 + d1 * d1 + d2 * d2; + + if (d3 > 36.0D) { + return; + } + + if (k >= this.minecraftServer.getMaxBuildHeight()) { + return; + } + } + + ChunkCoordinates chunkcoordinates = worldserver.getSpawn(); + int i1 = MathHelper.a(j - chunkcoordinates.x); + int j1 = MathHelper.a(l - chunkcoordinates.z); + + if (i1 > j1) { + j1 = i1; + } + + if (packet14blockdig.e == 0) { + // CraftBukkit start + if (j1 < this.server.getSpawnRadius() && !flag) { + CraftEventFactory.callPlayerInteractEvent(this.player, Action.LEFT_CLICK_BLOCK, j, k, l, i1, this.player.inventory.getItemInHand()); + this.player.playerConnection.sendPacket(new Packet53BlockChange(j, k, l, worldserver)); + // Update any tile entity data for this block + TileEntity tileentity = worldserver.getTileEntity(j, k, l); + if (tileentity != null) { + this.player.playerConnection.sendPacket(tileentity.getUpdatePacket()); + } + // CraftBukkit end + } else { + this.player.playerInteractManager.dig(j, k, l, packet14blockdig.face); + } + } else if (packet14blockdig.e == 2) { + this.player.playerInteractManager.a(j, k, l); + if (worldserver.getTypeId(j, k, l) != 0) { + this.player.playerConnection.sendPacket(new Packet53BlockChange(j, k, l, worldserver)); + } + } else if (packet14blockdig.e == 1) { + this.player.playerInteractManager.c(j, k, l); + if (worldserver.getTypeId(j, k, l) != 0) { + this.player.playerConnection.sendPacket(new Packet53BlockChange(j, k, l, worldserver)); + } + } + } + } + + public void a(Packet15Place packet15place) { + WorldServer worldserver = this.minecraftServer.getWorldServer(this.player.dimension); + + // CraftBukkit start + if (this.player.dead) return; + + // This is a horrible hack needed because the client sends 2 packets on 'right mouse click' + // aimed at a block. We shouldn't need to get the second packet if the data is handled + // but we cannot know what the client will do, so we might still get it + // + // If the time between packets is small enough, and the 'signature' similar, we discard the + // second one. This sadly has to remain until Mojang makes their packets saner. :( + // -- Grum + + if (packet15place.getFace() == 255) { + if (packet15place.getItemStack() != null && packet15place.getItemStack().id == this.lastMaterial && this.lastPacket != null && packet15place.timestamp - this.lastPacket < 100) { + this.lastPacket = null; + return; + } + } else { + this.lastMaterial = packet15place.getItemStack() == null ? -1 : packet15place.getItemStack().id; + this.lastPacket = packet15place.timestamp; + } + + // CraftBukkit - if rightclick decremented the item, always send the update packet. + // this is not here for CraftBukkit's own functionality; rather it is to fix + // a notch bug where the item doesn't update correctly. + boolean always = false; + + // CraftBukkit end + + ItemStack itemstack = this.player.inventory.getItemInHand(); + boolean flag = false; + int i = packet15place.d(); + int j = packet15place.f(); + int k = packet15place.g(); + int l = packet15place.getFace(); + int i1 = this.minecraftServer.getSpawnProtection(); + boolean flag1 = worldserver.worldProvider.dimension != 0 || this.minecraftServer.getPlayerList().getOPs().isEmpty() || this.minecraftServer.getPlayerList().isOp(this.player.name) || i1 <= 0 || this.minecraftServer.I(); + + if (packet15place.getFace() == 255) { + if (itemstack == null) { + return; + } + + // CraftBukkit start + int itemstackAmount = itemstack.count; + org.bukkit.event.player.PlayerInteractEvent event = CraftEventFactory.callPlayerInteractEvent(this.player, Action.RIGHT_CLICK_AIR, itemstack); + if (event.useItemInHand() != Event.Result.DENY) { + this.player.playerInteractManager.useItem(this.player, this.player.world, itemstack); + } + + // CraftBukkit - notch decrements the counter by 1 in the above method with food, + // snowballs and so forth, but he does it in a place that doesn't cause the + // inventory update packet to get sent + always = (itemstack.count != itemstackAmount); + // CraftBukkit end + } else if (packet15place.f() >= this.minecraftServer.getMaxBuildHeight() - 1 && (packet15place.getFace() == 1 || packet15place.f() >= this.minecraftServer.getMaxBuildHeight())) { + this.player.playerConnection.sendPacket(new Packet3Chat("\u00A77Height limit for building is " + this.minecraftServer.getMaxBuildHeight())); + flag = true; + } else { + ChunkCoordinates chunkcoordinates = worldserver.getSpawn(); + int j1 = MathHelper.a(i - chunkcoordinates.x); + int k1 = MathHelper.a(k - chunkcoordinates.z); + + if (j1 > k1) { + k1 = j1; + } + + // CraftBukkit start - Check if we can actually do something over this large a distance + Location eyeLoc = this.getPlayer().getEyeLocation(); + if (Math.pow(eyeLoc.getX() - i, 2) + Math.pow(eyeLoc.getY() - j, 2) + Math.pow(eyeLoc.getZ() - k, 2) > PLACE_DISTANCE_SQUARED) { + return; + } + flag1 = true; // spawn protection moved to ItemBlock!!! + if (j1 > i1 || flag1) { + // CraftBukkit end + this.player.playerInteractManager.interact(this.player, worldserver, itemstack, i, j, k, l, packet15place.j(), packet15place.l(), packet15place.m()); + } + + flag = true; + } + + if (flag) { + this.player.playerConnection.sendPacket(new Packet53BlockChange(i, j, k, worldserver)); + if (l == 0) { + --j; + } + + if (l == 1) { + ++j; + } + + if (l == 2) { + --k; + } + + if (l == 3) { + ++k; + } + + if (l == 4) { + --i; + } + + if (l == 5) { + ++i; + } + + this.player.playerConnection.sendPacket(new Packet53BlockChange(i, j, k, worldserver)); + } + + itemstack = this.player.inventory.getItemInHand(); + if (itemstack != null && itemstack.count == 0) { + this.player.inventory.items[this.player.inventory.itemInHandIndex] = null; + itemstack = null; + } + + if (itemstack == null || itemstack.m() == 0) { + this.player.h = true; + this.player.inventory.items[this.player.inventory.itemInHandIndex] = ItemStack.b(this.player.inventory.items[this.player.inventory.itemInHandIndex]); + Slot slot = this.player.activeContainer.a((IInventory) this.player.inventory, this.player.inventory.itemInHandIndex); + + this.player.activeContainer.b(); + this.player.h = false; + // CraftBukkit - TODO CHECK IF NEEDED -- new if structure might not need 'always'. Kept it in for now, but may be able to remove in future + if (!ItemStack.matches(this.player.inventory.getItemInHand(), packet15place.getItemStack()) || always) { + this.sendPacket(new Packet103SetSlot(this.player.activeContainer.windowId, slot.g, this.player.inventory.getItemInHand())); + } + } + } + + public void a(String s, Object[] aobject) { + if (this.disconnected) return; // CraftBukkit - rarely it would send a disconnect line twice + + logger.info(this.player.name + " lost connection: " + s); + // CraftBukkit start - we need to handle custom quit messages + String quitMessage = this.minecraftServer.getPlayerList().disconnect(this.player); + if ((quitMessage != null) && (quitMessage.length() > 0)) { + this.minecraftServer.getPlayerList().sendAll(new Packet3Chat(quitMessage)); + } + // CraftBukkit end + this.disconnected = true; + if (this.minecraftServer.I() && this.player.name.equals(this.minecraftServer.H())) { + logger.info("Stopping singleplayer server as player logged out"); + this.minecraftServer.safeShutdown(); + } + } + + public void onUnhandledPacket(Packet packet) { + if (this.disconnected) return; // CraftBukkit + logger.warning(this.getClass() + " wasn\'t prepared to deal with a " + packet.getClass()); + this.disconnect("Protocol error, unexpected packet"); + } + + public void sendPacket(Packet packet) { + if (packet instanceof Packet3Chat) { + Packet3Chat packet3chat = (Packet3Chat) packet; + int i = this.player.getChatFlags(); + + if (i == 2) { + return; + } + + if (i == 1 && !packet3chat.isServer()) { + return; + } + + // CraftBukkit start + String message = packet3chat.message; + for (final String line : org.bukkit.craftbukkit.TextWrapper.wrapText(message)) { + this.networkManager.queue(new Packet3Chat(line)); + } + return; + // CraftBukkit end + } + + // CraftBukkit start + if (packet == null) { + return; + } else if (packet instanceof Packet6SpawnPosition) { + Packet6SpawnPosition packet6 = (Packet6SpawnPosition) packet; + this.player.compassTarget = new Location(this.getPlayer().getWorld(), packet6.x, packet6.y, packet6.z); + } + // CraftBukkit end + + this.networkManager.queue(packet); + } + + public void a(Packet16BlockItemSwitch packet16blockitemswitch) { + // CraftBukkit start + if (this.player.dead) return; + + if (packet16blockitemswitch.itemInHandIndex >= 0 && packet16blockitemswitch.itemInHandIndex < PlayerInventory.getHotbarSize()) { + PlayerItemHeldEvent event = new PlayerItemHeldEvent(this.getPlayer(), this.player.inventory.itemInHandIndex, packet16blockitemswitch.itemInHandIndex); + this.server.getPluginManager().callEvent(event); + // CraftBukkit end + + this.player.inventory.itemInHandIndex = packet16blockitemswitch.itemInHandIndex; + } else { + logger.warning(this.player.name + " tried to set an invalid carried item"); + this.disconnect("Nope!"); // CraftBukkit + } + } + + public void a(Packet3Chat packet3chat) { + if (this.player.getChatFlags() == 2) { + this.sendPacket(new Packet3Chat("Cannot send chat message.")); + } else { + String s = packet3chat.message; + + if (s.length() > 100) { + // CraftBukkit start + if (packet3chat.a_()) { + Waitable waitable = new Waitable() { + @Override + protected Object evaluate() { + PlayerConnection.this.disconnect("Chat message too long"); + return null; + } + }; + + this.minecraftServer.processQueue.add(waitable); + + try { + waitable.get(); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } catch (ExecutionException e) { + throw new RuntimeException(e); + } + } else { + this.disconnect("Chat message too long"); + } + // CraftBukkit end + } else { + s = s.trim(); + + for (int i = 0; i < s.length(); ++i) { + if (!SharedConstants.isAllowedChatCharacter(s.charAt(i))) { + // CraftBukkit start + if (packet3chat.a_()) { + Waitable waitable = new Waitable() { + @Override + protected Object evaluate() { + PlayerConnection.this.disconnect("Illegal characters in chat"); + return null; + } + }; + + this.minecraftServer.processQueue.add(waitable); + + try { + waitable.get(); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } catch (ExecutionException e) { + throw new RuntimeException(e); + } + } else { + this.disconnect("Illegal characters in chat"); + } + // CraftBukkit end + return; + } + } + + // CraftBukkit start + if (this.player.getChatFlags() == 1 && !s.startsWith("/")) { + this.sendPacket(new Packet3Chat("Cannot send chat message.")); + return; + } + + this.chat(s, packet3chat.a_()); + + // This section stays because it is only applicable to packets + if (chatSpamField.addAndGet(this, 20) > 200 && !this.minecraftServer.getPlayerList().isOp(this.player.name)) { // CraftBukkit use thread-safe spam + // CraftBukkit start + if (packet3chat.a_()) { + Waitable waitable = new Waitable() { + @Override + protected Object evaluate() { + PlayerConnection.this.disconnect("disconnect.spam"); + return null; + } + }; + + this.minecraftServer.processQueue.add(waitable); + + try { + waitable.get(); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } catch (ExecutionException e) { + throw new RuntimeException(e); + } + } else { + this.disconnect("disconnect.spam"); + } + // CraftBukkit end + } + } + } + } + + public void chat(String s, boolean async) { + if (!this.player.dead) { + if (s.length() == 0) { + logger.warning(this.player.name + " tried to send an empty message"); + return; + } + + if (getPlayer().isConversing()) { + getPlayer().acceptConversationInput(s); + return; + } + + if (s.startsWith("/")) { + this.handleCommand(s); + return; + } else { + Player player = this.getPlayer(); + AsyncPlayerChatEvent event = new AsyncPlayerChatEvent(async, player, s, new LazyPlayerSet()); + this.server.getPluginManager().callEvent(event); + + if (PlayerChatEvent.getHandlerList().getRegisteredListeners().length != 0) { + // Evil plugins still listening to deprecated event + final PlayerChatEvent queueEvent = new PlayerChatEvent(player, event.getMessage(), event.getFormat(), event.getRecipients()); + queueEvent.setCancelled(event.isCancelled()); + Waitable waitable = new Waitable() { + @Override + protected Object evaluate() { + Bukkit.getPluginManager().callEvent(queueEvent); + + if (queueEvent.isCancelled()) { + return null; + } + + String message = String.format(queueEvent.getFormat(), queueEvent.getPlayer().getDisplayName(), queueEvent.getMessage()); + PlayerConnection.this.minecraftServer.console.sendMessage(message); + if (((LazyPlayerSet) queueEvent.getRecipients()).isLazy()) { + for (Object player : PlayerConnection.this.minecraftServer.getPlayerList().players) { + ((EntityPlayer) player).sendMessage(message); + } + } else { + for (Player player : queueEvent.getRecipients()) { + player.sendMessage(message); + } + } + return null; + }}; + if (async) { + minecraftServer.processQueue.add(waitable); + } else { + waitable.run(); + } + try { + waitable.get(); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); // This is proper habit for java. If we aren't handling it, pass it on! + } catch (ExecutionException e) { + throw new RuntimeException("Exception processing chat event", e.getCause()); + } + } else { + if (event.isCancelled()) { + return; + } + + s = String.format(event.getFormat(), event.getPlayer().getDisplayName(), event.getMessage()); + minecraftServer.console.sendMessage(s); + if (((LazyPlayerSet) event.getRecipients()).isLazy()) { + for (Object recipient : minecraftServer.getPlayerList().players) { + ((EntityPlayer) recipient).sendMessage(s); + } + } else { + for (Player recipient : event.getRecipients()) { + recipient.sendMessage(s); + } + } + } + } + } + + return; + } + // CraftBukkit end + + private void handleCommand(String s) { + // CraftBukkit start + CraftPlayer player = this.getPlayer(); + + PlayerCommandPreprocessEvent event = new PlayerCommandPreprocessEvent(player, s, new LazyPlayerSet()); + this.server.getPluginManager().callEvent(event); + + if (event.isCancelled()) { + return; + } + + try { + logger.info(event.getPlayer().getName() + " issued server command: " + event.getMessage()); // CraftBukkit + if (this.server.dispatchCommand(event.getPlayer(), event.getMessage().substring(1))) { + return; + } + } catch (org.bukkit.command.CommandException ex) { + player.sendMessage(org.bukkit.ChatColor.RED + "An internal error occurred while attempting to perform this command"); + Logger.getLogger(PlayerConnection.class.getName()).log(Level.SEVERE, null, ex); + return; + } + // CraftBukkit end + + /* CraftBukkit start - No longer needed as we have already handled it in server.dispatchServerCommand above. + this.minecraftServer.getCommandHandler().a(this.player, s); + // CraftBukkit end */ + } + + public void a(Packet18ArmAnimation packet18armanimation) { + if (this.player.dead) return; // CraftBukkit + + if (packet18armanimation.b == 1) { + // CraftBukkit start - raytrace to look for 'rogue armswings' + float f = 1.0F; + float f1 = this.player.lastPitch + (this.player.pitch - this.player.lastPitch) * f; + float f2 = this.player.lastYaw + (this.player.yaw - this.player.lastYaw) * f; + double d0 = this.player.lastX + (this.player.locX - this.player.lastX) * (double) f; + double d1 = this.player.lastY + (this.player.locY - this.player.lastY) * (double) f + 1.62D - (double) this.player.height; + double d2 = this.player.lastZ + (this.player.locZ - this.player.lastZ) * (double) f; + Vec3D vec3d = this.player.world.getVec3DPool().create(d0, d1, d2); + + float f3 = MathHelper.cos(-f2 * 0.017453292F - 3.1415927F); + float f4 = MathHelper.sin(-f2 * 0.017453292F - 3.1415927F); + float f5 = -MathHelper.cos(-f1 * 0.017453292F); + float f6 = MathHelper.sin(-f1 * 0.017453292F); + float f7 = f4 * f5; + float f8 = f3 * f5; + double d3 = 5.0D; + Vec3D vec3d1 = vec3d.add((double) f7 * d3, (double) f6 * d3, (double) f8 * d3); + MovingObjectPosition movingobjectposition = this.player.world.rayTrace(vec3d, vec3d1, true); + + if (movingobjectposition == null || movingobjectposition.type != EnumMovingObjectType.TILE) { + CraftEventFactory.callPlayerInteractEvent(this.player, Action.LEFT_CLICK_AIR, this.player.inventory.getItemInHand()); + } + + // Arm swing animation + PlayerAnimationEvent event = new PlayerAnimationEvent(this.getPlayer()); + this.server.getPluginManager().callEvent(event); + + if (event.isCancelled()) return; + // CraftBukkit end + + this.player.bH(); + } + } + + public void a(Packet19EntityAction packet19entityaction) { + // CraftBukkit start + if (this.player.dead) return; + + if (packet19entityaction.animation == 1 || packet19entityaction.animation == 2) { + PlayerToggleSneakEvent event = new PlayerToggleSneakEvent(this.getPlayer(), packet19entityaction.animation == 1); + this.server.getPluginManager().callEvent(event); + + if (event.isCancelled()) { + return; + } + } + + if (packet19entityaction.animation == 4 || packet19entityaction.animation == 5) { + PlayerToggleSprintEvent event = new PlayerToggleSprintEvent(this.getPlayer(), packet19entityaction.animation == 4); + this.server.getPluginManager().callEvent(event); + + if (event.isCancelled()) { + return; + } + } + // CraftBukkit end + + if (packet19entityaction.animation == 1) { + this.player.setSneaking(true); + } else if (packet19entityaction.animation == 2) { + this.player.setSneaking(false); + } else if (packet19entityaction.animation == 4) { + this.player.setSprinting(true); + } else if (packet19entityaction.animation == 5) { + this.player.setSprinting(false); + } else if (packet19entityaction.animation == 3) { + this.player.a(false, true, true); + // this.checkMovement = false; // CraftBukkit - this is handled in teleport + } + } + + public void a(Packet255KickDisconnect packet255kickdisconnect) { + // CraftBukkit start + getPlayer().disconnect("disconnect.quitting"); + // CraftBukkit end + this.networkManager.a("disconnect.quitting", new Object[0]); + } + + public int lowPriorityCount() { + return this.networkManager.e(); + } + + public void a(Packet7UseEntity packet7useentity) { + if (this.player.dead) return; // CraftBukkit + + WorldServer worldserver = this.minecraftServer.getWorldServer(this.player.dimension); + Entity entity = worldserver.getEntity(packet7useentity.target); + + if (entity != null) { + boolean flag = this.player.n(entity); + double d0 = 36.0D; + + if (!flag) { + d0 = 9.0D; + } + + if (this.player.e(entity) < d0) { + ItemStack itemInHand = this.player.inventory.getItemInHand(); // CraftBukkit + if (packet7useentity.action == 0) { + // CraftBukkit start + PlayerInteractEntityEvent event = new PlayerInteractEntityEvent((Player) this.getPlayer(), entity.getBukkitEntity()); + this.server.getPluginManager().callEvent(event); + + if (event.isCancelled()) { + return; + } + // CraftBukkit end + this.player.p(entity); + // CraftBukkit start - update the client if the item is an infinite one + if (itemInHand != null && itemInHand.count <= -1) { + this.player.updateInventory(this.player.activeContainer); + } + } else if (packet7useentity.action == 1) { + if ((entity instanceof EntityItem) || (entity instanceof EntityExperienceOrb) || (entity instanceof EntityArrow)) { + String type = entity.getClass().getSimpleName(); + disconnect("Attacking an " + type + " is not permitted"); + System.out.println("Player " + player.name + " tried to attack an " + type + ", so I have disconnected them for exploiting."); + return; + } + + this.player.attack(entity); + + if (itemInHand != null && itemInHand.count <= -1) { + this.player.updateInventory(this.player.activeContainer); + } + // CraftBukkit end + } + } + } + } + + public void a(Packet205ClientCommand packet205clientcommand) { + if (packet205clientcommand.a == 1) { + if (this.player.viewingCredits) { + // CraftBukkit start + org.bukkit.craftbukkit.PortalTravelAgent pta = new org.bukkit.craftbukkit.PortalTravelAgent(); + Location toLocation; + + if (this.player.getBukkitEntity().getBedSpawnLocation() == null) { + CraftWorld cworld = (CraftWorld) this.server.getWorlds().get(0); + ChunkCoordinates chunkcoordinates = cworld.getHandle().getSpawn(); + toLocation = new Location(cworld, chunkcoordinates.x + 0.5, chunkcoordinates.y, chunkcoordinates.z + 0.5); + this.player.playerConnection.sendPacket(new Packet70Bed(0, 0)); + } else { + toLocation = this.player.getBukkitEntity().getBedSpawnLocation(); + toLocation = new Location(toLocation.getWorld(), toLocation.getX() + 0.5, toLocation.getY(), toLocation.getZ() + 0.5); + } + + PlayerPortalEvent event = new PlayerPortalEvent(this.player.getBukkitEntity(), this.player.getBukkitEntity().getLocation(), toLocation, pta, PlayerPortalEvent.TeleportCause.END_PORTAL); + event.useTravelAgent(false); + + Bukkit.getServer().getPluginManager().callEvent(event); + this.player = this.minecraftServer.getPlayerList().moveToWorld(this.player, 0, true, event.getTo()); + // CraftBukkit end + } else if (this.player.p().getWorldData().isHardcore()) { + if (this.minecraftServer.I() && this.player.name.equals(this.minecraftServer.H())) { + this.player.playerConnection.disconnect("You have died. Game over, man, it\'s game over!"); + this.minecraftServer.P(); + } else { + BanEntry banentry = new BanEntry(this.player.name); + + banentry.setReason("Death in Hardcore"); + this.minecraftServer.getPlayerList().getNameBans().add(banentry); + this.player.playerConnection.disconnect("You have died. Game over, man, it\'s game over!"); + } + } else { + if (this.player.getHealth() > 0) { + return; + } + + this.player = this.minecraftServer.getPlayerList().moveToWorld(this.player, 0, false); + } + } + } + + public boolean b() { + return true; + } + + public void a(Packet9Respawn packet9respawn) {} + + public void handleContainerClose(Packet101CloseWindow packet101closewindow) { + if (this.player.dead) return; // CraftBukkit + + // CraftBukkit start - INVENTORY_CLOSE hook + InventoryCloseEvent event = new InventoryCloseEvent(this.player.activeContainer.getBukkitView()); + server.getPluginManager().callEvent(event); + this.player.activeContainer.transferTo(this.player.defaultContainer, getPlayer()); + // CraftBukkit end + + this.player.k(); + } + + public void a(Packet102WindowClick packet102windowclick) { + if (this.player.dead) return; // CraftBukkit + + if (this.player.activeContainer.windowId == packet102windowclick.a && this.player.activeContainer.c(this.player)) { + // CraftBukkit start - fire InventoryClickEvent + InventoryView inventory = this.player.activeContainer.getBukkitView(); + SlotType type = CraftInventoryView.getSlotType(inventory, packet102windowclick.slot); + + InventoryClickEvent event = new InventoryClickEvent(inventory, type, packet102windowclick.slot, packet102windowclick.button != 0, packet102windowclick.shift == 1); + org.bukkit.inventory.Inventory top = inventory.getTopInventory(); + if (packet102windowclick.slot == 0 && top instanceof CraftingInventory) { + org.bukkit.inventory.Recipe recipe = ((CraftingInventory) top).getRecipe(); + if (recipe != null) { + event = new CraftItemEvent(recipe, inventory, type, packet102windowclick.slot, packet102windowclick.button != 0, packet102windowclick.shift == 1); + } + } + server.getPluginManager().callEvent(event); + + ItemStack itemstack = null; + boolean defaultBehaviour = false; + + switch(event.getResult()) { + case DEFAULT: + itemstack = this.player.activeContainer.clickItem(packet102windowclick.slot, packet102windowclick.button, packet102windowclick.shift, this.player); + defaultBehaviour = true; + break; + case DENY: // Deny any change, including changes from the event + break; + case ALLOW: // Allow changes unconditionally + org.bukkit.inventory.ItemStack cursor = event.getCursor(); + if (cursor == null) { + this.player.inventory.setCarried((ItemStack) null); + } else { + this.player.inventory.setCarried(CraftItemStack.asNMSCopy(cursor)); + } + org.bukkit.inventory.ItemStack item = event.getCurrentItem(); + if (item != null) { + itemstack = CraftItemStack.asNMSCopy(item); + if (packet102windowclick.slot == -999) { + this.player.drop(itemstack); + } else { + this.player.activeContainer.getSlot(packet102windowclick.slot).set(itemstack); + } + } else if (packet102windowclick.slot != -999) { + this.player.activeContainer.getSlot(packet102windowclick.slot).set((ItemStack) null); + } + break; + } + // CraftBukkit end + + if (ItemStack.matches(packet102windowclick.item, itemstack)) { + this.player.playerConnection.sendPacket(new Packet106Transaction(packet102windowclick.a, packet102windowclick.d, true)); + this.player.h = true; + this.player.activeContainer.b(); + this.player.broadcastCarriedItem(); + this.player.h = false; + } else { + this.s.a(this.player.activeContainer.windowId, Short.valueOf(packet102windowclick.d)); + this.player.playerConnection.sendPacket(new Packet106Transaction(packet102windowclick.a, packet102windowclick.d, false)); + this.player.activeContainer.a(this.player, false); + ArrayList arraylist = new ArrayList(); + + for (int i = 0; i < this.player.activeContainer.c.size(); ++i) { + arraylist.add(((Slot) this.player.activeContainer.c.get(i)).getItem()); + } + + this.player.a(this.player.activeContainer, arraylist); + + // CraftBukkit start - send a Set Slot to update the crafting result slot + if(type == SlotType.RESULT && itemstack != null) + this.player.playerConnection.sendPacket((Packet) (new Packet103SetSlot(this.player.activeContainer.windowId, 0, itemstack))); + // CraftBukkit end + } + } + } + + public void a(Packet108ButtonClick packet108buttonclick) { + if (this.player.activeContainer.windowId == packet108buttonclick.a && this.player.activeContainer.c(this.player)) { + this.player.activeContainer.a((EntityHuman) this.player, packet108buttonclick.b); + this.player.activeContainer.b(); + } + } + + public void a(Packet107SetCreativeSlot packet107setcreativeslot) { + if (this.player.playerInteractManager.isCreative()) { + boolean flag = packet107setcreativeslot.slot < 0; + ItemStack itemstack = packet107setcreativeslot.b; + boolean flag1 = packet107setcreativeslot.slot >= 1 && packet107setcreativeslot.slot < 36 + PlayerInventory.getHotbarSize(); + // CraftBukkit + boolean flag2 = itemstack == null || itemstack.id < Item.byId.length && itemstack.id >= 0 && Item.byId[itemstack.id] != null && !invalidItems.contains(itemstack.id); + boolean flag3 = itemstack == null || itemstack.getData() >= 0 && itemstack.getData() >= 0 && itemstack.count <= 64 && itemstack.count > 0; + + // CraftBukkit start - Fire INVENTORY_CLICK event + org.bukkit.entity.HumanEntity player = this.player.getBukkitEntity(); + InventoryView inventory = new CraftInventoryView(player, player.getInventory(), this.player.defaultContainer); + SlotType slot = SlotType.QUICKBAR; + if (packet107setcreativeslot.slot == -1) { + slot = SlotType.OUTSIDE; + } + + InventoryClickEvent event = new InventoryClickEvent(inventory, slot, slot == SlotType.OUTSIDE ? -999 : packet107setcreativeslot.slot, false, false); + server.getPluginManager().callEvent(event); + org.bukkit.inventory.ItemStack item = event.getCurrentItem(); + + switch (event.getResult()) { + case ALLOW: + if (slot == SlotType.QUICKBAR) { + if (item == null) { + this.player.defaultContainer.setItem(packet107setcreativeslot.slot, (ItemStack) null); + } else { + this.player.defaultContainer.setItem(packet107setcreativeslot.slot, CraftItemStack.asNMSCopy(item)); + } + } else if (item != null) { + this.player.drop(CraftItemStack.asNMSCopy(item)); + } + return; + case DENY: + // TODO: Will this actually work? + if (packet107setcreativeslot.slot > -1) { + this.player.playerConnection.sendPacket(new Packet103SetSlot(this.player.defaultContainer.windowId, packet107setcreativeslot.slot, CraftItemStack.asNMSCopy(item))); + } + return; + case DEFAULT: + // We do the stuff below + break; + default: + return; + } + // CraftBukkit end + + if (flag1 && flag2 && flag3) { + if (itemstack == null) { + this.player.defaultContainer.setItem(packet107setcreativeslot.slot, (ItemStack) null); + } else { + this.player.defaultContainer.setItem(packet107setcreativeslot.slot, itemstack); + } + + this.player.defaultContainer.a(this.player, true); + } else if (flag && flag2 && flag3 && this.x < 200) { + this.x += 20; + EntityItem entityitem = this.player.drop(itemstack); + + if (entityitem != null) { + entityitem.c(); + } + } + } + } + + public void a(Packet106Transaction packet106transaction) { + if (this.player.dead) return; // CraftBukkit + Short oshort = (Short) this.s.get(this.player.activeContainer.windowId); + + if (oshort != null && packet106transaction.b == oshort.shortValue() && this.player.activeContainer.windowId == packet106transaction.a && !this.player.activeContainer.c(this.player)) { + this.player.activeContainer.a(this.player, true); + } + } + + public void a(Packet130UpdateSign packet130updatesign) { + if (this.player.dead) return; // CraftBukkit + + WorldServer worldserver = this.minecraftServer.getWorldServer(this.player.dimension); + + if (worldserver.isLoaded(packet130updatesign.x, packet130updatesign.y, packet130updatesign.z)) { + TileEntity tileentity = worldserver.getTileEntity(packet130updatesign.x, packet130updatesign.y, packet130updatesign.z); + + if (tileentity instanceof TileEntitySign) { + TileEntitySign tileentitysign = (TileEntitySign) tileentity; + + if (!tileentitysign.a()) { + this.minecraftServer.warning("Player " + this.player.name + " just tried to change non-editable sign"); + this.sendPacket(new Packet130UpdateSign(packet130updatesign.x, packet130updatesign.y, packet130updatesign.z, tileentitysign.lines)); // CraftBukkit + return; + } + } + + int i; + int j; + + for (j = 0; j < 4; ++j) { + boolean flag = true; + + if (packet130updatesign.lines[j].length() > 15) { + flag = false; + } else { + for (i = 0; i < packet130updatesign.lines[j].length(); ++i) { + if (SharedConstants.allowedCharacters.indexOf(packet130updatesign.lines[j].charAt(i)) < 0) { + flag = false; + } + } + } + + if (!flag) { + packet130updatesign.lines[j] = "!?"; + } + } + + if (tileentity instanceof TileEntitySign) { + j = packet130updatesign.x; + int k = packet130updatesign.y; + + i = packet130updatesign.z; + TileEntitySign tileentitysign1 = (TileEntitySign) tileentity; + + // CraftBukkit start + Player player = this.server.getPlayer(this.player); + SignChangeEvent event = new SignChangeEvent((org.bukkit.craftbukkit.block.CraftBlock) player.getWorld().getBlockAt(j, k, i), this.server.getPlayer(this.player), packet130updatesign.lines); + 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.isEditable = false; + } + // CraftBukkit end + + tileentitysign1.update(); + worldserver.notify(j, k, i); + } + } + } + + public void a(Packet0KeepAlive packet0keepalive) { + if (packet0keepalive.a == this.i) { + int i = (int) (System.nanoTime() / 1000000L - this.j); + + this.player.ping = (this.player.ping * 3 + i) / 4; + } + } + + public boolean a() { + return true; + } + + public void a(Packet202Abilities packet202abilities) { + // CraftBukkit start + if (this.player.abilities.canFly && this.player.abilities.isFlying != packet202abilities.f()) { + PlayerToggleFlightEvent event = new PlayerToggleFlightEvent(this.server.getPlayer(this.player), packet202abilities.f()); + this.server.getPluginManager().callEvent(event); + if (!event.isCancelled()) { + this.player.abilities.isFlying = packet202abilities.f(); // Actually set the player's flying status + } + else { + this.player.updateAbilities(); // Tell the player their ability was reverted + } + } + // CraftBukkit end + } + + public void a(Packet203TabComplete packet203tabcomplete) { + StringBuilder stringbuilder = new StringBuilder(); + + String s; + + for (Iterator iterator = this.minecraftServer.a((ICommandListener) this.player, packet203tabcomplete.d()).iterator(); iterator.hasNext(); stringbuilder.append(s)) { + s = (String) iterator.next(); + if (stringbuilder.length() > 0) { + stringbuilder.append('\0'); // CraftBukkit - fix decompile issue + } + } + + this.player.playerConnection.sendPacket(new Packet203TabComplete(stringbuilder.toString())); + } + + public void a(Packet204LocaleAndViewDistance packet204localeandviewdistance) { + this.player.a(packet204localeandviewdistance); + } + + public void a(Packet250CustomPayload packet250custompayload) { + DataInputStream datainputstream; + ItemStack itemstack; + ItemStack itemstack1; + + // CraftBukkit start - ignore empty payloads + if (packet250custompayload.length <= 0) { + return; + } + // CraftBukkit end + + if ("MC|BEdit".equals(packet250custompayload.tag)) { + try { + datainputstream = new DataInputStream(new ByteArrayInputStream(packet250custompayload.data)); + itemstack = Packet.c(datainputstream); + if (!ItemBookAndQuill.a(itemstack.getTag())) { + throw new IOException("Invalid book tag!"); + } + + itemstack1 = this.player.inventory.getItemInHand(); + if (itemstack != null && itemstack.id == Item.BOOK_AND_QUILL.id && itemstack.id == itemstack1.id) { + itemstack1.a("pages", (NBTBase) itemstack.getTag().getList("pages")); + } + } catch (Exception exception) { + exception.printStackTrace(); + } + } else if ("MC|BSign".equals(packet250custompayload.tag)) { + try { + datainputstream = new DataInputStream(new ByteArrayInputStream(packet250custompayload.data)); + itemstack = Packet.c(datainputstream); + if (!ItemWrittenBook.a(itemstack.getTag())) { + throw new IOException("Invalid book tag!"); + } + + itemstack1 = this.player.inventory.getItemInHand(); + if (itemstack != null && itemstack.id == Item.WRITTEN_BOOK.id && itemstack1.id == Item.BOOK_AND_QUILL.id) { + itemstack1.a("author", (NBTBase) (new NBTTagString("author", this.player.name))); + itemstack1.a("title", (NBTBase) (new NBTTagString("title", itemstack.getTag().getString("title")))); + itemstack1.a("pages", (NBTBase) itemstack.getTag().getList("pages")); + itemstack1.id = Item.WRITTEN_BOOK.id; + } + } catch (Exception exception1) { + // CraftBukkit start + // exception1.printStackTrace(); + // CraftBukkit end + } + } else { + int i; + + if ("MC|TrSel".equals(packet250custompayload.tag)) { + try { + datainputstream = new DataInputStream(new ByteArrayInputStream(packet250custompayload.data)); + i = datainputstream.readInt(); + Container container = this.player.activeContainer; + + if (container instanceof ContainerMerchant) { + ((ContainerMerchant) container).b(i); + } + } catch (Exception exception2) { + exception2.printStackTrace(); + } + } else { + int j; + + if ("MC|AdvCdm".equals(packet250custompayload.tag)) { + if (!this.minecraftServer.getEnableCommandBlock()) { + this.player.sendMessage(this.player.a("advMode.notEnabled", new Object[0])); + } else if (this.player.a(2, "") && this.player.abilities.canInstantlyBuild) { + try { + datainputstream = new DataInputStream(new ByteArrayInputStream(packet250custompayload.data)); + i = datainputstream.readInt(); + j = datainputstream.readInt(); + int k = datainputstream.readInt(); + String s = Packet.a(datainputstream, 256); + TileEntity tileentity = this.player.world.getTileEntity(i, j, k); + + if (tileentity != null && tileentity instanceof TileEntityCommand) { + ((TileEntityCommand) tileentity).b(s); + this.player.world.notify(i, j, k); + this.player.sendMessage("Command set: " + s); + } + } catch (Exception exception3) { + exception3.printStackTrace(); + } + } else { + this.player.sendMessage(this.player.a("advMode.notAllowed", new Object[0])); + } + } else if ("MC|Beacon".equals(packet250custompayload.tag)) { + if (this.player.activeContainer instanceof ContainerBeacon) { + try { + datainputstream = new DataInputStream(new ByteArrayInputStream(packet250custompayload.data)); + i = datainputstream.readInt(); + j = datainputstream.readInt(); + ContainerBeacon containerbeacon = (ContainerBeacon) this.player.activeContainer; + Slot slot = containerbeacon.getSlot(0); + + if (slot.d()) { + slot.a(1); + TileEntityBeacon tileentitybeacon = containerbeacon.d(); + + tileentitybeacon.d(i); + tileentitybeacon.e(j); + tileentitybeacon.update(); + } + } catch (Exception exception4) { + exception4.printStackTrace(); + } + } + } else if ("MC|ItemName".equals(packet250custompayload.tag) && this.player.activeContainer instanceof ContainerAnvil) { + ContainerAnvil containeranvil = (ContainerAnvil) this.player.activeContainer; + + if (packet250custompayload.data != null && packet250custompayload.data.length >= 1) { + String s1 = SharedConstants.a(new String(packet250custompayload.data)); + + if (s1.length() <= 30) { + containeranvil.a(s1); + } + } else { + containeranvil.a(""); + } + } + // CraftBukkit start + else if (packet250custompayload.tag.equals("REGISTER")) { + try { + String channels = new String(packet250custompayload.data, "UTF8"); + for (String channel : channels.split("\0")) { + getPlayer().addChannel(channel); + } + } catch (UnsupportedEncodingException ex) { + Logger.getLogger(PlayerConnection.class.getName()).log(Level.SEVERE, "Could not parse REGISTER payload in plugin message packet", ex); + } + } else if (packet250custompayload.tag.equals("UNREGISTER")) { + try { + String channels = new String(packet250custompayload.data, "UTF8"); + for (String channel : channels.split("\0")) { + getPlayer().removeChannel(channel); + } + } catch (UnsupportedEncodingException ex) { + Logger.getLogger(PlayerConnection.class.getName()).log(Level.SEVERE, "Could not parse UNREGISTER payload in plugin message packet", ex); + } + } else { + server.getMessenger().dispatchIncomingMessage(player.getBukkitEntity(), packet250custompayload.tag, packet250custompayload.data); + } + // CraftBukkit end + } + } + } +} diff --git a/src/main/java/net/minecraft/server/PlayerInstance.java b/src/main/java/net/minecraft/server/PlayerInstance.java deleted file mode 100644 index a4d90475..00000000 --- a/src/main/java/net/minecraft/server/PlayerInstance.java +++ /dev/null @@ -1,168 +0,0 @@ -package net.minecraft.server; - -import java.util.ArrayList; -import java.util.List; - -class PlayerInstance { - - private final List b; - private final ChunkCoordIntPair location; - private short[] dirtyBlocks; - private int dirtyCount; - private int f; - private boolean loaded = false; // CraftBukkit - - final PlayerManager playerManager; - - public PlayerInstance(PlayerManager playermanager, int i, int j) { - this.playerManager = playermanager; - this.b = new ArrayList(); - this.dirtyBlocks = new short[64]; - this.dirtyCount = 0; - this.location = new ChunkCoordIntPair(i, j); - // CraftBukkit start - playermanager.a().chunkProviderServer.getChunkAt(i, j, new Runnable() { - public void run() { - PlayerInstance.this.loaded = true; - } - }); - // CraftBukkit end - } - - public void a(final EntityPlayer entityplayer) { // CraftBukkit - added final to argument - if (this.b.contains(entityplayer)) { - throw new IllegalStateException("Failed to add player. " + entityplayer + " already is in chunk " + this.location.x + ", " + this.location.z); - } else { - this.b.add(entityplayer); - - // CraftBukkit start - if (this.loaded) { - entityplayer.chunkCoordIntPairQueue.add(this.location); - } else { - // Abuse getChunkAt to add another callback - this.playerManager.a().chunkProviderServer.getChunkAt(this.location.x, this.location.z, new Runnable() { - public void run() { - entityplayer.chunkCoordIntPairQueue.add(PlayerInstance.this.location); - } - }); - } - // CraftBukkit end - } - } - - public void b(EntityPlayer entityplayer) { - if (this.b.contains(entityplayer)) { - entityplayer.netServerHandler.sendPacket(new Packet51MapChunk(PlayerManager.a(this.playerManager).getChunkAt(this.location.x, this.location.z), true, 0)); - this.b.remove(entityplayer); - entityplayer.chunkCoordIntPairQueue.remove(this.location); - if (this.b.isEmpty()) { - long i = (long) this.location.x + 2147483647L | (long) this.location.z + 2147483647L << 32; - - PlayerManager.b(this.playerManager).remove(i); - if (this.dirtyCount > 0) { - PlayerManager.c(this.playerManager).remove(this); - } - - this.playerManager.a().chunkProviderServer.queueUnload(this.location.x, this.location.z); - } - } - } - - public void a(int i, int j, int k) { - if (this.dirtyCount == 0) { - PlayerManager.c(this.playerManager).add(this); - } - - this.f |= 1 << (j >> 4); - if (this.dirtyCount < 64) { - short short1 = (short) (i << 12 | k << 8 | j); - - for (int l = 0; l < this.dirtyCount; ++l) { - if (this.dirtyBlocks[l] == short1) { - return; - } - } - - this.dirtyBlocks[this.dirtyCount++] = short1; - } - } - - public void sendAll(Packet packet) { - for (int i = 0; i < this.b.size(); ++i) { - EntityPlayer entityplayer = (EntityPlayer) this.b.get(i); - - if (!entityplayer.chunkCoordIntPairQueue.contains(this.location)) { - entityplayer.netServerHandler.sendPacket(packet); - } - } - } - - public void a() { - if (this.dirtyCount != 0) { - int i; - int j; - int k; - - if (this.dirtyCount == 1) { - i = this.location.x * 16 + (this.dirtyBlocks[0] >> 12 & 15); - j = this.dirtyBlocks[0] & 255; - k = this.location.z * 16 + (this.dirtyBlocks[0] >> 8 & 15); - this.sendAll(new Packet53BlockChange(i, j, k, PlayerManager.a(this.playerManager))); - if (PlayerManager.a(this.playerManager).isTileEntity(i, j, k)) { - this.sendTileEntity(PlayerManager.a(this.playerManager).getTileEntity(i, j, k)); - } - } else { - int l; - - if (this.dirtyCount == 64) { - i = this.location.x * 16; - j = this.location.z * 16; - this.sendAll(new Packet51MapChunk(PlayerManager.a(this.playerManager).getChunkAt(this.location.x, this.location.z), (this.f == 0xFFFF), this.f)); // CraftBukkit - send everything (including biome) if all sections flagged - - for (k = 0; k < 16; ++k) { - if ((this.f & 1 << k) != 0) { - l = k << 4; - List list = PlayerManager.a(this.playerManager).getTileEntities(i, l, j, i + 16, l + 16, j + 16); - - for (int i1 = 0; i1 < list.size(); ++i1) { - this.sendTileEntity((TileEntity) list.get(i1)); - } - } - } - } else { - this.sendAll(new Packet52MultiBlockChange(this.location.x, this.location.z, this.dirtyBlocks, this.dirtyCount, PlayerManager.a(this.playerManager))); - - for (i = 0; i < this.dirtyCount; ++i) { - j = this.location.x * 16 + (this.dirtyBlocks[i] >> 12 & 15); - k = this.dirtyBlocks[i] & 255; - l = this.location.z * 16 + (this.dirtyBlocks[i] >> 8 & 15); - if (PlayerManager.a(this.playerManager).isTileEntity(j, k, l)) { - this.sendTileEntity(PlayerManager.a(this.playerManager).getTileEntity(j, k, l)); - } - } - } - } - - this.dirtyCount = 0; - this.f = 0; - } - } - - private void sendTileEntity(TileEntity tileentity) { - if (tileentity != null) { - Packet packet = tileentity.getUpdatePacket(); - - if (packet != null) { - this.sendAll(packet); - } - } - } - - static ChunkCoordIntPair a(PlayerInstance playerinstance) { - return playerinstance.location; - } - - static List b(PlayerInstance playerinstance) { - return playerinstance.b; - } -} diff --git a/src/main/java/net/minecraft/server/PlayerInteractManager.java b/src/main/java/net/minecraft/server/PlayerInteractManager.java new file mode 100644 index 00000000..5faee122 --- /dev/null +++ b/src/main/java/net/minecraft/server/PlayerInteractManager.java @@ -0,0 +1,413 @@ +package net.minecraft.server; + +// CraftBukkit start +import org.bukkit.event.block.BlockBreakEvent; +import org.bukkit.craftbukkit.event.CraftEventFactory; +import org.bukkit.event.Event; +import org.bukkit.event.block.Action; +import org.bukkit.event.player.PlayerInteractEvent; +// CraftBukkit end + +public class PlayerInteractManager { + + public World world; + public EntityPlayer player; + private EnumGamemode gamemode; + private boolean d; + private int lastDigTick; + private int f; + private int g; + private int h; + private int currentTick; + private boolean j; + private int k; + private int l; + private int m; + private int n; + private int o; + + public PlayerInteractManager(World world) { + this.gamemode = EnumGamemode.NONE; + this.o = -1; + this.world = world; + } + + // CraftBukkit start - keep this for backwards compatibility + public PlayerInteractManager(WorldServer world) { + this((World) world); + } + // CraftBukkit end + + public void setGameMode(EnumGamemode enumgamemode) { + this.gamemode = enumgamemode; + enumgamemode.a(this.player.abilities); + this.player.updateAbilities(); + } + + public EnumGamemode getGameMode() { + return this.gamemode; + } + + public boolean isCreative() { + return this.gamemode.d(); + } + + public void b(EnumGamemode enumgamemode) { + if (this.gamemode == EnumGamemode.NONE) { + this.gamemode = enumgamemode; + } + + this.setGameMode(this.gamemode); + } + + public void a() { + this.currentTick = (int) (System.currentTimeMillis() / 50); // CraftBukkit + int i; + float f; + int j; + + if (this.j) { + i = this.currentTick - this.n; + int k = this.world.getTypeId(this.k, this.l, this.m); + + if (k == 0) { + this.j = false; + } else { + Block block = Block.byId[k]; + + f = block.getDamage(this.player, this.player.world, this.k, this.l, this.m) * (float) (i + 1); + j = (int) (f * 10.0F); + if (j != this.o) { + this.world.g(this.player.id, this.k, this.l, this.m, j); + this.o = j; + } + + if (f >= 1.0F) { + this.j = false; + this.breakBlock(this.k, this.l, this.m); + } + } + } else if (this.d) { + i = this.world.getTypeId(this.f, this.g, this.h); + Block block1 = Block.byId[i]; + + if (block1 == null) { + this.world.g(this.player.id, this.f, this.g, this.h, -1); + this.o = -1; + this.d = false; + } else { + int l = this.currentTick - this.lastDigTick; + + f = block1.getDamage(this.player, this.player.world, this.f, this.g, this.h) * (float) (l + 1); + j = (int) (f * 10.0F); + if (j != this.o) { + this.world.g(this.player.id, this.f, this.g, this.h, j); + this.o = j; + } + } + } + } + + public void dig(int i, int j, int k, int l) { + // this.world.douseFire((EntityHuman) null, i, j, k, l); // CraftBukkit - moved down + // CraftBukkit + PlayerInteractEvent event = CraftEventFactory.callPlayerInteractEvent(this.player, Action.LEFT_CLICK_BLOCK, i, j, k, l, this.player.inventory.getItemInHand()); + + if (!this.gamemode.isAdventure() || this.player.f(i, j, k)) { + // CraftBukkit start + if (event.isCancelled()) { + // Let the client know the block still exists + ((EntityPlayer) this.player).playerConnection.sendPacket(new Packet53BlockChange(i, j, k, this.world)); + // Update any tile entity data for this block + TileEntity tileentity = this.world.getTileEntity(i, j, k); + if (tileentity != null) { + this.player.playerConnection.sendPacket(tileentity.getUpdatePacket()); + } + return; + } + // CraftBukkit end + if (this.isCreative()) { + if (!this.world.douseFire((EntityHuman) null, i, j, k, l)) { + this.breakBlock(i, j, k); + } + } else { + this.world.douseFire(this.player, i, j, k, l); + this.lastDigTick = this.currentTick; + float f = 1.0F; + int i1 = this.world.getTypeId(i, j, k); + // CraftBukkit start - Swings at air do *NOT* exist. + if (event.useInteractedBlock() == Event.Result.DENY) { + // If we denied a door from opening, we need to send a correcting update to the client, as it already opened the door. + if (i1 == Block.WOODEN_DOOR.id) { + // For some reason *BOTH* the bottom/top part have to be marked updated. + boolean bottom = (this.world.getData(i, j, k) & 8) == 0; + ((EntityPlayer) this.player).playerConnection.sendPacket(new Packet53BlockChange(i, j, k, this.world)); + ((EntityPlayer) this.player).playerConnection.sendPacket(new Packet53BlockChange(i, j + (bottom ? 1 : -1), k, this.world)); + } else if (i1 == Block.TRAP_DOOR.id) { + ((EntityPlayer) this.player).playerConnection.sendPacket(new Packet53BlockChange(i, j, k, this.world)); + } + } else if (i1 > 0) { + Block.byId[i1].attack(this.world, i, j, k, this.player); + // Allow fire punching to be blocked + this.world.douseFire((EntityHuman) null, i, j, k, l); + } + + // Handle hitting a block + if (i1 > 0) { + f = Block.byId[i1].getDamage(this.player, this.world, i, j, k); + } + + if (event.useItemInHand() == Event.Result.DENY) { + // If we 'insta destroyed' then the client needs to be informed. + if (f > 1.0f) { + ((EntityPlayer) this.player).playerConnection.sendPacket(new Packet53BlockChange(i, j, k, this.world)); + } + return; + } + org.bukkit.event.block.BlockDamageEvent blockEvent = CraftEventFactory.callBlockDamageEvent(this.player, i, j, k, this.player.inventory.getItemInHand(), f >= 1.0f); + + if (blockEvent.isCancelled()) { + // Let the client know the block still exists + ((EntityPlayer) this.player).playerConnection.sendPacket(new Packet53BlockChange(i, j, k, this.world)); + return; + } + + if (blockEvent.getInstaBreak()) { + f = 2.0f; + } + // CraftBukkit end + + if (i1 > 0 && f >= 1.0F) { + this.breakBlock(i, j, k); + } else { + this.d = true; + this.f = i; + this.g = j; + this.h = k; + int j1 = (int) (f * 10.0F); + + this.world.g(this.player.id, i, j, k, j1); + this.o = j1; + } + } + } + } + + public void a(int i, int j, int k) { + if (i == this.f && j == this.g && k == this.h) { + this.currentTick = (int) (System.currentTimeMillis() / 50); // CraftBukkit + int l = this.currentTick - this.lastDigTick; + int i1 = this.world.getTypeId(i, j, k); + + if (i1 != 0) { + Block block = Block.byId[i1]; + float f = block.getDamage(this.player, this.player.world, i, j, k) * (float) (l + 1); + + if (f >= 0.7F) { + this.d = false; + this.world.g(this.player.id, i, j, k, -1); + this.breakBlock(i, j, k); + } else if (!this.j) { + this.d = false; + this.j = true; + this.k = i; + this.l = j; + this.m = k; + this.n = this.lastDigTick; + } + } + // CraftBukkit start - force blockreset to client + } else { + ((EntityPlayer) this.player).playerConnection.sendPacket(new Packet53BlockChange(i, j, k, this.world)); + // CraftBukkit end + } + } + + public void c(int i, int j, int k) { + this.d = false; + this.world.g(this.player.id, this.f, this.g, this.h, -1); + } + + private boolean d(int i, int j, int k) { + Block block = Block.byId[this.world.getTypeId(i, j, k)]; + int l = this.world.getData(i, j, k); + + if (block != null) { + block.a(this.world, i, j, k, l, this.player); + } + + boolean flag = this.world.setTypeId(i, j, k, 0); + + if (block != null && flag) { + block.postBreak(this.world, i, j, k, l); + } + + return flag; + } + + public boolean breakBlock(int i, int j, int k) { + // CraftBukkit start + BlockBreakEvent event = null; + + if (this.player instanceof EntityPlayer) { + org.bukkit.block.Block block = this.world.getWorld().getBlockAt(i, j, k); + + // Tell client the block is gone immediately then process events + if (world.getTileEntity(i, j, k) == null) { + Packet53BlockChange packet = new Packet53BlockChange(i, j, k, this.world); + + packet.material = 0; + packet.data = 0; + ((EntityPlayer) this.player).playerConnection.sendPacket(packet); + } + + event = new BlockBreakEvent(block, this.player.getBukkitEntity()); + + // Adventure mode pre-cancel + event.setCancelled(this.gamemode.isAdventure() && !this.player.f(i, j, k)); + + // Calculate default block experience + Block nmsBlock = Block.byId[block.getTypeId()]; + + if (nmsBlock != null && !event.isCancelled() && !this.isCreative() && this.player.b(nmsBlock)) { + // Copied from Block.a(world, entityhuman, int, int, int, int) + if (!(nmsBlock.s_() && EnchantmentManager.hasSilkTouchEnchantment(this.player))) { + int data = block.getData(); + int bonusLevel = EnchantmentManager.getBonusBlockLootEnchantmentLevel(this.player); + + event.setExpToDrop(nmsBlock.getExpDrop(this.world, data, bonusLevel)); + } + } + + this.world.getServer().getPluginManager().callEvent(event); + + if (event.isCancelled()) { + // Let the client know the block still exists + ((EntityPlayer) this.player).playerConnection.sendPacket(new Packet53BlockChange(i, j, k, this.world)); + // Update any tile entity data for this block + TileEntity tileentity = this.world.getTileEntity(i, j, k); + if (tileentity != null) { + this.player.playerConnection.sendPacket(tileentity.getUpdatePacket()); + } + return false; + } + } + + if (false) { // Never trigger + // CraftBukkit end + return false; + } else { + int l = this.world.getTypeId(i, j, k); + if (Block.byId[l] == null) return false; // CraftBukkit - a plugin set block to air without cancelling + int i1 = this.world.getData(i, j, k); + + // CraftBukkit start - special case skulls, their item data comes from a tile entity + if (l == Block.SKULL.id && !this.isCreative()) { + Block.SKULL.dropNaturally(world, i, j, k, i1, 1.0F, 0); + return this.d(i, j, k); + } + // CraftBukkit end + + this.world.a(this.player, 2001, i, j, k, l + (this.world.getData(i, j, k) << 12)); + boolean flag = this.d(i, j, k); + + if (this.isCreative()) { + this.player.playerConnection.sendPacket(new Packet53BlockChange(i, j, k, this.world)); + } else { + ItemStack itemstack = this.player.bS(); + boolean flag1 = this.player.b(Block.byId[l]); + + if (itemstack != null) { + itemstack.a(this.world, l, i, j, k, this.player); + if (itemstack.count == 0) { + this.player.bT(); + } + } + + if (flag && flag1) { + Block.byId[l].a(this.world, this.player, i, j, k, i1); + } + } + + // CraftBukkit start - drop event experience + if (flag && event != null) { + Block.byId[l].f(this.world, i, j, k, event.getExpToDrop()); + } + // CraftBukkit end + + return flag; + } + } + + public boolean useItem(EntityHuman entityhuman, World world, ItemStack itemstack) { + int i = itemstack.count; + int j = itemstack.getData(); + ItemStack itemstack1 = itemstack.a(world, entityhuman); + + if (itemstack1 == itemstack && (itemstack1 == null || itemstack1.count == i && itemstack1.m() <= 0 && itemstack1.getData() == j)) { + return false; + } else { + entityhuman.inventory.items[entityhuman.inventory.itemInHandIndex] = itemstack1; + if (this.isCreative()) { + itemstack1.count = i; + if (itemstack1.f()) { + itemstack1.setData(j); + } + } + + if (itemstack1.count == 0) { + entityhuman.inventory.items[entityhuman.inventory.itemInHandIndex] = null; + } + + if (!entityhuman.bM()) { + ((EntityPlayer) entityhuman).updateInventory(entityhuman.defaultContainer); + } + + return true; + } + } + + public boolean interact(EntityHuman entityhuman, World world, ItemStack itemstack, int i, int j, int k, int l, float f, float f1, float f2) { + int i1 = world.getTypeId(i, j, k); + + // CraftBukkit start - Interact + boolean result = false; + if (i1 > 0) { + PlayerInteractEvent event = CraftEventFactory.callPlayerInteractEvent(entityhuman, Action.RIGHT_CLICK_BLOCK, i, j, k, l, itemstack); + if (event.useInteractedBlock() == Event.Result.DENY) { + // If we denied a door from opening, we need to send a correcting update to the client, as it already opened the door. + if (i1 == Block.WOODEN_DOOR.id) { + boolean bottom = (world.getData(i, j, k) & 8) == 0; + ((EntityPlayer) entityhuman).playerConnection.sendPacket(new Packet53BlockChange(i, j + (bottom ? 1 : -1), k, world)); + } + result = (event.useItemInHand() != Event.Result.ALLOW); + } else if (!entityhuman.isSneaking() || itemstack == null) { + result = Block.byId[i1].interact(world, i, j, k, entityhuman, l, f, f1, f2); + } + + if (itemstack != null && !result) { + int j1 = itemstack.getData(); + int k1 = itemstack.count; + + result = itemstack.placeItem(entityhuman, world, i, j, k, l, f, f1, f2); + + // The item count should not decrement in Creative mode. + if (this.isCreative()) { + itemstack.setData(j1); + itemstack.count = k1; + } + } + + // If we have 'true' and no explicit deny *or* an explicit allow -- run the item part of the hook + if (itemstack != null && ((!result && event.useItemInHand() != Event.Result.DENY) || event.useItemInHand() == Event.Result.ALLOW)) { + this.useItem(entityhuman, world, itemstack); + } + } + return result; + // CraftBukkit end + } + + public void a(WorldServer worldserver) { + this.world = worldserver; + } +} diff --git a/src/main/java/net/minecraft/server/PlayerInventory.java b/src/main/java/net/minecraft/server/PlayerInventory.java index d63a4a4a..288cb220 100644 --- a/src/main/java/net/minecraft/server/PlayerInventory.java +++ b/src/main/java/net/minecraft/server/PlayerInventory.java @@ -502,5 +502,7 @@ public class PlayerInventory implements IInventory { for (i = 0; i < this.armor.length; ++i) { this.armor[i] = ItemStack.b(playerinventory.armor[i]); } + + this.itemInHandIndex = playerinventory.itemInHandIndex; } } diff --git a/src/main/java/net/minecraft/server/PlayerList.java b/src/main/java/net/minecraft/server/PlayerList.java new file mode 100644 index 00000000..52dd997b --- /dev/null +++ b/src/main/java/net/minecraft/server/PlayerList.java @@ -0,0 +1,832 @@ +package net.minecraft.server; + +import java.io.File; +import java.net.SocketAddress; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Set; +import java.util.logging.Logger; + +// CraftBukkit start +import org.bukkit.Location; +import org.bukkit.craftbukkit.CraftServer; +import org.bukkit.craftbukkit.CraftWorld; +import org.bukkit.craftbukkit.chunkio.ChunkIOExecutor; +import org.bukkit.entity.Player; +import org.bukkit.event.player.PlayerChangedWorldEvent; +import org.bukkit.event.player.PlayerPortalEvent; +import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerLoginEvent; +import org.bukkit.event.player.PlayerRespawnEvent; +import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; +import org.bukkit.Bukkit; +// CraftBukkit end + +public abstract class PlayerList { + + private static final SimpleDateFormat e = new SimpleDateFormat("yyyy-MM-dd \'at\' HH:mm:ss z"); + public static final Logger a = Logger.getLogger("Minecraft"); + private final MinecraftServer server; + public final List players = new java.util.concurrent.CopyOnWriteArrayList(); // CraftBukkit - ArrayList -> CopyOnWriteArrayList: Iterator safety + private final BanList banByName = new BanList(new File("banned-players.txt")); + private final BanList banByIP = new BanList(new File("banned-ips.txt")); + private Set operators = new HashSet(); + private Set whitelist = new java.util.LinkedHashSet(); // CraftBukkit - HashSet -> LinkedHashSet + public PlayerFileData playerFileData; // CraftBukkit - private -> public + public boolean hasWhitelist; // CraftBukkit - private -> public + protected int maxPlayers; + protected int d; + private EnumGamemode m; + private boolean n; + private int o = 0; + + // CraftBukkit start + private CraftServer cserver; + + public PlayerList(MinecraftServer minecraftserver) { + minecraftserver.server = new CraftServer(minecraftserver, this); + minecraftserver.console = org.bukkit.craftbukkit.command.ColouredConsoleSender.getInstance(); + this.cserver = minecraftserver.server; + // CraftBukkit end + + this.server = minecraftserver; + this.banByName.setEnabled(false); + this.banByIP.setEnabled(false); + this.maxPlayers = 8; + } + + public void a(INetworkManager inetworkmanager, EntityPlayer entityplayer) { + this.a(entityplayer); + entityplayer.spawnIn(this.server.getWorldServer(entityplayer.dimension)); + entityplayer.playerInteractManager.a((WorldServer) entityplayer.world); + String s = "local"; + + if (inetworkmanager.getSocketAddress() != null) { + s = inetworkmanager.getSocketAddress().toString(); + } + + // CraftBukkit - add world and location to 'logged in' message. + a.info(entityplayer.name + "[" + s + "] logged in with entity id " + entityplayer.id + " at ([" + entityplayer.world.worldData.getName() + "] " + entityplayer.locX + ", " + entityplayer.locY + ", " + entityplayer.locZ + ")"); + WorldServer worldserver = this.server.getWorldServer(entityplayer.dimension); + ChunkCoordinates chunkcoordinates = worldserver.getSpawn(); + + this.a(entityplayer, (EntityPlayer) null, worldserver); + PlayerConnection playerconnection = new PlayerConnection(this.server, inetworkmanager, entityplayer); + + // CraftBukkit start -- Don't send a higher than 60 MaxPlayer size, otherwise the PlayerInfo window won't render correctly. + int maxPlayers = this.getMaxPlayers(); + if (maxPlayers > 60) { + maxPlayers = 60; + } + playerconnection.sendPacket(new Packet1Login(entityplayer.id, worldserver.getWorldData().getType(), entityplayer.playerInteractManager.getGameMode(), worldserver.getWorldData().isHardcore(), worldserver.worldProvider.dimension, worldserver.difficulty, worldserver.getHeight(), maxPlayers)); + entityplayer.getBukkitEntity().sendSupportedChannels(); + // CraftBukkit end + + playerconnection.sendPacket(new Packet6SpawnPosition(chunkcoordinates.x, chunkcoordinates.y, chunkcoordinates.z)); + playerconnection.sendPacket(new Packet202Abilities(entityplayer.abilities)); + playerconnection.sendPacket(new Packet16BlockItemSwitch(entityplayer.inventory.itemInHandIndex)); + this.b(entityplayer, worldserver); + // this.sendAll(new Packet3Chat("\u00A7e" + entityplayer.name + " joined the game.")); // CraftBukkit - handled in event + this.c(entityplayer); + playerconnection.a(entityplayer.locX, entityplayer.locY, entityplayer.locZ, entityplayer.yaw, entityplayer.pitch); + this.server.ae().a(playerconnection); + playerconnection.sendPacket(new Packet4UpdateTime(worldserver.getTime(), worldserver.getDayTime())); + if (this.server.getTexturePack().length() > 0) { + entityplayer.a(this.server.getTexturePack(), this.server.S()); + } + + Iterator iterator = entityplayer.getEffects().iterator(); + + while (iterator.hasNext()) { + MobEffect mobeffect = (MobEffect) iterator.next(); + + playerconnection.sendPacket(new Packet41MobEffect(entityplayer.id, mobeffect)); + } + + entityplayer.syncInventory(); + } + + public void setPlayerFileData(WorldServer[] aworldserver) { + if (this.playerFileData != null) return; // CraftBukkit + this.playerFileData = aworldserver[0].getDataManager().getPlayerFileData(); + } + + public void a(EntityPlayer entityplayer, WorldServer worldserver) { + WorldServer worldserver1 = entityplayer.p(); + + if (worldserver != null) { + worldserver.getPlayerChunkMap().removePlayer(entityplayer); + } + + worldserver1.getPlayerChunkMap().addPlayer(entityplayer); + worldserver1.chunkProviderServer.getChunkAt((int) entityplayer.locX >> 4, (int) entityplayer.locZ >> 4); + } + + public int a() { + return PlayerChunkMap.getFurthestViewableBlock(this.o()); + } + + public void a(EntityPlayer entityplayer) { + NBTTagCompound nbttagcompound = this.server.worlds.get(0).getWorldData().i(); // CraftBukkit + + if (entityplayer.getName().equals(this.server.H()) && nbttagcompound != null) { + entityplayer.e(nbttagcompound); + } else { + this.playerFileData.load(entityplayer); + } + } + + protected void b(EntityPlayer entityplayer) { + this.playerFileData.save(entityplayer); + } + + public void c(EntityPlayer entityplayer) { + cserver.detectListNameConflict(entityplayer); // CraftBukkit + // this.sendAll(new Packet201PlayerInfo(entityplayer.name, true, 1000)); // CraftBukkit - replaced with loop below + this.players.add(entityplayer); + WorldServer worldserver = this.server.getWorldServer(entityplayer.dimension); + + // CraftBukkit start + PlayerJoinEvent playerJoinEvent = new PlayerJoinEvent(this.cserver.getPlayer(entityplayer), "\u00A7e" + entityplayer.name + " joined the game."); + this.cserver.getPluginManager().callEvent(playerJoinEvent); + + String joinMessage = playerJoinEvent.getJoinMessage(); + + if ((joinMessage != null) && (joinMessage.length() > 0)) { + this.server.getPlayerList().sendAll(new Packet3Chat(joinMessage)); + } + this.cserver.onPlayerJoin(playerJoinEvent.getPlayer()); + + ChunkIOExecutor.adjustPoolSize(this.getPlayerCount()); + // CraftBukkit end + + // CraftBukkit start - only add if the player wasn't moved in the event + if (entityplayer.world == worldserver && !worldserver.players.contains(entityplayer)) { + worldserver.addEntity(entityplayer); + this.a(entityplayer, (WorldServer) null); + } + // CraftBukkit end + + // CraftBukkit start - sendAll above replaced with this loop + Packet201PlayerInfo packet = new Packet201PlayerInfo(entityplayer.listName, true, 1000); + for (int i = 0; i < this.players.size(); ++i) { + EntityPlayer entityplayer1 = (EntityPlayer) this.players.get(i); + + if (entityplayer1.getBukkitEntity().canSee(entityplayer.getBukkitEntity())) { + entityplayer1.playerConnection.sendPacket(packet); + } + } + // CraftBukkit end + + for (int i = 0; i < this.players.size(); ++i) { + EntityPlayer entityplayer1 = (EntityPlayer) this.players.get(i); + + // CraftBukkit start - .name -> .listName + if (entityplayer.getBukkitEntity().canSee(entityplayer1.getBukkitEntity())) { + entityplayer.playerConnection.sendPacket(new Packet201PlayerInfo(entityplayer1.listName, true, entityplayer1.ping)); + } + // CraftBukkit end + } + } + + public void d(EntityPlayer entityplayer) { + entityplayer.p().getPlayerChunkMap().movePlayer(entityplayer); + } + + public String disconnect(EntityPlayer entityplayer) { // CraftBukkit - return string + if (entityplayer.playerConnection.disconnected) return null; // CraftBukkit - exploitsies fix + + // CraftBukkit start - quitting must be before we do final save of data, in case plugins need to modify it + PlayerQuitEvent playerQuitEvent = new PlayerQuitEvent(this.cserver.getPlayer(entityplayer), "\u00A7e" + entityplayer.name + " left the game."); + this.cserver.getPluginManager().callEvent(playerQuitEvent); + // CraftBukkit end + + this.b(entityplayer); + WorldServer worldserver = entityplayer.p(); + + worldserver.kill(entityplayer); + worldserver.getPlayerChunkMap().removePlayer(entityplayer); + this.players.remove(entityplayer); + ChunkIOExecutor.adjustPoolSize(this.getPlayerCount()); // CraftBukkit + + // CraftBukkit start - .name -> .listName, replace sendAll with loop + Packet201PlayerInfo packet = new Packet201PlayerInfo(entityplayer.listName, false, 9999); + for (int i = 0; i < this.players.size(); ++i) { + EntityPlayer entityplayer1 = (EntityPlayer) this.players.get(i); + + if (entityplayer1.getBukkitEntity().canSee(entityplayer.getBukkitEntity())) { + entityplayer1.playerConnection.sendPacket(packet); + } + } + + return playerQuitEvent.getQuitMessage(); + // CraftBukkit end + } + + // CraftBukkit start - Whole method and signature + public EntityPlayer attemptLogin(PendingConnection pendingconnection, String s, String hostname) { + // Instead of kicking then returning, we need to store the kick reason + // in the event, check with plugins to see if it's ok, and THEN kick + // depending on the outcome. + EntityPlayer entity = new EntityPlayer(this.server, this.server.getWorldServer(0), s, this.server.M() ? new DemoPlayerInteractManager(this.server.getWorldServer(0)) : new PlayerInteractManager(this.server.getWorldServer(0))); + Player player = entity.getBukkitEntity(); + PlayerLoginEvent event = new PlayerLoginEvent(player, hostname, pendingconnection.getSocket().getInetAddress()); + + SocketAddress socketaddress = pendingconnection.networkManager.getSocketAddress(); + + if (this.banByName.isBanned(s)) { + BanEntry banentry = (BanEntry) this.banByName.getEntries().get(s); + String s1 = "You are banned from this server!\nReason: " + banentry.getReason(); + + if (banentry.getExpires() != null) { + s1 = s1 + "\nYour ban will be removed on " + e.format(banentry.getExpires()); + } + + event.disallow(PlayerLoginEvent.Result.KICK_BANNED, s1); + } else if (!this.isWhitelisted(s)) { + event.disallow(PlayerLoginEvent.Result.KICK_WHITELIST, "You are not white-listed on this server!"); + } else { + String s2 = socketaddress.toString(); + + s2 = s2.substring(s2.indexOf("/") + 1); + s2 = s2.substring(0, s2.indexOf(":")); + if (this.banByIP.isBanned(s2)) { + BanEntry banentry1 = (BanEntry) this.banByIP.getEntries().get(s2); + String s3 = "Your IP address is banned from this server!\nReason: " + banentry1.getReason(); + + if (banentry1.getExpires() != null) { + s3 = s3 + "\nYour ban will be removed on " + e.format(banentry1.getExpires()); + } + + event.disallow(PlayerLoginEvent.Result.KICK_BANNED, s3); + } else if (this.players.size() >= this.maxPlayers) { + event.disallow(PlayerLoginEvent.Result.KICK_FULL, "The server is full!"); + } else { + event.disallow(PlayerLoginEvent.Result.ALLOWED, s2); + } + } + + this.cserver.getPluginManager().callEvent(event); + if (event.getResult() != PlayerLoginEvent.Result.ALLOWED) { + pendingconnection.disconnect(event.getKickMessage()); + return null; + } + + return entity; + // CraftBukkit end + } + + public EntityPlayer processLogin(EntityPlayer player) { // CraftBukkit - String -> EntityPlayer + String s = player.name; // CraftBukkit + ArrayList arraylist = new ArrayList(); + + EntityPlayer entityplayer; + + for (int i = 0; i < this.players.size(); ++i) { + entityplayer = (EntityPlayer) this.players.get(i); + if (entityplayer.name.equalsIgnoreCase(s)) { + arraylist.add(entityplayer); + } + } + + Iterator iterator = arraylist.iterator(); + + while (iterator.hasNext()) { + entityplayer = (EntityPlayer) iterator.next(); + entityplayer.playerConnection.disconnect("You logged in from another location"); + } + + /* CraftBukkit start + Object object; + + if (this.server.M()) { + object = new DemoPlayerInteractManager(this.server.getWorldServer(0)); + } else { + object = new PlayerInteractManager(this.server.getWorldServer(0)); + } + + return new EntityPlayer(this.server, this.server.getWorldServer(0), s, (PlayerInteractManager) object); + */ + return player; + // CraftBukkit end + } + + // CraftBukkit start + public EntityPlayer moveToWorld(EntityPlayer entityplayer, int i, boolean flag) { + return this.moveToWorld(entityplayer, i, flag, null); + } + + public EntityPlayer moveToWorld(EntityPlayer entityplayer, int i, boolean flag, Location location) { + // CraftBukkit end + entityplayer.p().getTracker().untrackPlayer(entityplayer); + // entityplayer.p().getTracker().untrackEntity(entityplayer); // CraftBukkit + entityplayer.p().getPlayerChunkMap().removePlayer(entityplayer); + this.players.remove(entityplayer); + this.server.getWorldServer(entityplayer.dimension).removeEntity(entityplayer); + ChunkCoordinates chunkcoordinates = entityplayer.getBed(); + boolean flag1 = entityplayer.isRespawnForced(); + + // CraftBukkit start + EntityPlayer entityplayer1 = entityplayer; + org.bukkit.World fromWorld = entityplayer1.getBukkitEntity().getWorld(); + entityplayer1.viewingCredits = false; + entityplayer1.copyTo(entityplayer, flag); + + ChunkCoordinates chunkcoordinates1; + + if (location == null) { + boolean isBedSpawn = false; + CraftWorld cworld = (CraftWorld) this.server.server.getWorld(entityplayer.spawnWorld); + if (cworld != null && chunkcoordinates != null) { + chunkcoordinates1 = EntityHuman.getBed(cworld.getHandle(), chunkcoordinates, flag1); + if (chunkcoordinates1 != null) { + isBedSpawn = true; + location = new Location(cworld, chunkcoordinates1.x + 0.5, chunkcoordinates1.y, chunkcoordinates1.z + 0.5); + } else { + entityplayer1.setRespawnPosition(null, true); + entityplayer1.playerConnection.sendPacket(new Packet70Bed(0, 0)); + } + } + + if (location == null) { + cworld = (CraftWorld) this.server.server.getWorlds().get(0); + chunkcoordinates = cworld.getHandle().getSpawn(); + location = new Location(cworld, chunkcoordinates.x + 0.5, chunkcoordinates.y, chunkcoordinates.z + 0.5); + } + + Player respawnPlayer = this.cserver.getPlayer(entityplayer1); + PlayerRespawnEvent respawnEvent = new PlayerRespawnEvent(respawnPlayer, location, isBedSpawn); + this.cserver.getPluginManager().callEvent(respawnEvent); + + location = respawnEvent.getRespawnLocation(); + entityplayer.reset(); + } else { + location.setWorld(this.server.getWorldServer(i).getWorld()); + } + WorldServer worldserver = ((CraftWorld) location.getWorld()).getHandle(); + entityplayer1.setLocation(location.getX(), location.getY(), location.getZ(), location.getYaw(), location.getPitch()); + // CraftBukkit end + + worldserver.chunkProviderServer.getChunkAt((int) entityplayer1.locX >> 4, (int) entityplayer1.locZ >> 4); + + while (!worldserver.getCubes(entityplayer1, entityplayer1.boundingBox).isEmpty()) { + entityplayer1.setPosition(entityplayer1.locX, entityplayer1.locY + 1.0D, entityplayer1.locZ); + } + + // CraftBukkit start + byte actualDimension = (byte) (worldserver.getWorld().getEnvironment().getId()); + // Force the client to refresh their chunk cache. + entityplayer1.playerConnection.sendPacket(new Packet9Respawn((byte) (actualDimension >= 0 ? -1 : 0), (byte) worldserver.difficulty, worldserver.getWorldData().getType(), worldserver.getHeight(), entityplayer.playerInteractManager.getGameMode())); + entityplayer1.playerConnection.sendPacket(new Packet9Respawn(actualDimension, (byte) worldserver.difficulty, worldserver.getWorldData().getType(), worldserver.getHeight(), entityplayer.playerInteractManager.getGameMode())); + entityplayer1.spawnIn(worldserver); + entityplayer1.dead = false; + entityplayer1.playerConnection.teleport(new Location(worldserver.getWorld(), entityplayer1.locX, entityplayer1.locY, entityplayer1.locZ, entityplayer1.yaw, entityplayer1.pitch)); + entityplayer1.setSneaking(false); + chunkcoordinates1 = worldserver.getSpawn(); + // CraftBukkit end + entityplayer1.playerConnection.sendPacket(new Packet6SpawnPosition(chunkcoordinates1.x, chunkcoordinates1.y, chunkcoordinates1.z)); + entityplayer1.playerConnection.sendPacket(new Packet43SetExperience(entityplayer1.exp, entityplayer1.expTotal, entityplayer1.expLevel)); + this.b(entityplayer1, worldserver); + worldserver.getPlayerChunkMap().addPlayer(entityplayer1); + worldserver.addEntity(entityplayer1); + this.players.add(entityplayer1); + // CraftBukkit start - added from changeDimension + this.updateClient(entityplayer1); // CraftBukkit + entityplayer1.updateAbilities(); + Iterator iterator = entityplayer1.getEffects().iterator(); + + while (iterator.hasNext()) { + MobEffect mobeffect = (MobEffect) iterator.next(); + + entityplayer1.playerConnection.sendPacket(new Packet41MobEffect(entityplayer1.id, mobeffect)); + } + // entityplayer1.syncInventory(); + // CraftBukkit end + + // CraftBukkit start - don't fire on respawn + if (fromWorld != location.getWorld()) { + PlayerChangedWorldEvent event = new PlayerChangedWorldEvent((Player) entityplayer1.getBukkitEntity(), fromWorld); + Bukkit.getServer().getPluginManager().callEvent(event); + } + // CraftBukkit end + + return entityplayer1; + } + + public void changeDimension(EntityPlayer entityplayer, int i) { + // CraftBukkit start -- Replaced the standard handling of portals with a more customised method. + int dimension = i; + WorldServer fromWorld = this.server.getWorldServer(entityplayer.dimension); + WorldServer toWorld = null; + if (entityplayer.dimension < 10) { + for (WorldServer world : this.server.worlds) { + if (world.dimension == dimension) { + toWorld = world; + } + } + } + + Location fromLocation = new Location(fromWorld.getWorld(), entityplayer.locX, entityplayer.locY, entityplayer.locZ, entityplayer.yaw, entityplayer.pitch); + Location toLocation = null; + + if (toWorld != null) { + if (((dimension == -1) || (dimension == 0)) && ((entityplayer.dimension == -1) || (entityplayer.dimension == 0))) { + double blockRatio = dimension == 0 ? 8 : 0.125; + + toLocation = toWorld == null ? null : new Location(toWorld.getWorld(), (entityplayer.locX * blockRatio), entityplayer.locY, (entityplayer.locZ * blockRatio), entityplayer.yaw, entityplayer.pitch); + } else { + ChunkCoordinates coords = toWorld.getDimensionSpawn(); + if (coords != null) { + toLocation = new Location(toWorld.getWorld(), coords.x, coords.y, coords.z, 90, 0); + } + } + } + + TeleportCause cause = TeleportCause.UNKNOWN; + int playerEnvironmentId = entityplayer.getBukkitEntity().getWorld().getEnvironment().getId(); + switch (dimension) { + case -1: + cause = TeleportCause.NETHER_PORTAL; + break; + case 0: + if (playerEnvironmentId == -1) { + cause = TeleportCause.NETHER_PORTAL; + } else if (playerEnvironmentId == 1) { + cause = TeleportCause.END_PORTAL; + } + + break; + case 1: + cause = TeleportCause.END_PORTAL; + break; + } + + org.bukkit.craftbukkit.PortalTravelAgent pta = new org.bukkit.craftbukkit.PortalTravelAgent(); + PlayerPortalEvent event = new PlayerPortalEvent((Player) entityplayer.getBukkitEntity(), fromLocation, toLocation, pta, cause); + + if (entityplayer.dimension == 1) { + event.useTravelAgent(false); + } + + Bukkit.getServer().getPluginManager().callEvent(event); + if (event.isCancelled() || event.getTo() == null) { + return; + } + + Location finalLocation = event.getTo(); + if (event.useTravelAgent()) { + finalLocation = event.getPortalTravelAgent().findOrCreate(finalLocation); + } + toWorld = ((CraftWorld) finalLocation.getWorld()).getHandle(); + this.moveToWorld(entityplayer, toWorld.dimension, true, finalLocation); + // CraftBukkit end + } + + public void a(Entity entity, int i, WorldServer worldserver, WorldServer worldserver1) { + double d0 = entity.locX; + double d1 = entity.locZ; + double d2 = 8.0D; + double d3 = entity.locX; + double d4 = entity.locY; + double d5 = entity.locZ; + float f = entity.yaw; + + worldserver.methodProfiler.a("moving"); + if (entity.dimension == -1) { + d0 /= d2; + d1 /= d2; + entity.setPositionRotation(d0, entity.locY, d1, entity.yaw, entity.pitch); + if (entity.isAlive()) { + worldserver.entityJoinedWorld(entity, false); + } + } else if (entity.dimension == 0) { + d0 *= d2; + d1 *= d2; + entity.setPositionRotation(d0, entity.locY, d1, entity.yaw, entity.pitch); + if (entity.isAlive()) { + worldserver.entityJoinedWorld(entity, false); + } + } else { + ChunkCoordinates chunkcoordinates; + + if (i == 1) { + chunkcoordinates = worldserver1.getSpawn(); + } else { + chunkcoordinates = worldserver1.getDimensionSpawn(); + } + + d0 = (double) chunkcoordinates.x; + entity.locY = (double) chunkcoordinates.y; + d1 = (double) chunkcoordinates.z; + entity.setPositionRotation(d0, entity.locY, d1, 90.0F, 0.0F); + if (entity.isAlive()) { + worldserver.entityJoinedWorld(entity, false); + } + } + + worldserver.methodProfiler.b(); + if (i != 1) { + worldserver.methodProfiler.a("placing"); + d0 = (double) MathHelper.a((int) d0, -29999872, 29999872); + d1 = (double) MathHelper.a((int) d1, -29999872, 29999872); + if (entity.isAlive()) { + worldserver1.addEntity(entity); + entity.setPositionRotation(d0, entity.locY, d1, entity.yaw, entity.pitch); + worldserver1.entityJoinedWorld(entity, false); + worldserver1.s().a(entity, d3, d4, d5, f); + } + + worldserver.methodProfiler.b(); + } + + entity.spawnIn(worldserver1); + } + + public void tick() { + if (++this.o > 600) { + this.o = 0; + } + + /* CraftBukkit start - remove updating of lag to players -- it spams way to much on big servers. + if (this.o < this.players.size()) { + EntityPlayer entityplayer = (EntityPlayer) this.players.get(this.o); + + this.sendAll(new Packet201PlayerInfo(entityplayer.name, true, entityplayer.ping)); + } + // CraftBukkit end */ + } + + public void sendAll(Packet packet) { + for (int i = 0; i < this.players.size(); ++i) { + ((EntityPlayer) this.players.get(i)).playerConnection.sendPacket(packet); + } + } + + public void a(Packet packet, int i) { + for (int j = 0; j < this.players.size(); ++j) { + EntityPlayer entityplayer = (EntityPlayer) this.players.get(j); + + if (entityplayer.dimension == i) { + entityplayer.playerConnection.sendPacket(packet); + } + } + } + + public String c() { + String s = ""; + + for (int i = 0; i < this.players.size(); ++i) { + if (i > 0) { + s = s + ", "; + } + + s = s + ((EntityPlayer) this.players.get(i)).name; + } + + return s; + } + + public String[] d() { + String[] astring = new String[this.players.size()]; + + for (int i = 0; i < this.players.size(); ++i) { + astring[i] = ((EntityPlayer) this.players.get(i)).name; + } + + return astring; + } + + public BanList getNameBans() { + return this.banByName; + } + + public BanList getIPBans() { + return this.banByIP; + } + + public void addOp(String s) { + this.operators.add(s.toLowerCase()); + + // CraftBukkit start + Player player = server.server.getPlayer(s); + if (player != null) { + player.recalculatePermissions(); + } + // CraftBukkit end + } + + public void removeOp(String s) { + this.operators.remove(s.toLowerCase()); + + // CraftBukkit start + Player player = server.server.getPlayer(s); + if (player != null) { + player.recalculatePermissions(); + } + // CraftBukkit end + } + + public boolean isWhitelisted(String s) { + s = s.trim().toLowerCase(); + return !this.hasWhitelist || this.operators.contains(s) || this.whitelist.contains(s); + } + + public boolean isOp(String s) { + // CraftBukkit + return this.operators.contains(s.trim().toLowerCase()) || this.server.I() && this.server.worlds.get(0).getWorldData().allowCommands() && this.server.H().equalsIgnoreCase(s) || this.n; + } + + public EntityPlayer f(String s) { + Iterator iterator = this.players.iterator(); + + EntityPlayer entityplayer; + + do { + if (!iterator.hasNext()) { + return null; + } + + entityplayer = (EntityPlayer) iterator.next(); + } while (!entityplayer.name.equalsIgnoreCase(s)); + + return entityplayer; + } + + public List a(ChunkCoordinates chunkcoordinates, int i, int j, int k, int l, int i1, int j1) { + if (this.players.isEmpty()) { + return null; + } else { + Object object = new ArrayList(); + boolean flag = k < 0; + int k1 = i * i; + int l1 = j * j; + + k = MathHelper.a(k); + + for (int i2 = 0; i2 < this.players.size(); ++i2) { + EntityPlayer entityplayer = (EntityPlayer) this.players.get(i2); + + if (chunkcoordinates != null && (i > 0 || j > 0)) { + float f = chunkcoordinates.e(entityplayer.b()); + + if (i > 0 && f < (float) k1 || j > 0 && f > (float) l1) { + continue; + } + } + + if ((l == EnumGamemode.NONE.a() || l == entityplayer.playerInteractManager.getGameMode().a()) && (i1 <= 0 || entityplayer.expLevel >= i1) && entityplayer.expLevel <= j1) { + ((List) object).add(entityplayer); + } + } + + if (chunkcoordinates != null) { + Collections.sort((List) object, new PlayerDistanceComparator(chunkcoordinates)); + } + + if (flag) { + Collections.reverse((List) object); + } + + if (k > 0) { + object = ((List) object).subList(0, Math.min(k, ((List) object).size())); + } + + return (List) object; + } + } + + public void sendPacketNearby(double d0, double d1, double d2, double d3, int i, Packet packet) { + this.sendPacketNearby((EntityHuman) null, d0, d1, d2, d3, i, packet); + } + + public void sendPacketNearby(EntityHuman entityhuman, double d0, double d1, double d2, double d3, int i, Packet packet) { + for (int j = 0; j < this.players.size(); ++j) { + EntityPlayer entityplayer = (EntityPlayer) this.players.get(j); + + // CraftBukkit start - Test if player receiving packet can see the source of the packet + if (entityhuman != null && entityhuman instanceof EntityPlayer && !entityplayer.getBukkitEntity().canSee(((EntityPlayer) entityhuman).getBukkitEntity())) { + continue; + } + // CraftBukkit end + if (entityplayer != entityhuman && entityplayer.dimension == i) { + double d4 = d0 - entityplayer.locX; + double d5 = d1 - entityplayer.locY; + double d6 = d2 - entityplayer.locZ; + + if (d4 * d4 + d5 * d5 + d6 * d6 < d3 * d3) { + entityplayer.playerConnection.sendPacket(packet); + } + } + } + } + + public void savePlayers() { + for (int i = 0; i < this.players.size(); ++i) { + this.b((EntityPlayer) this.players.get(i)); + } + } + + public void addWhitelist(String s) { + this.whitelist.add(s); + } + + public void removeWhitelist(String s) { + this.whitelist.remove(s); + } + + public Set getWhitelisted() { + return this.whitelist; + } + + public Set getOPs() { + return this.operators; + } + + public void reloadWhitelist() {} + + public void b(EntityPlayer entityplayer, WorldServer worldserver) { + entityplayer.playerConnection.sendPacket(new Packet4UpdateTime(worldserver.getTime(), worldserver.getDayTime())); + if (worldserver.N()) { + entityplayer.playerConnection.sendPacket(new Packet70Bed(1, 0)); + } + } + + public void updateClient(EntityPlayer entityplayer) { + entityplayer.updateInventory(entityplayer.defaultContainer); + entityplayer.m(); + entityplayer.playerConnection.sendPacket(new Packet16BlockItemSwitch(entityplayer.inventory.itemInHandIndex)); + } + + public int getPlayerCount() { + return this.players.size(); + } + + public int getMaxPlayers() { + return this.maxPlayers; + } + + public String[] getSeenPlayers() { + return this.server.worlds.get(0).getDataManager().getPlayerFileData().getSeenPlayers(); // CraftBukkit + } + + public boolean getHasWhitelist() { + return this.hasWhitelist; + } + + public void setHasWhitelist(boolean flag) { + this.hasWhitelist = flag; + } + + public List j(String s) { + ArrayList arraylist = new ArrayList(); + Iterator iterator = this.players.iterator(); + + while (iterator.hasNext()) { + EntityPlayer entityplayer = (EntityPlayer) iterator.next(); + + if (entityplayer.q().equals(s)) { + arraylist.add(entityplayer); + } + } + + return arraylist; + } + + public int o() { + return this.d; + } + + public MinecraftServer getServer() { + return this.server; + } + + public NBTTagCompound q() { + return null; + } + + private void a(EntityPlayer entityplayer, EntityPlayer entityplayer1, World world) { + if (entityplayer1 != null) { + entityplayer.playerInteractManager.setGameMode(entityplayer1.playerInteractManager.getGameMode()); + } else if (this.m != null) { + entityplayer.playerInteractManager.setGameMode(this.m); + } + + entityplayer.playerInteractManager.b(world.getWorldData().getGameType()); + } + + public void r() { + while (!this.players.isEmpty()) { + ((EntityPlayer) this.players.get(0)).playerConnection.disconnect(this.server.server.getShutdownMessage()); // CraftBukkit - add custom shutdown message + } + } + + public void k(String s) { + this.server.info(s); + this.sendAll(new Packet3Chat(s)); + } +} diff --git a/src/main/java/net/minecraft/server/PlayerManager.java b/src/main/java/net/minecraft/server/PlayerManager.java deleted file mode 100644 index 3b776fad..00000000 --- a/src/main/java/net/minecraft/server/PlayerManager.java +++ /dev/null @@ -1,303 +0,0 @@ -package net.minecraft.server; - -import java.util.ArrayList; -import java.util.List; - -// CraftBukkit start -import java.util.Collections; -import java.util.Queue; -import java.util.Iterator; -import java.util.LinkedList; -// CraftBukkit end - -public class PlayerManager { - - private final WorldServer world; - private final List managedPlayers = new ArrayList(); - private final LongHashMap c = new LongHashMap(); - private final Queue d = new java.util.concurrent.ConcurrentLinkedQueue(); // CraftBukkit ArrayList -> ConcurrentLinkedQueue - private final int e; - private final int[][] f = new int[][] { { 1, 0}, { 0, 1}, { -1, 0}, { 0, -1}}; - private boolean wasNotEmpty; // CraftBukkit - - public PlayerManager(WorldServer worldserver, int i) { - if (i > 15) { - throw new IllegalArgumentException("Too big view radius!"); - } else if (i < 3) { - throw new IllegalArgumentException("Too small view radius!"); - } else { - this.e = i; - this.world = worldserver; - } - } - - public WorldServer a() { - return this.world; - } - - public void flush() { - // CraftBukkit start - use iterator - Iterator iterator = this.d.iterator(); - - while (iterator.hasNext()) { - PlayerInstance playerinstance = (PlayerInstance) iterator.next(); - playerinstance.a(); - iterator.remove(); - } - // CraftBukkit end - - // this.d.clear(); // CraftBukkit - removals are already covered - if (this.managedPlayers.isEmpty()) { - if (!wasNotEmpty) return; // CraftBukkit - only do unload when we go from non-empty to empty - WorldProvider worldprovider = this.world.worldProvider; - - if (!worldprovider.e()) { - this.world.chunkProviderServer.a(); - } - // CraftBukkit start - wasNotEmpty = false; - } else { - wasNotEmpty = true; - } - // CraftBukkit end - } - - private PlayerInstance a(int i, int j, boolean flag) { - long k = (long) i + 2147483647L | (long) j + 2147483647L << 32; - PlayerInstance playerinstance = (PlayerInstance) this.c.getEntry(k); - - if (playerinstance == null && flag) { - playerinstance = new PlayerInstance(this, i, j); - this.c.put(k, playerinstance); - } - - return playerinstance; - } - // CraftBukkit start - public final boolean isChunkInUse(int x, int z) { - PlayerInstance pi = a(x, z, false); - if (pi != null) { - return (PlayerInstance.b(pi).size() > 0); - } - return false; - } - // CraftBukkit end - - public void flagDirty(int i, int j, int k) { - int l = i >> 4; - int i1 = k >> 4; - PlayerInstance playerinstance = this.a(l, i1, false); - - if (playerinstance != null) { - playerinstance.a(i & 15, j, k & 15); - } - } - - public void addPlayer(EntityPlayer entityplayer) { - int i = (int) entityplayer.locX >> 4; - int j = (int) entityplayer.locZ >> 4; - - entityplayer.d = entityplayer.locX; - entityplayer.e = entityplayer.locZ; - - // CraftBukkit start - load nearby chunks first - List chunkList = new LinkedList(); - for (int k = i - this.e; k <= i + this.e; ++k) { - for (int l = j - this.e; l <= j + this.e; ++l) { - chunkList.add(new ChunkCoordIntPair(k, l)); - } - } - - Collections.sort(chunkList, new ChunkCoordComparator(entityplayer)); - for (ChunkCoordIntPair pair : chunkList) { - this.a(pair.x, pair.z, true).a(entityplayer); - } - // CraftBukkit end - - this.managedPlayers.add(entityplayer); - this.b(entityplayer); - } - - public void b(EntityPlayer entityplayer) { - ArrayList arraylist = new ArrayList(entityplayer.chunkCoordIntPairQueue); - int i = 0; - int j = this.e; - int k = (int) entityplayer.locX >> 4; - int l = (int) entityplayer.locZ >> 4; - int i1 = 0; - int j1 = 0; - ChunkCoordIntPair chunkcoordintpair = PlayerInstance.a(this.a(k, l, true)); - - entityplayer.chunkCoordIntPairQueue.clear(); - if (arraylist.contains(chunkcoordintpair)) { - entityplayer.chunkCoordIntPairQueue.add(chunkcoordintpair); - } - - int k1; - - for (k1 = 1; k1 <= j * 2; ++k1) { - for (int l1 = 0; l1 < 2; ++l1) { - int[] aint = this.f[i++ % 4]; - - for (int i2 = 0; i2 < k1; ++i2) { - i1 += aint[0]; - j1 += aint[1]; - chunkcoordintpair = PlayerInstance.a(this.a(k + i1, l + j1, true)); - if (arraylist.contains(chunkcoordintpair)) { - entityplayer.chunkCoordIntPairQueue.add(chunkcoordintpair); - } - } - } - } - - i %= 4; - - for (k1 = 0; k1 < j * 2; ++k1) { - i1 += this.f[i][0]; - j1 += this.f[i][1]; - chunkcoordintpair = PlayerInstance.a(this.a(k + i1, l + j1, true)); - if (arraylist.contains(chunkcoordintpair)) { - entityplayer.chunkCoordIntPairQueue.add(chunkcoordintpair); - } - } - } - - public void removePlayer(EntityPlayer entityplayer) { - int i = (int) entityplayer.d >> 4; - int j = (int) entityplayer.e >> 4; - - for (int k = i - this.e; k <= i + this.e; ++k) { - for (int l = j - this.e; l <= j + this.e; ++l) { - PlayerInstance playerinstance = this.a(k, l, false); - - if (playerinstance != null) { - playerinstance.b(entityplayer); - } - } - } - - this.managedPlayers.remove(entityplayer); - } - - private boolean a(int i, int j, int k, int l, int i1) { - int j1 = i - k; - int k1 = j - l; - - return j1 >= -i1 && j1 <= i1 ? k1 >= -i1 && k1 <= i1 : false; - } - - public void movePlayer(EntityPlayer entityplayer) { - int i = (int) entityplayer.locX >> 4; - int j = (int) entityplayer.locZ >> 4; - double d0 = entityplayer.d - entityplayer.locX; - double d1 = entityplayer.e - entityplayer.locZ; - double d2 = d0 * d0 + d1 * d1; - - if (d2 >= 64.0D) { - int k = (int) entityplayer.d >> 4; - int l = (int) entityplayer.e >> 4; - int i1 = this.e; - int j1 = i - k; - int k1 = j - l; - List chunksToLoad = new LinkedList(); // CraftBukkit - - if (j1 != 0 || k1 != 0) { - for (int l1 = i - i1; l1 <= i + i1; ++l1) { - for (int i2 = j - i1; i2 <= j + i1; ++i2) { - if (!this.a(l1, i2, k, l, i1)) { - chunksToLoad.add(new ChunkCoordIntPair(l1, i2)); // CraftBukkit - } - - if (!this.a(l1 - j1, i2 - k1, i, j, i1)) { - PlayerInstance playerinstance = this.a(l1 - j1, i2 - k1, false); - - if (playerinstance != null) { - playerinstance.b(entityplayer); - } - } - } - } - - this.b(entityplayer); - entityplayer.d = entityplayer.locX; - entityplayer.e = entityplayer.locZ; - - // CraftBukkit start - send nearest chunks first - Collections.sort(chunksToLoad, new ChunkCoordComparator(entityplayer)); - for (ChunkCoordIntPair pair : chunksToLoad) { - this.a(pair.x, pair.z, true).a(entityplayer); - } - - if (i1 > 1 || i1 < -1 || j1 > 1 || j1 < -1) { - Collections.sort(entityplayer.chunkCoordIntPairQueue, new ChunkCoordComparator(entityplayer)); - } - // CraftBukkit end - } - } - } - - public boolean a(EntityPlayer entityplayer, int i, int j) { - PlayerInstance playerinstance = this.a(i, j, false); - - return playerinstance == null ? false : PlayerInstance.b(playerinstance).contains(entityplayer) && !entityplayer.chunkCoordIntPairQueue.contains(PlayerInstance.a(playerinstance)); - } - - public static int getFurthestViewableBlock(int i) { - return i * 16 - 16; - } - - static WorldServer a(PlayerManager playermanager) { - return playermanager.world; - } - - static LongHashMap b(PlayerManager playermanager) { - return playermanager.c; - } - - static Queue c(PlayerManager playermanager) { // CraftBukkit List -> Queue - return playermanager.d; - } - - // CraftBukkit start - sorter to load nearby chunks first - private static class ChunkCoordComparator implements java.util.Comparator { - private int x; - private int z; - - public ChunkCoordComparator (EntityPlayer entityplayer) { - x = (int) entityplayer.locX >> 4; - z = (int) entityplayer.locZ >> 4; - } - - public int compare(ChunkCoordIntPair a, ChunkCoordIntPair b) { - if (a.equals(b)) { - return 0; - } - - // Subtract current position to set center point - int ax = a.x - this.x; - int az = a.z - this.z; - int bx = b.x - this.x; - int bz = b.z - this.z; - - int result = ((ax - bx) * (ax + bx)) + ((az - bz) * (az + bz)); - if (result != 0) { - return result; - } - - if (ax < 0) { - if (bx < 0) { - return bz - az; - } else { - return -1; - } - } else { - if (bx < 0) { - return 1; - } else { - return az - bz; - } - } - } - } - // CraftBukkit end -} diff --git a/src/main/java/net/minecraft/server/PropertyManager.java b/src/main/java/net/minecraft/server/PropertyManager.java index af01fd33..3f87365a 100644 --- a/src/main/java/net/minecraft/server/PropertyManager.java +++ b/src/main/java/net/minecraft/server/PropertyManager.java @@ -91,7 +91,6 @@ public class PropertyManager { public String getString(String s, String s1) { if (!this.properties.containsKey(s)) { - s1 = this.getOverride(s, s1); // CraftBukkit this.properties.setProperty(s, s1); this.savePropertiesFile(); } @@ -103,7 +102,6 @@ public class PropertyManager { try { return this.getOverride(s, Integer.parseInt(this.getString(s, "" + i))); // CraftBukkit } catch (Exception exception) { - i = this.getOverride(s, i); // CraftBukkit this.properties.setProperty(s, "" + i); return i; } @@ -113,7 +111,6 @@ public class PropertyManager { try { return this.getOverride(s, Boolean.parseBoolean(this.getString(s, "" + flag))); // CraftBukkit } catch (Exception exception) { - flag = this.getOverride(s, flag); // CraftBukkit this.properties.setProperty(s, "" + flag); return flag; } diff --git a/src/main/java/net/minecraft/server/RecipeArmorDye.java b/src/main/java/net/minecraft/server/RecipeArmorDye.java new file mode 100644 index 00000000..3735aa7a --- /dev/null +++ b/src/main/java/net/minecraft/server/RecipeArmorDye.java @@ -0,0 +1,123 @@ +package net.minecraft.server; + +import java.util.ArrayList; + +public class RecipeArmorDye extends ShapelessRecipes implements IRecipe { // CraftBukkit - added extends + + // CraftBukkit start - delegate to new parent class with bogus info + public RecipeArmorDye() { + super(new ItemStack(Item.LEATHER_HELMET, 0, 0), java.util.Arrays.asList(new ItemStack(Item.INK_SACK, 0, 5))); + } + // CraftBukkit end + + public boolean a(InventoryCrafting inventorycrafting, World world) { + ItemStack itemstack = null; + ArrayList arraylist = new ArrayList(); + + for (int i = 0; i < inventorycrafting.getSize(); ++i) { + ItemStack itemstack1 = inventorycrafting.getItem(i); + + if (itemstack1 != null) { + if (itemstack1.getItem() instanceof ItemArmor) { + ItemArmor itemarmor = (ItemArmor) itemstack1.getItem(); + + if (itemarmor.d() != EnumArmorMaterial.CLOTH || itemstack != null) { + return false; + } + + itemstack = itemstack1; + } else { + if (itemstack1.id != Item.INK_SACK.id) { + return false; + } + + arraylist.add(itemstack1); + } + } + } + + return itemstack != null && !arraylist.isEmpty(); + } + + public ItemStack a(InventoryCrafting inventorycrafting) { + ItemStack itemstack = null; + int[] aint = new int[3]; + int i = 0; + int j = 0; + ItemArmor itemarmor = null; + + int k; + int l; + float f; + float f1; + int i1; + + for (k = 0; k < inventorycrafting.getSize(); ++k) { + ItemStack itemstack1 = inventorycrafting.getItem(k); + + if (itemstack1 != null) { + if (itemstack1.getItem() instanceof ItemArmor) { + itemarmor = (ItemArmor) itemstack1.getItem(); + if (itemarmor.d() != EnumArmorMaterial.CLOTH || itemstack != null) { + return null; + } + + itemstack = itemstack1.cloneItemStack(); + if (itemarmor.a(itemstack1)) { + l = itemarmor.b(itemstack); + f = (float) (l >> 16 & 255) / 255.0F; + f1 = (float) (l >> 8 & 255) / 255.0F; + float f2 = (float) (l & 255) / 255.0F; + + i = (int) ((float) i + Math.max(f, Math.max(f1, f2)) * 255.0F); + aint[0] = (int) ((float) aint[0] + f * 255.0F); + aint[1] = (int) ((float) aint[1] + f1 * 255.0F); + aint[2] = (int) ((float) aint[2] + f2 * 255.0F); + ++j; + } + } else { + if (itemstack1.id != Item.INK_SACK.id) { + return null; + } + + float[] afloat = EntitySheep.d[BlockCloth.e_(itemstack1.getData())]; + int j1 = (int) (afloat[0] * 255.0F); + int k1 = (int) (afloat[1] * 255.0F); + + i1 = (int) (afloat[2] * 255.0F); + i += Math.max(j1, Math.max(k1, i1)); + aint[0] += j1; + aint[1] += k1; + aint[2] += i1; + ++j; + } + } + } + + if (itemarmor == null) { + return null; + } else { + k = aint[0] / j; + int l1 = aint[1] / j; + + l = aint[2] / j; + f = (float) i / (float) j; + f1 = (float) Math.max(k, Math.max(l1, l)); + k = (int) ((float) k * f / f1); + l1 = (int) ((float) l1 * f / f1); + l = (int) ((float) l * f / f1); + i1 = (k << 8) + l1; + i1 = (i1 << 8) + l; + itemarmor.b(itemstack, i1); + return itemstack; + } + } + + public int a() { + return 10; + } + + public ItemStack b() { + return null; + } +} diff --git a/src/main/java/net/minecraft/server/RecipeFireworks.java b/src/main/java/net/minecraft/server/RecipeFireworks.java new file mode 100644 index 00000000..abed268e --- /dev/null +++ b/src/main/java/net/minecraft/server/RecipeFireworks.java @@ -0,0 +1,176 @@ +package net.minecraft.server; + +import java.util.ArrayList; + +public class RecipeFireworks extends ShapelessRecipes implements IRecipe { // CraftBukkit - added extends + + private ItemStack a; + + // CraftBukkit start - delegate to new parent class with bogus info + public RecipeFireworks() { + super(new ItemStack(Item.FIREWORKS, 0, 0), java.util.Arrays.asList(new ItemStack(Item.SULPHUR, 0, 5))); + } + // CraftBukkit end + + public boolean a(InventoryCrafting inventorycrafting, World world) { + this.a = null; + int i = 0; + int j = 0; + int k = 0; + int l = 0; + int i1 = 0; + int j1 = 0; + + for (int k1 = 0; k1 < inventorycrafting.getSize(); ++k1) { + ItemStack itemstack = inventorycrafting.getItem(k1); + + if (itemstack != null) { + if (itemstack.id == Item.SULPHUR.id) { + ++j; + } else if (itemstack.id == Item.FIREWORKS_CHARGE.id) { + ++l; + } else if (itemstack.id == Item.INK_SACK.id) { + ++k; + } else if (itemstack.id == Item.PAPER.id) { + ++i; + } else if (itemstack.id == Item.GLOWSTONE_DUST.id) { + ++i1; + } else if (itemstack.id == Item.DIAMOND.id) { + ++i1; + } else if (itemstack.id == Item.FIREBALL.id) { + ++j1; + } else if (itemstack.id == Item.FEATHER.id) { + ++j1; + } else if (itemstack.id == Item.GOLD_NUGGET.id) { + ++j1; + } else { + if (itemstack.id != Item.SKULL.id) { + return false; + } + + ++j1; + } + } + } + + i1 += k + j1; + if (j <= 3 && i <= 1) { + NBTTagCompound nbttagcompound; + NBTTagCompound nbttagcompound1; + + if (j >= 1 && i == 1 && i1 == 0) { + this.a = new ItemStack(Item.FIREWORKS); + if (l > 0) { + nbttagcompound = new NBTTagCompound(); + nbttagcompound1 = new NBTTagCompound("Fireworks"); + NBTTagList nbttaglist = new NBTTagList("Explosions"); + + for (int l1 = 0; l1 < inventorycrafting.getSize(); ++l1) { + ItemStack itemstack1 = inventorycrafting.getItem(l1); + + if (itemstack1 != null && itemstack1.id == Item.FIREWORKS_CHARGE.id && itemstack1.hasTag() && itemstack1.getTag().hasKey("Explosion")) { + nbttaglist.add(itemstack1.getTag().getCompound("Explosion")); + } + } + + nbttagcompound1.set("Explosions", nbttaglist); + nbttagcompound1.setByte("Flight", (byte) j); + nbttagcompound.set("Fireworks", nbttagcompound1); + this.a.setTag(nbttagcompound); + } + + return true; + } else if (j == 1 && i == 0 && l == 0 && k > 0 && j1 <= 1) { + this.a = new ItemStack(Item.FIREWORKS_CHARGE); + nbttagcompound = new NBTTagCompound(); + nbttagcompound1 = new NBTTagCompound("Explosion"); + byte b0 = 0; + ArrayList arraylist = new ArrayList(); + + for (int i2 = 0; i2 < inventorycrafting.getSize(); ++i2) { + ItemStack itemstack2 = inventorycrafting.getItem(i2); + + if (itemstack2 != null) { + if (itemstack2.id == Item.INK_SACK.id) { + arraylist.add(Integer.valueOf(ItemDye.b[itemstack2.getData()])); + } else if (itemstack2.id == Item.GLOWSTONE_DUST.id) { + nbttagcompound1.setBoolean("Flicker", true); + } else if (itemstack2.id == Item.DIAMOND.id) { + nbttagcompound1.setBoolean("Trail", true); + } else if (itemstack2.id == Item.FIREBALL.id) { + b0 = 1; + } else if (itemstack2.id == Item.FEATHER.id) { + b0 = 4; + } else if (itemstack2.id == Item.GOLD_NUGGET.id) { + b0 = 2; + } else if (itemstack2.id == Item.SKULL.id) { + b0 = 3; + } + } + } + + int[] aint = new int[arraylist.size()]; + + for (int j2 = 0; j2 < aint.length; ++j2) { + aint[j2] = ((Integer) arraylist.get(j2)).intValue(); + } + + nbttagcompound1.setIntArray("Colors", aint); + nbttagcompound1.setByte("Type", b0); + nbttagcompound.set("Explosion", nbttagcompound1); + this.a.setTag(nbttagcompound); + return true; + } else if (j == 0 && i == 0 && l == 1 && k > 0 && k == i1) { + ArrayList arraylist1 = new ArrayList(); + + for (int k2 = 0; k2 < inventorycrafting.getSize(); ++k2) { + ItemStack itemstack3 = inventorycrafting.getItem(k2); + + if (itemstack3 != null) { + if (itemstack3.id == Item.INK_SACK.id) { + arraylist1.add(Integer.valueOf(ItemDye.b[itemstack3.getData()])); + } else if (itemstack3.id == Item.FIREWORKS_CHARGE.id) { + this.a = itemstack3.cloneItemStack(); + this.a.count = 1; + } + } + } + + int[] aint1 = new int[arraylist1.size()]; + + for (int l2 = 0; l2 < aint1.length; ++l2) { + aint1[l2] = ((Integer) arraylist1.get(l2)).intValue(); + } + + if (this.a != null && this.a.hasTag()) { + NBTTagCompound nbttagcompound2 = this.a.getTag().getCompound("Explosion"); + + if (nbttagcompound2 == null) { + return false; + } else { + nbttagcompound2.setIntArray("FadeColors", aint1); + return true; + } + } else { + return false; + } + } else { + return false; + } + } else { + return false; + } + } + + public ItemStack a(InventoryCrafting inventorycrafting) { + return this.a.cloneItemStack(); + } + + public int a() { + return 10; + } + + public ItemStack b() { + return this.a; + } +} diff --git a/src/main/java/net/minecraft/server/RecipeMapClone.java b/src/main/java/net/minecraft/server/RecipeMapClone.java new file mode 100644 index 00000000..7224c7af --- /dev/null +++ b/src/main/java/net/minecraft/server/RecipeMapClone.java @@ -0,0 +1,82 @@ +package net.minecraft.server; + +public class RecipeMapClone extends ShapelessRecipes implements IRecipe { // CraftBukkit - added extends + + // CraftBukkit start - delegate to new parent class + public RecipeMapClone() { + super(new ItemStack(Item.MAP, 0, -1), java.util.Arrays.asList(new ItemStack(Item.MAP_EMPTY, 0, 0))); + } + // CraftBukkit end + + public boolean a(InventoryCrafting inventorycrafting, World world) { + int i = 0; + ItemStack itemstack = null; + + for (int j = 0; j < inventorycrafting.getSize(); ++j) { + ItemStack itemstack1 = inventorycrafting.getItem(j); + + if (itemstack1 != null) { + if (itemstack1.id == Item.MAP.id) { + if (itemstack != null) { + return false; + } + + itemstack = itemstack1; + } else { + if (itemstack1.id != Item.MAP_EMPTY.id) { + return false; + } + + ++i; + } + } + } + + return itemstack != null && i > 0; + } + + public ItemStack a(InventoryCrafting inventorycrafting) { + int i = 0; + ItemStack itemstack = null; + + for (int j = 0; j < inventorycrafting.getSize(); ++j) { + ItemStack itemstack1 = inventorycrafting.getItem(j); + + if (itemstack1 != null) { + if (itemstack1.id == Item.MAP.id) { + if (itemstack != null) { + return null; + } + + itemstack = itemstack1; + } else { + if (itemstack1.id != Item.MAP_EMPTY.id) { + return null; + } + + ++i; + } + } + } + + if (itemstack != null && i >= 1) { + ItemStack itemstack2 = new ItemStack(Item.MAP, i + 1, itemstack.getData()); + + if (itemstack.s()) { + itemstack2.c(itemstack.r()); + } + + return itemstack2; + } else { + return null; + } + } + + public int a() { + return 9; + } + + public ItemStack b() { + return null; + } +} diff --git a/src/main/java/net/minecraft/server/RecipesArmorDye.java b/src/main/java/net/minecraft/server/RecipesArmorDye.java deleted file mode 100644 index 22d8d328..00000000 --- a/src/main/java/net/minecraft/server/RecipesArmorDye.java +++ /dev/null @@ -1,123 +0,0 @@ -package net.minecraft.server; - -import java.util.ArrayList; - -public class RecipesArmorDye extends ShapelessRecipes implements IRecipe { // CraftBukkit - added extends - - // CraftBukkit start - delegate to new parent class with bogus info - public RecipesArmorDye() { - super(new ItemStack(Item.LEATHER_HELMET, 0, 0), java.util.Arrays.asList(new ItemStack(Item.INK_SACK, 0, 5))); - } - // CraftBukkit end - - public boolean a(InventoryCrafting inventorycrafting, World world) { - ItemStack itemstack = null; - ArrayList arraylist = new ArrayList(); - - for (int i = 0; i < inventorycrafting.getSize(); ++i) { - ItemStack itemstack1 = inventorycrafting.getItem(i); - - if (itemstack1 != null) { - if (itemstack1.getItem() instanceof ItemArmor) { - ItemArmor itemarmor = (ItemArmor) itemstack1.getItem(); - - if (itemarmor.d() != EnumArmorMaterial.CLOTH || itemstack != null) { - return false; - } - - itemstack = itemstack1; - } else { - if (itemstack1.id != Item.INK_SACK.id) { - return false; - } - - arraylist.add(itemstack1); - } - } - } - - return itemstack != null && !arraylist.isEmpty(); - } - - public ItemStack a(InventoryCrafting inventorycrafting) { - ItemStack itemstack = null; - int[] aint = new int[3]; - int i = 0; - int j = 0; - ItemArmor itemarmor = null; - - int k; - int l; - float f; - float f1; - int i1; - - for (k = 0; k < inventorycrafting.getSize(); ++k) { - ItemStack itemstack1 = inventorycrafting.getItem(k); - - if (itemstack1 != null) { - if (itemstack1.getItem() instanceof ItemArmor) { - itemarmor = (ItemArmor) itemstack1.getItem(); - if (itemarmor.d() != EnumArmorMaterial.CLOTH || itemstack != null) { - return null; - } - - itemstack = itemstack1.cloneItemStack(); - if (itemarmor.b_(itemstack1)) { - l = itemarmor.b(itemstack); - f = (float) (l >> 16 & 255) / 255.0F; - f1 = (float) (l >> 8 & 255) / 255.0F; - float f2 = (float) (l & 255) / 255.0F; - - i = (int) ((float) i + Math.max(f, Math.max(f1, f2)) * 255.0F); - aint[0] = (int) ((float) aint[0] + f * 255.0F); - aint[1] = (int) ((float) aint[1] + f1 * 255.0F); - aint[2] = (int) ((float) aint[2] + f2 * 255.0F); - ++j; - } - } else { - if (itemstack1.id != Item.INK_SACK.id) { - return null; - } - - float[] afloat = EntitySheep.d[BlockCloth.e_(itemstack1.getData())]; - int j1 = (int) (afloat[0] * 255.0F); - int k1 = (int) (afloat[1] * 255.0F); - - i1 = (int) (afloat[2] * 255.0F); - i += Math.max(j1, Math.max(k1, i1)); - aint[0] += j1; - aint[1] += k1; - aint[2] += i1; - ++j; - } - } - } - - if (itemarmor == null) { - return null; - } else { - k = aint[0] / j; - int l1 = aint[1] / j; - - l = aint[2] / j; - f = (float) i / (float) j; - f1 = (float) Math.max(k, Math.max(l1, l)); - k = (int) ((float) k * f / f1); - l1 = (int) ((float) l1 * f / f1); - l = (int) ((float) l * f / f1); - i1 = (k << 8) + l1; - i1 = (i1 << 8) + l; - itemarmor.b(itemstack, i1); - return itemstack; - } - } - - public int a() { - return 10; - } - - public ItemStack b() { - return null; - } -} diff --git a/src/main/java/net/minecraft/server/RecipesMapClone.java b/src/main/java/net/minecraft/server/RecipesMapClone.java deleted file mode 100644 index f0e69736..00000000 --- a/src/main/java/net/minecraft/server/RecipesMapClone.java +++ /dev/null @@ -1,88 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit start -import java.util.List; -import org.bukkit.craftbukkit.inventory.CraftItemStack; -import org.bukkit.craftbukkit.inventory.CraftShapelessRecipe; -// CraftBukkit end - -public class RecipesMapClone extends ShapelessRecipes implements IRecipe { // CraftBukkit - added extends - - // CraftBukkit start - delegate to new parent class - public RecipesMapClone() { - super(new ItemStack(Item.MAP, 0, -1), java.util.Arrays.asList(new ItemStack(Item.MAP_EMPTY, 0, 0))); - } - // CraftBukkit end - - public boolean a(InventoryCrafting inventorycrafting, World world) { - int i = 0; - ItemStack itemstack = null; - - for (int j = 0; j < inventorycrafting.getSize(); ++j) { - ItemStack itemstack1 = inventorycrafting.getItem(j); - - if (itemstack1 != null) { - if (itemstack1.id == Item.MAP.id) { - if (itemstack != null) { - return false; - } - - itemstack = itemstack1; - } else { - if (itemstack1.id != Item.MAP_EMPTY.id) { - return false; - } - - ++i; - } - } - } - - return itemstack != null && i > 0; - } - - public ItemStack a(InventoryCrafting inventorycrafting) { - int i = 0; - ItemStack itemstack = null; - - for (int j = 0; j < inventorycrafting.getSize(); ++j) { - ItemStack itemstack1 = inventorycrafting.getItem(j); - - if (itemstack1 != null) { - if (itemstack1.id == Item.MAP.id) { - if (itemstack != null) { - return null; - } - - itemstack = itemstack1; - } else { - if (itemstack1.id != Item.MAP_EMPTY.id) { - return null; - } - - ++i; - } - } - } - - if (itemstack != null && i >= 1) { - ItemStack itemstack2 = new ItemStack(Item.MAP, i + 1, itemstack.getData()); - - if (itemstack.s()) { - itemstack2.c(itemstack.r()); - } - - return itemstack2; - } else { - return null; - } - } - - public int a() { - return 9; - } - - public ItemStack b() { - return null; - } -} diff --git a/src/main/java/net/minecraft/server/ServerConfigurationManagerAbstract.java b/src/main/java/net/minecraft/server/ServerConfigurationManagerAbstract.java deleted file mode 100644 index b3d8c2c5..00000000 --- a/src/main/java/net/minecraft/server/ServerConfigurationManagerAbstract.java +++ /dev/null @@ -1,825 +0,0 @@ -package net.minecraft.server; - -import java.io.File; -import java.net.SocketAddress; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Set; -import java.util.logging.Logger; - -// CraftBukkit start -import org.bukkit.Location; -import org.bukkit.craftbukkit.CraftServer; -import org.bukkit.craftbukkit.CraftWorld; -import org.bukkit.craftbukkit.chunkio.ChunkIOExecutor; -import org.bukkit.entity.Player; -import org.bukkit.event.player.PlayerChangedWorldEvent; -import org.bukkit.event.player.PlayerPortalEvent; -import org.bukkit.event.player.PlayerQuitEvent; -import org.bukkit.event.player.PlayerJoinEvent; -import org.bukkit.event.player.PlayerLoginEvent; -import org.bukkit.event.player.PlayerRespawnEvent; -import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; -import org.bukkit.Bukkit; -// CraftBukkit end - -public abstract class ServerConfigurationManagerAbstract { - - private static final SimpleDateFormat e = new SimpleDateFormat("yyyy-MM-dd \'at\' HH:mm:ss z"); - public static final Logger a = Logger.getLogger("Minecraft"); - private final MinecraftServer server; - public final List players = new java.util.concurrent.CopyOnWriteArrayList(); // CraftBukkit - ArrayList -> CopyOnWriteArrayList: Iterator safety - private final BanList banByName = new BanList(new File("banned-players.txt")); - private final BanList banByIP = new BanList(new File("banned-ips.txt")); - private Set operators = new HashSet(); - private Set whitelist = new java.util.LinkedHashSet(); // CraftBukkit - HashSet -> LinkedHashSet - public PlayerFileData playerFileData; // CraftBukkit - private -> public - public boolean hasWhitelist; // CraftBukkit - private -> public - protected int maxPlayers; - protected int d; - private EnumGamemode m; - private boolean n; - private int o = 0; - - // CraftBukkit start - private CraftServer cserver; - - public ServerConfigurationManagerAbstract(MinecraftServer minecraftserver) { - minecraftserver.server = new CraftServer(minecraftserver, this); - minecraftserver.console = org.bukkit.craftbukkit.command.ColouredConsoleSender.getInstance(); - this.cserver = minecraftserver.server; - // CraftBukkit end - - this.server = minecraftserver; - this.banByName.setEnabled(false); - this.banByIP.setEnabled(false); - this.maxPlayers = 8; - } - - public void a(INetworkManager inetworkmanager, EntityPlayer entityplayer) { - this.a(entityplayer); - entityplayer.spawnIn(this.server.getWorldServer(entityplayer.dimension)); - entityplayer.itemInWorldManager.a((WorldServer) entityplayer.world); - String s = "local"; - - if (inetworkmanager.getSocketAddress() != null) { - s = inetworkmanager.getSocketAddress().toString(); - } - - // CraftBukkit - add world and location to 'logged in' message. - a.info(entityplayer.name + "[" + s + "] logged in with entity id " + entityplayer.id + " at ([" + entityplayer.world.worldData.getName() + "] " + entityplayer.locX + ", " + entityplayer.locY + ", " + entityplayer.locZ + ")"); - WorldServer worldserver = this.server.getWorldServer(entityplayer.dimension); - ChunkCoordinates chunkcoordinates = worldserver.getSpawn(); - - this.a(entityplayer, (EntityPlayer) null, worldserver); - NetServerHandler netserverhandler = new NetServerHandler(this.server, inetworkmanager, entityplayer); - - // CraftBukkit start -- Don't send a higher than 60 MaxPlayer size, otherwise the PlayerInfo window won't render correctly. - int maxPlayers = this.getMaxPlayers(); - if (maxPlayers > 60) { - maxPlayers = 60; - } - netserverhandler.sendPacket(new Packet1Login(entityplayer.id, worldserver.getWorldData().getType(), entityplayer.itemInWorldManager.getGameMode(), worldserver.getWorldData().isHardcore(), worldserver.worldProvider.dimension, worldserver.difficulty, worldserver.getHeight(), maxPlayers)); - entityplayer.getBukkitEntity().sendSupportedChannels(); - // CraftBukkit end - - netserverhandler.sendPacket(new Packet6SpawnPosition(chunkcoordinates.x, chunkcoordinates.y, chunkcoordinates.z)); - netserverhandler.sendPacket(new Packet202Abilities(entityplayer.abilities)); - this.b(entityplayer, worldserver); - // this.sendAll(new Packet3Chat("\u00A7e" + entityplayer.name + " joined the game.")); // CraftBukkit - handled in event - this.c(entityplayer); - netserverhandler.a(entityplayer.locX, entityplayer.locY, entityplayer.locZ, entityplayer.yaw, entityplayer.pitch); - this.server.ae().a(netserverhandler); - netserverhandler.sendPacket(new Packet4UpdateTime(worldserver.getTime(), worldserver.getDayTime())); - if (this.server.getTexturePack().length() > 0) { - entityplayer.a(this.server.getTexturePack(), this.server.S()); - } - - Iterator iterator = entityplayer.getEffects().iterator(); - - while (iterator.hasNext()) { - MobEffect mobeffect = (MobEffect) iterator.next(); - - netserverhandler.sendPacket(new Packet41MobEffect(entityplayer.id, mobeffect)); - } - - entityplayer.syncInventory(); - } - - public void setPlayerFileData(WorldServer[] aworldserver) { - if (this.playerFileData != null) return; // CraftBukkit - this.playerFileData = aworldserver[0].getDataManager().getPlayerFileData(); - } - - public void a(EntityPlayer entityplayer, WorldServer worldserver) { - WorldServer worldserver1 = entityplayer.p(); - - if (worldserver != null) { - worldserver.getPlayerManager().removePlayer(entityplayer); - } - - worldserver1.getPlayerManager().addPlayer(entityplayer); - worldserver1.chunkProviderServer.getChunkAt((int) entityplayer.locX >> 4, (int) entityplayer.locZ >> 4); - } - - public int a() { - return PlayerManager.getFurthestViewableBlock(this.o()); - } - - public void a(EntityPlayer entityplayer) { - NBTTagCompound nbttagcompound = this.server.worlds.get(0).getWorldData().i(); // CraftBukkit - - if (entityplayer.getName().equals(this.server.H()) && nbttagcompound != null) { - entityplayer.e(nbttagcompound); - } else { - this.playerFileData.load(entityplayer); - } - } - - protected void b(EntityPlayer entityplayer) { - this.playerFileData.save(entityplayer); - } - - public void c(EntityPlayer entityplayer) { - cserver.detectListNameConflict(entityplayer); // CraftBukkit - // this.sendAll(new Packet201PlayerInfo(entityplayer.name, true, 1000)); // CraftBukkit - replaced with loop below - this.players.add(entityplayer); - WorldServer worldserver = this.server.getWorldServer(entityplayer.dimension); - - // CraftBukkit start - PlayerJoinEvent playerJoinEvent = new PlayerJoinEvent(this.cserver.getPlayer(entityplayer), "\u00A7e" + entityplayer.name + " joined the game."); - this.cserver.getPluginManager().callEvent(playerJoinEvent); - - String joinMessage = playerJoinEvent.getJoinMessage(); - - if ((joinMessage != null) && (joinMessage.length() > 0)) { - this.server.getServerConfigurationManager().sendAll(new Packet3Chat(joinMessage)); - } - this.cserver.onPlayerJoin(playerJoinEvent.getPlayer()); - - ChunkIOExecutor.adjustPoolSize(this.getPlayerCount()); - // CraftBukkit end - - // CraftBukkit start - only add if the player wasn't moved in the event - if (entityplayer.world == worldserver && !worldserver.players.contains(entityplayer)) { - worldserver.addEntity(entityplayer); - this.a(entityplayer, (WorldServer) null); - } - // CraftBukkit end - - // CraftBukkit start - sendAll above replaced with this loop - Packet201PlayerInfo packet = new Packet201PlayerInfo(entityplayer.listName, true, 1000); - for (int i = 0; i < this.players.size(); ++i) { - EntityPlayer entityplayer1 = (EntityPlayer) this.players.get(i); - - if (entityplayer1.getBukkitEntity().canSee(entityplayer.getBukkitEntity())) { - entityplayer1.netServerHandler.sendPacket(packet); - } - } - // CraftBukkit end - - for (int i = 0; i < this.players.size(); ++i) { - EntityPlayer entityplayer1 = (EntityPlayer) this.players.get(i); - - // CraftBukkit start - .name -> .listName - if (entityplayer.getBukkitEntity().canSee(entityplayer1.getBukkitEntity())) { - entityplayer.netServerHandler.sendPacket(new Packet201PlayerInfo(entityplayer1.listName, true, entityplayer1.ping)); - } - // CraftBukkit end - } - } - - public void d(EntityPlayer entityplayer) { - entityplayer.p().getPlayerManager().movePlayer(entityplayer); - } - - public String disconnect(EntityPlayer entityplayer) { // CraftBukkit - return string - if (entityplayer.netServerHandler.disconnected) return null; // CraftBukkit - exploitsies fix - - // CraftBukkit start - quitting must be before we do final save of data, in case plugins need to modify it - PlayerQuitEvent playerQuitEvent = new PlayerQuitEvent(this.cserver.getPlayer(entityplayer), "\u00A7e" + entityplayer.name + " left the game."); - this.cserver.getPluginManager().callEvent(playerQuitEvent); - // CraftBukkit end - - this.b(entityplayer); - WorldServer worldserver = entityplayer.p(); - - worldserver.kill(entityplayer); - worldserver.getPlayerManager().removePlayer(entityplayer); - this.players.remove(entityplayer); - ChunkIOExecutor.adjustPoolSize(this.getPlayerCount()); // CraftBukkit - - // CraftBukkit start - .name -> .listName, replace sendAll with loop - Packet201PlayerInfo packet = new Packet201PlayerInfo(entityplayer.listName, false, 9999); - for (int i = 0; i < this.players.size(); ++i) { - EntityPlayer entityplayer1 = (EntityPlayer) this.players.get(i); - - if (entityplayer1.getBukkitEntity().canSee(entityplayer.getBukkitEntity())) { - entityplayer1.netServerHandler.sendPacket(packet); - } - } - - return playerQuitEvent.getQuitMessage(); - // CraftBukkit end - } - - // CraftBukkit start - Whole method and signature - public EntityPlayer attemptLogin(NetLoginHandler netloginhandler, String s, String hostname) { - // Instead of kicking then returning, we need to store the kick reason - // in the event, check with plugins to see if it's ok, and THEN kick - // depending on the outcome. - EntityPlayer entity = new EntityPlayer(this.server, this.server.getWorldServer(0), s, this.server.M() ? new DemoItemInWorldManager(this.server.getWorldServer(0)) : new ItemInWorldManager(this.server.getWorldServer(0))); - Player player = entity.getBukkitEntity(); - PlayerLoginEvent event = new PlayerLoginEvent(player, hostname, netloginhandler.getSocket().getInetAddress()); - - SocketAddress socketaddress = netloginhandler.networkManager.getSocketAddress(); - - if (this.banByName.isBanned(s)) { - BanEntry banentry = (BanEntry) this.banByName.getEntries().get(s); - String s1 = "You are banned from this server!\nReason: " + banentry.getReason(); - - if (banentry.getExpires() != null) { - s1 = s1 + "\nYour ban will be removed on " + e.format(banentry.getExpires()); - } - - event.disallow(PlayerLoginEvent.Result.KICK_BANNED, s1); - } else if (!this.isWhitelisted(s)) { - event.disallow(PlayerLoginEvent.Result.KICK_WHITELIST, "You are not white-listed on this server!"); - } else { - String s2 = socketaddress.toString(); - - s2 = s2.substring(s2.indexOf("/") + 1); - s2 = s2.substring(0, s2.indexOf(":")); - if (this.banByIP.isBanned(s2)) { - BanEntry banentry1 = (BanEntry) this.banByIP.getEntries().get(s2); - String s3 = "Your IP address is banned from this server!\nReason: " + banentry1.getReason(); - - if (banentry1.getExpires() != null) { - s3 = s3 + "\nYour ban will be removed on " + e.format(banentry1.getExpires()); - } - - event.disallow(PlayerLoginEvent.Result.KICK_BANNED, s3); - } else if (this.players.size() >= this.maxPlayers) { - event.disallow(PlayerLoginEvent.Result.KICK_FULL, "The server is full!"); - } else { - event.disallow(PlayerLoginEvent.Result.ALLOWED, s2); - } - } - - this.cserver.getPluginManager().callEvent(event); - if (event.getResult() != PlayerLoginEvent.Result.ALLOWED) { - netloginhandler.disconnect(event.getKickMessage()); - return null; - } - - return entity; - // CraftBukkit end - } - - public EntityPlayer processLogin(EntityPlayer player) { // CraftBukkit - String -> EntityPlayer - String s = player.name; // CraftBukkit - ArrayList arraylist = new ArrayList(); - - EntityPlayer entityplayer; - - for (int i = 0; i < this.players.size(); ++i) { - entityplayer = (EntityPlayer) this.players.get(i); - if (entityplayer.name.equalsIgnoreCase(s)) { - arraylist.add(entityplayer); - } - } - - Iterator iterator = arraylist.iterator(); - - while (iterator.hasNext()) { - entityplayer = (EntityPlayer) iterator.next(); - entityplayer.netServerHandler.disconnect("You logged in from another location"); - } - - /* CraftBukkit start - Object object; - - if (this.server.M()) { - object = new DemoItemInWorldManager(this.server.getWorldServer(0)); - } else { - object = new ItemInWorldManager(this.server.getWorldServer(0)); - } - - return new EntityPlayer(this.server, this.server.getWorldServer(0), s, (ItemInWorldManager) object); - */ - return player; - // CraftBukkit end - } - - // CraftBukkit start - public EntityPlayer moveToWorld(EntityPlayer entityplayer, int i, boolean flag) { - return this.moveToWorld(entityplayer, i, flag, null); - } - - public EntityPlayer moveToWorld(EntityPlayer entityplayer, int i, boolean flag, Location location) { - // CraftBukkit end - entityplayer.p().getTracker().untrackPlayer(entityplayer); - // entityplayer.p().getTracker().untrackEntity(entityplayer); // CraftBukkit - entityplayer.p().getPlayerManager().removePlayer(entityplayer); - this.players.remove(entityplayer); - this.server.getWorldServer(entityplayer.dimension).removeEntity(entityplayer); - ChunkCoordinates chunkcoordinates = entityplayer.getBed(); - boolean flag1 = entityplayer.isRespawnForced(); - - // CraftBukkit start - EntityPlayer entityplayer1 = entityplayer; - org.bukkit.World fromWorld = entityplayer1.getBukkitEntity().getWorld(); - entityplayer1.viewingCredits = false; - entityplayer1.copyTo(entityplayer, flag); - - ChunkCoordinates chunkcoordinates1; - - if (location == null) { - boolean isBedSpawn = false; - CraftWorld cworld = (CraftWorld) this.server.server.getWorld(entityplayer.spawnWorld); - if (cworld != null && chunkcoordinates != null) { - chunkcoordinates1 = EntityHuman.getBed(cworld.getHandle(), chunkcoordinates, flag1); - if (chunkcoordinates1 != null) { - isBedSpawn = true; - location = new Location(cworld, chunkcoordinates1.x + 0.5, chunkcoordinates1.y, chunkcoordinates1.z + 0.5); - } else { - entityplayer1.setRespawnPosition(null, true); - entityplayer1.netServerHandler.sendPacket(new Packet70Bed(0, 0)); - } - } - - if (location == null) { - cworld = (CraftWorld) this.server.server.getWorlds().get(0); - chunkcoordinates = cworld.getHandle().getSpawn(); - location = new Location(cworld, chunkcoordinates.x + 0.5, chunkcoordinates.y, chunkcoordinates.z + 0.5); - } - - Player respawnPlayer = this.cserver.getPlayer(entityplayer1); - PlayerRespawnEvent respawnEvent = new PlayerRespawnEvent(respawnPlayer, location, isBedSpawn); - this.cserver.getPluginManager().callEvent(respawnEvent); - - location = respawnEvent.getRespawnLocation(); - entityplayer.reset(); - } else { - location.setWorld(this.server.getWorldServer(i).getWorld()); - } - WorldServer worldserver = ((CraftWorld) location.getWorld()).getHandle(); - entityplayer1.setLocation(location.getX(), location.getY(), location.getZ(), location.getYaw(), location.getPitch()); - // CraftBukkit end - - worldserver.chunkProviderServer.getChunkAt((int) entityplayer1.locX >> 4, (int) entityplayer1.locZ >> 4); - - while (!worldserver.getCubes(entityplayer1, entityplayer1.boundingBox).isEmpty()) { - entityplayer1.setPosition(entityplayer1.locX, entityplayer1.locY + 1.0D, entityplayer1.locZ); - } - - // CraftBukkit start - byte actualDimension = (byte) (worldserver.getWorld().getEnvironment().getId()); - // Force the client to refresh their chunk cache. - entityplayer1.netServerHandler.sendPacket(new Packet9Respawn((byte) (actualDimension >= 0 ? -1 : 0), (byte) worldserver.difficulty, worldserver.getWorldData().getType(), worldserver.getHeight(), entityplayer.itemInWorldManager.getGameMode())); - entityplayer1.netServerHandler.sendPacket(new Packet9Respawn(actualDimension, (byte) worldserver.difficulty, worldserver.getWorldData().getType(), worldserver.getHeight(), entityplayer.itemInWorldManager.getGameMode())); - entityplayer1.spawnIn(worldserver); - entityplayer1.dead = false; - entityplayer1.netServerHandler.teleport(new Location(worldserver.getWorld(), entityplayer1.locX, entityplayer1.locY, entityplayer1.locZ, entityplayer1.yaw, entityplayer1.pitch)); - entityplayer1.setSneaking(false); - chunkcoordinates1 = worldserver.getSpawn(); - // CraftBukkit end - entityplayer1.netServerHandler.sendPacket(new Packet6SpawnPosition(chunkcoordinates1.x, chunkcoordinates1.y, chunkcoordinates1.z)); - entityplayer1.netServerHandler.sendPacket(new Packet43SetExperience(entityplayer1.exp, entityplayer1.expTotal, entityplayer1.expLevel)); - this.b(entityplayer1, worldserver); - worldserver.getPlayerManager().addPlayer(entityplayer1); - worldserver.addEntity(entityplayer1); - this.players.add(entityplayer1); - // CraftBukkit start - added from changeDimension - this.updateClient(entityplayer1); // CraftBukkit - entityplayer1.updateAbilities(); - Iterator iterator = entityplayer1.getEffects().iterator(); - - while (iterator.hasNext()) { - MobEffect mobeffect = (MobEffect) iterator.next(); - - entityplayer1.netServerHandler.sendPacket(new Packet41MobEffect(entityplayer1.id, mobeffect)); - } - // entityplayer1.syncInventory(); - // CraftBukkit end - - // CraftBukkit start - don't fire on respawn - if (fromWorld != location.getWorld()) { - PlayerChangedWorldEvent event = new PlayerChangedWorldEvent((Player) entityplayer1.getBukkitEntity(), fromWorld); - Bukkit.getServer().getPluginManager().callEvent(event); - } - // CraftBukkit end - - return entityplayer1; - } - - public void changeDimension(EntityPlayer entityplayer, int i) { - // CraftBukkit start -- Replaced the standard handling of portals with a more customised method. - int dimension = i; - WorldServer fromWorld = this.server.getWorldServer(entityplayer.dimension); - WorldServer toWorld = null; - if (entityplayer.dimension < 10) { - for (WorldServer world : this.server.worlds) { - if (world.dimension == dimension) { - toWorld = world; - } - } - } - - Location fromLocation = new Location(fromWorld.getWorld(), entityplayer.locX, entityplayer.locY, entityplayer.locZ, entityplayer.yaw, entityplayer.pitch); - Location toLocation = null; - - if (toWorld != null) { - if (((dimension == -1) || (dimension == 0)) && ((entityplayer.dimension == -1) || (entityplayer.dimension == 0))) { - double blockRatio = dimension == 0 ? 8 : 0.125; - - toLocation = toWorld == null ? null : new Location(toWorld.getWorld(), (entityplayer.locX * blockRatio), entityplayer.locY, (entityplayer.locZ * blockRatio), entityplayer.yaw, entityplayer.pitch); - } else { - ChunkCoordinates coords = toWorld.getDimensionSpawn(); - if (coords != null) { - toLocation = new Location(toWorld.getWorld(), coords.x, coords.y, coords.z, 90, 0); - } - } - } - - TeleportCause cause = TeleportCause.UNKNOWN; - int playerEnvironmentId = entityplayer.getBukkitEntity().getWorld().getEnvironment().getId(); - switch (dimension) { - case -1: - cause = TeleportCause.NETHER_PORTAL; - break; - case 0: - if (playerEnvironmentId == -1) { - cause = TeleportCause.NETHER_PORTAL; - } else if (playerEnvironmentId == 1) { - cause = TeleportCause.END_PORTAL; - } - - break; - case 1: - cause = TeleportCause.END_PORTAL; - break; - } - - org.bukkit.craftbukkit.PortalTravelAgent pta = new org.bukkit.craftbukkit.PortalTravelAgent(); - PlayerPortalEvent event = new PlayerPortalEvent((Player) entityplayer.getBukkitEntity(), fromLocation, toLocation, pta, cause); - - if (entityplayer.dimension == 1) { - event.useTravelAgent(false); - } - - Bukkit.getServer().getPluginManager().callEvent(event); - if (event.isCancelled() || event.getTo() == null) { - return; - } - - Location finalLocation = event.getTo(); - if (event.useTravelAgent()) { - finalLocation = event.getPortalTravelAgent().findOrCreate(finalLocation); - } - toWorld = ((CraftWorld) finalLocation.getWorld()).getHandle(); - this.moveToWorld(entityplayer, toWorld.dimension, true, finalLocation); - // CraftBukkit end - } - - public void a(Entity entity, int i, WorldServer worldserver, WorldServer worldserver1) { - double d0 = entity.locX; - double d1 = entity.locZ; - double d2 = 8.0D; - double d3 = entity.locX; - double d4 = entity.locY; - double d5 = entity.locZ; - float f = entity.yaw; - - worldserver.methodProfiler.a("moving"); - if (entity.dimension == -1) { - d0 /= d2; - d1 /= d2; - entity.setPositionRotation(d0, entity.locY, d1, entity.yaw, entity.pitch); - if (entity.isAlive()) { - worldserver.entityJoinedWorld(entity, false); - } - } else if (entity.dimension == 0) { - d0 *= d2; - d1 *= d2; - entity.setPositionRotation(d0, entity.locY, d1, entity.yaw, entity.pitch); - if (entity.isAlive()) { - worldserver.entityJoinedWorld(entity, false); - } - } else { - ChunkCoordinates chunkcoordinates; - - if (i == 1) { - chunkcoordinates = worldserver1.getSpawn(); - } else { - chunkcoordinates = worldserver1.getDimensionSpawn(); - } - - d0 = (double) chunkcoordinates.x; - entity.locY = (double) chunkcoordinates.y; - d1 = (double) chunkcoordinates.z; - entity.setPositionRotation(d0, entity.locY, d1, 90.0F, 0.0F); - if (entity.isAlive()) { - worldserver.entityJoinedWorld(entity, false); - } - } - - worldserver.methodProfiler.b(); - if (i != 1) { - worldserver.methodProfiler.a("placing"); - d0 = (double) MathHelper.a((int) d0, -29999872, 29999872); - d1 = (double) MathHelper.a((int) d1, -29999872, 29999872); - if (entity.isAlive()) { - worldserver1.addEntity(entity); - entity.setPositionRotation(d0, entity.locY, d1, entity.yaw, entity.pitch); - worldserver1.entityJoinedWorld(entity, false); - worldserver1.s().a(entity, d3, d4, d5, f); - } - - worldserver.methodProfiler.b(); - } - - entity.spawnIn(worldserver1); - } - - public void tick() { - if (++this.o > 600) { - this.o = 0; - } - - /* CraftBukkit start - remove updating of lag to players -- it spams way to much on big servers. - if (this.o < this.players.size()) { - EntityPlayer entityplayer = (EntityPlayer) this.players.get(this.o); - - this.sendAll(new Packet201PlayerInfo(entityplayer.name, true, entityplayer.ping)); - } - // CraftBukkit end */ - } - - public void sendAll(Packet packet) { - for (int i = 0; i < this.players.size(); ++i) { - ((EntityPlayer) this.players.get(i)).netServerHandler.sendPacket(packet); - } - } - - public void a(Packet packet, int i) { - for (int j = 0; j < this.players.size(); ++j) { - EntityPlayer entityplayer = (EntityPlayer) this.players.get(j); - - if (entityplayer.dimension == i) { - entityplayer.netServerHandler.sendPacket(packet); - } - } - } - - public String c() { - String s = ""; - - for (int i = 0; i < this.players.size(); ++i) { - if (i > 0) { - s = s + ", "; - } - - s = s + ((EntityPlayer) this.players.get(i)).name; - } - - return s; - } - - public String[] d() { - String[] astring = new String[this.players.size()]; - - for (int i = 0; i < this.players.size(); ++i) { - astring[i] = ((EntityPlayer) this.players.get(i)).name; - } - - return astring; - } - - public BanList getNameBans() { - return this.banByName; - } - - public BanList getIPBans() { - return this.banByIP; - } - - public void addOp(String s) { - this.operators.add(s.toLowerCase()); - - // CraftBukkit start - Player player = server.server.getPlayer(s); - if (player != null) { - player.recalculatePermissions(); - } - // CraftBukkit end - } - - public void removeOp(String s) { - this.operators.remove(s.toLowerCase()); - - // CraftBukkit start - Player player = server.server.getPlayer(s); - if (player != null) { - player.recalculatePermissions(); - } - // CraftBukkit end - } - - public boolean isWhitelisted(String s) { - s = s.trim().toLowerCase(); - return !this.hasWhitelist || this.operators.contains(s) || this.whitelist.contains(s); - } - - public boolean isOp(String s) { - // CraftBukkit - return this.operators.contains(s.trim().toLowerCase()) || this.server.I() && this.server.worlds.get(0).getWorldData().allowCommands() && this.server.H().equalsIgnoreCase(s) || this.n; - } - - public EntityPlayer f(String s) { - Iterator iterator = this.players.iterator(); - - EntityPlayer entityplayer; - - do { - if (!iterator.hasNext()) { - return null; - } - - entityplayer = (EntityPlayer) iterator.next(); - } while (!entityplayer.name.equalsIgnoreCase(s)); - - return entityplayer; - } - - public List a(ChunkCoordinates chunkcoordinates, int i, int j, int k, int l, int i1, int j1) { - if (this.players.isEmpty()) { - return null; - } else { - Object object = new ArrayList(); - boolean flag = k < 0; - int k1 = i * i; - int l1 = j * j; - - k = MathHelper.a(k); - - for (int i2 = 0; i2 < this.players.size(); ++i2) { - EntityPlayer entityplayer = (EntityPlayer) this.players.get(i2); - - if (chunkcoordinates != null && (i > 0 || j > 0)) { - float f = chunkcoordinates.e(entityplayer.b()); - - if (i > 0 && f < (float) k1 || j > 0 && f > (float) l1) { - continue; - } - } - - if ((l == EnumGamemode.NONE.a() || l == entityplayer.itemInWorldManager.getGameMode().a()) && (i1 <= 0 || entityplayer.expLevel >= i1) && entityplayer.expLevel <= j1) { - ((List) object).add(entityplayer); - } - } - - if (chunkcoordinates != null) { - Collections.sort((List) object, new PlayerDistanceComparator(chunkcoordinates)); - } - - if (flag) { - Collections.reverse((List) object); - } - - if (k > 0) { - object = ((List) object).subList(0, Math.min(k, ((List) object).size())); - } - - return (List) object; - } - } - - public void sendPacketNearby(double d0, double d1, double d2, double d3, int i, Packet packet) { - this.sendPacketNearby((EntityHuman) null, d0, d1, d2, d3, i, packet); - } - - public void sendPacketNearby(EntityHuman entityhuman, double d0, double d1, double d2, double d3, int i, Packet packet) { - for (int j = 0; j < this.players.size(); ++j) { - EntityPlayer entityplayer = (EntityPlayer) this.players.get(j); - - // CraftBukkit start - Test if player receiving packet can see the source of the packet - if (entityhuman != null && entityhuman instanceof EntityPlayer && !entityplayer.getBukkitEntity().canSee(((EntityPlayer) entityhuman).getBukkitEntity())) { - continue; - } - // CraftBukkit end - if (entityplayer != entityhuman && entityplayer.dimension == i) { - double d4 = d0 - entityplayer.locX; - double d5 = d1 - entityplayer.locY; - double d6 = d2 - entityplayer.locZ; - - if (d4 * d4 + d5 * d5 + d6 * d6 < d3 * d3) { - entityplayer.netServerHandler.sendPacket(packet); - } - } - } - } - - public void savePlayers() { - for (int i = 0; i < this.players.size(); ++i) { - this.b((EntityPlayer) this.players.get(i)); - } - } - - public void addWhitelist(String s) { - this.whitelist.add(s); - } - - public void removeWhitelist(String s) { - this.whitelist.remove(s); - } - - public Set getWhitelisted() { - return this.whitelist; - } - - public Set getOPs() { - return this.operators; - } - - public void reloadWhitelist() {} - - public void b(EntityPlayer entityplayer, WorldServer worldserver) { - entityplayer.netServerHandler.sendPacket(new Packet4UpdateTime(worldserver.getTime(), worldserver.getDayTime())); - if (worldserver.N()) { - entityplayer.netServerHandler.sendPacket(new Packet70Bed(1, 0)); - } - } - - public void updateClient(EntityPlayer entityplayer) { - entityplayer.updateInventory(entityplayer.defaultContainer); - entityplayer.m(); - } - - public int getPlayerCount() { - return this.players.size(); - } - - public int getMaxPlayers() { - return this.maxPlayers; - } - - public String[] getSeenPlayers() { - return this.server.worlds.get(0).getDataManager().getPlayerFileData().getSeenPlayers(); // CraftBukkit - } - - public boolean getHasWhitelist() { - return this.hasWhitelist; - } - - public void setHasWhitelist(boolean flag) { - this.hasWhitelist = flag; - } - - public List j(String s) { - ArrayList arraylist = new ArrayList(); - Iterator iterator = this.players.iterator(); - - while (iterator.hasNext()) { - EntityPlayer entityplayer = (EntityPlayer) iterator.next(); - - if (entityplayer.q().equals(s)) { - arraylist.add(entityplayer); - } - } - - return arraylist; - } - - public int o() { - return this.d; - } - - public MinecraftServer getServer() { - return this.server; - } - - public NBTTagCompound q() { - return null; - } - - private void a(EntityPlayer entityplayer, EntityPlayer entityplayer1, World world) { - if (entityplayer1 != null) { - entityplayer.itemInWorldManager.setGameMode(entityplayer1.itemInWorldManager.getGameMode()); - } else if (this.m != null) { - entityplayer.itemInWorldManager.setGameMode(this.m); - } - - entityplayer.itemInWorldManager.b(world.getWorldData().getGameType()); - } - - public void r() { - while (!this.players.isEmpty()) { - ((EntityPlayer) this.players.get(0)).netServerHandler.disconnect(this.server.server.getShutdownMessage()); // CraftBukkit - add custom shutdown message - } - } -} diff --git a/src/main/java/net/minecraft/server/ShapedRecipes.java b/src/main/java/net/minecraft/server/ShapedRecipes.java index e3126b6b..52f8ee74 100644 --- a/src/main/java/net/minecraft/server/ShapedRecipes.java +++ b/src/main/java/net/minecraft/server/ShapedRecipes.java @@ -12,6 +12,7 @@ public class ShapedRecipes implements IRecipe { private ItemStack[] items; private ItemStack result; public final int a; + private boolean f = false; public ShapedRecipes(int i, int j, ItemStack[] aitemstack, ItemStack itemstack) { this.a = itemstack.id; @@ -134,10 +135,27 @@ public class ShapedRecipes implements IRecipe { } public ItemStack a(InventoryCrafting inventorycrafting) { - return this.b().cloneItemStack(); + ItemStack itemstack = this.b().cloneItemStack(); + + if (this.f) { + for (int i = 0; i < inventorycrafting.getSize(); ++i) { + ItemStack itemstack1 = inventorycrafting.getItem(i); + + if (itemstack1 != null && itemstack1.hasTag()) { + itemstack.setTag((NBTTagCompound) itemstack1.tag.clone()); + } + } + } + + return itemstack; } public int a() { return this.width * this.height; } + + public ShapedRecipes c() { + this.f = true; + return this; + } } diff --git a/src/main/java/net/minecraft/server/ThreadLoginVerifier.java b/src/main/java/net/minecraft/server/ThreadLoginVerifier.java index 8bb1f71e..0686ba0f 100644 --- a/src/main/java/net/minecraft/server/ThreadLoginVerifier.java +++ b/src/main/java/net/minecraft/server/ThreadLoginVerifier.java @@ -15,40 +15,40 @@ import org.bukkit.event.player.PlayerPreLoginEvent; class ThreadLoginVerifier extends Thread { - final NetLoginHandler netLoginHandler; + final PendingConnection pendingConnection; // CraftBukkit start CraftServer server; - ThreadLoginVerifier(NetLoginHandler netloginhandler, CraftServer server) { + ThreadLoginVerifier(PendingConnection pendingconnection, CraftServer server) { this.server = server; // CraftBukkit end - this.netLoginHandler = netloginhandler; + this.pendingConnection = pendingconnection; } public void run() { try { - String s = (new BigInteger(MinecraftEncryption.a(NetLoginHandler.a(this.netLoginHandler), NetLoginHandler.b(this.netLoginHandler).F().getPublic(), NetLoginHandler.c(this.netLoginHandler)))).toString(16); - URL url = new URL("http://session.minecraft.net/game/checkserver.jsp?user=" + URLEncoder.encode(NetLoginHandler.d(this.netLoginHandler), "UTF-8") + "&serverId=" + URLEncoder.encode(s, "UTF-8")); + String s = (new BigInteger(MinecraftEncryption.a(PendingConnection.a(this.pendingConnection), PendingConnection.b(this.pendingConnection).F().getPublic(), PendingConnection.c(this.pendingConnection)))).toString(16); + URL url = new URL("http://session.minecraft.net/game/checkserver.jsp?user=" + URLEncoder.encode(PendingConnection.d(this.pendingConnection), "UTF-8") + "&serverId=" + URLEncoder.encode(s, "UTF-8")); BufferedReader bufferedreader = new BufferedReader(new InputStreamReader(url.openStream())); String s1 = bufferedreader.readLine(); bufferedreader.close(); if (!"YES".equals(s1)) { - this.netLoginHandler.disconnect("Failed to verify username!"); + this.pendingConnection.disconnect("Failed to verify username!"); return; } // CraftBukkit start - if (this.netLoginHandler.getSocket() == null) { + if (this.pendingConnection.getSocket() == null) { return; } - AsyncPlayerPreLoginEvent asyncEvent = new AsyncPlayerPreLoginEvent(NetLoginHandler.d(this.netLoginHandler), this.netLoginHandler.getSocket().getInetAddress()); + AsyncPlayerPreLoginEvent asyncEvent = new AsyncPlayerPreLoginEvent(PendingConnection.d(this.pendingConnection), this.pendingConnection.getSocket().getInetAddress()); this.server.getPluginManager().callEvent(asyncEvent); if (PlayerPreLoginEvent.getHandlerList().getRegisteredListeners().length != 0) { - final PlayerPreLoginEvent event = new PlayerPreLoginEvent(NetLoginHandler.d(this.netLoginHandler), this.netLoginHandler.getSocket().getInetAddress()); + final PlayerPreLoginEvent event = new PlayerPreLoginEvent(PendingConnection.d(this.pendingConnection), this.pendingConnection.getSocket().getInetAddress()); if (asyncEvent.getResult() != PlayerPreLoginEvent.Result.ALLOWED) { event.disallow(asyncEvent.getResult(), asyncEvent.getKickMessage()); } @@ -59,26 +59,26 @@ class ThreadLoginVerifier extends Thread { return event.getResult(); }}; - NetLoginHandler.b(this.netLoginHandler).processQueue.add(waitable); + PendingConnection.b(this.pendingConnection).processQueue.add(waitable); if (waitable.get() != PlayerPreLoginEvent.Result.ALLOWED) { - this.netLoginHandler.disconnect(event.getKickMessage()); + this.pendingConnection.disconnect(event.getKickMessage()); return; } } else { if (asyncEvent.getLoginResult() != AsyncPlayerPreLoginEvent.Result.ALLOWED) { - this.netLoginHandler.disconnect(asyncEvent.getKickMessage()); + this.pendingConnection.disconnect(asyncEvent.getKickMessage()); return; } } // CraftBukkit end - NetLoginHandler.a(this.netLoginHandler, true); + PendingConnection.a(this.pendingConnection, true); // CraftBukkit start } catch (java.io.IOException exception) { - this.netLoginHandler.disconnect("Failed to verify username, session authentication server unavailable!"); + this.pendingConnection.disconnect("Failed to verify username, session authentication server unavailable!"); } catch (Exception exception) { - this.netLoginHandler.disconnect("Failed to verify username!"); - server.getLogger().log(java.util.logging.Level.WARNING, "Exception verifying " + NetLoginHandler.d(this.netLoginHandler), exception); + this.pendingConnection.disconnect("Failed to verify username!"); + server.getLogger().log(java.util.logging.Level.WARNING, "Exception verifying " + PendingConnection.d(this.pendingConnection), exception); // CraftBukkit end } } diff --git a/src/main/java/net/minecraft/server/TileEntityMobSpawner.java b/src/main/java/net/minecraft/server/TileEntityMobSpawner.java index ccc94d22..b6ad98c4 100644 --- a/src/main/java/net/minecraft/server/TileEntityMobSpawner.java +++ b/src/main/java/net/minecraft/server/TileEntityMobSpawner.java @@ -1,17 +1,22 @@ package net.minecraft.server; +import java.util.ArrayList; +import java.util.Collection; import java.util.Iterator; +import java.util.List; public class TileEntityMobSpawner extends TileEntity { public int spawnDelay = -1; public String mobName = "Pig"; // CraftBukkit - private -> public - private NBTTagCompound spawnData = null; + private List mobs = null; + private TileEntityMobSpawnerData spawnData = null; public double b; public double c = 0.0D; private int minSpawnDelay = 200; private int maxSpawnDelay = 800; private int spawnCount = 4; + private Entity j; private int maxNearbyEntities = 6; private int requiredPlayerRange = 16; private int spawnRange = 4; @@ -20,6 +25,10 @@ public class TileEntityMobSpawner extends TileEntity { this.spawnDelay = 20; } + public String getMobName() { + return this.spawnData == null ? this.mobName : this.spawnData.c; + } + public void a(String s) { this.mobName = s; } @@ -30,13 +39,15 @@ public class TileEntityMobSpawner extends TileEntity { public void g() { if (this.b()) { + double d0; + if (this.world.isStatic) { - double d0 = (double) ((float) this.x + this.world.random.nextFloat()); - double d1 = (double) ((float) this.y + this.world.random.nextFloat()); - double d2 = (double) ((float) this.z + this.world.random.nextFloat()); + double d1 = (double) ((float) this.x + this.world.random.nextFloat()); + double d2 = (double) ((float) this.y + this.world.random.nextFloat()); - this.world.addParticle("smoke", d0, d1, d2, 0.0D, 0.0D, 0.0D); - this.world.addParticle("flame", d0, d1, d2, 0.0D, 0.0D, 0.0D); + d0 = (double) ((float) this.z + this.world.random.nextFloat()); + this.world.addParticle("smoke", d1, d2, d0, 0.0D, 0.0D, 0.0D); + this.world.addParticle("flame", d1, d2, d0, 0.0D, 0.0D, 0.0D); if (this.spawnDelay > 0) { --this.spawnDelay; } @@ -53,8 +64,10 @@ public class TileEntityMobSpawner extends TileEntity { return; } + boolean flag = false; + for (int i = 0; i < this.spawnCount; ++i) { - Entity entity = EntityTypes.createEntityByName(this.mobName, this.world); + Entity entity = EntityTypes.createEntityByName(this.getMobName(), this.world); if (entity == null) { return; @@ -68,12 +81,12 @@ public class TileEntityMobSpawner extends TileEntity { } if (entity != null) { - double d3 = (double) this.x + (this.world.random.nextDouble() - this.world.random.nextDouble()) * (double) this.spawnRange; - double d4 = (double) (this.y + this.world.random.nextInt(3) - 1); - double d5 = (double) this.z + (this.world.random.nextDouble() - this.world.random.nextDouble()) * (double) this.spawnRange; + d0 = (double) this.x + (this.world.random.nextDouble() - this.world.random.nextDouble()) * (double) this.spawnRange; + double d3 = (double) (this.y + this.world.random.nextInt(3) - 1); + double d4 = (double) this.z + (this.world.random.nextDouble() - this.world.random.nextDouble()) * (double) this.spawnRange; EntityLiving entityliving = entity instanceof EntityLiving ? (EntityLiving) entity : null; - entity.setPositionRotation(d3, d4, d5, this.world.random.nextFloat() * 360.0F, 0.0F); + entity.setPositionRotation(d0, d3, d4, this.world.random.nextFloat() * 360.0F, 0.0F); if (entityliving == null || entityliving.canSpawn()) { this.a(entity); this.world.addEntity(entity, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.SPAWNER); // CraftBukkit @@ -82,10 +95,14 @@ public class TileEntityMobSpawner extends TileEntity { entityliving.aR(); } - this.e(); + flag = true; } } } + + if (flag) { + this.e(); + } } super.g(); @@ -97,7 +114,7 @@ public class TileEntityMobSpawner extends TileEntity { NBTTagCompound nbttagcompound = new NBTTagCompound(); entity.c(nbttagcompound); - Iterator iterator = this.spawnData.c().iterator(); + Iterator iterator = this.spawnData.b.c().iterator(); while (iterator.hasNext()) { NBTBase nbtbase = (NBTBase) iterator.next(); @@ -118,6 +135,11 @@ public class TileEntityMobSpawner extends TileEntity { this.spawnDelay = this.minSpawnDelay + this.world.random.nextInt(this.maxSpawnDelay - this.minSpawnDelay); } + if (this.mobs != null && this.mobs.size() > 0) { + this.spawnData = (TileEntityMobSpawnerData) WeightedRandom.a(this.world.random, (Collection) this.mobs); + this.world.notify(this.x, this.y, this.z); + } + this.world.playNote(this.x, this.y, this.z, this.q().id, 1, 0); } @@ -125,8 +147,19 @@ public class TileEntityMobSpawner extends TileEntity { super.a(nbttagcompound); this.mobName = nbttagcompound.getString("EntityId"); this.spawnDelay = nbttagcompound.getShort("Delay"); + if (nbttagcompound.hasKey("SpawnPotentials")) { + this.mobs = new ArrayList(); + NBTTagList nbttaglist = nbttagcompound.getList("SpawnPotentials"); + + for (int i = 0; i < nbttaglist.size(); ++i) { + this.mobs.add(new TileEntityMobSpawnerData(this, (NBTTagCompound) nbttaglist.get(i))); + } + } else { + this.mobs = null; + } + if (nbttagcompound.hasKey("SpawnData")) { - this.spawnData = nbttagcompound.getCompound("SpawnData"); + this.spawnData = new TileEntityMobSpawnerData(this, nbttagcompound.getCompound("SpawnData"), this.mobName); } else { this.spawnData = null; } @@ -145,11 +178,15 @@ public class TileEntityMobSpawner extends TileEntity { if (nbttagcompound.hasKey("SpawnRange")) { this.spawnRange = nbttagcompound.getShort("SpawnRange"); } + + if (this.world != null && this.world.isStatic) { + this.j = null; + } } public void b(NBTTagCompound nbttagcompound) { super.b(nbttagcompound); - nbttagcompound.setString("EntityId", this.mobName); + nbttagcompound.setString("EntityId", this.getMobName()); nbttagcompound.setShort("Delay", (short) this.spawnDelay); nbttagcompound.setShort("MinSpawnDelay", (short) this.minSpawnDelay); nbttagcompound.setShort("MaxSpawnDelay", (short) this.maxSpawnDelay); @@ -158,7 +195,25 @@ public class TileEntityMobSpawner extends TileEntity { nbttagcompound.setShort("RequiredPlayerRange", (short) this.requiredPlayerRange); nbttagcompound.setShort("SpawnRange", (short) this.spawnRange); if (this.spawnData != null) { - nbttagcompound.setCompound("SpawnData", this.spawnData); + nbttagcompound.setCompound("SpawnData", (NBTTagCompound) this.spawnData.b.clone()); + } + + if (this.spawnData != null || this.mobs != null && this.mobs.size() > 0) { + NBTTagList nbttaglist = new NBTTagList(); + + if (this.mobs != null && this.mobs.size() > 0) { + Iterator iterator = this.mobs.iterator(); + + while (iterator.hasNext()) { + TileEntityMobSpawnerData tileentitymobspawnerdata = (TileEntityMobSpawnerData) iterator.next(); + + nbttaglist.add(tileentitymobspawnerdata.a()); + } + } else { + nbttaglist.add(this.spawnData.a()); + } + + nbttagcompound.set("SpawnPotentials", nbttaglist); } } @@ -166,6 +221,7 @@ public class TileEntityMobSpawner extends TileEntity { NBTTagCompound nbttagcompound = new NBTTagCompound(); this.b(nbttagcompound); + nbttagcompound.o("SpawnPotentials"); return new Packet132TileEntityData(this.x, this.y, this.z, 1, nbttagcompound); } diff --git a/src/main/java/net/minecraft/server/World.java b/src/main/java/net/minecraft/server/World.java index 0260dd3c..e2fd0dfd 100644 --- a/src/main/java/net/minecraft/server/World.java +++ b/src/main/java/net/minecraft/server/World.java @@ -43,13 +43,12 @@ public abstract class World implements IBlockAccess { protected float n; protected float o; protected float p; - protected int q = 0; - public int r = 0; + public int q = 0; public boolean suppressPhysics = false; public int difficulty; public Random random = new Random(); public WorldProvider worldProvider; // CraftBukkit - remove final - protected List w = new ArrayList(); + protected List v = new ArrayList(); public IChunkProvider chunkProvider; // CraftBukkit - protected -> public protected final IDataManager dataManager; public WorldData worldData; // CraftBukkit - protected -> public @@ -58,10 +57,10 @@ public abstract class World implements IBlockAccess { public final VillageCollection villages; protected final VillageSiege siegeManager = new VillageSiege(this); public final MethodProfiler methodProfiler; - private final Vec3DPool K = new Vec3DPool(300, 2000); - private final Calendar L = Calendar.getInstance(); - private UnsafeList M = new UnsafeList(); // CraftBukkit - ArrayList -> UnsafeList - private boolean N; + private final Vec3DPool J = new Vec3DPool(300, 2000); + private final Calendar K = Calendar.getInstance(); + private UnsafeList L = new UnsafeList(); // CraftBukkit - ArrayList -> UnsafeList + private boolean M; // CraftBukkit start - public, longhashset public boolean allowMonsters = true; public boolean allowAnimals = true; @@ -69,9 +68,9 @@ public abstract class World implements IBlockAccess { public long ticksPerAnimalSpawns; public long ticksPerMonsterSpawns; // CraftBukkit end - private int O; - int[] I; - private List P; + private int N; + int[] H; + private List O; public boolean isStatic; public BiomeBase getBiome(int i, int j) { @@ -116,9 +115,9 @@ public abstract class World implements IBlockAccess { this.ticksPerMonsterSpawns = this.getServer().getTicksPerMonsterSpawns(); // CraftBukkit // CraftBukkit end - this.O = this.random.nextInt(12000); - this.I = new int['\u8000']; - this.P = new UnsafeList(); // CraftBukkit - ArrayList -> UnsafeList + this.N = this.random.nextInt(12000); + this.H = new int['\u8000']; + this.O = new UnsafeList(); // CraftBukkit - ArrayList -> UnsafeList this.isStatic = false; this.dataManager = idatamanager; this.methodProfiler = methodprofiler; @@ -416,8 +415,8 @@ public abstract class World implements IBlockAccess { } public void notify(int i, int j, int k) { - for (int l = 0; l < this.w.size(); ++l) { - ((IWorldAccess) this.w.get(l)).a(i, j, k); + for (int l = 0; l < this.v.size(); ++l) { + ((IWorldAccess) this.v.get(l)).a(i, j, k); } } @@ -444,14 +443,14 @@ public abstract class World implements IBlockAccess { } public void j(int i, int j, int k) { - for (int l = 0; l < this.w.size(); ++l) { - ((IWorldAccess) this.w.get(l)).a(i, j, k, i, j, k); + for (int l = 0; l < this.v.size(); ++l) { + ((IWorldAccess) this.v.get(l)).a(i, j, k, i, j, k); } } public void e(int i, int j, int k, int l, int i1, int j1) { - for (int k1 = 0; k1 < this.w.size(); ++k1) { - ((IWorldAccess) this.w.get(k1)).a(i, j, k, l, i1, j1); + for (int k1 = 0; k1 < this.v.size(); ++k1) { + ((IWorldAccess) this.v.get(k1)).a(i, j, k, l, i1, j1); } } @@ -636,8 +635,8 @@ public abstract class World implements IBlockAccess { chunk.a(enumskyblock, i & 15, j, k & 15, l); - for (int i1 = 0; i1 < this.w.size(); ++i1) { - ((IWorldAccess) this.w.get(i1)).b(i, j, k); + for (int i1 = 0; i1 < this.v.size(); ++i1) { + ((IWorldAccess) this.v.get(i1)).b(i, j, k); } } } @@ -646,8 +645,8 @@ public abstract class World implements IBlockAccess { } public void o(int i, int j, int k) { - for (int l = 0; l < this.w.size(); ++l) { - ((IWorldAccess) this.w.get(l)).b(i, j, k); + for (int l = 0; l < this.v.size(); ++l) { + ((IWorldAccess) this.v.get(l)).b(i, j, k); } } @@ -830,39 +829,39 @@ public abstract class World implements IBlockAccess { public void makeSound(Entity entity, String s, float f, float f1) { if (entity != null && s != null) { - for (int i = 0; i < this.w.size(); ++i) { - ((IWorldAccess) this.w.get(i)).a(s, entity.locX, entity.locY - (double) entity.height, entity.locZ, f, f1); + for (int i = 0; i < this.v.size(); ++i) { + ((IWorldAccess) this.v.get(i)).a(s, entity.locX, entity.locY - (double) entity.height, entity.locZ, f, f1); } } } public void a(EntityHuman entityhuman, String s, float f, float f1) { if (entityhuman != null && s != null) { - for (int i = 0; i < this.w.size(); ++i) { - ((IWorldAccess) this.w.get(i)).a(entityhuman, s, entityhuman.locX, entityhuman.locY - (double) entityhuman.height, entityhuman.locZ, f, f1); + for (int i = 0; i < this.v.size(); ++i) { + ((IWorldAccess) this.v.get(i)).a(entityhuman, s, entityhuman.locX, entityhuman.locY - (double) entityhuman.height, entityhuman.locZ, f, f1); } } } public void makeSound(double d0, double d1, double d2, String s, float f, float f1) { if (s != null) { - for (int i = 0; i < this.w.size(); ++i) { - ((IWorldAccess) this.w.get(i)).a(s, d0, d1, d2, f, f1); + for (int i = 0; i < this.v.size(); ++i) { + ((IWorldAccess) this.v.get(i)).a(s, d0, d1, d2, f, f1); } } } - public void b(double d0, double d1, double d2, String s, float f, float f1) {} + public void a(double d0, double d1, double d2, String s, float f, float f1, boolean flag) {} public void a(String s, int i, int j, int k) { - for (int l = 0; l < this.w.size(); ++l) { - ((IWorldAccess) this.w.get(l)).a(s, i, j, k); + for (int l = 0; l < this.v.size(); ++l) { + ((IWorldAccess) this.v.get(l)).a(s, i, j, k); } } public void addParticle(String s, double d0, double d1, double d2, double d3, double d4, double d5) { - for (int i = 0; i < this.w.size(); ++i) { - ((IWorldAccess) this.w.get(i)).a(s, d0, d1, d2, d3, d4, d5); + for (int i = 0; i < this.v.size(); ++i) { + ((IWorldAccess) this.v.get(i)).a(s, d0, d1, d2, d3, d4, d5); } } @@ -934,16 +933,16 @@ public abstract class World implements IBlockAccess { } protected void a(Entity entity) { - for (int i = 0; i < this.w.size(); ++i) { - ((IWorldAccess) this.w.get(i)).a(entity); + for (int i = 0; i < this.v.size(); ++i) { + ((IWorldAccess) this.v.get(i)).a(entity); } entity.valid = true; // CraftBukkit } protected void b(Entity entity) { - for (int i = 0; i < this.w.size(); ++i) { - ((IWorldAccess) this.w.get(i)).b(entity); + for (int i = 0; i < this.v.size(); ++i) { + ((IWorldAccess) this.v.get(i)).b(entity); } entity.valid = false; // CraftBukkit @@ -984,11 +983,11 @@ public abstract class World implements IBlockAccess { } public void addIWorldAccess(IWorldAccess iworldaccess) { - this.w.add(iworldaccess); + this.v.add(iworldaccess); } public List getCubes(Entity entity, AxisAlignedBB axisalignedbb) { - this.M.clear(); + this.L.clear(); int i = MathHelper.floor(axisalignedbb.a); int j = MathHelper.floor(axisalignedbb.d + 1.0D); int k = MathHelper.floor(axisalignedbb.b); @@ -1003,7 +1002,7 @@ public abstract class World implements IBlockAccess { Block block = Block.byId[this.getTypeId(k1, i2, l1)]; if (block != null) { - block.a(this, k1, i2, l1, axisalignedbb, this.M, entity); + block.a(this, k1, i2, l1, axisalignedbb, this.L, entity); } } } @@ -1017,20 +1016,20 @@ public abstract class World implements IBlockAccess { AxisAlignedBB axisalignedbb1 = ((Entity) list.get(j2)).E(); if (axisalignedbb1 != null && axisalignedbb1.a(axisalignedbb)) { - this.M.add(axisalignedbb1); + this.L.add(axisalignedbb1); } axisalignedbb1 = entity.g((Entity) list.get(j2)); if (axisalignedbb1 != null && axisalignedbb1.a(axisalignedbb)) { - this.M.add(axisalignedbb1); + this.L.add(axisalignedbb1); } } - return this.M; + return this.L; } public List a(AxisAlignedBB axisalignedbb) { - this.M.clear(); + this.L.clear(); int i = MathHelper.floor(axisalignedbb.a); int j = MathHelper.floor(axisalignedbb.d + 1.0D); int k = MathHelper.floor(axisalignedbb.b); @@ -1045,14 +1044,14 @@ public abstract class World implements IBlockAccess { Block block = Block.byId[this.getTypeId(k1, i2, l1)]; if (block != null) { - block.a(this, k1, i2, l1, axisalignedbb, this.M, (Entity) null); + block.a(this, k1, i2, l1, axisalignedbb, this.L, (Entity) null); } } } } } - return this.M; + return this.L; } public int a(float f) { @@ -1128,6 +1127,7 @@ public abstract class World implements IBlockAccess { // CraftBukkit end try { + ++entity.ticksLived; entity.j_(); } catch (Throwable throwable) { crashreport = CrashReport.a(throwable, "Ticking entity"); @@ -1221,7 +1221,7 @@ public abstract class World implements IBlockAccess { } this.methodProfiler.c("tileEntities"); - this.N = true; + this.M = true; Iterator iterator = this.tileEntityList.iterator(); while (iterator.hasNext()) { @@ -1261,7 +1261,7 @@ public abstract class World implements IBlockAccess { } } - this.N = false; + this.M = false; if (!this.b.isEmpty()) { this.tileEntityList.removeAll(this.b); this.b.clear(); @@ -1304,7 +1304,7 @@ public abstract class World implements IBlockAccess { } public void a(Collection collection) { - if (this.N) { + if (this.M) { this.a.addAll(collection); } else { this.tileEntityList.addAll(collection); @@ -1330,6 +1330,7 @@ public abstract class World implements IBlockAccess { if (entity.vehicle != null) { entity.U(); } else { + ++entity.ticksLived; entity.j_(); } } @@ -1517,7 +1518,7 @@ public abstract class World implements IBlockAccess { Block block = Block.byId[this.getTypeId(k1, l1, i2)]; if (block != null && block.material == material) { - double d0 = (double) ((float) (l1 + 1) - BlockFluids.d(this.getData(k1, l1, i2))); + double d0 = (double) ((float) (l1 + 1) - BlockFluids.e(this.getData(k1, l1, i2))); if ((double) l >= d0) { flag = true; @@ -1702,7 +1703,7 @@ public abstract class World implements IBlockAccess { public void setTileEntity(int i, int j, int k, TileEntity tileentity) { if (tileentity != null && !tileentity.r()) { - if (this.N) { + if (this.M) { tileentity.x = i; tileentity.y = j; tileentity.z = k; @@ -1721,7 +1722,7 @@ public abstract class World implements IBlockAccess { public void r(int i, int j, int k) { TileEntity tileentity = this.getTileEntity(i, j, k); - if (tileentity != null && this.N) { + if (tileentity != null && this.M) { tileentity.w_(); this.a.remove(tileentity); } else { @@ -1814,10 +1815,6 @@ public abstract class World implements IBlockAccess { protected void n() { if (!this.worldProvider.f) { - if (this.q > 0) { - --this.q; - } - int i = this.worldData.getThunderDuration(); if (i <= 0) { @@ -1929,8 +1926,8 @@ public abstract class World implements IBlockAccess { } this.methodProfiler.b(); - if (this.O > 0) { - --this.O; + if (this.N > 0) { + --this.N; } this.methodProfiler.a("playerCheckLight"); @@ -1949,7 +1946,7 @@ public abstract class World implements IBlockAccess { protected void a(int i, int j, Chunk chunk) { this.methodProfiler.c("moodSound"); - if (this.O == 0 && !this.isStatic) { + if (this.N == 0 && !this.isStatic) { this.k = this.k * 3 + 1013904223; int k = this.k >> 2; int l = k & 15; @@ -1964,7 +1961,7 @@ public abstract class World implements IBlockAccess { if (entityhuman != null && entityhuman.e((double) l + 0.5D, (double) j1 + 0.5D, (double) i1 + 0.5D) > 4.0D) { this.makeSound((double) l + 0.5D, (double) j1 + 0.5D, (double) i1 + 0.5D, "ambient.cave.cave", 0.7F, 0.8F + this.random.nextFloat() * 0.2F); - this.O = this.random.nextInt(12000) + 6000; + this.N = this.random.nextInt(12000) + 6000; } } } @@ -2171,16 +2168,16 @@ public abstract class World implements IBlockAccess { int i4; if (i2 > j1) { - this.I[i1++] = 133152; + this.H[i1++] = 133152; } else if (i2 < j1) { if (enumskyblock != EnumSkyBlock.BLOCK) { ; } - this.I[i1++] = 133152 + (j1 << 18); + this.H[i1++] = 133152 + (j1 << 18); while (l < i1) { - k1 = this.I[l++]; + k1 = this.H[l++]; l1 = (k1 & 63) - 32 + i; i2 = (k1 >> 6 & 63) - 32 + j; j2 = (k1 >> 12 & 63) - 32 + k; @@ -2218,8 +2215,8 @@ public abstract class World implements IBlockAccess { i5 = 1; } - if (l2 == k2 - i5 && i1 < this.I.length) { - this.I[i1++] = j4 - i + 32 + (k4 - j + 32 << 6) + (l4 - k + 32 << 12) + (k2 - i5 << 18); + if (l2 == k2 - i5 && i1 < this.H.length) { + this.H[i1++] = j4 - i + 32 + (k4 - j + 32 << 6) + (l4 - k + 32 << 12) + (k2 - i5 << 18); } } } @@ -2234,7 +2231,7 @@ public abstract class World implements IBlockAccess { this.methodProfiler.a("checkedPosition < toCheckCount"); while (l < i1) { - k1 = this.I[l++]; + k1 = this.H[l++]; l1 = (k1 & 63) - 32 + i; i2 = (k1 >> 6 & 63) - 32 + j; j2 = (k1 >> 12 & 63) - 32 + k; @@ -2271,29 +2268,29 @@ public abstract class World implements IBlockAccess { l3 = -l3; } - if (j3 + i4 + l3 < 17 && i1 < this.I.length - 6) { + if (j3 + i4 + l3 < 17 && i1 < this.H.length - 6) { if (this.b(enumskyblock, l1 - 1, i2, j2) < k3) { - this.I[i1++] = l1 - 1 - i + 32 + (i2 - j + 32 << 6) + (j2 - k + 32 << 12); + this.H[i1++] = l1 - 1 - i + 32 + (i2 - j + 32 << 6) + (j2 - k + 32 << 12); } if (this.b(enumskyblock, l1 + 1, i2, j2) < k3) { - this.I[i1++] = l1 + 1 - i + 32 + (i2 - j + 32 << 6) + (j2 - k + 32 << 12); + this.H[i1++] = l1 + 1 - i + 32 + (i2 - j + 32 << 6) + (j2 - k + 32 << 12); } if (this.b(enumskyblock, l1, i2 - 1, j2) < k3) { - this.I[i1++] = l1 - i + 32 + (i2 - 1 - j + 32 << 6) + (j2 - k + 32 << 12); + this.H[i1++] = l1 - i + 32 + (i2 - 1 - j + 32 << 6) + (j2 - k + 32 << 12); } if (this.b(enumskyblock, l1, i2 + 1, j2) < k3) { - this.I[i1++] = l1 - i + 32 + (i2 + 1 - j + 32 << 6) + (j2 - k + 32 << 12); + this.H[i1++] = l1 - i + 32 + (i2 + 1 - j + 32 << 6) + (j2 - k + 32 << 12); } if (this.b(enumskyblock, l1, i2, j2 - 1) < k3) { - this.I[i1++] = l1 - i + 32 + (i2 - j + 32 << 6) + (j2 - 1 - k + 32 << 12); + this.H[i1++] = l1 - i + 32 + (i2 - j + 32 << 6) + (j2 - 1 - k + 32 << 12); } if (this.b(enumskyblock, l1, i2, j2 + 1) < k3) { - this.I[i1++] = l1 - i + 32 + (i2 - j + 32 << 6) + (j2 + 1 - k + 32 << 12); + this.H[i1++] = l1 - i + 32 + (i2 - j + 32 << 6) + (j2 + 1 - k + 32 << 12); } } } @@ -2313,7 +2310,7 @@ public abstract class World implements IBlockAccess { } public List getEntities(Entity entity, AxisAlignedBB axisalignedbb) { - this.P.clear(); + this.O.clear(); int i = MathHelper.floor((axisalignedbb.a - 2.0D) / 16.0D); int j = MathHelper.floor((axisalignedbb.d + 2.0D) / 16.0D); int k = MathHelper.floor((axisalignedbb.c - 2.0D) / 16.0D); @@ -2322,12 +2319,12 @@ public abstract class World implements IBlockAccess { for (int i1 = i; i1 <= j; ++i1) { for (int j1 = k; j1 <= l; ++j1) { if (this.isChunkLoaded(i1, j1)) { - this.getChunkAt(i1, j1).a(entity, axisalignedbb, this.P); + this.getChunkAt(i1, j1).a(entity, axisalignedbb, this.O); } } } - return this.P; + return this.O; } public List a(Class oclass, AxisAlignedBB axisalignedbb) { @@ -2548,7 +2545,7 @@ public abstract class World implements IBlockAccess { } // CraftBukkit end - if (!entityhuman1.abilities.isInvulnerable) { + if (!entityhuman1.abilities.isInvulnerable && entityhuman1.isAlive()) { double d5 = entityhuman1.e(d0, d1, d2); double d6 = d3; @@ -2557,7 +2554,7 @@ public abstract class World implements IBlockAccess { } if (entityhuman1.isInvisible()) { - float f = entityhuman1.bS(); + float f = entityhuman1.bR(); if (f < 0.1F) { f = 0.1F; @@ -2699,8 +2696,8 @@ public abstract class World implements IBlockAccess { } public void e(int i, int j, int k, int l, int i1) { - for (int j1 = 0; j1 < this.w.size(); ++j1) { - ((IWorldAccess) this.w.get(j1)).a(i, j, k, l, i1); + for (int j1 = 0; j1 < this.v.size(); ++j1) { + ((IWorldAccess) this.v.get(j1)).a(i, j, k, l, i1); } } @@ -2709,8 +2706,19 @@ public abstract class World implements IBlockAccess { } public void a(EntityHuman entityhuman, int i, int j, int k, int l, int i1) { - for (int j1 = 0; j1 < this.w.size(); ++j1) { - ((IWorldAccess) this.w.get(j1)).a(entityhuman, i, j, k, l, i1); + try { + for (int j1 = 0; j1 < this.v.size(); ++j1) { + ((IWorldAccess) this.v.get(j1)).a(entityhuman, i, j, k, l, i1); + } + } catch (Throwable throwable) { + CrashReport crashreport = CrashReport.a(throwable, "Playing level event"); + CrashReportSystemDetails crashreportsystemdetails = crashreport.a("Level event being played"); + + crashreportsystemdetails.a("Block coordinates", CrashReportSystemDetails.a(j, k, l)); + crashreportsystemdetails.a("Event source", entityhuman); + crashreportsystemdetails.a("Event type", Integer.valueOf(i)); + crashreportsystemdetails.a("Event data", Integer.valueOf(i1)); + throw new ReportedException(crashreport); } } @@ -2754,22 +2762,22 @@ public abstract class World implements IBlockAccess { } public void g(int i, int j, int k, int l, int i1) { - for (int j1 = 0; j1 < this.w.size(); ++j1) { - IWorldAccess iworldaccess = (IWorldAccess) this.w.get(j1); + for (int j1 = 0; j1 < this.v.size(); ++j1) { + IWorldAccess iworldaccess = (IWorldAccess) this.v.get(j1); iworldaccess.b(i, j, k, l, i1); } } public Vec3DPool getVec3DPool() { - return this.K; + return this.J; } public Calendar T() { if (this.getTime() % 600L == 0L) { - this.L.setTimeInMillis(System.currentTimeMillis()); + this.K.setTimeInMillis(System.currentTimeMillis()); } - return this.L; + return this.K; } } diff --git a/src/main/java/net/minecraft/server/WorldManager.java b/src/main/java/net/minecraft/server/WorldManager.java index 34104a1e..d1a02e6b 100644 --- a/src/main/java/net/minecraft/server/WorldManager.java +++ b/src/main/java/net/minecraft/server/WorldManager.java @@ -24,18 +24,18 @@ public class WorldManager implements IWorldAccess { public void a(String s, double d0, double d1, double d2, float f, float f1) { // CraftBukkit - this.world.dimension - this.server.getServerConfigurationManager().sendPacketNearby(d0, d1, d2, f > 1.0F ? (double) (16.0F * f) : 16.0D, this.world.dimension, new Packet62NamedSoundEffect(s, d0, d1, d2, f, f1)); + this.server.getPlayerList().sendPacketNearby(d0, d1, d2, f > 1.0F ? (double) (16.0F * f) : 16.0D, this.world.dimension, new Packet62NamedSoundEffect(s, d0, d1, d2, f, f1)); } public void a(EntityHuman entityhuman, String s, double d0, double d1, double d2, float f, float f1) { // CraftBukkit - this.world.dimension - this.server.getServerConfigurationManager().sendPacketNearby(entityhuman, d0, d1, d2, f > 1.0F ? (double) (16.0F * f) : 16.0D, this.world.dimension, new Packet62NamedSoundEffect(s, d0, d1, d2, f, f1)); + this.server.getPlayerList().sendPacketNearby(entityhuman, d0, d1, d2, f > 1.0F ? (double) (16.0F * f) : 16.0D, this.world.dimension, new Packet62NamedSoundEffect(s, d0, d1, d2, f, f1)); } public void a(int i, int j, int k, int l, int i1, int j1) {} public void a(int i, int j, int k) { - this.world.getPlayerManager().flagDirty(i, j, k); + this.world.getPlayerChunkMap().flagDirty(i, j, k); } public void b(int i, int j, int k) {} @@ -44,15 +44,15 @@ public class WorldManager implements IWorldAccess { public void a(EntityHuman entityhuman, int i, int j, int k, int l, int i1) { // CraftBukkit - this.world.dimension - this.server.getServerConfigurationManager().sendPacketNearby(entityhuman, (double) j, (double) k, (double) l, 64.0D, this.world.dimension, new Packet61WorldEvent(i, j, k, l, i1, false)); + this.server.getPlayerList().sendPacketNearby(entityhuman, (double) j, (double) k, (double) l, 64.0D, this.world.dimension, new Packet61WorldEvent(i, j, k, l, i1, false)); } public void a(int i, int j, int k, int l, int i1) { - this.server.getServerConfigurationManager().sendAll(new Packet61WorldEvent(i, j, k, l, i1, true)); + this.server.getPlayerList().sendAll(new Packet61WorldEvent(i, j, k, l, i1, true)); } public void b(int i, int j, int k, int l, int i1) { - Iterator iterator = this.server.getServerConfigurationManager().players.iterator(); + Iterator iterator = this.server.getPlayerList().players.iterator(); while (iterator.hasNext()) { EntityPlayer entityplayer = (EntityPlayer) iterator.next(); @@ -63,7 +63,7 @@ public class WorldManager implements IWorldAccess { double d2 = (double) l - entityplayer.locZ; if (d0 * d0 + d1 * d1 + d2 * d2 < 1024.0D) { - entityplayer.netServerHandler.sendPacket(new Packet55BlockBreakAnimation(i, j, k, l, i1)); + entityplayer.playerConnection.sendPacket(new Packet55BlockBreakAnimation(i, j, k, l, i1)); } } } diff --git a/src/main/java/net/minecraft/server/WorldServer.java b/src/main/java/net/minecraft/server/WorldServer.java index 02982bae..48fdcab5 100644 --- a/src/main/java/net/minecraft/server/WorldServer.java +++ b/src/main/java/net/minecraft/server/WorldServer.java @@ -23,17 +23,17 @@ public class WorldServer extends World implements org.bukkit.BlockChangeDelegate private final MinecraftServer server; public EntityTracker tracker; // CraftBukkit - private final -> public - private final PlayerManager manager; - private Set M; - private TreeSet N; + private final PlayerChunkMap manager; + private Set L; + private TreeSet M; public ChunkProviderServer chunkProviderServer; public boolean savingDisabled; - private boolean O; + private boolean N; private int emptyTime = 0; - private final PortalTravelAgent Q; - private NoteDataList[] R = new NoteDataList[] { new NoteDataList((EmptyClass2) null), new NoteDataList((EmptyClass2) null)}; - private int S = 0; - private static final StructurePieceTreasure[] T = new StructurePieceTreasure[] { new StructurePieceTreasure(Item.STICK.id, 0, 1, 3, 10), new StructurePieceTreasure(Block.WOOD.id, 0, 1, 3, 10), new StructurePieceTreasure(Block.LOG.id, 0, 1, 3, 10), new StructurePieceTreasure(Item.STONE_AXE.id, 0, 1, 1, 3), new StructurePieceTreasure(Item.WOOD_AXE.id, 0, 1, 1, 5), new StructurePieceTreasure(Item.STONE_PICKAXE.id, 0, 1, 1, 3), new StructurePieceTreasure(Item.WOOD_PICKAXE.id, 0, 1, 1, 5), new StructurePieceTreasure(Item.APPLE.id, 0, 2, 3, 5), new StructurePieceTreasure(Item.BREAD.id, 0, 2, 3, 3)}; + private final PortalTravelAgent P; + private NoteDataList[] Q = new NoteDataList[] { new NoteDataList((EmptyClass2) null), new NoteDataList((EmptyClass2) null)}; + private int R = 0; + private static final StructurePieceTreasure[] S = new StructurePieceTreasure[] { new StructurePieceTreasure(Item.STICK.id, 0, 1, 3, 10), new StructurePieceTreasure(Block.WOOD.id, 0, 1, 3, 10), new StructurePieceTreasure(Block.LOG.id, 0, 1, 3, 10), new StructurePieceTreasure(Item.STONE_AXE.id, 0, 1, 1, 3), new StructurePieceTreasure(Item.WOOD_AXE.id, 0, 1, 1, 5), new StructurePieceTreasure(Item.STONE_PICKAXE.id, 0, 1, 1, 3), new StructurePieceTreasure(Item.WOOD_PICKAXE.id, 0, 1, 1, 5), new StructurePieceTreasure(Item.APPLE.id, 0, 2, 3, 5), new StructurePieceTreasure(Item.BREAD.id, 0, 2, 3, 3)}; private IntHashMap entitiesById; // CraftBukkit start @@ -46,20 +46,20 @@ public class WorldServer extends World implements org.bukkit.BlockChangeDelegate // CraftBukkit end this.server = minecraftserver; this.tracker = new EntityTracker(this); - this.manager = new PlayerManager(this, minecraftserver.getServerConfigurationManager().o()); + this.manager = new PlayerChunkMap(this, minecraftserver.getPlayerList().o()); if (this.entitiesById == null) { this.entitiesById = new IntHashMap(); } - if (this.M == null) { - this.M = new HashSet(); + if (this.L == null) { + this.L = new HashSet(); } - if (this.N == null) { - this.N = new TreeSet(); + if (this.M == null) { + this.M = new TreeSet(); } - this.Q = new PortalTravelAgent(this); + this.P = new PortalTravelAgent(this); } // CraftBukkit start @@ -178,7 +178,7 @@ public class WorldServer extends World implements org.bukkit.BlockChangeDelegate this.villages.tick(); this.siegeManager.a(); this.methodProfiler.c("portalForcer"); - this.Q.a(this.getTime()); + this.P.a(this.getTime()); this.methodProfiler.b(); this.V(); } @@ -190,21 +190,21 @@ public class WorldServer extends World implements org.bukkit.BlockChangeDelegate } public void everyoneSleeping() { - this.O = !this.players.isEmpty(); + this.N = !this.players.isEmpty(); Iterator iterator = this.players.iterator(); while (iterator.hasNext()) { EntityHuman entityhuman = (EntityHuman) iterator.next(); if (!entityhuman.isSleeping() && !entityhuman.fauxSleeping) { // CraftBukkit - this.O = false; + this.N = false; break; } } } protected void d() { - this.O = false; + this.N = false; Iterator iterator = this.players.iterator(); while (iterator.hasNext()) { @@ -237,7 +237,7 @@ public class WorldServer extends World implements org.bukkit.BlockChangeDelegate } public boolean everyoneDeeplySleeping() { - if (this.O && !this.isStatic) { + if (this.N && !this.isStatic) { Iterator iterator = this.players.iterator(); // CraftBukkit - This allows us to assume that some people are in bed but not really, allowing time to pass in spite of AFKers @@ -299,7 +299,6 @@ public class WorldServer extends World implements org.bukkit.BlockChangeDelegate l1 = this.h(j1, k1); if (this.D(j1, l1, k1)) { this.strikeLightning(new EntityLightning(this, (double) j1, (double) l1, (double) k1)); - this.q = 2; } } @@ -412,9 +411,9 @@ public class WorldServer extends World implements org.bukkit.BlockChangeDelegate nextticklistentry.a(j1); } - if (!this.M.contains(nextticklistentry)) { + if (!this.L.contains(nextticklistentry)) { + this.L.add(nextticklistentry); this.M.add(nextticklistentry); - this.N.add(nextticklistentry); } } } @@ -426,9 +425,9 @@ public class WorldServer extends World implements org.bukkit.BlockChangeDelegate nextticklistentry.a((long) i1 + this.worldData.getTime()); } - if (!this.M.contains(nextticklistentry)) { + if (!this.L.contains(nextticklistentry)) { + this.L.add(nextticklistentry); this.M.add(nextticklistentry); - this.N.add(nextticklistentry); } } @@ -449,9 +448,9 @@ public class WorldServer extends World implements org.bukkit.BlockChangeDelegate } public boolean a(boolean flag) { - int i = this.N.size(); + int i = this.M.size(); - if (i != this.M.size()) { + if (i != this.L.size()) { throw new IllegalStateException("TickNextTick list out of synch"); } else { if (i > 1000) { @@ -465,14 +464,14 @@ public class WorldServer extends World implements org.bukkit.BlockChangeDelegate } for (int j = 0; j < i; ++j) { - NextTickListEntry nextticklistentry = (NextTickListEntry) this.N.first(); + NextTickListEntry nextticklistentry = (NextTickListEntry) this.M.first(); if (!flag && nextticklistentry.e > this.worldData.getTime()) { break; } - this.N.remove(nextticklistentry); this.M.remove(nextticklistentry); + this.L.remove(nextticklistentry); byte b0 = 8; if (this.d(nextticklistentry.a - b0, nextticklistentry.b - b0, nextticklistentry.c - b0, nextticklistentry.a + b0, nextticklistentry.b + b0, nextticklistentry.c + b0)) { @@ -495,11 +494,12 @@ public class WorldServer extends World implements org.bukkit.BlockChangeDelegate CrashReportSystemDetails.a(crashreportsystemdetails, nextticklistentry.a, nextticklistentry.b, nextticklistentry.c, k, l); throw new ReportedException(crashreport); - } } + } + } } } - return !this.N.isEmpty(); + return !this.M.isEmpty(); } } @@ -510,14 +510,14 @@ public class WorldServer extends World implements org.bukkit.BlockChangeDelegate int j = i + 16; int k = chunkcoordintpair.z << 4; int l = k + 16; - Iterator iterator = this.N.iterator(); + Iterator iterator = this.M.iterator(); while (iterator.hasNext()) { NextTickListEntry nextticklistentry = (NextTickListEntry) iterator.next(); if (nextticklistentry.a >= i && nextticklistentry.a < j && nextticklistentry.c >= k && nextticklistentry.c < l) { if (flag) { - this.M.remove(nextticklistentry); + this.L.remove(nextticklistentry); iterator.remove(); } @@ -599,7 +599,7 @@ public class WorldServer extends World implements org.bukkit.BlockChangeDelegate } // CraftBukkit - Configurable spawn protection - return i1 > this.getServer().getSpawnRadius() || this.server.getServerConfigurationManager().isOp(entityhuman.name) || this.server.I(); + return i1 > this.getServer().getSpawnRadius() || this.server.getPlayerList().isOp(entityhuman.name) || this.server.I(); } protected void a(WorldSettings worldsettings) { @@ -607,12 +607,12 @@ public class WorldServer extends World implements org.bukkit.BlockChangeDelegate this.entitiesById = new IntHashMap(); } - if (this.M == null) { - this.M = new HashSet(); + if (this.L == null) { + this.L = new HashSet(); } - if (this.N == null) { - this.N = new TreeSet(); + if (this.M == null) { + this.M = new TreeSet(); } this.b(worldsettings); @@ -676,7 +676,7 @@ public class WorldServer extends World implements org.bukkit.BlockChangeDelegate } protected void k() { - WorldGenBonusChest worldgenbonuschest = new WorldGenBonusChest(T, 10); + WorldGenBonusChest worldgenbonuschest = new WorldGenBonusChest(S, 10); for (int i = 0; i < 10; ++i) { int j = this.worldData.c() + this.random.nextInt(6) - this.random.nextInt(6); @@ -710,7 +710,7 @@ public class WorldServer extends World implements org.bukkit.BlockChangeDelegate protected void a() throws ExceptionWorldConflict { // CraftBukkit - added throws this.D(); - this.dataManager.saveWorldData(this.worldData, this.server.getServerConfigurationManager().q()); + this.dataManager.saveWorldData(this.worldData, this.server.getPlayerList().q()); this.worldMaps.a(); } @@ -752,7 +752,7 @@ public class WorldServer extends World implements org.bukkit.BlockChangeDelegate } if (super.strikeLightning(entity)) { - this.server.getServerConfigurationManager().sendPacketNearby(entity.locX, entity.locY, entity.locZ, 512.0D, this.dimension, new Packet71Weather(entity)); + this.server.getPlayerList().sendPacketNearby(entity.locX, entity.locY, entity.locZ, 512.0D, this.dimension, new Packet71Weather(entity)); // CraftBukkit end return true; } else { @@ -792,7 +792,7 @@ public class WorldServer extends World implements org.bukkit.BlockChangeDelegate EntityHuman entityhuman = (EntityHuman) iterator.next(); if (entityhuman.e(d0, d1, d2) < 4096.0D) { - ((EntityPlayer) entityhuman).netServerHandler.sendPacket(new Packet60Explosion(d0, d1, d2, f, explosion.blocks, (Vec3D) explosion.b().get(entityhuman))); + ((EntityPlayer) entityhuman).playerConnection.sendPacket(new Packet60Explosion(d0, d1, d2, f, explosion.blocks, (Vec3D) explosion.b().get(entityhuman))); } } @@ -801,13 +801,13 @@ public class WorldServer extends World implements org.bukkit.BlockChangeDelegate public void playNote(int i, int j, int k, int l, int i1, int j1) { NoteBlockData noteblockdata = new NoteBlockData(i, j, k, l, i1, j1); - Iterator iterator = this.R[this.S].iterator(); + Iterator iterator = this.Q[this.R].iterator(); NoteBlockData noteblockdata1; do { if (!iterator.hasNext()) { - this.R[this.S].add(noteblockdata); + this.Q[this.R].add(noteblockdata); return; } @@ -817,22 +817,22 @@ public class WorldServer extends World implements org.bukkit.BlockChangeDelegate } private void V() { - while (!this.R[this.S].isEmpty()) { - int i = this.S; + while (!this.Q[this.R].isEmpty()) { + int i = this.R; - this.S ^= 1; - Iterator iterator = this.R[i].iterator(); + this.R ^= 1; + Iterator iterator = this.Q[i].iterator(); while (iterator.hasNext()) { NoteBlockData noteblockdata = (NoteBlockData) iterator.next(); if (this.a(noteblockdata)) { // CraftBukkit - this.worldProvider.dimension -> this.dimension - this.server.getServerConfigurationManager().sendPacketNearby((double) noteblockdata.a(), (double) noteblockdata.b(), (double) noteblockdata.c(), 64.0D, this.dimension, new Packet54PlayNoteBlock(noteblockdata.a(), noteblockdata.b(), noteblockdata.c(), noteblockdata.f(), noteblockdata.d(), noteblockdata.e())); + this.server.getPlayerList().sendPacketNearby((double) noteblockdata.a(), (double) noteblockdata.b(), (double) noteblockdata.c(), 64.0D, this.dimension, new Packet54PlayNoteBlock(noteblockdata.a(), noteblockdata.b(), noteblockdata.c(), noteblockdata.f(), noteblockdata.d(), noteblockdata.e())); } } - this.R[i].clear(); + this.Q[i].clear(); } } @@ -859,7 +859,7 @@ public class WorldServer extends World implements org.bukkit.BlockChangeDelegate // CraftBukkit start - only sending weather packets to those affected for (int i = 0; i < this.players.size(); ++i) { if (((EntityPlayer) this.players.get(i)).world == this) { - ((EntityPlayer) this.players.get(i)).netServerHandler.sendPacket(new Packet70Bed(flag ? 2 : 1, 0)); + ((EntityPlayer) this.players.get(i)).playerConnection.sendPacket(new Packet70Bed(flag ? 2 : 1, 0)); } } // CraftBukkit end @@ -874,11 +874,11 @@ public class WorldServer extends World implements org.bukkit.BlockChangeDelegate return this.tracker; } - public PlayerManager getPlayerManager() { + public PlayerChunkMap getPlayerChunkMap() { return this.manager; } public PortalTravelAgent s() { - return this.Q; + return this.P; } } diff --git a/src/main/java/org/bukkit/craftbukkit/CraftOfflinePlayer.java b/src/main/java/org/bukkit/craftbukkit/CraftOfflinePlayer.java index d35c0fad..c43773df 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftOfflinePlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftOfflinePlayer.java @@ -106,7 +106,7 @@ public class CraftOfflinePlayer implements OfflinePlayer, ConfigurationSerializa for (Object obj : server.getHandle().players) { EntityPlayer player = (EntityPlayer) obj; if (player.name.equalsIgnoreCase(getName())) { - return (player.netServerHandler != null) ? player.netServerHandler.getPlayer() : null; + return (player.playerConnection != null) ? player.playerConnection.getPlayer() : null; } } diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java index 6f957c53..9642959f 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java @@ -23,12 +23,14 @@ import net.minecraft.server.ChunkCoordinates; import net.minecraft.server.Convertable; import net.minecraft.server.ConvertProgressUpdater; import net.minecraft.server.CraftingManager; +import net.minecraft.server.DedicatedPlayerList; import net.minecraft.server.DedicatedServer; import net.minecraft.server.Enchantment; import net.minecraft.server.EntityPlayer; import net.minecraft.server.EntityTracker; import net.minecraft.server.EnumGamemode; import net.minecraft.server.ExceptionWorldConflict; +import net.minecraft.server.PlayerList; import net.minecraft.server.RecipesFurnace; import net.minecraft.server.IProgressUpdate; import net.minecraft.server.IWorldAccess; @@ -37,8 +39,6 @@ import net.minecraft.server.MinecraftServer; import net.minecraft.server.MobEffectList; import net.minecraft.server.PropertyManager; import net.minecraft.server.ServerCommand; -import net.minecraft.server.ServerConfigurationManager; -import net.minecraft.server.ServerConfigurationManagerAbstract; import net.minecraft.server.ServerNBTManager; import net.minecraft.server.WorldLoaderServer; import net.minecraft.server.WorldManager; @@ -144,7 +144,7 @@ public final class CraftServer implements Server { private final StandardMessenger messenger = new StandardMessenger(); private final PluginManager pluginManager = new SimplePluginManager(this, commandMap); protected final MinecraftServer console; - protected final ServerConfigurationManager server; + protected final DedicatedPlayerList playerList; private final Map worlds = new LinkedHashMap(); private YamlConfiguration configuration; private final Yaml yaml = new Yaml(new SafeConstructor()); @@ -159,16 +159,22 @@ public final class CraftServer implements Server { private int ambientSpawn = -1; private File container; private WarningState warningState = WarningState.DEFAULT; + private final BooleanWrapper online = new BooleanWrapper(); + + private final class BooleanWrapper { + private boolean value = true; + } static { ConfigurationSerialization.registerClass(CraftOfflinePlayer.class); CraftItemFactory.instance(); } - public CraftServer(MinecraftServer console, ServerConfigurationManagerAbstract server) { + public CraftServer(MinecraftServer console, PlayerList playerList) { this.console = console; - this.server = (ServerConfigurationManager) server; + this.playerList = (DedicatedPlayerList) playerList; this.serverVersion = CraftServer.class.getPackage().getImplementationVersion(); + online.value = console.getPropertyManager().getBoolean("online-mode", true); Bukkit.setServer(this); @@ -299,11 +305,11 @@ public final class CraftServer implements Server { @SuppressWarnings("unchecked") public Player[] getOnlinePlayers() { - List online = server.players; + List online = playerList.players; Player[] players = new Player[online.size()]; for (int i = 0; i < players.length; i++) { - players[i] = online.get(i).netServerHandler.getPlayer(); + players[i] = online.get(i).playerConnection.getPlayer(); } return players; @@ -345,7 +351,7 @@ public final class CraftServer implements Server { } public Player getPlayer(final EntityPlayer entity) { - return entity.netServerHandler.getPlayer(); + return entity.playerConnection.getPlayer(); } public List matchPlayer(String partialName) { @@ -370,7 +376,7 @@ public final class CraftServer implements Server { } public int getMaxPlayers() { - return server.getMaxPlayers(); + return playerList.getMaxPlayers(); } // NOTE: These are dependent on the corrisponding call in MinecraftServer @@ -478,8 +484,8 @@ public final class CraftServer implements Server { return new ArrayList(worlds.values()); } - public ServerConfigurationManager getHandle() { - return server; + public DedicatedPlayerList getHandle() { + return playerList; } // NOTE: Should only be called from DedicatedServer.ah() @@ -520,7 +526,7 @@ public final class CraftServer implements Server { boolean monsters = config.getBoolean("spawn-monsters", console.worlds.get(0).difficulty > 0); int difficulty = config.getInt("difficulty", console.worlds.get(0).difficulty); - console.setOnlineMode(config.getBoolean("online-mode", console.getOnlineMode())); + online.value = config.getBoolean("online-mode", console.getOnlineMode()); console.setSpawnAnimals(config.getBoolean("spawn-animals", console.getSpawnAnimals())); console.setPvP(config.getBoolean("pvp", console.getPvP())); console.setAllowFlight(config.getBoolean("allow-flight", console.getAllowFlight())); @@ -833,7 +839,7 @@ public final class CraftServer implements Server { } public void savePlayers() { - server.savePlayers(); + playerList.savePlayers(); } public void configureDbConfig(ServerConfig config) { @@ -946,7 +952,7 @@ public final class CraftServer implements Server { } public boolean getOnlineMode() { - return console.getOnlineMode(); + return online.value; } public boolean getAllowFlight() { @@ -1059,24 +1065,24 @@ public final class CraftServer implements Server { @SuppressWarnings("unchecked") public Set getIPBans() { - return server.getIPBans().getEntries().keySet(); + return playerList.getIPBans().getEntries().keySet(); } public void banIP(String address) { BanEntry entry = new BanEntry(address); - server.getIPBans().add(entry); - server.getIPBans().save(); + playerList.getIPBans().add(entry); + playerList.getIPBans().save(); } public void unbanIP(String address) { - server.getIPBans().remove(address); - server.getIPBans().save(); + playerList.getIPBans().remove(address); + playerList.getIPBans().save(); } public Set getBannedPlayers() { Set result = new HashSet(); - for (Object name : server.getNameBans().getEntries().keySet()) { + for (Object name : playerList.getNameBans().getEntries().keySet()) { result.add(getOfflinePlayer((String) name)); } @@ -1084,14 +1090,14 @@ public final class CraftServer implements Server { } public void setWhitelist(boolean value) { - server.hasWhitelist = value; + playerList.hasWhitelist = value; console.getPropertyManager().a("white-list", value); } public Set getWhitelistedPlayers() { Set result = new LinkedHashSet(); - for (Object name : server.getWhitelisted()) { + for (Object name : playerList.getWhitelisted()) { if (((String)name).length() == 0 || ((String)name).startsWith("#")) { continue; } @@ -1104,7 +1110,7 @@ public final class CraftServer implements Server { public Set getOperators() { Set result = new HashSet(); - for (Object name : server.getOPs()) { + for (Object name : playerList.getOPs()) { result.add(getOfflinePlayer((String) name)); } @@ -1112,7 +1118,7 @@ public final class CraftServer implements Server { } public void reloadWhitelist() { - server.reloadWhitelist(); + playerList.reloadWhitelist(); } public GameMode getDefaultGameMode() { diff --git a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java index 19d891d7..2b81286e 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java @@ -222,7 +222,7 @@ public class CraftWorld implements World { } public boolean isChunkInUse(int x, int z) { - return world.getPlayerManager().isChunkInUse(x, z); + return world.getPlayerChunkMap().isChunkInUse(x, z); } public boolean loadChunk(int x, int z, boolean generate) { @@ -430,9 +430,9 @@ public class CraftWorld implements World { // Forces the client to update to the new time immediately for (Player p : getPlayers()) { CraftPlayer cp = (CraftPlayer) p; - if (cp.getHandle().netServerHandler == null) continue; + if (cp.getHandle().playerConnection == null) continue; - cp.getHandle().netServerHandler.sendPacket(new Packet4UpdateTime(cp.getHandle().world.getTime(), cp.getHandle().getPlayerTime())); + cp.getHandle().playerConnection.sendPacket(new Packet4UpdateTime(cp.getHandle().world.getTime(), cp.getHandle().getPlayerTime())); } } @@ -767,12 +767,12 @@ public class CraftWorld implements World { radius *= radius; for (Player player : getPlayers()) { - if (((CraftPlayer) player).getHandle().netServerHandler == null) continue; + if (((CraftPlayer) player).getHandle().playerConnection == null) continue; if (!location.getWorld().equals(player.getWorld())) continue; distance = (int) player.getLocation().distanceSquared(location); if (distance <= radius) { - ((CraftPlayer) player).getHandle().netServerHandler.sendPacket(packet); + ((CraftPlayer) player).getHandle().playerConnection.sendPacket(packet); } } } diff --git a/src/main/java/org/bukkit/craftbukkit/enchantments/CraftEnchantment.java b/src/main/java/org/bukkit/craftbukkit/enchantments/CraftEnchantment.java index e40c00a8..a6245248 100644 --- a/src/main/java/org/bukkit/craftbukkit/enchantments/CraftEnchantment.java +++ b/src/main/java/org/bukkit/craftbukkit/enchantments/CraftEnchantment.java @@ -72,6 +72,8 @@ public class CraftEnchantment extends Enchantment { return "OXYGEN"; case 6: return "WATER_WORKER"; + case 7: + return "THORNS"; case 16: return "DAMAGE_ALL"; case 17: diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java index 503c8a9a..1a0d2faa 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java @@ -148,6 +148,7 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { else { return new CraftHanging(server, (EntityHanging) entity); } } else if (entity instanceof EntityTNTPrimed) { return new CraftTNTPrimed(server, (EntityTNTPrimed) entity); } + else if (entity instanceof EntityFireworks) { return new CraftFirework(server, (EntityFireworks) entity); } throw new IllegalArgumentException("Unknown entity"); } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftFirework.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftFirework.java new file mode 100644 index 00000000..78e5baa1 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftFirework.java @@ -0,0 +1,28 @@ +package org.bukkit.craftbukkit.entity; + +import net.minecraft.server.EntityFireworks; + +import org.bukkit.craftbukkit.CraftServer; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Firework; + +public class CraftFirework extends CraftEntity implements Firework { + + public CraftFirework(CraftServer server, EntityFireworks entity) { + super(server, entity); + } + + @Override + public EntityFireworks getHandle() { + return (EntityFireworks) entity; + } + + @Override + public String toString() { + return "CraftFirework"; + } + + public EntityType getType() { + return EntityType.FIREWORK; + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java index c4bd959a..9068a454 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java @@ -229,7 +229,7 @@ public class CraftHumanEntity extends CraftLivingEntity implements HumanEntity { } private void openCustomInventory(Inventory inventory, EntityPlayer player, int windowType) { - if (player.netServerHandler == null) return; + if (player.playerConnection == null) return; Container container = new CraftContainer(inventory, this, player.nextContainerCounter()); container = CraftEventFactory.callInventoryOpenEvent(player, container); @@ -238,7 +238,7 @@ public class CraftHumanEntity extends CraftLivingEntity implements HumanEntity { String title = container.getBukkitView().getTitle(); int size = container.getBukkitView().getTopInventory().getSize(); - player.netServerHandler.sendPacket(new Packet100OpenWindow(container.windowId, windowType, title, size)); + player.playerConnection.sendPacket(new Packet100OpenWindow(container.windowId, windowType, title, size)); getHandle().activeContainer = container; getHandle().activeContainer.addSlotListener(player); } @@ -279,10 +279,10 @@ public class CraftHumanEntity extends CraftLivingEntity implements HumanEntity { public void openInventory(InventoryView inventory) { if (!(getHandle() instanceof EntityPlayer)) return; // TODO: NPC support? - if (((EntityPlayer) getHandle()).netServerHandler == null) return; + if (((EntityPlayer) getHandle()).playerConnection == null) return; if (getHandle().activeContainer != getHandle().defaultContainer) { // fire INVENTORY_CLOSE if one already open - ((EntityPlayer)getHandle()).netServerHandler.handleContainerClose(new Packet101CloseWindow(getHandle().activeContainer.windowId)); + ((EntityPlayer)getHandle()).playerConnection.handleContainerClose(new Packet101CloseWindow(getHandle().activeContainer.windowId)); } EntityPlayer player = (EntityPlayer) getHandle(); Container container; @@ -303,7 +303,7 @@ public class CraftHumanEntity extends CraftLivingEntity implements HumanEntity { int windowType = CraftContainer.getNotchInventoryType(type); String title = inventory.getTitle(); int size = inventory.getTopInventory().getSize(); - player.netServerHandler.sendPacket(new Packet100OpenWindow(container.windowId, windowType, title, size)); + player.playerConnection.sendPacket(new Packet100OpenWindow(container.windowId, windowType, title, size)); player.activeContainer = container; player.activeContainer.addSlotListener(player); } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftItem.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftItem.java index 6bdfe3e7..02b32cfa 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftItem.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftItem.java @@ -22,11 +22,11 @@ public class CraftItem extends CraftEntity implements Item { } public ItemStack getItemStack() { - return CraftItemStack.asCraftMirror(item.itemStack); + return CraftItemStack.asCraftMirror(item.getItemStack()); } public void setItemStack(ItemStack stack) { - item.itemStack = CraftItemStack.asNMSCopy(stack); + item.setItemStack(CraftItemStack.asNMSCopy(stack)); } public int getPickupDelay() { diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java index eafce16f..ee41c37b 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java @@ -255,8 +255,8 @@ public class CraftLivingEntity extends CraftEntity implements LivingEntity { getHandle().effects.remove(type.getId()); getHandle().updateEffects = true; if (getHandle() instanceof EntityPlayer) { - if (((EntityPlayer) getHandle()).netServerHandler == null) return; - ((EntityPlayer) getHandle()).netServerHandler.sendPacket(new Packet42RemoveMobEffect(getHandle().id, new MobEffect(type.getId(), 0, 0))); + if (((EntityPlayer) getHandle()).playerConnection == null) return; + ((EntityPlayer) getHandle()).playerConnection.sendPacket(new Packet42RemoveMobEffect(getHandle().id, new MobEffect(type.getId(), 0, 0))); } } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java index 3c1ff730..750e9509 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java @@ -94,9 +94,9 @@ public class CraftPlayer extends CraftHumanEntity implements Player { } public InetSocketAddress getAddress() { - if (getHandle().netServerHandler == null) return null; + if (getHandle().playerConnection == null) return null; - SocketAddress addr = getHandle().netServerHandler.networkManager.getSocketAddress(); + SocketAddress addr = getHandle().playerConnection.networkManager.getSocketAddress(); if (addr instanceof InetSocketAddress) { return (InetSocketAddress) addr; } else { @@ -123,9 +123,9 @@ public class CraftPlayer extends CraftHumanEntity implements Player { } public void sendRawMessage(String message) { - if (getHandle().netServerHandler == null) return; + if (getHandle().playerConnection == null) return; - getHandle().netServerHandler.sendPacket(new Packet3Chat(message)); + getHandle().playerConnection.sendPacket(new Packet3Chat(message)); } public void sendMessage(String message) { @@ -181,11 +181,11 @@ public class CraftPlayer extends CraftHumanEntity implements Player { Packet201PlayerInfo packet = new Packet201PlayerInfo(name, true, getHandle().ping); for (int i = 0; i < server.getHandle().players.size(); ++i) { EntityPlayer entityplayer = (EntityPlayer) server.getHandle().players.get(i); - if (entityplayer.netServerHandler == null) continue; + if (entityplayer.playerConnection == null) continue; if (entityplayer.getBukkitEntity().canSee(this)) { - entityplayer.netServerHandler.sendPacket(oldpacket); - entityplayer.netServerHandler.sendPacket(packet); + entityplayer.playerConnection.sendPacket(oldpacket); + entityplayer.playerConnection.sendPacket(packet); } } } @@ -211,16 +211,16 @@ public class CraftPlayer extends CraftHumanEntity implements Player { } public void kickPlayer(String message) { - if (getHandle().netServerHandler == null) return; + if (getHandle().playerConnection == null) return; - getHandle().netServerHandler.disconnect(message == null ? "" : message); + getHandle().playerConnection.disconnect(message == null ? "" : message); } public void setCompassTarget(Location loc) { - if (getHandle().netServerHandler == null) return; + if (getHandle().playerConnection == null) return; // Do not directly assign here, from the packethandler we'll assign it. - getHandle().netServerHandler.sendPacket(new Packet6SpawnPosition(loc.getBlockX(), loc.getBlockY(), loc.getBlockZ())); + getHandle().playerConnection.sendPacket(new Packet6SpawnPosition(loc.getBlockX(), loc.getBlockY(), loc.getBlockZ())); } public Location getCompassTarget() { @@ -228,9 +228,9 @@ public class CraftPlayer extends CraftHumanEntity implements Player { } public void chat(String msg) { - if (getHandle().netServerHandler == null) return; + if (getHandle().playerConnection == null) return; - getHandle().netServerHandler.chat(msg, false); + getHandle().playerConnection.chat(msg, false); } public boolean performCommand(String command) { @@ -238,36 +238,36 @@ public class CraftPlayer extends CraftHumanEntity implements Player { } public void playNote(Location loc, byte instrument, byte note) { - if (getHandle().netServerHandler == null) return; + if (getHandle().playerConnection == null) return; int id = getHandle().world.getTypeId(loc.getBlockX(), loc.getBlockY(), loc.getBlockZ()); - getHandle().netServerHandler.sendPacket(new Packet54PlayNoteBlock(loc.getBlockX(), loc.getBlockY(), loc.getBlockZ(), id, instrument, note)); + getHandle().playerConnection.sendPacket(new Packet54PlayNoteBlock(loc.getBlockX(), loc.getBlockY(), loc.getBlockZ(), id, instrument, note)); } public void playNote(Location loc, Instrument instrument, Note note) { - if (getHandle().netServerHandler == null) return; + if (getHandle().playerConnection == null) return; int id = getHandle().world.getTypeId(loc.getBlockX(), loc.getBlockY(), loc.getBlockZ()); - getHandle().netServerHandler.sendPacket(new Packet54PlayNoteBlock(loc.getBlockX(), loc.getBlockY(), loc.getBlockZ(), id, instrument.getType(), note.getId())); + getHandle().playerConnection.sendPacket(new Packet54PlayNoteBlock(loc.getBlockX(), loc.getBlockY(), loc.getBlockZ(), id, instrument.getType(), note.getId())); } public void playSound(Location loc, Sound sound, float volume, float pitch) { - if (loc == null || sound == null || getHandle().netServerHandler == null) return; + if (loc == null || sound == null || getHandle().playerConnection == null) return; double x = loc.getBlockX() + 0.5; double y = loc.getBlockY() + 0.5; double z = loc.getBlockZ() + 0.5; Packet62NamedSoundEffect packet = new Packet62NamedSoundEffect(CraftSound.getSound(sound), x, y, z, volume, pitch); - getHandle().netServerHandler.sendPacket(packet); + getHandle().playerConnection.sendPacket(packet); } public void playEffect(Location loc, Effect effect, int data) { - if (getHandle().netServerHandler == null) return; + if (getHandle().playerConnection == null) return; int packetData = effect.getId(); Packet61WorldEvent packet = new Packet61WorldEvent(packetData, loc.getBlockX(), loc.getBlockY(), loc.getBlockZ(), data, false); - getHandle().netServerHandler.sendPacket(packet); + getHandle().playerConnection.sendPacket(packet); } public void playEffect(Location loc, Effect effect, T data) { @@ -286,17 +286,17 @@ public class CraftPlayer extends CraftHumanEntity implements Player { } public void sendBlockChange(Location loc, int material, byte data) { - if (getHandle().netServerHandler == null) return; + if (getHandle().playerConnection == null) return; Packet53BlockChange packet = new Packet53BlockChange(loc.getBlockX(), loc.getBlockY(), loc.getBlockZ(), ((CraftWorld) loc.getWorld()).getHandle()); packet.material = material; packet.data = data; - getHandle().netServerHandler.sendPacket(packet); + getHandle().playerConnection.sendPacket(packet); } public boolean sendChunkChange(Location loc, int sx, int sy, int sz, byte[] data) { - if (getHandle().netServerHandler == null) return false; + if (getHandle().playerConnection == null) return false; /* int x = loc.getBlockX(); @@ -320,7 +320,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { Packet51MapChunk packet = new Packet51MapChunk(x, y, z, sx, sy, sz, data); - getHandle().netServerHandler.sendPacket(packet); + getHandle().playerConnection.sendPacket(packet); return true; */ @@ -329,7 +329,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { } public void sendMap(MapView map) { - if (getHandle().netServerHandler == null) return; + if (getHandle().playerConnection == null) return; RenderData data = ((CraftMapView) map).render(this); for (int x = 0; x < 128; ++x) { @@ -339,7 +339,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { bytes[y + 3] = data.buffer[y * 128 + x]; } Packet131ItemData packet = new Packet131ItemData((short) Material.MAP.getId(), map.getId(), bytes); - getHandle().netServerHandler.sendPacket(packet); + getHandle().playerConnection.sendPacket(packet); } } @@ -347,7 +347,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { public boolean teleport(Location location, PlayerTeleportEvent.TeleportCause cause) { EntityPlayer entity = getHandle(); - if (entity.netServerHandler == null || entity.netServerHandler.disconnected) { + if (entity.playerConnection == null || entity.playerConnection.disconnected) { return false; } @@ -378,7 +378,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { // Check if the fromWorld and toWorld are the same. if (fromWorld == toWorld) { - entity.netServerHandler.teleport(to); + entity.playerConnection.teleport(to); } else { // Close any foreign inventory if (getHandle().activeContainer != getHandle().defaultContainer){ @@ -460,14 +460,14 @@ public class CraftPlayer extends CraftHumanEntity implements Player { } private void sendStatistic(int id, int amount) { - if (getHandle().netServerHandler == null) return; + if (getHandle().playerConnection == null) return; while (amount > Byte.MAX_VALUE) { sendStatistic(id, Byte.MAX_VALUE); amount -= Byte.MAX_VALUE; } - getHandle().netServerHandler.sendPacket(new Packet200Statistic(id, amount)); + getHandle().playerConnection.sendPacket(new Packet200Statistic(id, amount)); } public void setPlayerTime(long time, boolean relative) { @@ -520,7 +520,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { @Override public void setGameMode(GameMode mode) { - if (getHandle().netServerHandler == null) return; + if (getHandle().playerConnection == null) return; if (mode == null) { throw new IllegalArgumentException("Mode cannot be null"); @@ -533,14 +533,14 @@ public class CraftPlayer extends CraftHumanEntity implements Player { return; } - getHandle().itemInWorldManager.setGameMode(EnumGamemode.a(mode.getValue())); - getHandle().netServerHandler.sendPacket(new Packet70Bed(3, mode.getValue())); + getHandle().playerInteractManager.setGameMode(EnumGamemode.a(mode.getValue())); + getHandle().playerConnection.sendPacket(new Packet70Bed(3, mode.getValue())); } } @Override public GameMode getGameMode() { - return GameMode.getByValue(getHandle().itemInWorldManager.getGameMode().a()); + return GameMode.getByValue(getHandle().playerInteractManager.getGameMode().a()); } public void giveExp(int exp) { @@ -624,7 +624,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { public void hidePlayer(Player player) { Validate.notNull(player, "hidden player cannot be null"); - if (getHandle().netServerHandler == null) return; + if (getHandle().playerConnection == null) return; if (equals(player)) return; if (hiddenPlayers.containsKey(player.getName())) return; hiddenPlayers.put(player.getName(), player); @@ -638,12 +638,12 @@ public class CraftPlayer extends CraftHumanEntity implements Player { } //remove the hidden player from this player user list - getHandle().netServerHandler.sendPacket(new Packet201PlayerInfo(player.getPlayerListName(), false, 9999)); + getHandle().playerConnection.sendPacket(new Packet201PlayerInfo(player.getPlayerListName(), false, 9999)); } public void showPlayer(Player player) { Validate.notNull(player, "shown player cannot be null"); - if (getHandle().netServerHandler == null) return; + if (getHandle().playerConnection == null) return; if (equals(player)) return; if (!hiddenPlayers.containsKey(player.getName())) return; hiddenPlayers.remove(player.getName()); @@ -655,7 +655,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { entry.updatePlayer(getHandle()); } - getHandle().netServerHandler.sendPacket(new Packet201PlayerInfo(player.getPlayerListName(), true, getHandle().ping)); + getHandle().playerConnection.sendPacket(new Packet201PlayerInfo(player.getPlayerListName(), true, getHandle().ping)); } public boolean canSee(Player player) { @@ -771,14 +771,14 @@ public class CraftPlayer extends CraftHumanEntity implements Player { public void sendPluginMessage(Plugin source, String channel, byte[] message) { StandardMessenger.validatePluginMessage(server.getMessenger(), source, channel, message); - if (getHandle().netServerHandler == null) return; + if (getHandle().playerConnection == null) return; if (channels.contains(channel)) { Packet250CustomPayload packet = new Packet250CustomPayload(); packet.tag = channel; packet.length = message.length; packet.data = message; - getHandle().netServerHandler.sendPacket(packet); + getHandle().playerConnection.sendPacket(packet); } } @@ -799,7 +799,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { } public void sendSupportedChannels() { - if (getHandle().netServerHandler == null) return; + if (getHandle().playerConnection == null) return; Set listening = server.getMessenger().getIncomingChannels(); if (!listening.isEmpty()) { @@ -820,7 +820,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { packet.data = stream.toByteArray(); packet.length = packet.data.length; - getHandle().netServerHandler.sendPacket(packet); + getHandle().playerConnection.sendPacket(packet); } } diff --git a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java index 106db16e..9850ac7e 100644 --- a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java +++ b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java @@ -488,7 +488,7 @@ public class CraftEventFactory { public static Container callInventoryOpenEvent(EntityPlayer player, Container container) { if (player.activeContainer != player.defaultContainer) { // fire INVENTORY_CLOSE if one already open - player.netServerHandler.handleContainerClose(new Packet101CloseWindow(player.activeContainer.windowId)); + player.playerConnection.handleContainerClose(new Packet101CloseWindow(player.activeContainer.windowId)); } CraftServer server = ((WorldServer) player.world).getServer(); diff --git a/src/main/java/org/bukkit/craftbukkit/generator/CustomChunkGenerator.java b/src/main/java/org/bukkit/craftbukkit/generator/CustomChunkGenerator.java index 0b86469b..36aa6f82 100644 --- a/src/main/java/org/bukkit/craftbukkit/generator/CustomChunkGenerator.java +++ b/src/main/java/org/bukkit/craftbukkit/generator/CustomChunkGenerator.java @@ -91,7 +91,7 @@ public class CustomChunkGenerator extends InternalChunkGenerator { } } // Build chunk section - csect[sec] = new ChunkSection(sec << 4, secBlkID, secExtBlkID); + csect[sec] = new ChunkSection(sec << 4, true, secBlkID, secExtBlkID); } } else { // Else check for byte-per-block section data @@ -107,7 +107,7 @@ public class CustomChunkGenerator extends InternalChunkGenerator { if (btypes[sec] == null) { continue; } - csect[sec] = new ChunkSection(sec << 4, btypes[sec], null); + csect[sec] = new ChunkSection(sec << 4, true, btypes[sec], null); } } else { // Else, fall back to pre 1.2 method @@ -137,7 +137,7 @@ public class CustomChunkGenerator extends InternalChunkGenerator { if (blk != 0) { // If non-empty if (cs == null) { // If no section yet, get one - cs = csect[sec] = new ChunkSection(sec << 4); + cs = csect[sec] = new ChunkSection(sec << 4, true); csbytes = cs.g(); } csbytes[(cy << 8) | (cz << 4) | cx] = blk; diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftContainer.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftContainer.java index 048451e1..1f136dee 100644 --- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftContainer.java +++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftContainer.java @@ -85,7 +85,7 @@ public class CraftContainer extends Container { setupSlots(top, bottom); } int size = getSize(); - player.getHandle().netServerHandler.sendPacket(new Packet100OpenWindow(this.windowId, type, cachedTitle, size)); + player.getHandle().playerConnection.sendPacket(new Packet100OpenWindow(this.windowId, type, cachedTitle, size)); player.updateInventory(); } return true; diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java index 87709d73..7c52e853 100644 --- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java +++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java @@ -36,8 +36,8 @@ import com.google.common.collect.ImmutableMap; *
  • void applyToItem(NBTTagCompound tag) *
  • boolean applicableTo(Material type) *

    - *
  • boolean notUncommon(CraftMetaItem meta) *
  • boolean equalsCommon(CraftMetaItem meta) + *
  • boolean notUncommon(CraftMetaItem meta) *

    *
  • boolean isEmpty() *
  • boolean is{Type}Empty() diff --git a/src/main/java/org/bukkit/craftbukkit/util/LazyPlayerSet.java b/src/main/java/org/bukkit/craftbukkit/util/LazyPlayerSet.java index df090190..90b2e6ac 100644 --- a/src/main/java/org/bukkit/craftbukkit/util/LazyPlayerSet.java +++ b/src/main/java/org/bukkit/craftbukkit/util/LazyPlayerSet.java @@ -14,7 +14,7 @@ public class LazyPlayerSet extends LazyHashSet { if (reference != null) { throw new IllegalStateException("Reference already created!"); } - List players = MinecraftServer.getServer().getServerConfigurationManager().players; + List players = MinecraftServer.getServer().getPlayerList().players; HashSet reference = new HashSet(players.size()); for (EntityPlayer player : players) { reference.add(player.getBukkitEntity()); -- cgit v1.2.3